tag:blogger.com,1999:blog-88204734663513247232024-02-08T07:07:00.124-08:00sap & abapRauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.comBlogger17125tag:blogger.com,1999:blog-8820473466351324723.post-2034136263389139412008-07-30T04:34:00.000-07:002008-07-30T05:12:00.368-07:00PENDIENTE DE ESTUDIARCONSISTENCIAS DE DATOS EN FICHEROS.<br />En el editor, escribimos transfer y pulsamos f1 para la ayuda.<br />Vemos las opciones del DATASET, y un capitulillo al final llamado consistencia de datos.<br /><br /><hr /><br />NOMBRES DE FICHEROS <a href="http://help.sap.com/saphelp_46c/helpdata/en/fc/eb3dc4358411d1829f0000e829fbfe/content.htm">INDEPENDIENTES DE LA PLATAFORMA</a><br /><br />Hay un sistema en SAP/ABAP para esto, no se que tal funcionará.<br /><hr/>Rauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com1tag:blogger.com,1999:blog-8820473466351324723.post-56935885823635198192008-07-30T02:14:00.000-07:002008-07-30T04:32:46.997-07:00ficheros en abap.open dataset comenzandoDel <a href="http://help.sap.com/saphelp_46c/helpdata/en/fc/eb3ca6358411d1829f0000e829fbfe/content.htm">manual online de abap</a><br /><br /><span style="font-weight: bold;">Abrir en local.</span><br /><blockquote>Realmente no se puede abrir un fichero en local, se pueden exportar e importar<br />con funciones preparadas para ello. Lo natural en abap es manejar ficheros en el servidor.</blockquote><br /><br /><span style="font-weight: bold;">Abrir en el servidor de aplicaciones.</span><br /><br />La forma básica de abrir un fichero en el servidor de aplicaciones es esta:<br /><br /><div style="text-align: center;"><span style=";font-family:Arial;font-size:85%;" >OPEN DATASET <dsn> [Additions].</span><br /></div> <span style=";font-family:Arial;font-size:85%;" ><br /></span> <p><span style=";font-family:Arial;font-size:85%;" >Ejemplo:<br />DATA FNAME(60).</span></p> <p><span style=";font-family:Arial;font-size:85%;" >FNAME = '/tmp/myfile'.</span></p> <p><span style=";font-family:Arial;font-size:85%;" >OPEN DATASET 'myfile'.</span></p> Pero ¿Donde lo abre?.<br />En el servidor de aplicaciones, ¿Que pasa cuando hay varios servidores de aplicaciones? pues no se.<br /><br />El programa no funciona porque necesita mas opciones.<br /><br /><br /><span style="font-weight: bold;font-size:180%;" >Opciones OPEN DATASET</span><br /><span style="font-weight: bold;font-size:130%;" ><br />Tipo de acceso</span><br /><br /> OPEN DATASET 'myfile' for input.<br /><ul> <li> ... INPUT </li> <li> ... OUTPUT </li> <li> ... APPENDING </li> <li> ... UPDATE</li> </ul> <span style="font-weight: bold;font-size:130%;" >Modo<br /></span><span style="font-size:130%;"><br />OPEN DATASET 'MYFILE' FOR INPUT BINARY MODE.<br /></span> <ul> <li><span style="font-size:130%;"><span style="font-size:100%;"> ... BINARY MODE </span></span></li> <li><span style="font-size:130%;"><span style="font-size:100%;"> ... TEXT MODE encoding [linefeed] </span></span></li> <li><span style="font-size:130%;"><span style="font-size:100%;"> ... LEGACY BINARY MODE [{BIG|LITTLE} ENDIAN ] [CODE PAGE cp] </span></span></li> <li><span style="font-size:130%;"><span style="font-size:100%;"> ... LEGACY TEXT MODE [{BIG|LITTLE} ENDIAN] [CODE PAGE cp] </span></span></li> <li><span style="font-size:130%;"><span style="font-size:100%;">[linefeed] </span></span></li> </ul> <span style="font-size:130%;"><span style="font-size:100%;"><br /></span></span> <ul> <li><span style="font-size:130%;"><span style="font-size:100%;">Extras:</span></span></li> </ul> <span style="font-size:130%;"><span style="font-size:100%;"></span></span><blockquote> <ul> <li><span style="font-size:130%;"><span style="font-size:100%;"> ... {BIG|LITTLE} ENDIAN<br /> </span></span><span style="font-size:130%;"><span style="font-size:100%;"> ... CODE PAGE cp </span></span><span style="font-size:130%;"><span style="font-size:100%;"><br /> </span></span></li> </ul> </blockquote><span style="font-weight: bold;font-size:130%;" ><br /></span> <ul> <li>Mas cosas sobre codificación</li> </ul> <span style="font-weight: bold;font-size:130%;" ></span><blockquote> <ul> <li><span style="font-weight: bold;font-size:130%;" >enconding</span></li> <li><span style="font-weight: bold;font-size:130%;" >linefeed</span><span style="font-weight: bold;font-size:130%;" ><br /> </span></li> </ul> </blockquote><br /><span style="font-weight: bold;font-size:130%;" >TRABAJANDO CON EL DATASET</span><br /><br />READ DATASET<br /><blockquote>para leer datos del fichero<br /></blockquote>TRANSFER<br />GET DATASET<br /><blockquote>para leer posicion del fichero.</blockquote><br />SET DATASET<br /><blockquote>para cambiar la posicion del fichero</blockquote><br />TRUNCATE DATASET<br /><blockquote>Para acabar el fichero donde queramos</blockquote><br />CLOSE DATASET<br /><blockquote>Cerrar el fichero</blockquote><br />DELETE DATASET<br /><blockquote>Borrar el fichero.</blockquote><br /><br /><br />XXXXX<br /><br /><span style=";font-family:Arial;font-size:85%;" ><br /></span>Rauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com1tag:blogger.com,1999:blog-8820473466351324723.post-23529406663364181842008-07-24T05:03:00.000-07:002008-09-03T05:33:17.137-07:00abap mensajes<span style=";font-family:Arial;font-size:85%;" >Los mensajes de abap es una forma de comunicación con los usuarios, No solamente son textos sino que tambien son acciones de flujo en el contexto del programa abap.<br /><br />http://help.sap.com/saphelp_46c/helpdata/en/9f/dba79435c111d1829f0000e829fbfe/frameset.htm<br />EN el worbench http://help.sap.com/saphelp_46c/helpdata/en/d1/801b3e454211d189710000e8322d00/frameset.htm<br /></span> <p>En principio, los mensajes son siemplemente textos almacenados en la tabla T100, que podemos mantener por la transación SE91 y navegando con el workbench.<br />La extructura de la tabla T100 es:<br /></p> <ul> <li>Clave de lenguaje.</li><li>Clase de mensaje (30 caracteres)<br /></li><li>Numero de mensaje<br /></li><li>Texto del mensaje (up to 72 characters)</li> </ul> <p>La clase de mensaje asigna mensajes a una aplicación o a una clase de desarrollo... y los numeros identifican el mensaje individual. Cuando necesitamos un mensaje o nos envian un mensaje, esta identificado por una clave de lenguaje, la clase de mensaje y el número de mensaje.<br /></p> <p>LA SENTENCIA MENSAJE.<br /></p> <p>En el propio .report, se puede de fininir la identidad o las clases de mensajes que vamos a utilizar ejemplo:<br /><b><span><b><span style=";font-family:Courier New;font-size:85%;" >REPORT DEMO_MESSAGES_SIMPLE MESSAGE-ID SABAPDOCU.<br /></span></b></span></b></p> <p>La clase de mensajes que vamos a utilizar son los SABAPDOCU<br /></p> <p><br /></p> <p>La clave del mensaje es lo que llamaremos en abap <id><br /><br /></id></p> <b><span style="color: rgb(0, 0, 128);font-family:Arial;font-size:180%;" ><p>Messages on Selection Screens <a href="http://help.sap.com/saphelp_46c/helpdata/en/91/dec863880411d194cb0000e8353423/frameset.htm" target="_top"><img src="http://help.sap.com/saphelp_46c/helpdata/en/images/locate.gif" align="bottom" border="0" /></a></p></span></b> <span style=";font-family:Arial;font-size:85%;" > <p>This context includes all situations where a selection screen is being processed, that is, the program is reacting to user input. In ABAP programs, this corresponds to the AT SELECTION-SCREEN processing blocks, except those with the OUTPUT addition. </p></span> <b><span style="color: rgb(0, 0, 128);font-family:Arial;font-size:130%;" ><p>Message Processing</p></span></b> <table width="100%" border="1" cellpadding="7" cellspacing="1"> <tbody><tr><td valign="top" width="7%"><p><b><span style=";font-family:Arial;font-size:85%;" >Type</span></b></p></td> <td valign="top" width="34%"> <p><b><span style=";font-family:Arial;font-size:85%;" >Display</span></b></p></td> <td valign="top" width="59%"> <p><b><span style=";font-family:Arial;font-size:85%;" >Processing</span></b></p></td></tr> <tr><td valign="top" width="7%"><p><span style=";font-family:Arial;font-size:85%;" >A</span></p></td> <td valign="top" width="34%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Dialog box</span></p></td> <td valign="top" width="59%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Program terminates, and control returns to last area menu</span></p></td></tr> <tr><td valign="top" width="7%"><p><span style=";font-family:Arial;font-size:85%;" >E</span></p></td> <td valign="top" width="34%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Status bar</span></p></td> <td valign="top" width="59%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Selection screen processing terminates, and the selection screen is redisplayed. The screen fields specified through the additions to the AT SELECTION-SCREEN statement are ready for input. The user <b>must</b> enter a new value. The system then restarts the selection screen processing using the new values. You cannot use error messages with the ON HELP-REQUEST or ON VALUE-REQUEST additions. Instead, a runtime error occurs.</span></p></td></tr> <tr><td valign="top" width="7%"><p><span style=";font-family:Arial;font-size:85%;" >I</span></p></td> <td valign="top" width="34%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Dialog box</span></p></td> <td valign="top" width="59%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Program continues processing after the MESSAGE statement</span></p></td></tr> <tr><td valign="top" width="7%"><p><span style=";font-family:Arial;font-size:85%;" >S</span></p></td> <td valign="top" width="34%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Status bar of next screen</span></p></td> <td valign="top" width="59%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Program continues processing after the MESSAGE statement</span></p></td></tr> <tr><td valign="top" width="7%"><p><span style=";font-family:Arial;font-size:85%;" >W</span></p></td> <td valign="top" width="34%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Status bar</span></p></td> <td valign="top" width="59%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Like type E, but the user can confirm the message by pressing ENTER without having to enter new values. The system then resumes selection screen processing directly after the MESSAGE statement. You cannot use warning messages with the ON HELP-REQUEST or ON VALUE-REQUEST additions. Instead, a runtime error occurs.</span></p></td></tr> <tr><td valign="top" width="7%"><p><span style=";font-family:Arial;font-size:85%;" >X</span></p></td> <td valign="top" width="34%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >None</span></p></td> <td valign="top" width="59%"> <span style=";font-family:Arial;font-size:85%;" > </span><p><span style=";font-family:Arial;font-size:85%;" >Triggers a runtime error with short dump</span></p></td></tr></tbody> </table> <span style=";font-family:Arial;font-size:85%;" > </span> <p><br /></p> <p><span style=";font-family:Arial;font-size:85%;" >abao USO DE MESSAGE<br />PRIMER METODO:<br /></span></p> <p><span style=";font-family:Arial;font-size:85%;" >Expecificar la clase de mensajes en el report<br />REPORT ASDFASDF MESSAGE-ID SABAPDOCU.<br /></span></p> <p><span style=";font-family:Arial;font-size:85%;" >LLamar al mensaje de la forma<br />MESSAGE I003.<br />Así llamamos al mensaje 003 del tipo I, de la clase SABAPDOCU.<br /></span></p> <p><span style=";font-family:Arial;font-size:85%;" >SEGUNDA FORMA :<br />MESSAGE I003(SABAPDOCU).<br /></span></p> <p><span style=";font-family:Arial;font-size:85%;" >LLamamos al mensaje 003 de la clase SABAPDOCU, del tipo I<br /></span></p> <p><span style=";font-family:Arial;font-size:85%;" >TERCERA FORMA :<br />DInamicamente:<br /></span><span><span style=";font-family:Arial;font-size:85%;" ><br />MESSAGE ID 'SABAPDOCU' TYPE 'S' NUMBER '014'. </span></span><br /></p> <p><span style=";font-family:Arial;font-size:85%;" >Podemos substituir los literales por variables.<br /></span></p> <p><span style=";font-family:Arial;font-size:85%;" ><br /></span></p> <p><span style=";font-family:Arial;font-size:85%;" >OPCIONES DE MESSAGE<br /></span></p> <p><span><span style=";font-family:Arial;font-size:85%;" >MESSAGE ..... {WITH <f1> ... <f4>]<br />a veces el mensaje (el texto del mensaje) tiene caracteres anspersan que se pueden substituir por parametros a la hora de formar el mensaje, con la opción with podemos implementar estos parámetros.<br /></f4></f1></span></span></p> <p><span><span style=";font-family:Arial;font-size:85%;" >MESAGE ..... RAISING <exe><br />para lanzar la excepcion exe, caso de no existir, pues el programa continua.<br /><br /></exe></span></span></p>Rauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-52941343057065048252008-07-24T05:02:00.000-07:002008-07-24T05:03:15.983-07:00logical databaseshttp://help.sap.com/saphelp_nw70/helpdata/en/9f/db9b5e35c111d1829f0000e829fbfe/frameset.htm<br /><br />Cuidado, esta tecnica esta obsoletaRauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-5519690220250739342008-07-24T04:50:00.000-07:002008-07-24T05:02:48.358-07:00screens. select screenHay tres maneras de hacer pantallas en abap:<br />dialogos screen<br />select screen<br />listas.<br /><br />los dialogos screen , se hacen con el worbench y el screen painter.<br />los select screen se hacen directamente en abap<br />las listas no definen botones y recursos con nombres que luego se utilizan en ABAP<br />en este caso se utilizan areas de trabajo libres y las sentencias WRITE, ULINE; and SKIP .<br /><br /><br /><span style="font-weight: bold;">SELECT SCREEN</span><br /><br />http://help.sap.com/saphelp_46c/helpdata/en/1e/401ad6ee3c11d1951d0000e8353423/frameset.htm<br />Tres sentencias para manejar las select screen.<br /><ul> <li> <a href="http://help.sap.com/saphelp_46c/helpdata/en/9f/dba68335c111d1829f0000e829fbfe/content.htm"> <span style=";font-family:Arial;font-size:85%;" >PARAMETERS</span></a><span style=";font-family:Arial;font-size:85%;" > for single fields</span></li><li> <a href="http://help.sap.com/saphelp_46c/helpdata/en/9f/dba71235c111d1829f0000e829fbfe/content.htm"> <span style=";font-family:Arial;font-size:85%;" >SELECT-OPTIONS</span></a><span style=";font-family:Arial;font-size:85%;" > for complex selections</span></li><li> <a href="http://help.sap.com/saphelp_46c/helpdata/en/9f/dba79435c111d1829f0000e829fbfe/content.htm"> <span style=";font-family:Arial;font-size:85%;" >SELECTION-SCREEN</span></a><span style=";font-family:Arial;font-size:85%;" > for formatting the selection screen and defining user-specific selection screens</span></li> </ul><br /><br />Una pantalla tipo select screen está definida entre estas dos sentencias :<br /><span style=";font-family:Arial;font-size:85%;" >SELECTION-SCREEN BEGIN OF SCREEN <numb><title>] [AS WINDOW].</title> [TITLE<br />...<br />SELECTION-SCREEN END OF SCREEN <numb>.<br /><br />donde el número <nunb> hay que tener cuidado no este repetido y AS WINDOW es si la ventana se quiere modal.<br /><br /><span style="font-weight: bold;">PODEMOS DEFINIR UNA PANTALLA SIN TENER ESTAS DOS SENTENCIAS, Y ENTONCES EL VALOR POR DEFECTO ES EL 1000 (numbe=1000).</span><br /><br />Dentro de estas sentencias podemos poner los parámetros que queramoos.<br /><br />ADEMAS DE PARAMETROS, PODEMOS INCLUIR :<br /><span style="font-weight: bold;">Bloques (varios parametros encuadrados en un mismo bloque).</span><br /></nunb></numb></numb></span><span style=";font-family:Arial;font-size:85%;" ><blockquote><block><br /></block> <p><span style=";font-family:Arial;font-size:85%;" >SELECTION-SCREEN BEGIN OF BLOCK <block><br /> [WITH FRAME [TITLE <title>]]<br /> [NO INTERVALS].<br />...<br />SELECTION-SCREEN END OF BLOCK <block>.</span></p><br /></blockquote></span><br /><span style="font-weight: bold;">lineas en blanco</span><br /><span><span style=";font-family:Arial;font-size:85%;" >SELECTION-SCREEN SKIP [<n>].</span></span><br /><br /><span style="font-weight: bold;">lineas rectas</span><br /><span style=";font-family:Arial;font-size:85%;" >SELECTION-SCREEN ULINE [[/]<pos(len)>] [MODIF ID <key>].</span><br /><br /><b><span><b><span style=";font-family:Courier New;font-size:85%;" >comentarios<br />SELECTION-SCREEN COMMENT [/]<pos gt="" for="" field="" qt="" modif="" id=""><key>].</key></pos></span></b></span></b><br /><br /><span style="font-weight: bold;">varios elementos en una linea</span><br /><span><span style=";font-family:Arial;font-size:85%;" >SELECTION-SCREEN BEGIN OF LINE.<br />...<br />SELECTION-SCREEN END OF LINE.</span></span><br /><br /><span style="font-weight: bold;">posicion del siguiente elemento</span><br /><span><span style=";font-family:Arial;font-size:85%;" >SELECTION-SCREEN POSITION <pos>.</span></span><br /><br /><br /><br />xx<br /><br />complex selection la sentencia select-option ????? tiene que ver con las logical databasses.<br /><a href="http://help.sap.com/saphelp_46c/helpdata/en/1e/401ad6ee3c11d1951d0000e8353423/frameset.htm">logical databases </a><br />Las logical databases esta obsoleto y no deberían usarse.<br />faltan las llamadas y los eventos.<br />x<br /><br /><br />atributos de la tabla screen http://help.sap.com/saphelp_46c/helpdata/en/9f/dbab6f35c111d1829f0000e829fbfe/frameset.htm<br /><br /><br />---------------------------------<br /><hr /><br />Eventos antes de la edicion de selection screen (BPO) en SELECTION SCREEN.<br /><span style="font-size:130%;"><b><span style="font-family:Courier New;">EVENTO AT SELECTION-SCREEN OUTPUT.</span></b></span><br /><br />Una vez definidos los selection screen, podemos definir los enventos antes de ediccion en el evento<br />AT SELECTION-SCREEN OUTPUT.<br /><br /><br /><span style="font-size:130%;"> <span style="font-weight: bold;">EVENTO AT SELECTION-SCREEN<br /></span></span>Este es el evento "despues de output"<br /><br />Este evento ocurre cuando pulsamos return, o el relojito de la pantalla.<br /><br />podemos revisar los campos, antes de entrar en el proceso.<br /><br />Esta es una forma de comprobar si la variable se ha modificado.<br /><b><span style=";font-family:Courier New;font-size:85%;" >IF VARIABLE IS INITIAL </span></b><br /><br /><br /><br />XXXXXXXXXXXXXX<br /><span style="font-size:130%;"><span style="font-weight: bold;"><br /><br /></span></span>Rauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-49631579503441948542008-07-24T04:47:00.000-07:002008-07-24T04:49:04.497-07:00sap/abap elementos de textohttp://help.sap.com/saphelp_46c/helpdata/en/1e/401ad6ee3c11d1951d0000e8353423/frameset.htm<br /><br />Los elementos de texto son textos que sirven para que los programa muestren textos unificados e independientes del idioma. :<br /><span><span style=";font-family:Arial;font-size:85%;" ><br />cualquier texto mostrado por una pantalla de programa puede ser mantenido con el mantenimiento de elementos de texto.<br /><br />TRANSACION SE32<br /><br />Hay tres tipos de elementos de texto:<br />Los simbolos de texto, los textos de seleccion y las cabeceras de lista.<br /><br />simbolo de textos,<br />hay un identificador de 3 caracteres.<br />en abap, usaremos estos textos de dos formas:<br />text-<id><br />'texto que queramos'(<id>)</id></id></span></span><br /><span><span style=";font-family:Arial;font-size:85%;" ><br />en cualquiermomento text-aaa es el texto con identidad aaa<br />'texto que queramos'(aaa) si existe el id aaa esto es equivalente a text-aaa, si no existe el id aaa, usara el 'texto que queramos'.<br /><br /><br /><br /></span></span>Rauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-62318763381055258892008-07-24T04:45:00.000-07:002008-07-24T04:46:21.225-07:00sap. problemas de navegacion y varios.CREANDO UNA TABLA:<br />Voy a crear una tabla (bla-bla-bla). Creando Un elemento de datos y un dominio.<br /><br />Pues nada me voy al diccionario(S11),<br />marco el pirulillo de "tabla base de datos" y escribo en el campo de nombre de la tabla ZTABLAMIA Y pincho el boton de crear.<br /><br />Me sale una pantalla donde escribo:<br />descripcion breve: esta es una tabla mia<br />Tipo de entrega: L tabla de datos temporales entregada vacía.<br />Browse datos/actualizar tabla : le digo que visualizacion/actualizacion permitida.<br />Me voy a la pestaña de campos y le meto el nombre que quiero.<br />En el texbox de tipo de dato escribimos el que nos de la gana (que no exista) y doble click en el. nos pide que si queremos grabar (da igual) y nos saca el ventanuco de elemento de datos.<br />Ventana pa crear Elemento de datos:<br />nos pide el nombre breve (el que nos de la gana).<br />y el dominio: escribimos el que nos de la gana (uno que no exista) y de nuevo doble click y nos presenta la ventana de crear un dominio. (antes nos pedira grabar (optativo) y si queremos crear un nuevo dominio, decir que siiiii),<br />descripcion breve<br />tipo de datos char y ya esta<br />posiciones 10 y al disquete a grabar<br />En la ventana de crear catalogo bla bla bla, punchamos objeto local<br />activamos y Damos flecha azul pa tras (no la verde de arriba), coño y nos ha perdido lo del elemento de datos.<br />No pasa nada, nos ha salido la ventana de creación de campos y volvemos a punchar dos veces al tipo de datos<br />Grabamos y activamos el elemento de datos, antes nos pide actualizar denominadores de campo, pues nada, los actualizamos y a correr.<br /><br />Acordarse de pulsar return despues de escribir un elemento de datos.<br />No hay forma humana de activar la tabla. Si verificamos el unico error que da es la falta de clave, pero la podemos poner y sigue sin activarse.<br /><br /><span style="font-weight: bold;">Para activar la tabla, tengo que punchar el boton opciones tecnicas</span> y poner algo en clase de datos y categoria tamaño, darle a grabar y ya esta, pero da un "warning". Para quitar el warnin de no se que de categoria de ampliación, voy a detalles->categoria de ampliacion, pongo algo y ya esta. ya no hay warning<br /><br /><hr /><br />En Clase de entrega hemos puesto temporal porque si no es asi no nos permite tabla sin mandante.<br />En otras clases como la A hace falta un campo de mandante.<br />simplemente con crear un campo llamado mandt de elementos de datos mandt y ponerlo en el indice ya esta.<br /><br /><br /><hr /><br />browser datos.<br />En el propio diccionario mientras estamos viendo los campos de la tabla, en utilidades->contenido de la tabla, podemos ver datos y añadir datos.<br />(en la pestaña de la tabla de entrega y actualizacion segun lo que tengamos puesto, permitirá unas cosas y otras).<br />SE16, SE17, SM30, and SM31 son posibles formas de browser.Rauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-82232470252677309512008-07-24T04:43:00.000-07:002008-07-24T04:44:36.390-07:00selection screen,(primer intento)Esta parte de ABAP, trata de los eventos generados por el usuario.<br /><br /><span style="font-weight: bold;">Programando Event-Driven.</span><br />En ABAP ya vimos que los eventos se definen por bloques en el programa comenzando por determinadas palabras claves de eventis, estos bloques son ejecutados al invocar ciertos eventos.<br /><br />Como ya vimos, si un bloque de programa no está asignado a ningúna clave de evento, se le asigna por defecto al evento de clave: <span style="font-weight: bold;">start-of-selection.<br /></span><br />Es buena practica escribir los bloques en el orden lógico secuencial en que se producen, y también usar los eventos mas importantes de selection-screen.<br /><br /><ul> <li>El evento initialization<br /> </li><li>El evento at selection-screen<br /> </li><li>El evento at user-command<br /> </li> </ul> <span style="font-weight: bold;">El Evento initialization</span><br /><br />Este evento se lanza antes de la pantalla de usuario, por lo que es especialmente valido para inicializar variables....<br /><br /><span style="font-weight: bold;">El evento at selection-screen</span><br /><br />El evento <span style="font-weight: bold;">at selection-screen</span> se procesa despues de que el usuario haga input en la pantalla de seleción activa. Por ejemplo pulsando un botón, u otras entradas de la pantalla de selección.<br />Puede ser usado para validar las entradas o tambien para modificar la propia pantalla de seleccion.Rauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-91149095132766188932008-07-24T04:39:00.000-07:002008-07-24T04:40:24.603-07:00ABAP. Tablas internas.TABLAS INTERNAS.<br /> Una <span style="font-style: italic;">tabla interna</span> es una tabla temporal en la memoria del servidor de aplicaciones. Es creada y mantenida por un programa durante la ejecución, y es descartada cuando el programa termina. Como una tabla de bases de datos, una tabla interna consiste de varios registros con la misma estructura, poro sus datos desaparecen cuando el programa termina. Se usa como almacen temporal para manipular datos, o como un buffer temporal privado.<br /><br />Una tabla interna se compone de un cuerpo y una cabecera opcional..<br />El cuerpo es el que almacena los registros de la tabla interna. Normalmente cuando se habla de tabla interna, se refiere al cuerpo de la tabla interna.<br />La cabecera de la tabla interna es un unico registro que se utiliza para añadir y recoger datos del cuerpo de la tabla interna.<br /><br />Como crear una basica tabla interna:<br />Creando con data un field string, podemos crear una tabla interna con la sintaxis:<br /><pre>con header:<br /></pre> <div style="text-align: center;">begin of it1 occurs n.<br /><pre>data it1 like fs1 occurs n with header line. </pre><br /></div> <pre>sin header:<br /></pre> <div style="text-align: center;">data it1 like fs1 occurs n.<br /><br /></div> Pienso que no necesita explicación.<br />El numero de registros simplemente es orientativo, pese a que es posible que haya algún problema cuando nos pasamos este número, por ejemplo que no haga el rolling completo. (consultar versiones)<br />Es importante el número de registros (puede ser incluso cero) para la 'perfomance'.<br /><br />La mayor confusión con respecto a las tablas internas está en que el cuerpo y la cabecera se llaman igual, pero esto no es problema porque la propia codificación nos dice si estamos usando el cuerpo o la cabecera, por ejemplo los asignamientos de campos de las tablas internas siempre se refieren al header.<br /><br /><span style="font-weight: bold;">Añadir datos a una tabla interna con la sentencia append.</span><br /><br />append it.<br />Añade los datos introducidos en la cabecera it (usar it como si fuera un field string) al final de la tabla it.<br /><br />append wa to it<br />Añade los datos de wa (un field string conla misma estructura que it).<br /><br />append initial line to it<br />Añade un registro en 'blanco' a la tabla interna.<br /><br /><br /><tt>sy-tabix</tt> es una variable del sistema que nos dice que numero de registro es el que acabamos de añadir.<br /><br /><span style="font-weight: bold;">Leyendo datos de una tabla interna</span><br /><br /><span style="font-style: italic;">Sentencia loop at</span><br /><br /><pre>loop at <i>it</i> [into <i>wa</i>] [from <i>m</i>] [to <i>n</i>] [where <i>exp</i>].<br /> ---<br />endloop.</pre> donde:<br /><ul> <li><tt><i>it</i></tt> es una tabla interna<br /></li><li><tt><i>wa</i></tt> es el nombre del work area (si se omite, por defecto es el header).<br /></li><li><tt><i>m</i></tt><i> </i>y<i> </i><tt><i>n</i></tt> son enteros literales,constantes o variables representando numeros de registros. </li><li><tt><i>exp</i></tt> es una expresión lógica restrigiendo el numero de registros.<br /></li><li><tt>---</tt> Son lineas de codigo que se ejecutan una vez por registro de la tabla interna.</li> </ul> Mas explicaciones:<br /><ul> <li><tt><i>wa</i></tt> tiene que tener la misma estructura que la tabla interna. </li><li><tt><i>wa</i></tt> puede ser la cabecera de la tabla interna. </li><li>Si no se expecifica work area se usa por defecto la cabecera.. </li><li>Si from no se especifica es el primer registro </li><li>Si <tt>to</tt> no se especifica es el ultimo registro. </li><li>En la expresion logica, los componentes os subcampos de la it no tienen que escribirse it-componente, sino componente. Incluso da error si se hace asi. </li><li><tt><i>En exp</i></tt>, cualquie uso de los componentes de la tabla tiene que estar a la izquierda del operador relación.</li> </ul> <tt>sy-tabix</tt> nos muestra en cualquier momento el numero de registro por el que vamos.<br />Si hay bucles anidados, nos da el del bucle en el que estamos.<br />Despues del bucle, es cero si se han leido registro y no-cero si no se ha leido ninguno (comprobar).<br /><br />En la condición, hay que intentar que no se hagan transformaciones que no llegen a hacer el program amuy pesado.<br /><br /><br />Sentencias del control de bucle.<br /><center><b>Sentencias que alteran el bucle de proceso de tablas internas</b></center> <table border="1"> <tbody><tr valign="top"><td width="96"><center><b>Statement</b></center></td><td width="480"><center><b>Effect</b></center> </td></tr> <tr valign="top"><td width="96"><tt>exit</tt></td><td width="480">Termina el bucle y sigue en la linea siguiente a endloop </td></tr> <tr valign="top"><td width="96"><tt>Continue</tt></td><td width="480">El programa va inmediatamente a la sentencia endloop y continuea el siguiente registro. Si no hay mas, linea siguiente a endloop. </td></tr> <tr valign="top"><td width="96"><tt>Check <i>exp</i></tt> </td><td width="480">Si if es true, el proceso continua y si no, lo mismo que continue.</td></tr></tbody> </table><br /><br /><span style="font-style: italic; font-weight: bold;">Sentencia read table</span><span style="font-weight: bold;"> :</span><br />Se usa para leer un solo registro de una tabla interna.<br /><pre>read table <i>it</i> [into <i>wa</i>] [index <i>i</i> | with key <i>keyexp </i>[binary search] ] [comparing <i>cmpexp</i>] [transporting <i>texp</i>].</pre><br /><span style="font-style: italic;"><br /></span> <ul> <li><tt><i>it</i></tt> es una tabla interna<br /></li><li><tt><i>wa</i></tt> es un work area<br /></li><li><tt><i>i</i></tt> es un número de registro. </li><li><tt><i>keyexp</i></tt> una condición para buscar el registro<br /></li><li><tt><i>cmpexp</i></tt> es una expresion de comparación de test sobre el registro encontrado. </li><li><tt><i>texp</i></tt> es una expresion que representa los campos que se transportan al work area despues que el registro ha sido encontrado. </li><li>Si comparing y transporting son especificados primero se realiza el comparing. </li> </ul><br /><br /><span style="font-style: italic; font-weight: bold;">read table con la opcion index</span><br /><blockquote> En una tabla interna el indice de registros es el numero de registro de cada registro.En la sentencia <tt>read table</tt> , index i , especifica el registro numero i.<br />Ejemplo:<br /><tt>read table it index 7<br /></tt>lee el registro 7 en cabecera.<br /></blockquote> <blockquote> Si es correcto: <tt>sy-subrc</tt>=0 y <tt>sy-tabix=i</tt><br /></blockquote><br />Ejemplo:<br />REPORT .<br /> data: begin of mitabla occurs 10,<br /> cliente(4),<br /> nombre(20),<br /> importe type i,<br /> end of mitabla.<br /> <br />mitabla-cliente = '0001'. mitabla-nombre = 'pepito perez'. mitabla-importe = 1000.<br />append mitabla.<br />mitabla-cliente = '0002'. mitabla-nombre = 'antonio leches'. mitabla-importe = 2000.<br />append mitabla.<br />mitabla-cliente = '0003'. mitabla-nombre = 'ramiro oveja'. mitabla-importe = 3000.<br />append mitabla.<br />mitabla-cliente = '0004'. mitabla-nombre = 'jesus boina'. mitabla-importe = 4000.<br />append mitabla.<br />mitabla-cliente = '0005'. mitabla-nombre = 'remigio gutierrez'. mitabla-importe = 5000.<br />append mitabla.<br />mitabla-cliente = '0006'. mitabla-nombre = 'wenceslao roto'. mitabla-importe = 6000.<br />append mitabla.<br /><br /> <span style="font-weight: bold;"> read table mitabla index 3.</span><br />write: /,<br /> / 'sy-subrc =', sy-subrc,<br /> / 'sy-tabix =', sy-tabix,<br /> / mitabla-cliente,<br /> / mitabla-nombre.<br />Resultado:<br />sy-subrc=0<br />sy-tabix=3<br />0003<br />ramiro obeja<br /><br />Si ejecutamos con<br /> <span style="font-weight: bold;">read table mitabla index 9.</span><br /><span style="font-weight: bold;">c</span><span style="font-size:130%;"><span style="font-weight: bold;">Read table con la opcion </span>key</span><br /><br />Si se especifica la opción key keyexp, el sistema busca un registro que cumpla la expresión clave y lo coloca en el header. Caso de encontrarse varios registros que cumplan la keyexp, solo el primero encontrado se retorna (por orden de registro). Es de suponer que la busqueda que hace es secuencial.<br /><br /><center><b>Expresiones de la opcion key y sus efectos.</b></center> <center> <table border="1"> <tbody><tr valign="top"><td width="192"><center><b>Key Expression</b></center></td> <td width="384"><center><b>Effect</b></center></td></tr> <tr valign="top"><td width="192">c1 = v1 c2 = v2 ...</td><td width="384">Localiza el primer registro de la tabla interna cuyo componente c1 tiene el valor v1(literal, constante o vaariable) y así sucesivamente.<br /></td></tr> <tr valign="top"><td width="192"><tt>(f1) = v1 (f2) = v2 ...</tt></td><td width="384">f1 contiene el nombre del componente cuyo contenido se va a comparar. (el contenido de f1 es en mayusculas). </td></tr> <tr valign="top"><td width="192"><tt>= wa</tt></td><td width="384"><tt>wa</tt> es un work area identico en estructura a la tabla interna. Se localiza el primer registro que es igual a wa, comparando incluso blancos.. Tiene que coincidir el registro entero.<br /></td></tr> <tr valign="top"><td width="192"><tt>Wa</tt></td><td width="384"><tt>wa es un work area idéntico en estructura a la tabla interna pero solo los primeros n campos.<br />Busca el primer registro que cumple todos los n campos. Tienen que cumplir los n campos perfectamente</tt> </td></tr> </tbody></table> </center> <p> </p><br /><center><b>valores de </b><tt><b>SY-SUBRC</b></tt><b> and </b><tt><b>SY-TABIX despues de key exp<br /></b></tt></center> <table border="1"> <tbody><tr valign="top"><td width="288"><center><b>Result</b></center></td><td width="96"><center><b>sy-subrc</b></center> </td><td width="192"><center><b>sy-tabix</b></center></td></tr> <tr valign="top"><td width="288">Lectura correcta. Se encontro un registro<br /></td><td width="96"><center>0</center></td><td width="192">index of matching row </td></tr> <tr valign="top"><td width="288">No se encontro un registro pero hay uno con una clave mayor que la leida </td><td width="96"><center>4</center></td><td width="192">index of row with next higher key </td></tr> <tr valign="top"><td width="288">No se encontro un registro ni igual ni mayor, (esto a mi no me funciona) </td><td width="96"><center>8</center></td><td width="192">number of rows in <i>it</i> + 1</td></tr></tbody> </table> -----------------------<br />Ejemplo anterior usando key expr:<br /><br /><span style="font-weight: bold;"> read table mitabla with key cliente = '0004'.</span><br />Resultado:<br />sy-subrc=0<br /> sy-tabix=4<br /> 0004<br /> jesus boina<br />---------------------<br />Otro ejemplo:<br /><span style="font-weight: bold;">read table mitabla with key cliente = '0009'.</span><br />Resultado:<br /> sy-subrc=4<br /> sy-tabix=0<br /> 0006<br /> wenceslao roto<br />------------------------------<br /><span style="font-weight: bold;">read table mitabla with key importe = 1000.</span>"con datos numericos<br />sy-subrc=0<br />sy-tabix=1<br />0001<br />pepito perez<br /><br />---------------------------------<br /><span style="font-weight: bold;">data clave(7) value 'CLIENTE'. </span> <span style="font-weight: bold;">read table mitabla with key (clave) = '0001'. " indirecto<br /><br /></span>sy-subrc=0<br />sy-tabix=1<br />0001<br />pepito perez<br /><br />------------------------------------<br /><br /><br /><br /><br /><br /> <span style="font-weight: bold;">read table con la opcion <span style="font-style: italic;">binary search</span></span><br /><br />Cuando usamos la opcion key addition, podemos usar la opcion binary search, que causa que el registro se localice usando una busqueda bianaria en lugar de una busqueda lineal.<br />Claro que antes necesita ser indexada en ascendente orden por los componentes especificados en la key exp. (ver la opcion on sorting).<br /><br />???? esto hay que mirarlo mas, no se muy bien como funciona cuando los valores van con espacios....<br /><br /><b>CAUTION</b> <blockquote> Only blanks in a default key field will match all values. This means that you cannot clear types <tt>d</tt>, <tt>t</tt>, <tt>n</tt>, and <tt>x </tt>and obtain a match-clearing will set them to zeros, not blanks. You must force blanks into these fields for them to match. You can do this using a field string (see the following example), using a subfield, or using a field symbol (see the previous section on field symbols for more information). </blockquote> <span style="font-weight: bold;">Sin opciones como funciona?</span>.<br /><br />read table mitable.<br />Es como si la clave fuera todo<br /><br /><span style="font-weight: bold;">Usando la opcion comparing.<br /></span><br /><br />La opcion comparing es seguida por campos de la tabla, la busqueda y el resultado es el mismo, pero según el resultado de comparar el work area y el registro encontrado, el valor de sy-subrc cambia.<br /><center><b>Table 11.4 Forms for the Comparison Expression in the Read Table Statement</b></center> <table border="1"> <tbody><tr valign="top"><td width="192"><center><b>Cmpexp</b></center></td><td width="384"><center><b>Description</b></center> </td></tr> <tr valign="top"><td width="192"><tt>f1 f2 ...</tt></td><td width="384">Si los valores de f1, f2 son iguales en registroencontrado y work area , <tt>sy-subrc</tt> is set to <tt>0</tt>. Si hay alguno diferente, sy-subrc es 2. </td></tr> <tr valign="top"><td width="192"><tt>all fields</tt></td><td width="384">Todos los campos son comparados. </td></tr> <tr valign="top"><td width="192"><tt>no fields</tt></td><td width="384"><span style="font-family:monospace;">No se compara nada, valor por defecto<br /></span></td></tr></tbody> </table><br />El workarea es la cabecera o el into workarea. Hemos de tener en cuenta pues, el contenido inicial del workarea.<br />La utilidad de esta opción es evitarse unos if despues del read table.<br /><br /><br /><span style="font-weight: bold;">La opción transporting :</span><br /><br />La opcion transporte, es para indicar los campos del registro encontrado que pasarán al workarea.<br /><br /><center><b>Table 11.5 Forms for the Transporting Expression in the </b><tt><b>READ TABLE</b></tt><b> Statement<br /></b></center> <center> <table border="1"> <tbody><tr valign="top"><td width="192"><center><b>Cmpexp</b></center></td><td width="384"><center><b>Description</b></center> </td></tr> <tr valign="top"><td width="192"><tt>f1 f2 ...</tt></td><td width="384">After a row is found, the value of <tt>f1</tt> in the found row overlays the value of <tt>f1</tt> in the work area. Then the value of <tt>f2</tt> overlays the value of <tt>f2</tt> in the work area, and so on. Only the components named after <tt>transporting</tt> are moved. All other components remain unchanged. </td></tr> <tr valign="top"><td width="192"><tt>All fields</tt></td><td width="384">All fields are transported. This is the default, and has the same effect as leaving off the <tt>transporting</tt> addition. </td></tr> <tr valign="top"><td width="192"><tt>no fields</tt></td><td width="384">No fields are transported. None of the fields in the work area are changed. </td></tr> </tbody></table> </center> <p> </p> Es util para controlar el contenido del workarea si encuentra un registro.<br /><hr /><br /><span style="font-weight: bold;">ORDENANDO EL CONTENIDO DE UNA TABLA INTERNA</span><br /><p>Para ordenar el contenido de una tabla interna, hay que usar la sentencia sort.</p> <p>Los registros son ordenados por una o mas colunas en orden ascendente o descendente.<br /></p> <p>La secuencia de ordenación puede ser modificada. </p> <h4>Syntax de la sentencia SORT<br /></h4> <p><br /></p> <blockquote> <pre>sort <i>it</i> [descending] [as text] [by <i>f1</i> [ascending|descending] [as text]<br /> <i>f2</i> ...].<br /></pre> </blockquote> <p> : </p> <ul> <li><tt><i>it</i></tt> el nombre de una tabla interna. </li><li><tt><i>f1</i></tt> y <tt><i>f2</i></tt> <span style="font-style: italic;">son campos de la tabla interna</span> </li><li>La tabla se ordena con los campos indicados con la opción de ascending/descending y/o como texto.. </li> </ul> <p> mas propiedades: </p> <ul> <li><tt>ascending</tt> es por defecto. </li><li>Si <tt>descending</tt> aparece antes de los campos, se aplica a todos los campos por defecto. </li><li>Por defecto se ordena por la clave por defecto , que son los campos char de la tagbla en orden ascendiente. </li> </ul> El orden de registros con la misma clave es impredecible.<br /><br /><br />La opción text, se reffiere a las palabras acentuadas y ñ's. Por defecto en un entorno ASCII se ordena por codigo ascii del caracter.<br /><p>EL <i>text environment</i>(entorno de texto) es un conjunto de caracteristicas asociadas con el lenguaje al hacer el usuario logon. Se caracteriza por el conjunto de caracteres utilizados y su secuencia. Se puede puede cambiar usando la sentencia set locale. La variable dels sistema sy-langu guarda el contenido de lenguaje especificado</p> En todo caso lo siguiente se aplica a la opcion text en la sentencia sort.<br /><ul> <li>Solo se aplica a campos tipo c.<br /></li><li>Puede especificarse para todos o campo por campo. </li> </ul><br /><br />xxxx<br />xxxxRauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-10675380530503551692008-07-24T04:37:00.001-07:002008-07-24T04:37:53.336-07:00ABAP. Instruciones de controlIF<br /><br />La comparación de variables constantes y literales es:<br /><br /><br /><center><span style="font-weight: bold;">Comparaciones comunes y formas alternativas</span><br /></center> <table border="1"> <tbody><tr valign="top"><td width="144"><br /><center><b>Comparison</b></center></td> <td width="144"><center><b>Alternate<br />Forms</b></center></td> <td width="192"><center><b>True When</b></center></td></tr> <tr valign="top"><td width="144"><tt><i>v1</i> = <i>v2</i></tt> </td><td width="144"><tt>EQ</tt></td><td width="192"><tt><i>v1</i></tt> equals <tt><i>v2</i></tt> </td></tr> <tr valign="top"><td width="144"><tt><i>v1</i> <> <i>v2</i></tt> </td><td width="144"><tt>NE</tt>, <tt>><</tt></td><td width="192"><tt><i>v1</i></tt> does not equal <tt><i>v2</i></tt> </td></tr> <tr valign="top"><td width="144"><tt><i>v1</i> > <i>v2</i></tt> </td><td width="144"><tt>GT</tt></td><td width="192"><tt><i>v1</i></tt> is greater than <tt><i>v2</i></tt> </td></tr> <tr valign="top"><td width="144"><tt><i>v1</i> < <i>v2</i></tt> </td><td width="144"><tt>LT</tt></td><td width="192"><tt><i>v1</i></tt> is less than <tt><i>v2</i></tt> </td></tr> <tr valign="top"><td width="144"><tt><i>v1</i> >= <i>v2</i></tt> </td><td width="144"><tt>GE</tt>, <tt>=></tt></td><td width="192"><tt><i>v1</i></tt> is greater than or equal to <tt><i>v2</i></tt> </td></tr> <tr valign="top"><td width="144"><tt><i>v1</i> <= <i>v2</i></tt> </td><td width="144"><tt>LE</tt>, <tt>=<</tt></td><td width="192"><tt><i>v1</i></tt> is less than or equal to <tt><i>v2</i></tt> </td></tr> <tr valign="top"><td width="144"><tt><i>v1</i> between <i>v2</i> and <i>v3</i></tt> </td><td width="144"><br /></td><td width="192"><tt><i>v1</i></tt> lies between <tt><i>v2</i></tt> and <tt><i>v3</i></tt> (inclusive) </td></tr> <tr valign="top"><td width="144"><tt><i>not v1</i> between <i>v2</i> and <i>v3</i></tt> </td><td width="144"><br /></td><td width="192"><tt><i>v1</i></tt> lies outside of the range <tt><i>v2</i></tt> to <tt><i>v3</i></tt> (inclusive)</td></tr></tbody> </table><br /><br /><br />Durante las comparaciones entre variables, puede haber conversiones.<br />Para eso se usa el ANALISIS DE PROGRAMA.<br /><center><b>Conversion de Literales</b></center> <table style="text-align: left; margin-left: auto; margin-right: auto;" border="1"> <tbody><tr valign="top"><td width="240"><center><b>Description</b></center></td><td width="96"><center><b>Data Type</b></center> </td></tr> <tr valign="top"><td width="240">Numbers one to nine digits long</td><td width="96"><center><tt>i</tt></center> </td></tr> <tr valign="top"><td width="240">Numbers 10 or more digits long</td><td width="96"><center><tt>p</tt></center> </td></tr> <tr valign="top"><td width="240">All others</td><td width="96"><center><tt>c</tt></center></td></tr></tbody> </table><br />Conversiones de variables en la comparación.<br /><ul> <li>If one field is type <tt>f</tt>, the other is converted to type <tt>f</tt>. </li><li>If one field is type <tt>p</tt>, the other is converted to type <tt>p</tt>. </li><li>If one field is type <tt>i</tt>, the other is converted to type <tt>i</tt>. </li><li>If one field is type <tt>d</tt>, the other is converted to type <tt>d</tt>. Types <tt>c</tt> and <tt>n</tt>, however, are not converted. They are compared directly. </li><li>If one field is type <tt>t</tt>, the other is converted to type <tt>t</tt>. Types <tt>c</tt> and <tt>n</tt>, however, are not converted. They are compared directly. </li><li>If one field is type <tt>n</tt>, <i>both</i> are converted to type <tt>p</tt> (at this point, the other field can only be type <tt>c</tt> or <tt>x</tt>). </li><li>At this point, one field will be type <tt>c</tt> and the other will be type <tt>x</tt>. <tt>x</tt> is converted to type <tt>c</tt>. </li> </ul> <p> Conversions follow the same rules as those performed by the <tt>move</tt> statement. Type conversions are fully detailed in the ABAP/4 keyword documentation under the heading "Relational Operators for All Data Types." </p><br />COMPARACIÓN DE STRINGS DE CARACTERES<br /><center><b>Table 10.3 Special Operators for Character Strings</b></center> <center> <table border="1"> <tbody><tr valign="top"><td width="96"><br /><br /><center><b>Operator</b></center> </td><td width="96"><br /><br /><center><b>Means</b></center></td> <td width="96"><br /><br /><center><b>True When</b></center></td> <td width="96"><br /><center><b>Case<br />Sensitive?</b></center> </td><td width="96"><center><b>Trailing<br />Blanks<br />Ignored?</b></center> </td></tr> <tr valign="top"><td width="96"><tt><i>v1</i> CO <i>v2</i></tt> </td><td width="96">Contains Only</td><td width="96"><tt><i>v1</i></tt> is composed solely of characters in <tt><i>v2</i></tt> </td><td width="96"><center>Yes</center></td><td width="96"><center>No</center></td></tr> <tr valign="top"><td width="96"><tt><i>v1</i> CN <i>v2</i></tt> </td><td width="96"><tt>not <i>v1</i> CO <i>v2</i></tt> </td><td width="96"><tt><i>v1</i></tt> contains characters that are not in <tt><i>v2</i></tt> </td><td width="96"><center>Yes</center></td><td width="96"><center>No</center></td></tr> <tr valign="top"><td width="96"><tt><i>v1</i> CA <i>v2</i></tt> </td><td width="96">Contains Any</td><td width="96"><tt><i>v1</i></tt> contains at least one character in <tt><i>v2</i></tt> </td><td width="96"><center>Yes</center></td><td width="96"><center>No</center></td></tr> <tr valign="top"><td width="96"><tt><i>v1</i> NA <i>v2</i></tt> </td><td width="96"><tt>not <i>v1</i> CA <i>v2</i></tt> </td><td width="96"><tt><i>v1</i></tt> does not contain any character in <tt><i>v2</i></tt> </td><td width="96"><center>Yes</center></td><td width="96"><center>No</center></td></tr> <tr valign="top"><td width="96"><tt><i>v1</i> CS <i>v2</i></tt> </td><td width="96">Contains String</td><td width="96"><tt><i>v1</i></tt> contains the character string <tt><i>v2</i></tt> </td><td width="96"><center>No</center></td><td width="96"><center>Yes</center></td></tr> <tr valign="top"><td width="96"><tt><i>v1</i> NS <i>v2</i></tt> </td><td width="96"><tt>not <i>v1</i> CS <i>v2</i></tt> </td><td width="96"><tt><i>v1</i></tt> does not contain the character string <tt><i>v2</i></tt> </td><td width="96"><center>No</center></td><td width="96"><center>Yes</center></td></tr> <tr valign="top"><td width="96"><tt><i>v1</i> CP <i>v2</i></tt> </td><td width="96">Contains Pattern</td><td width="96"><tt><i>v1</i></tt> contains the pattern in <tt><i>v2</i></tt> </td><td width="96"><center>No</center></td><td width="96"><center>Yes</center></td></tr> <tr valign="top"><td width="96"><tt><i>v1</i> NP <i>v2</i></tt> </td><td width="96"><tt>not <i>v1</i> CP <i>v2</i></tt> </td><td width="96"><tt><i>v1</i></tt> does not contain the pattern in <tt><i>v2</i></tt> </td><td width="96"><center>No</center></td><td width="96"><center>Yes</center></td></tr> </tbody></table> </center> <p> </p> <p> These operators can be used in any comparison expression. The <tt>CS</tt>, <tt>NS</tt>, <tt>CP</tt>, and <tt>NP</tt> operators ignore trailing blanks and are not case sensitive.</p> <p>Esto es válido para variables, literales y strings.</p> <p>Contains Pattern: Se pueden usar las siguientes pattern:</p> <div style="text-align: center;"><center><b>Table 10.4 </b><tt><b>CP</b></tt><b> and </b><tt><b>NP</b></tt><b> Operators</b></center> </div> <table style="text-align: left; margin-left: auto; margin-right: auto;" border="1" bordercolor="#000000"> <tbody><tr valign="top"><td style="text-align: center;" width="96"><center><b>Character</b></center></td><td style="text-align: center;" width="192"><center><b>Used to</b></center> </td></tr> <tr valign="top"><td style="text-align: center;" width="96"><center><tt>*</tt></center></td><td style="text-align: center;" width="192">Match any sequence of characters. </td></tr> <tr valign="top"><td style="text-align: center;" width="96"><center><tt>+</tt></center></td><td style="text-align: center;" width="192">Match any single character. </td></tr> <tr valign="top"><td style="text-align: center;" width="96"><center><tt>#</tt></center></td><td style="text-align: center;" width="192">Interpret the next character literally.</td></tr></tbody> </table> <p style="text-align: center;"> </p><br /><tt>sy-fdpos</tt>. Es una variable del sistema que se puede usar para comparaciones.<br /><br /><hr /><br />Sentencia Case.<br /><br />La sintaxis de la sentencia case es la siguiente:<br /><br /><pre>case <i>v1</i>.<br /> when <i>v2</i> [ or <i>vn</i> ... ].<br /> <i>---<br /></i> when <i>v3</i> [ or <i>vn</i> ... ].<br /> <i>---<br /></i> [ when others.<br /> <i>---</i> ]<br /> endcase.</pre><br /><br /><br /><br /><br /><br />xxxxxRauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com2tag:blogger.com,1999:blog-8820473466351324723.post-18431547363506155822008-07-24T04:34:00.001-07:002008-07-25T03:14:05.658-07:00ABAP. Asignar,convertir y calcular.<span style="color: rgb(255, 0, 0);font-size:130%;" >Sentencias de asignación.Clear</span><br />Clear es la sentencia que se utiliza en principio para 'borrar' el contenido de una variable, o dicho de otra forma, llevarla a sus valores por defecto, sin embargo tiene algunos añadidos para iniciar la variable a conveniencia del programador.<br /><ul> <li>Si v1 es una variable tipo c sin adicciones, es rellenada con blancos. Si v1 es e cualquier otro tipo , es rellenada con ceros. Si v1 es un field string, sus componentes siguen la misma norma.</li><li>Si usamos "with v2" , el primer byte de v2 es usado para rellenar todo v1.</li><li>Si usamos "whit 'A'" todo v1 se rellenará del literal 'A'. (¿Y si v1 es numérico?).</li><li>Si usamos "with NULL", se rellena todo v1 con nulos. (????). </li> </ul> <hr /><br /><span style="color: rgb(255, 0, 0);font-size:130%;" >Sentencias de asignación.Move.</span><br />Move es el operador de asignación de contenido a cualquier variable, es equivalente al igual.<br />Al destino se le asigna todo o parte del origen.<br />Tenemos las siguentes sintaxis:<br /><br /><div style="text-align: center;"><pre>move v1 to v2.<br />v2 = v1.<br />v2 = v1 = vm = vn . . ..<br /><br /></pre></div> <span style="font-style: italic;">¡Cuidado con los espacios que son obligatorios!</span><br /><hr /><br /><span style="font-size:130%;"><span style="color: rgb(255, 0, 0);">Subcampos y asignación de subcampos.</span></span><br /><br /><pre>move v1[+N(L)] to v2[+N(L)].<br />v2[+N(L)] = v1[+N(L)].</pre><br />Si v1 es un char de 10:<br />v1(3) referencia a las tres primeras posiciones de v1, es equivalente a v1+0(3),<br />si v1='123456789' entonces v1+2(3) es '345' .<br />Los subcampos solamente son válidos con tipos char.<br /><br /><hr /><br /><span style="font-size:130%;"><span style="color: rgb(255, 0, 0);">Asignaciones simples numericas-char.</span></span><br /><br />Las conversiones con variables simples se hacen automáticamente.<br />Ejemplo:<br /><br />REPORT .<br />data: caracter(5) type c,<br />entero type i.<br />caracter = 126.<br />caracter = '126'.<br />entero = 128.<br />caracter = entero.<br />entero = '128'.<br />entero = 129.<br /><br />write: / caracter,entero.<br /><br /><hr /><br /><span style="font-size:130%;"><span style="color: rgb(255, 0, 0);">Problemática con las conversiones de tipos numéricos.</span></span><br /><br /><div id="result_box" dir="ltr">Los sistemas operativos suelen requerir que los campos numéricos se ajusten a ciertas reglas. Por ejemplo, la dirección de un entero de cuatro bytes requieren que sea un número par. Este tipo de normas se llama Alineamento de datos numéricos.<br />Este alineamiento, puede dar lugar a errores en las asignaciones de field strings que se supone que copia byte a byte.<br /><br />De todas formas con la entrada del unicode, esto se complica mas.<br /><br /><br /><hr /><br /><span style="font-size:130%;"><span style="color: rgb(255, 0, 0);">La sentencia move-corresponding</span></span><br />Con la sentencia move-corresponding, podemos copiar field string en otro field string solamente copiando los nombres que coincidan, el resto no se copia.<br /><br /></div> Es una solucción simple para los movimientos de datos numéricos de distintos tipos.<br /><br />sintaxis: move-correspondig sf1 to sf2. " sf1 y sf2 son field string.<br /><br /><hr /><br /><span style="font-size:130%;"><span style="color: rgb(255, 0, 0);">Calculos en ABAP.Operator.</span></span><br />La sentencia para realizar operaciones en ABAP, es la sentencia <span style="font-weight: bold;">operator</span>.<br /><center><b>Operadores en ABAP<br /></b></center> <center> <table border="1" bordercolor="#000000"> <tbody><tr valign="top"><td width="96"><center><b>Operator</b></center></td><td width="192"><center><b>Operation</b></center> </td></tr> <tr valign="top"><td width="96"><center><tt>+</tt></center></td><td width="192">Addition </td></tr> <tr valign="top"><td width="96"><center><tt>-</tt></center></td><td width="192">Subtraction </td></tr> <tr valign="top"><td width="96"><center><tt>*</tt></center></td><td width="192">Multiplication </td></tr> <tr valign="top"><td width="96"><center><tt>/</tt></center></td><td width="192">Division </td></tr> <tr valign="top"><td width="96"><center><tt>**</tt></center></td><td width="192">Exponentiation </td></tr> <tr valign="top"><td width="96"><center><tt>DIV</tt></center></td><td width="192">Integer division </td></tr> <tr valign="top"><td width="96"><center><tt>MOD</tt></center></td><td width="192">Remainder of integer division </td></tr> </tbody></table> </center> <p> </p><br /><blockquote> <pre>compute <i>v3</i> = <i>v1</i> op <i>v2</i> [op <i>vn</i> ...].<br /></pre> </blockquote> <blockquote> <pre><i>v3</i> = <i>v2</i> op <i>v2</i> [op <i>vn</i> ...].<br /></pre> </blockquote><br /><br /><span style="font-size:130%;"><span style="color: rgb(255, 0, 0);">Calculos en ABAP.add, substract,multiply,divide.</span></span><br />Son calculos simples directos.<br /><br />add v1 to v2<br />substract v1 to v2<br />multiply v1 to v2<br />divide v1 to v2<br /><br /><br /><span style="font-size:130%;"><span style="color: rgb(255, 0, 0);">Calculos en ABAP field string.add-correspondig,<br />substract-corresponding,<br />multiply-correspondig,<br />divide-correspondig.</span></span><br /><br />Se pueden hacer operaciones con field strings cuando coinciden los tipos de datos de los componentes.<br />Si los tipos de datos son distintos tenemos la posibilidad de operar solo con subcampos con los mismos nombres.<br /><br /><br /><hr /><br />Calculos con date.<br /><br /><br /><br /><br /><hr /><br /><span style="font-weight: bold;font-size:130%;" >Asignación dinámica. Punteros.</span><br />Un puntero se representa con entre tags <puntero&lgt;<br /><br />La sintasix simple es:<br /><pre><code><span style="font-weight: bold;">field-symbols <nombrepuntero>.</span></code></pre><br /><br />Y podemos asignarlo de esta forma<br /><pre><code>assign variable to <nombrepuntero>. </code></pre><br /><br />A partir de entonces el <nombrepuntero> se puede usar de la misma forma que la variable<br />data var(3).<br />field-symbols <pun>.<br />assign var to <pun>.<br /><pun> = 'XYZ'. " es equivalente a var = 'XYZ'.<br /><br />xxxxxxxRauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-44618413947464443352008-07-24T04:32:00.001-07:002008-07-24T04:32:58.202-07:00El diccionario de datos. Dominios y tipos de datos<p><span style="color: rgb(255, 0, 0);font-size:180%;" > Explorando Componentes de Tablas</span><br /></p> <p><span style="color: rgb(255, 0, 0);font-size:180%;" >Campos<br /></span></p> <p>Una Tabla en SAP está íntimamente ligada con una tabla de la base de datos, sobre todo en las tablas trans parentes que son las que estamos tratando.</p> <p>Las tablas de la base de datos están formadas por <span style="font-weight: bold;">campos</span>. Las tablas de SAP tambien están formadas por campos.<br /></p> <p>Los campos en la base de datos, están formados basicamente por un nombre, un tipo de datos(char,fecha,numero.....) y unos datos especificativos (longitud, decimales). En SAP, estos datos están agrupados en unas entidades llamadas <span style="font-weight: bold;">Elementos de Datos</span>,<br /></p> <p>Los<span style="font-weight: bold;"> Elementos de Datos</span> de SAP, contienen una parte semántica (descripciones y ayudas), y una parte técnica que es lo que está mas cerca de la tabla de base de datos, es decir el tipo del campo de la tabla de la base de datos su longitud, decimales....... Esta parte técnica se agrupa en unas entidades llamadas <span style="font-weight: bold;">Dominios</span>.</p> Cuando hablamos del tipo de un campo de una tabla de SAP, puede ser:<br /><ul> <li>El Elemento de Datos al que pertenece. </li><li>El Dominio al que pertenece. (Parte del elemento de Datos) </li><li>El Tipo de campo elemental(base de datos). (Parte del dominio);</li> </ul><br />Los Elementos de Datos y Dominios pueden crear/editar/borrar desde el diccionario SAP, pero el tipo de campo de la base de datos, se puede solo consultar.<br /><hr /><br /><h4><span style="color: rgb(255, 0, 0);font-size:180%;" >Tipos de campos basicos</span>.<br /></h4> <p> Estos tipos especifican la representación usada internamente por la basse de datos para almacenar los valores de los campos. Son por lo tanto fuertemente dependientes de la base de datos. Algunos tipos tienen deteminados una validación de formato y una salida formateada del campo. Por ejemplo los datos de fecha y hora.</p> <p>Hay campos que necesitan datos adicionales como su longitud y/o número de decimales.<br /></p> <p> </p> <center><b>Tipos de Datos mas comunes</b></center> <center> <table border="1" bordercolor="#000000"> <tbody><tr valign="top"><td width="144"><center><b>Type</b></center></td><td width="288"><center><b>Description</b></center> </td></tr> <tr valign="top"><td width="144"><tt>CHAR</tt></td><td width="288">Character strings (maximum 255 characters) </td></tr> <tr valign="top"><td width="144"><tt>DEC</tt></td><td width="288">Decimal values (maximum length 31) </td></tr> <tr valign="top"><td width="144"><tt>DATS</tt></td><td width="288">Date field</td> </tr> <tr valign="top"><td width="144"><tt>TIMS</tt></td><td width="288">Time field</td> </tr> <tr valign="top"><td width="144"><tt>INT1</tt>, <tt>INT2</tt>, <tt>INT4</tt> </td><td width="288">Integer values </td></tr> <tr valign="top"><td width="144"><tt>NUMC</tt></td><td width="288">Character field that can contain only numerics </td></tr> </tbody></table></center><br />Existen también tipos de campo que son exclusivos de SAP R/3 y se encarga SAP convertirlos a datos reales de base de datos, como por ejemplo el tipo CLNT del que ya hemos hablado (mandante).<br /><br /><hr /> <h4><span style="color: rgb(255, 0, 0);font-size:180%;" >Dominios</span>.</h4> Veamos lo que se necesita para crear un <span style="font-weight: bold;">dominio</span>.<br /><ul style="font-weight: bold;"> <li>Nombre del dominio.</li> </ul> <blockquote>10 Caracteres máximo.<br />Tienen que empezar por y o por z, el resto esta reservado por SAP.<br /><ul style="font-weight: bold;"><li><br /></li></ul></blockquote> <ul style="font-weight: bold;"> <li>Descripción corta.</li> </ul> <blockquote>El campo descripción corta, contendrá una descripción del dominio. El usuario final nunca lo ve, sino que sólo se muestra a los desarrolladores. Cuando buscamos un dominio para un cambo, veremos esta descripción. Puede ser muy util escribirla correctamente.</blockquote> <ul> <li><span style="font-weight: bold;">tipo de campo.</span></li> </ul> <blockquote>Se trata del tipo de campo explicado anteriormente. Está intimamente ligado a la base de datos utilizada.Según el tipo de campo, nos pueden aparecer campos adicionales para implementar correspondientes al tipo de dato elegido. Como por ejemplo la longitud y los decimales.</blockquote><br /><ul> <li><h4>Opciones de Formato. Longitud y decimales.</h4></li> </ul> <blockquote>En algunos casos se necesita la longitud del campo y el numero de decimales.<br /><p>En los campos tipo DEC, el punto decimal, no se guarda en la base de datos. Sólo la parte numérica se almacena, no la coma decimal. Al recuperar el dato, la posición de la coma decimal se determina por el valor que se pone puso en el campo decimales.</p></blockquote> <ul> <li><span style="font-weight: bold;">Opciones de Salida. Longitud, minusculas,signo.</span></li> </ul> <blockquote>Las opciones de salida, nos permiten un pequeño control sobre la visualización de los datos que contienen estos campos.</blockquote><br />Con estos datos, ya sería suficiente para crear un dominio.<br /><h4><span style="color: rgb(255, 0, 0);font-size:180%;" >Elemento de Datos</span>.</h4> <h4>Elemento de datos.</h4> Veamos lo que se necesita para crear un <span style="font-weight: bold;">Elemento de datos</span>.<br />descripcion breve<br />el dominio al que pertenece.<br />Las etiquetas?<br />Falta terminarRauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-4579460712171588052008-07-24T04:28:00.000-07:002008-07-24T04:29:51.442-07:00abap.estructuras,field string<p><span style="color: rgb(255, 0, 0);font-size:130%;" > Field strings</span><br /></p> <p>Un Field string, es un conjunto de varios datos, se corresponde a una estructura del Diccionario de SAP, por lo que también se puede corresponder con los datos de una tabla.</p> <p>Hay dos formas de definir Field strings en SAP.</p> <hr /> <p><span style="color: rgb(255, 0, 0);font-size:130%;" > Field strings con la declaración data.</span></p><br />Sintaxis básica:<br /><pre><blockquote>data begin of fs1.<br /><br />data f1[(l)] [type t] [decimals d] [value 'xxx'].<br />data f2[(l)] [type t] [decimals d] [value 'xxx'].<br />...<br />data end of fs1.</blockquote></pre> Ejemplo:<br /><pre><blockquote>data begin of totals_1.<br />data region(7) value 'unknown'.<br />data debits(15) type p.<br />data count type i.<br />data end of totals_1.</blockquote>En un formato compuesto típico:<br /></pre> <pre><blockquote>data: begin of fs1,<br /><br />f1[(l)] [type t] [decimals d] [value 'xxx'],<br />data f2[(l)] [type t] [decimals d] [value 'xxx'],<br />...<br />data end of fs1.</blockquote></pre> Ejemplo:<br /><pre><blockquote>data begin of totals_1.<br />data region(7) value 'unknown'.<br />data debits(15) type p.<br />data count type i.<br />data end of totals_1.</blockquote><br />Un componente de un string field tambien puede ser un 'like'<br /></pre> Ejemplo:<br /><pre><blockquote>data begin of fs1.<br />data region(7) value 'unknown'.<br />data debits(15) type p.<br />data count type i.<br />data end of fs1.</blockquote></pre> <blockquote>data begin of fs2.<br />data region(7) value 'unknown'.<br />data debits(15) type p.<br />data cosa like fs1.<br />data count type i.<br />data end of fs1.</blockquote> Y se puede incluir un field string en otro fied string, pero cuidado que no puede ser en la forma compuesta porque la sentencia include no es parte de data.<br /><br />Ejemplo:<br />data: begin of totals_1,<br /> region(7) value 'unknown',<br /> debits(15) type p,<br /> count type i,<br /> end of totals_1,<br /> totals_2 like totals_1.<br />data: begin of totals_3,<br /> xregion(7) value 'unknown',<br /> xdebits(15) type p,<br /> xcosas like totals_1.<br /> <span style="font-style: italic;"> include structure totals_1.</span><br />data: xcount type i,<br /> end of totals_3.<br /><br /><br />A los componentes de un field string accedemos con la tipica barra "-"<br />por ejemplo en este ultimo ejemplo, podriamos escribir:<br /><br />totals_3-xcosas-region = '123'.<br />write totals_3-xcosas-region.<br /><br /><span style="font-weight: bold;">Usos especiales del field string.</span><br />puede usarse el like para definir otro field string igualito.<br />pueden hacerse asignaciones globales si el field string es todo char.<br />Ejemplo:<br />data : begin of localidad,<br /> ciudad(2),<br /> pueblo(3),<br /> end of localiddad.<br />localidad='12345'.<br />write: localidad-ciudad,localidad-pueblo.<br /><p><br /></p> <hr /> <p><span style="color: rgb(255, 0, 0);font-size:130%;" > Field strings con la declaración <span style="font-weight: bold;">tables</span>.</span></p> Con tables, podemos definir un field string con el mismo nombre y forma que una tabla o estructura del diccionario.<br />Sintaxis básica:<br /><pre><blockquote>tables fs1.<br /></blockquote></pre> fs1 tiene que ser un elemento del diccionario.<br /><br /><br />Una tabla es siempre global (visivilidad que aun no se muy bien como funciona)<br />Una tabla es la forma de interacturar con un select de una tabla de la base de datos.<br /><br /><p><br /></p> <hr /> <p><span style="color: rgb(255, 0, 0);font-size:130%;" > Tipos definidos por el usuario.</span></p> Podemos definir tipos y luego usarlos de esta forma:<br /><blockquote> <pre>types <i>t1</i>[(<i>l</i>)] [type <i>t</i>] [decimals <i>d</i>].<br /></pre> </blockquote> <p> or </p> <blockquote> <pre>types <i>t1</i> like <i>v1</i>.<br /></pre> </blockquote><br /><br /><br /><p><br /></p> <hr /> <p><span style="color: rgb(255, 0, 0);font-size:130%;" > Tipos definidos por el usuario estructurados.</span></p> Podemos definir tipos de estructura y luego usarlos de esta forma:<br /><pre> 1 report ztx0813.<br />2 types: begin of address,<br />3 street(25),<br />4 city(20),<br />5 region(7),<br />6 country(15),<br />7 postal_code(9),<br />8 end of address.<br />9<br />10 data: customer_addr type address,<br />11 vendor_addr type address,<br />12 employee_addr type address,<br />13 shipto_addr type address.</pre><br /><p><br /></p> <hr /> <p><span style="color: rgb(255, 0, 0);font-size:130%;" > Grupos de tipos(Type Groups). Sentencia type-pools.</span></p> Podemos definir varios tipos en el diccionario SAP agrupandolos con un nombre (llamados type Groups) y acceder a ellos<br />mediante la sentencia type-pools.<br />A los tipos accederemos de esta forma : <span style="font-weight: bold;">grupo_</span><span style="font-style: italic;">tipo</span>.<br /><br /><pre> type-pools ztx1.<br />data: begin of american_sums,<br /> petty_cash type ztx1_dollars,<br /> pay_outs type ztx1_dollars,<br /> lump_sums type ztx1_dollars,<br /> end of american_sums.</pre><br /> Existe un grupo de tipos en el diccionario que se llama ztx1, en los cuales está definido el tipo dollars, por lo que el tipo es en el programa ABAP ztx1_dollars.<br /><br /><br /><br /><br />xxxxxxRauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-58301780418733635712008-07-24T04:25:00.000-07:002008-07-24T04:26:00.446-07:00ABAP modularización.<p><span style="font-weight: bold;">Unidad Modularización</span> es como un shell en que podemos escribir código.</p> <p>Permite segregar un grupo de lineas de código del resto, y lo ejecutamos en un momento determinado. Las lineas de codigos dentro de una modularización actua como un mini-programa que puede llamarse desde otro programa.</p> <p><br /></p> <p><br /></p> <p> ABAP/4 Ofrece tres tipo de unidades de modulariación. </p> <ul> <li>Events </li><li>Subroutines </li><li>Function modules </li> </ul> <p>Usar unidades de modularización para eliminar código redundante en su programa y hacer mas facil leerlo. Por ejemplo, suponemos que tenemos una serie de sentencias que forman una direccion de correo, y necesita formar direcciones de correo en distintos lugares de su programa. En lugar de euplicar el codigo en su programa, es una buena idea escribir el código en una unidad de modularización y llamarla cuando necesite formar una direción.</p><br /><h2><a name="Events"><span style="color: rgb(255, 0, 0);font-size:180%;" > Eventos</span></a></h2> <p>Pese a su apariencia, los programas ABAP/4 estan orientados a eventos. Una buena forma de entender ABAP/4 es entender bien los eventos. </p> <h3><a name="DefiningEvents"> Definiendo Eventos</a></h3> <p>Un evento es una etiqueta que identifica una seccion de codigo. La ssecion de codigo asociada con un evento, comienza con un nombre de evento y termina cuando el siguiente nombre de evento se encuentra.En el ejemplo siguiente, los nombres de eventos son : inicializacion, start-of-selection, y end-of-selection. Los nombres de eventos son palabras reservadaas. No podemos crear nuevos eventos, solamente podemos usar los que ya existen.<br /></p><br /><p>Ejemplo:</p> <pre> report ztx1701.<br />initialization.<br />write / '1'.<br /><br />start-of-selection.<br />write / '2'.<br /><br />end-of-selection.<br />write / '3'.</pre> <span style="font-weight: bold;">Etiquetas repetidas<br /></span> <blockquote>Una etiqueta de evento puede estar repetida, y entonces el codigo de las dos etiquetas pertenecen al mismo evento ejecutandose en el orden escrito.<br />etiqueta1.<br />sentencias "primero se ejecutan estas<br />etiqueta2.<br />sentencias.<br />etiqueta1.<br />sentencias" y luego estas</blockquote><br /><h3><a name="DefiningEvents"> Driver program.</a></h3> <p>Un driver program es un programa que controla otro (driven) programa. SAP suministra driver programas con el R/3 system. Nosotros tenemos que suministar el driven (lanzado) programa. Cuando ejecutamos el programa, el driver programa es el primero que se lanza y entonces llama a los eventos de nuestro programa..<br />Esto pasa con todos los programas que escribimos en ABAP/4, pero es posible que no lo supieramos hasta ahora. Lea este parrafo cuidadosamente. Lo repetimos una vez mas, cuando ejecutamos nuestros programas, un driver programa comienza primero y controla nuestro programa llamando a los eventos que hay escritos en el.</p> EL código asociado con un evento es ejecutado por una sentencia del driver programa. Los eventos son lanzados por el driver programa en una predefinida y predecible secuencia.<br /><br />El orden en que escribimos los eventos en el programa ABAP no es importante, aunque es util escribirlos mas o menos en orden.<br /><br />Un bucle o condición tiene que estar siempre completamente dentro de un evento. O dicho de otra forma, Un bucle o condición no puede tener una etiqueta de evento en su ambito.<br /><br /><br /><br /><br />Varios eventos ABAP.<br /><br /><center><b> ABAP/4 Eventos<br /><br /></b></center> <div style="text-align: center;"> </div> <table style="text-align: left; margin-left: auto; margin-right: auto;" border="1"> <tbody><tr valign="top"><td width="192"><center><b>Category</b></center></td><td width="192"><center><b>Events</b></center> </td></tr> <tr valign="top"><td width="192">Driver</td><td width="192"><tt>initialization</tt><br />at selection-screen<br />start-of-selection<br />get<br />end-of-selection </td></tr> <tr valign="top"><td width="192">User</td><td width="192"><tt>at line-selection</tt><br /><tt>at pfn</tt><br /><tt>at user-command</tt> </td></tr> <tr valign="top"><td width="192">Program</td><td width="192"><tt>top-of-page</tt><br /><tt>end-of-page</tt></td></tr></tbody> </table><br />Los Driver eveventos son lanzados por el Driver programa. Los Eventos de usuario son desencadenados por el usuario a traves de la interfaz de usuario. Los eventos de programa son desencadenados dentro del programa.. En este capítulo se detalla el uso de la inicialización, puesta en marcha de la selección, y al final de su selección. Tenga en cuenta que algunos de estos eventos se producen entre el comienzo de la selección y al final de su selección.<br /><br /><h3><a name="Defaultingtostartofselection">EL Evento por defecto es start-of-selection</a></h3> <p> Si escribimos sentencias ejecutables sin etiqueta de evento, se adjudican por defecto a start-of-selection. </p> <span style="font-weight: bold;"><br />Orden de eventos lanzados por el Driver Program<br /></span> <ul> <li>Primero lanza el evento <tt>initialization</tt> si existe. </li><li>Muestra la pantalla de seleccion del programa (si existe).. </li><li>Lanza el evento <tt>start-of-selection</tt> event, (recordar que es el evento por defecto en el programa ABAP). Si no hay codigo para ejecutar, no hace nada. </li><li>Lanza el evento <tt>end-of-selection</tt> si existe. </li><li>Muestra la lista de salida al usuario(output list). </li> </ul> <a name="Defaultingtostartofselection"></a><span style="font-weight: bold;"><br /><br /><br />Consideraciones epeciales cuando se usa write en eventos</span> <p>El sistema de eventos tiene dos inusuales efectos en la sentencia write. </p> <ul> <li>Si el programa tiene una pantalla de selecion y ponemos una sentencia write en cualquier evento de antes de start-of-selection, no veremos el ouput de el. Por ejemplo si tenemos una sentencia statement en el programa, una pantalla de seleción es creada para el programa para permitir al usuario entrar parametros. Si escribimos write en inicializacion, no veremos la salida de este write. </li><li>Un nuevo evento siempre empieza una nueva linea en el output Por ejemplo si ponemos un write en start-of-selection, un write en end-of-selection empezará con una nuevalinea. Podemos usar la sentencia skip to linea para saltarnos este problema.<br /></li> </ul><br /><h4>Lanzando top-of-page</h4> <p> ¿como top-of-of page es lanzado en relacion a otros eventos?.<br />Si el programa no tiene una selection screen, la primera sentencia write ejecuta el top-of-page. Si el programa tiene una selection screen, es posible que top-of-page sea lanzado dos veces: </p> <ul> <li>Por el write ejecutado antes de la selection screen. </li><li>Por el primer write despues de selection screen es mostrado. </li> </ul> <p> Solamente si escribe alguna sentencia inusual en top-of-page deberá tener cuidado con este doble lanzamiento de eventos. </p> <p> Si se ejecuta dos veces <tt>top-of-page</tt>, el write del primero sá descartado. Hay que tener cuidado </p> <ul> <li>No se puede ver los writes antes de la seleccion. Por lo que no suele escribirse la sentencia write en estos casos. </li><li>Como solamente se suele escribir sentencias write en top-of-page, esta duplicación no hace daño. </li> </ul> <h3><a name="LeavinganEvent"> Saliendo de un Evento</a></h3> <p> Se puede salir de un evento en cualquier momento con las siguientes sentencias: </p> <ul> <li><tt>exit</tt> </li><li><tt>check</tt> </li><li><tt>stop</tt> </li> </ul> <p> At this time, please review the function of the <tt>check</tt> statement (presented in <a href="file:///D:/sapdoc/Copy%20of%20Sap%20-%20Sams%20Teach%20Yourself%20Abap%204%20In%2021%20Days/ch10/ch10.htm">Chapter 10</a>, "Common Control Statements"). </p> <p>Exit y check son sentencias que se usan dentro de un bucle, en tal caso, no tienen nada que ver con el evento.</p> <p>Exit y check escritos fuera de un bucle, tienen que ver con eventos.</p> <p><span style="font-weight: bold;">Check</span><br /></p> <blockquote>Si el resultado de check es true, se sale del evento y el programa sigue su curso.</blockquote> <p style="font-weight: bold;">Stop<br /></p> <blockquote><p><span style="font-weight: bold;">end-of-selection.</span> se sale del evento y el programa sigue su curso.</p><p><span style="font-weight: bold;">fuera de end-of-selection.</span> Se sale del evento y se ejecuta el evento end-of-selection.</p></blockquote> <p style="font-weight: bold;">Exit</p> <p><span style="font-weight: bold;">En eventos anteriores a start-of-selection</span>, se sale del evento y el programa sigue su curso.<br /></p> <blockquote><p><span style="font-weight: bold;">En start-of-selection y eventos posteriores </span><br /></p><p><tt><span style="font-weight: bold;">----------top-of-page.</span> se sale del evento y el programa sigue su curso.<br /></tt></p><span style="font-weight: bold;">----------------resto de eventos.</span> Termina el report y muestra el output list.</blockquote><br />Consejos:<br /><blockquote>No usar stop en los siguientes eventos:<br />initialization,<br />at selection-screen output,<br />top-of-page, Se produce short dump<br />end-of-page. Se puede perder salida(si usa write).<br />Tecnicamente,stop puede funcionar bien en top-of-page y end-of-page si nos abasstenemos de poner sentencias write en el end-of-sselection. Es más seguro de evitar por completo dentro de estos eventos.</blockquote> <span style="font-weight: bold;">sy-subrc</span><br /><blockquote><tt>check</tt>, <tt>exit</tt>, y <tt>stop</tt> nocambian el valor de <tt>sy-subrc</tt>. Si hace falta podemos asignar nuestro propios valores.</blockquote><br /><h3><a name="ReturningfromtheList">El botón volver (back). Copia de los datos de la pantalla de selección.<br /></a></h3> <p>Miremos mas de cerca los eventos en un report que tiene una selection screen (Recordar que la sentencia parameters genera una pantalla de selección).</p> <p>Cuando el usuario ejecuta el report, el conductor(driver) lanza la inicialización y muestra la pantalla de selección. Cuando el usuario presiona el botón de ejecutar, el conductor lanza el resto de eventos y el programa termina mostrando al usuario la lista de salida. El usuario entonces presiona el boton Retorno(back), para volver, el conductor restaura el proceso comenzando al principio de la lista de eventos, comenzando por el evento inicialización y El usuario ve el la pantalla de seleción. Sin embargo hay alguna diferencia cuando ocurre la restauración.</p> La pantalla de seleción tiene una copia (propia) de las variables que se muestran en el. La primera vez que se ejecuta el report y el programa conductor toma el control despues de terminar la inicializacion, <span style="font-weight: bold;">guarda en su copia los valores</span> de las variables que corresponden a la pantalla de seleción y los muestra . El usuario entonces puede modificar los campos. Cuando el usuaro pulsa el boton de ejecución, el conductor <span style="font-weight: bold;">guarda en su copia los valores </span>de las variables de la pantalla de selección a parte de guardar los datos en las variables del programa.<br /><br />Sin embargo la primera copia(la de despues de la inicialización) <span style="font-weight: bold;">solamente ocurre la primera vez </span>que ejecutamos el programa, por lo que al usuario se le muestra los últimos valores introducidos.<br /><br /><h2><a name="Subroutines"><span style="color: rgb(255, 0, 0);font-size:180%;" > Subrutinas. form,endfor y perform.<br /></span></a></h2> <p>Una subrutina es una sección de código reutilizable. Es como un mini-programa que puede ser llamado desde otro punto de su programa. Dentro de el, se pueden definir las variables, ejecutar declaraciones, calcular los resultados, y escribir salida. Para definir una subrutina, se utiliza <span style="font-weight: bold;">la sentencia form</span> para indicar el comienzo y la <span style="font-weight: bold;">sentencia endform </span>para terminarla. El nombre de una subrutina no puede exceder los 30 caracteres.</p> Para llamar una subrutina, usamos la <span style="font-weight: bold;">sentencia perform</span>.<br />Hay dos tipos de subrutinas. <ul> <li>Subrutinas internas. </li><li>Subrutinas externas.<br /></li> </ul><br /><br /><h3><a name="DefiningandCallingInternalSubroutines">Definir y llamar a una subrutina interna.</a></h3> <p>Las definiciones de subrutinas suelen normalmente escribirse al final del programa , despues de todos los eventos.</p> <p>La sentencia form define el fin del evento precedente y el principio de una subrutina. Las subrutinas no pueden anidarse dentro de eventos.</p><br /><h4>Sintaxis de la sentencia form.</h4> <blockquote> <pre>form <i>s</i> [tables <i>t1 t2 ...</i>]<br /> [using <i>u1 value(u2) ...</i>]<br /> [changing <i>c1 value(c2) ...</i>].<br />---<br />endform.<br /></pre> </blockquote> <p> donde: </p> <ul> <li><tt><i>s</i></tt> es el nombre de la subrutina<br /></li><li><tt><i>t1</i></tt>, <tt><i>t2</i></tt>, <tt><i>u1</i></tt>, <tt><i>u2</i></tt>, <tt><i>c1</i></tt><i>,</i> y <tt><i>c2</i></tt> son parámetros. </li><li><tt>tables</tt> permite pasar tablas internas como parámetros<br /></li><li>La opción value no puede ser usada con <tt>tables</tt>. </li><li>La opción value, puede ser aplicada a variables via using o changing. </li><li><tt>---</tt> represents any number of lines of code. </li> </ul> <p> The following points apply: </p><br /><ul> <li>Los parámetros son opcionales.<br /></li><li>Hay que respetar el orden.Siempre las tablas primero, luego las using y luego las changing. </li><li>No puede haber mas de una opcion tables , using y/o changig Each addition can only be specified once. </li><li>No usar comas para separar parámetros. </li><li><tt>No se permiten tables de databases.</tt> </li><li>Una subrutina puede llamar a otra/s subrutinas.<br /></li><li>Esta soportada la Recursividad. Una subrutina puede llamarse a si misma. Y una subrutina puede llamar a la subrutina que le ha llamado. </li><li>No se pueden anidar subrutinas (No podemos definir subrutinas dentro de otras subrutinas.) </li> </ul><br /><h4>Syntax for the perform Statement</h4> <blockquote> <pre>perform <i>s</i> <br /> [tables <i>t1 t2 ...</i>]<br /> [using <i>u1 u2 ...</i>]<br /> [changing <i>c1 c2 ...</i>].<br /></pre> </blockquote> <blockquote> <pre>perform <i>n</i> of <i>s1</i> <i>s2</i> <i>s3</i> ... <br /> [tables <i>t1 t2 ...</i>]<br /> [using <i>u1 u2 ...</i>]<br /> [changing <i>c1 c2 ...</i>].<br /></pre> </blockquote> <p><br /></p> <ul> <li><tt><i>s</i></tt><i>, </i><tt><i>s1</i></tt><i>, </i><tt><i>s2</i></tt><i>, </i><tt><i>s3</i></tt><i>,</i> son nombres de subrutinas. </li><li><tt><i>n</i></tt> is un numerico valor (si vale 1, se ejecutara s1, si vale 2, se ejecutara s2.......)<br /></li><li><tt>tables</tt>, <tt>using</tt>, and <tt>changing</tt> son opcionales<br /></li><li>La opción <tt>value()</tt> no puede usarse con <tt>perform</tt>.</li> </ul><br /><h3><a name="LeavingaSubroutine">Saliendo de una subrutina.</a></h3> <p> Podemos salir de una subrutina con cualquiera de estas sentencias </p> <ul> <li><tt>exit</tt> </li><li><tt>check</tt> </li><li><tt>stop</tt> </li> </ul> <p>Exit y check dentro de un bucle no tienen efecto en una subrutina.<br /></p> <ul> <li><tt>check</tt> and <tt>exit</tt> Salen de la subrutina y continua con la sentencia que sigue al perform que llamó a la subrutina </li><li><tt>stop sale de la surutina y va directamente al end-of-selection evento.</tt>???? </li> </ul> <p> <tt>check</tt>, <tt>exit</tt>, y <tt>stop</tt> no modifican el valor de sy-subrc. </p><br /><h3><a name="DefiningGlobalandLocalVariables">Definiendo Variables locales y globales.</a></h3> <p><span style="font-weight: bold;">Variables globales.</span><br /></p> <p>Una <i>variable global </i> es una que es definida fuera de una subrutina usando la sentencia tables o data. Se puede acceder a ellas en cualquier punto del programa dentro o fuera de eventos y subrutinas. Una buena práctica es escribir la definiciones de las variables globales al principio del programa antes de cualquier linea de codigo ejecutable.</p> <span style="font-weight: bold;">Variables locales</span><br />Una variable local es una variable que que se defina dentro de una subrutina usando las sentencias <span style="font-weight: bold;">local</span>,<span style="font-weight: bold;">data</span> o <span style="font-weight: bold;">statics</span>. Estas variables decimos que son locales a la subrutinas.<br /><ul> <li><span style="font-weight: bold;">Local</span></li> </ul> <blockquote>Una variable definida con la sentencia local, es accesible por las subrutinas llamadas por la subrutina en la que están definidas las variables. Son inicializadas(se crea una copia) cada vez que se llama a la subrutina.<br /></blockquote> <ul style="font-weight: bold;"> <li>data</li> </ul> <blockquote>Las variables definidas localmente con la sentencia data, son inicializadas(se crea una copia) cada vez que se llama a la subrutina, pero al contrario de las creadas con Local, no son visibles por las subrutinas llamadas.</blockquote> <ul style="font-weight: bold;"> <li>statics</li> </ul> <blockquote>Las variables definidas con statics son creadas una sola vez, por lo que su valor persiste. No son visibles por las subrutinas llamadas.</blockquote> <span style="font-size:130%;"><span style="font-weight: bold;">Visivilidad global versus Sentencia local.</span></span><br /><blockquote>Una variable global es visible para todo el programa pero <span style="font-weight: bold;">¡ojo! solamente a partir del punto donde se ha definido.</span><br />Una variable creada con la sentencia local en una subrutina, es visible por cualquier otra subrutina llamada por esta. <span style="font-weight: bold;">¡aunque la subrutina llamada esté escrita antes de la definición de la variable.!<br /></span>Es una de las muchas razones de no escribir globales dentro de una subrutina.<span style="font-weight: bold;"><br /><br /></span></blockquote><br /><h4><span style="font-size:130%;">Definiendo una <tt>tables</tt> Work Area con local.</span><br /></h4> <p>Las variables definidas usando la sentencia tables son siempre globales . Pero no parece que haya motivos para escribir una sentencia tables dentro de una subrutina. </p> <p> Para definir una local tabla wrok area dentro de una subrutina, usaremos local en lugar de tables.La sintaxis es la misma, y es visible por las subrutinas llamadas.<br /></p><br />Siempre que coincidan en nombre una variable local y otra global, siempre tiene preferencia la local, por lo que las variables globales se hacen invisibles cuando hay una variable local con el mismo nombre.<br /><br /><h4>Defining Data</h4> <p>Las variables definidas con la sentencia data en el comienzo del programa son globales. Las definiciones data en una subrutina, son locales a la subrutina. La memoria es asignada para estas variables cuando la subrutina es llamada, y liberada cuando la subrutina termina. Lo mismo que las variables definidas usando local, los valores de data locales se pierden cuando la subrutina termina.</p> La variables locales cradas con la sentencia statics no se pierden ni se liberan cuando se termina la subrutina. La sintaxis de static es la misma que la sentencia data. La memoria de variables estáticas es asignada la primera vez que se llama y se conserva al fin de la subrutina. Sin embargo, una variable estática es solo visible dentro de la subrutina. La siguiente vez que la subrutina es llamada, la variable vuelve a ser visible ysu valor es el mismo que la ultima vez que se retorno la subrutina.<br /><br /><br /><h2><a name="PassingParameters"><span style="color: rgb(255, 0, 0);font-size:180%;" >Pasando Parámetros a subrutinas.<br /></span></a></h2> Los parámetros son variables,tablas,constalntes,literales... que se pasan de unas subrutinas a otras.<br /><br /><ul> <li><span style="font-weight: bold;">Parámetros formales</span></li> </ul> <blockquote>Son los que se definen en la sentencia form con una de estas opciones: tables,changing,using.</blockquote> <ul> <li><span style="font-weight: bold;">Parámetros actuales</span></li> </ul> <blockquote>Son las variables,tablas,cosntantes.... que se pasan a la subrutina en la sentencia perform.</blockquote><br /><br /><span style="font-weight: bold;">Tipado de los parámetros formales.</span><br />En la sentencia form hemos visto, que los parametros se escriben uno detras de otros separados por espacios.<br />Si además ponemos el tipo, se llaman <span style="font-weight: bold;">parámetros tipados</span>.<br /><br />Ejemplo de form con parámetros sin tipar.<br /><pre>form s1 using p1 p2 p3 p4. </pre> Ejemplo de form con parámetros tipados.<br /><pre>form s1 using p1 type c p2 type i p3 type d p4 type t.</pre><br /><br /><span style="font-weight: bold;">Pasando field strings como parámetros.</span><br /><br />Podemos pasa field strings (estructuras) como parámetros de este modo:<br /><ul> <li><tt>like <i>x</i></tt> </li><li><tt>structure <i>x</i></tt> </li> </ul> Donde x es un field string o una estructura o tabla del diccionario.<br /><br /><span style="font-weight: bold;">Paso por referencia,valor,resultado.</span><br /><br /><p>Hay tres formas de pasar los valores a una subrutina.<br /></p> <ul> <li>Paso por referencia. </li><li>Paso por valor. </li><li>Paso por valor y resultado. </li> </ul> La sintaxis de la sentencia form determina como pasan las variables. El perform no puede cambiar la forma de paso .<br /><br /><div style="text-align: center;"><center><b>forma de paso de variables a subrutinas.</b></center> </div> <table style="text-align: left; margin-left: auto; margin-right: auto;" border="1"> <tbody><tr valign="top"><td width="192"><center><b>Addition</b></center></td><td width="192"><center><b>Method</b></center> </td></tr> <tr valign="top"><td width="192"><tt>using <i>v1</i></tt> </td><td width="192">Por referencia</td></tr> <tr valign="top"><td width="192"><tt>changing <i>v1</i></tt> </td><td width="192">Por referencia<br /></td></tr> <tr valign="top"><td width="192"><tt>using value(<i>v1)</i></tt> </td><td width="192">Por valor<br /></td></tr> <tr valign="top"><td width="192"><tt>changing value(<i>v1</i>)</tt> </td><td width="192">Por valor y resultado.<br /></td></tr></tbody> </table><br />Por defecto, los valores se pasan por referencia.<br /><br />LOS PARÁMETROS CON LA OPCIÓN CHANGING SOLO DIFIEREN DE LA OPCIÓN USING CUANDO SE PASA POR VALOR . UN CHANGING SIEMPRE PUEDE CAMBIAR DE VALOR AUNQUE SE PASE CON LA OPCION VALUE.<br /><br /><br /><br />xxxRauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com1tag:blogger.com,1999:blog-8820473466351324723.post-121641946107838092008-07-23T07:50:00.001-07:002008-07-23T07:50:59.243-07:00abap.Variables,literales,constantes<span style="color: rgb(255, 0, 0);font-size:180%;" >Buffer de Programa y el Area Roll</span><br /><br />Los Programas son almacenados en el servidor de aplicaciones en un <i>buffer de programa</i>. Cuando un usuario pide ejecutar un programa, una busqueda es hecha en el buffer. Si es encontrado, y no ha sido modificado en la base de datos, la copia almacenada es usada. Si no se encuentra, o si la copia de la base de datos es mas nueva, el programa se vuelve a cargar.<br /><p>Si varios usuarios quieren ejecutar un programa, se usa la misma copia. La diferencia está en un area separada de memoria llamada<i style="font-weight: bold;"> roll area</i>. Un area roll es creada por cada usuario y programa.<br />El sistema usa el roll area para almacenar la información sobre la ejecución del programa y las asignaciones de memoria. La informacion de las variables y sus valores, el puntero al programa, y la lista de salida son guardadas en el roll area.</p> <p>Por ejemplo, suponemos que un usuario ejecuta un programa y un area roll es asignada.<br />Si, sin esperar para terminar, el usuario cambia a otra sesión y empieza el mismo programa otra vez , otra area roll es asignada para la segunda ejecución del programa.</p> <p>El usuario tiene dos areas roll, una para cada ejecución del programa.<br />Si el usuario ejecuta otro programa, el usuario tendrá dos roll areas, una para cada programa.</p><br /><span style="color: rgb(255, 0, 0);font-size:180%;" >Definiendo Objetos de Datos</span><br /><p> <i><span style="font-weight: bold;">Data objects</span> </i>son localizaciones de memoria que usamos para almacenar datos mientras el programa se está ejecutando.</p> <ul style="font-weight: bold;"> <li>Objetos de datos Modificables</li> </ul> <blockquote><ul><li> variables</li><li>field strings=estructuras</li><li>internal tables=arrays</li></ul></blockquote> <ul style="font-weight: bold;"> <li>Objetos de datos No Modificables</li> </ul> <blockquote><ul><li>Literales</li><li>Constantes</li></ul></blockquote> <p>Cuando comienza el programa, el espacio de memoria para cada objeto de datos se ubica en el area roll del programa.</p> <p>Cuando el programa se está ejecutando, se puede leer el contenido de los objetos de datos y modificar los objetos de datos modificables. Cuando el programa termina, el sistema libera la memoria para todos los objetos y su contenido se pierde.</p><br /><hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >Literales.</span><br /><br />Un <span style="font-style: italic;">literal</span> es un <span style="font-style: italic;">objeto de datos</span> no modificable. Los literales pueden aparecer en cualquier parte de un programa, y se definen simplemente escribiendolos cuando es necesario.<br /><ul> <li>cadena de caracteres</li><li>numéricos</li><li>punto flotante</li><li>hexadecimal.</li> </ul><br /><hr /><br /><span style="color: rgb(255, 0, 0);font-size:180%;" >Literales. Cadenas de caracteres</span><br /><br /><br /><i>Cadenas de caracterees literales</i> son case-sensitive secuencias de caracteres de cualquier longitud cerradas entre simples comillas. 'hola Mundo','buenos dias'.<br />Caso de tener que incluir comillas simples dentro de la cadena, escribiremos la comilla simple dos veces: 'y Cesar dijo : ''hijo mio''' (y cesar dijo : 'hijo mio').<br /><br /><hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >Literales. Numéricos.</span><br /><p><i>Los literales Numericos</i> son numeros escritos directamente en el código( hard-coded) y opcionalmente signo y punto decimal.</p> Pueden escribirse con comillas simples o sin comillas simples. <p><span style="font-weight: bold;">Obligatorio uso de comillas simples si</span> :</p> <ul> <li>Escribimos punto decimal.</li> </ul> <table border="1" bordercolor="#000000"> <tbody><tr valign="top"><td width="67"><center><b>Correcto</b></center></td><td width="67"><center><span style="font-weight: bold;">Erroneo</span></center> </td><td width="288"><center><span style="font-weight: bold;">Explicación</span></center></td></tr> <tr valign="top"><td width="67"><center><tt>-99</tt></center></td><td width="67"><center><tt>99-</tt></center> </td><td width="288">Signo al final obliga a comillas.. </td></tr> <tr valign="top"><td width="67"><center><tt>'-12' '12-'</tt></center></td><td width="67"><center><tt>12-</tt><br /></center> </td><td width="288">Con comillas, el signo al principio o al final<br /></td></tr> <tr valign="top"><td width="67"><center><tt>'12.3'</tt></center></td><td width="67"><center><tt>12.3</tt></center> </td><td width="288">Punto decimal con comillas siempre<br /></td></tr> <tr valign="top"><td width="67"><center><span style="font-family:monospace;">'125'<br />125</span><br /></center></td><td width="67"><center><tt><br /></tt></center> </td><td width="288">Podemos escribir con o sin comillas estos casos<br /></td></tr></tbody> </table><br /><hr /><br /><ul> <li>Si queremos escribir el signo a la izquierda.<br /></li> </ul><br /><span style="color: rgb(255, 0, 0);font-size:180%;" >Literales. Numéricos.</span><br /><p><i>Los literales Numericos</i> son numeros escritos directamente en el código( hard-coded) y opcionalmente signo y punto decimal.</p><br /><hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >Literales. Coma flotante.</span><br /><br /><p> <i>Los literales en Coma-Flotante</i> se escriben con comillas simples de esta forma : <tt><br /></tt></p> <p><tt>'<<span style="font-weight: bold;">mantisa</span>>E<<span style="font-weight: bold;">exponent</span>e>'</tt>.<br /></p> <p>La <span style="font-weight: bold;">mantisa</span> puede escribirse con signo al principio y con punto decimal y decimales.</p> <p>El <span style="font-weight: bold;">exponente</span> puede escribirse con signo a la izquierda y admite ceros a la izquierda.<br /></p> <p>Ejemplos: <tt>'9.99E9'</tt>, <tt>'-10E-32'</tt>, and <tt>'+1E09'</tt><br /></p> <p><br /></p> <hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >Literales. Hexadecimales.</span><br /><br /><p> <i>Los literales Hexadecimales</i> se escriben entre comillas simples, numeros(0-9) y letras mayúsculas(A-F) <span style="font-weight: bold;">siempre en número par </span>y por supuesto pueden empezar con cero.</p> <p>Ejemplos : '0F', 'A0B4', '00'<br /></p><br /><p><br /></p> <hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >VARIABLES.</span><br />Dos sentencias son las usadas comúnmente para definir variables en un programa ABAP/4.<br /><ul> <li>data</li><li>parameters</li> </ul> <p> Declarar variables data, consiste en dar un nombre, tipo y opcionalmente inicializar una variable.</p> <p>Declarar variables parameters, es parecido a data, con la diferencia que hay que indicar como se presentan las variables en pantalla.<br /></p> <p>Un parámetro es un especial tipo de variable que se define usando la sentencia <span style="font-weight: bold;"> </span><tt><span style="font-weight: bold;">parameters</span>.</tt></p> <p>La diferencia entre un parametro y un data está en que el sistema presenta los parametros en una pantalla inicial para que el usuario los 'valide' o modifique y un boton para ejecutar antes de que el programa realmente se ejecute.<br /></p> <p><tt>Pueden usarse las veces que se requiera las sentencias <span style="font-weight: bold;">data</span> y <span style="font-weight: bold;">parameters</span> en el mismo programa.</tt></p> <hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >TIPOS DE VARIABLES DATA/PARAMETERS.</span><br /><a href="http://help.sap.com/saphelp_46c/helpdata/en/fc/eb2c46358411d1829f0000e829fbfe/frameset.htm">http://help.sap.com/saphelp_46c/helpdata/en/fc/eb2c46358411d1829f0000e829fbfe/frameset.htm</a><br />Vamos a hablar solo de los tipos elementales. Posteriormente veremos que se pueden usar tipos definidos por el usuario a parte de otros definidos por el sistema.<br /><h5>Tipos Data Caracter.</h5> <center><b> Lista de tipos Data Caracter.<br /></b></center> <center> <table border="1" bordercolor="#000000"> <tbody><tr valign="top"><td width="77"> <b>Tipo de Data</b></td><td width="77"><b>Descripción<br />Interna</b> </td><td width="77"><b>Longitud<br />Interna por<br />defecto</b></td> <td width="77"><b>Longitud<br />Interna<br />Maxima<br /></b></td><td width="77"><b>Valores<br />Validos</b> </td><td width="77"><b>Valor inicial por Defecto<br /></b></td> </tr> <tr valign="top"><td width="77"><center><tt>c</tt></center></td><td width="77">character </td><td width="77"><center>1</center></td><td width="77"><center>65535</center> </td><td width="77"><center>Any char</center></td><td width="77"><center>Blank</center> </td></tr> <tr valign="top"><td width="77"><center><tt>n</tt></center></td><td width="77">numeric text </td><td width="77"><center>1</center></td><td width="77"><center>65535</center> </td><td width="77"><center>0-9</center></td><td width="77"><center>0</center> </td></tr> <tr valign="top"><td width="77"><center><tt>d</tt></center></td><td width="77">date </td><td width="77"><center>8 (fixed)</center></td><td width="77"><center>-</center> </td><td width="77"><center>0-9</center></td><td width="77"><center>00000000</center> </td></tr> <tr valign="top"><td width="77"><center><tt>t</tt></center></td><td width="77">time </td><td width="77"><center>6 (fixed)</center></td><td width="77"><center>-</center> </td><td width="77"><center>0-9</center></td><td width="77"><center>000000</center> </td></tr> <tr valign="top"><td width="77"><center><tt>x</tt></center></td><td width="77">hexadecimal </td><td width="77"><center>1</center></td><td width="77"><center>65535</center> </td><td width="77"><center>Any</center></td><td width="77"><center> </center><br /></td></tr> </tbody></table> </center> <p> </p> Hay que pensar que estos tipos de caracter son guardados internamente por ABAP/4 como cadenas de caracteres.<br /><br /><h5>Tipos de Data Numéricos.</h5> <blockquote>Un guión en Máxima Lognitud indica que la longitud no se puede cambiar. Un asterisco indica que es máquina dependiente.<br /></blockquote> <p> </p> <center><b>Tipos Data Numéricos<br /></b></center> <center> <table border="1" bordercolor="#000000"> <tbody><tr valign="top"><td width="86"><br /><b>Tipo Data</b></td><td width="86"><br /><br /><b>Descripción</b> </td><td width="86"><b>Longitud Interna por Defecto</b></td> <td width="86"><br /><b>Maxima longitud</b></td><td width="86"><br /><b>Maximo decimales</b> </td><td width="86"><br /><b>Valores Válidos</b></td><td width="86"><b>Valor inicial por defecto.</b><br /></td></tr> <tr valign="top"><td width="86"><center><tt>i</tt></center></td><td width="86">integer </td><td width="86"><center>4(fixed)</center></td><td width="86"><center>-</center> </td><td width="86"><center>0</center></td><td width="86">-2^31 to +2^31-1<br /></td><td width="86"><center>0</center></td></tr> <tr valign="top"><td width="86"><center><tt>p</tt></center></td><td width="86">packed decimal </td><td width="86"><center>8</center></td><td width="86"><center>16</center> </td><td width="86"><center>14</center></td><td width="86">0-9 .</td> <td width="86"><center>0</center></td></tr> <tr valign="top"><td width="86"><center><tt>f</tt></center></td><td width="86">floating-point </td><td width="86"><center>8</center></td><td width="86"><center>8</center> </td><td width="86"><center>15*</center></td><td width="86">-1E-307 to 1E308 </td><td width="86"><center>0.0</center></td></tr> </tbody></table> </center> <p> </p> <blockquote>Todas las variables numéricas son con signo. Las variables de coma-flotante el exponente es también con signo.<br /></blockquote><br /><br /><hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >DECLARACION VARIABLES CON LA SENTENCIA <span style="font-weight: bold;">DATA</span>.</span><br /><br /><div style="text-align: center;"><pre><code>data <i>v1</i>[(<i>l</i>)] [type <i>t</i>] [decimals <i>d</i>] [value '<i>xxx</i>'].</code><br /></pre></div> <ul> <li>v1=Nombre de la variable</li><li>l=longitud interna.</li><li>t=tipo de la variable data</li><li>d=numero de decimales</li><li>'xxx'=valor inicial.</li> </ul> <span style="font-weight: bold;">Nombres de las variables:</span><br /><ul> <li>Los nombres de variable names pueden ser de 1 a 30 characters de largo. </li><li>Puede contener cualquier caracter excepto: <code>( ) + . , :</code> </li><li>Tienen que contener al menos un caracter alfabético.</li><li>SAP recomienda </li> </ul> <blockquote><ul><li>Siempre comenzar el nombre de variable con un caracter.</li><li>No utilizar guiones, en su lugar usar subrrayado.</li><li>No usar <tt>USING </tt>or <tt>CHANGING </tt>como nombres de variables.</li></ul></blockquote><br />Otras cuestiones sobre variables.<br /><ul> <li>La longitud por defecto depende del tipo de dato. </li><li>El tipo por defecto es <tt>c</tt> (character). </li><li>El valor inicial por defeto es es <tt>0</tt>, salvo el tipo <tt>c</tt> que es blanco. </li><li>La inicialización, sólo acepta literales o constantes(mas tarde las definimos) no se pueden usar variables. </li> </ul> La sentencia <tt style="font-weight: bold;">data</tt><span style="font-weight: bold;"> </span>puede aparecer en cualquier lugar del programa. La única restrición es que no puede usarse una variable antes de ser declarada por la sentencia <span style="font-weight: bold;">data</span>.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Declaración con like<br /></span></span><br />Si queremos que una variable sea como otra, podemos utilizar:<br /><div style="text-align: center;"><pre><code>data <i>v1</i> like v2 [value '<i>xxx</i>'].<br /><br /></code></pre></div> v2 puede ser una variable ya definida, o un campo de una tabla o estructura del diccionario.<br />v2 copia el 'formato' de v1, no el contenido.<br /><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span> <hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >DECLARACION VARIABLES CON LA SENTENCIA <span style="font-weight: bold;">PARAMETERS</span>.</span><br /><br /><div style="text-align: center;"><code>parameters p1[(<span style="font-weight: bold;">l</span>)] [type <span style="font-weight: bold;">t</span>] [decimals <span style="font-weight: bold;">d</span>] [default 'xxx']<br />[obligatory] [lower case] [as checkbox] [radiobutton group g]</code><br /></div><br /><ul> <li>p1=Nombre de la variable</li><li>l=longitud interna.</li><li>t=tipo de la variable data</li><li>d=numero de decimales</li><li>'xxx'=valor inicial.</li><li>g= Se explica en la opcion radiobutton.<br /></li> </ul><br /><br /><br /><ul> <li>Los nombres de variables son como en la sentencia data, pero máxima longitud es 8.<br /></li><li>Como en data, El valor por defecto es <tt>0</tt>, salvo el tipo c que es blanco.</li><li>Como en data, el tipo por defecto es <tt>c</tt> (character).</li><li>Al contrario que data, acepta otras variables como inicialización. </li><li>Todos las variables parameters, sin tener encuenta en que sitio del programa estén, aparecerán en la pantalla de seleccion en el orden en que se han escrito antes de que se ejecute el programa. </li><li>Los parameters, son visualizados en el stadard formato de SAP. Para modificar su apariencia o su posición, hay que usar la sentencia selection-screen.</li><li>Por defecto las variables son en mayusculas, ver la opción lowercase.</li><li>La forma de presentación en la pantalla inicial es un cuadro de texto, y opcionalmente check-box y radiobottom.<br /></li> </ul> <span style="font-weight: bold;">Opción lowercase.</span><br /><blockquote>Permite que se introduzcan datos en minúsculas, si no escribimos esta opción, el texto se convertirá en mayusculas.</blockquote> <span style="font-weight: bold;">Opción checkbox.</span> <blockquote> Un checkbox tiene dos estados chequeado y no chequeado. Si usamos esta opción significa que vamos a presentar una elección del tipo on/off o verdadero/falso.<br />Los checkbox son independientes entre si .<br />No se puede especificar tipo y longitud. siempre su tipo es c y su longitud es 1.<br />Los valores de un checkbox son X y espacio. No existen otros valores de este parámetro.</blockquote> <span style="font-weight: bold;font-size:100%;" >Opción radiobutton group g</span> <blockquote>Como los checkbox, un radio button tiene también dos estados, selecionado y no selecionado. Sin embargo los radio buttons funcionan en grupos de modo que solamente uno de los parámetros del grupo puede estar selecionado.<br /><br />No se puede especificar tipo y longitud. siempre su tipo es c y su longitud es 1.<br />Para mostrar un parámetro como radiobutton, hay que especificar de que grupo es.<br />Se pueden crear varios grupos en el programa.<br />Los valores de un parametro radiobutton son X y espacio.<br /></blockquote> <span style="font-weight: bold;font-size:100%;" >Opción obligatory</span><br /><br />Con esta opción en la pantalla inicial, los campos a rellenar obligatorios aparecen con una marca, y no se puede ejecutar el programa hasta que los campos estén 'rellenos'.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Declaración con like<br /></span></span><br />Si queremos que un parametro sea del mismo tipo que otro parametro,variable....<code></code><br /><br /><div style="text-align: center;"><code>parameters p2 like v1 [default 'xxx']<br />[obligatory] [lower case] [as checkbox] [radiobutton group g]</code><br /></div> <div style="text-align: center;"><pre><code><br /></code></pre> </div> p2 puede ser una variable/parámetro ya definida, o un campo de una tabla o estructura del diccionario.<br />p2 copia el 'formato' de v1, no el contenido.<br /><span style="font-size:130%;"><span style="font-weight: bold;"><br /></span></span> <hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >Constante</span><a name="SyntaxfortheTTFONTSIZECONSTANTSFONTTTFONTSIZEStatementFONT"></a><span style="color: rgb(255, 0, 0);font-size:180%;" >s. Sentencia <span style="font-weight: bold;">constants.</span></span><a name="SyntaxfortheTTFONTSIZECONSTANTSFONTTTFONTSIZEStatementFONT"></a><br /><br />Las constantes son como las variables data pero que posteriormente no se pueden modificar en el programa.<br />Requieren una inicialización.<br /><blockquote> <pre>constants <i>c1</i>[(<i>l</i>)] [type <i>t</i>] [decimals <i>d</i>] value '<i>xxx</i>'.<br /></pre> </blockquote> <blockquote> <pre>constants <i>c1</i> like <i>cv</i> value '<i>xxx</i>'.<br /></pre></blockquote> Observar la obligatoriedad de la opcion 'value'<br />Ejemplos:<br /><pre>1 constants c1(2) type c value 'AA'.<br />2 constants c2 like c1 value 'BB'.<br />3 constants error_threshold type i value 5.<br />4 constants amalgamation_date like sy-datum value '19970305'.</pre><br /><br /><blockquote><pre><br /><br /><br /><br /><br /></pre> </blockquote> <hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >Tabla de Tipos Basicos ABAP/4 vs tipos diccionario.<br /></span><br />Esta tabla puede ser util para saber los tipos que se estan usando cuando se crean variables con la palabra 'like' a variables del sistema o campos del diccionario.<br /><br /><center><b>Tipos de datos del diccionario y su correspondencia con TIPOS ABAP/4</b></center> <center> <table border="1" bordercolor="#000000"> <tbody><tr valign="top"><td width="192"><center><b>DDIC<br /><b>Data Type</b></b></center> </td><td width="192"><center><b>Description</b></center></td><td width="192"><center><b>ABAP/4<br />Data Definition</b></center> </td></tr> <tr valign="top"><td width="192"><center><tt>char</tt></center></td><td width="192">Character </td><td width="192"><tt>c(L)</tt></td></tr> <tr valign="top"><td width="192"><center><tt>clnt</tt></center></td><td width="192">Client </td><td width="192"><tt>c(3)</tt></td></tr> <tr valign="top"><td width="192"><center><tt>dats</tt></center></td><td width="192">Date </td><td width="192"><tt>d</tt></td></tr> <tr valign="top"><td width="192"><center><tt>tims</tt></center></td><td width="192">Time </td><td width="192"><tt>t</tt></td></tr> <tr valign="top"><td width="192"><center><tt>cuky</tt></center></td><td width="192">Currency key </td><td width="192"><tt>c(5)</tt></td></tr> <tr valign="top"><td width="192"><center><tt>curr</tt></center></td><td width="192">Currency </td><td width="192"><tt>p((L+2)/2)</tt></td></tr> <tr valign="top"><td width="192"><center><tt>dec</tt></center></td><td width="192">Decimal </td><td width="192"><tt>p((L+2)/2)</tt></td></tr> <tr valign="top"><td width="192"><center><tt>fltp</tt></center></td><td width="192">Floating-point </td><td width="192"><tt>f</tt></td></tr> <tr valign="top"><td width="192"><center><tt>int1</tt></center></td><td width="192">1-byte integer </td><td width="192">(none)</td></tr> <tr valign="top"><td width="192"><center><tt>int2</tt></center></td><td width="192">2-byte integer </td><td width="192">(none)</td></tr> <tr valign="top"><td width="192"><center><tt>int4</tt></center></td><td width="192">4-byte integer </td><td width="192"><tt>I</tt></td></tr> <tr valign="top"><td width="192"><center><tt>lang</tt></center></td><td width="192">Language </td><td width="192"><tt>c(1)</tt></td></tr> <tr valign="top"><td width="192"><center><tt>numc</tt></center></td><td width="192">Numeric text </td><td width="192"><tt>n(L)</tt></td></tr> <tr valign="top"><td width="192"><center><tt>prec</tt></center></td><td width="192">Precision </td><td width="192"><tt>x(2)</tt></td></tr> <tr valign="top"><td width="192"><center><tt>quan</tt></center></td><td width="192">Quantity </td><td width="192"><tt>p((L+2)/2)</tt></td></tr> <tr valign="top"><td width="192"><center><tt>unit</tt></center></td><td width="192">Units </td><td width="192"><tt>c(L)</tt></td></tr> </tbody></table> </center> <p> </p> <h4><br /></h4><br /><br /><hr /><span style="color: rgb(255, 0, 0);font-size:180%;" >n.t. COSAS PENDIENTES.<br /></span><br />- Cambio de las etiquetas de la pantalla de seleccion(entrada).<br />una vez en el editor y el programa editado, si nos vamos a: pasar-a->elementos de texto->textos de seleccion, podremos cambiar los datos de las etiquetas de entrada de los campos parametros<br /><br />- tanto las variables data como las variables parametro, tienen una sintaxis like to, que hay que estudiar.<br /><br />- tampoco hemos mirado la relación entre tipos de datos del diccionario con los tipos de abap.<br /><br />- una cosa rarta en el documento es al final cuando habla de check table.Rauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com1tag:blogger.com,1999:blog-8820473466351324723.post-19508781800044914182008-07-23T07:45:00.000-07:002008-07-23T07:48:47.394-07:00SAP/ABAP DICCIONARIO<i style="font-weight: bold;">functional areas, </i><i style="font-weight: bold;">application areas, </i> <i style="font-weight: bold;">functional modules</i><span style="font-weight: bold;"> of R/3</span><br />Se refiere a la serie de aplicaciones de negocios integradas en R/3.<br />Ejemplos :<br /><ul> <li>PP (Production Planning) </li><li>MM (Materials Management) </li><li>SD (Sales and Distribution) </li><li>FI (Financial Accounting) </li><li>CO (Controlling) </li><li>AM (Fixed Assets Management) </li><li>PS (Project System) </li><li>WF (Workflow) </li><li>IS (Industry Solutions) </li><li>HR (Human Resources) </li><li>PM (Plant Maintenance) </li><li>QM (Quality Management) </li> </ul> <hr style="border: medium solid rgb(0, 0, 255);"><span style="font-weight: bold;">Transaction code, tcode,codigo de transacción.</span><br />Para entenderlo, diremos que SAP y transación es lo mismo(no es del todo cierto). Toda transacción tiene un codigo alfanumérico único.<br /><br /><hr style="border: medium solid rgb(0, 0, 255);"><span style="font-weight: bold;">n-tiered client/server configuración. n-nivel cliente/servidor configuración.</span><br />Se refiere a la habilidad de que una aplicación se pueda ejecutar en varios procesos/ordenadores.<br />La lógica cliente servidor es 2-tiered configuración pues son dos procesos los que manejan el programa.<br />Si el servidor es capaz de utilizar un tercer proceso (el servidor hará las veces de cliente y servidor), ya tenemos un 3-tiered configuracion.<br /><hr style="border: medium solid rgb(0, 0, 255);"><span style="font-weight: bold;">R/3 basis. </span><br />Es una especie de run-time de R/3 que se encarga sobre todo de ejecutar los programas (interpretar).<br />R/2 era de tipo mainframe, y para crear R/3 de tipo cliente/servidor, tuvieron que crear este sistema.<br /><hr style="border: medium solid rgb(0, 0, 255);"><i style="font-weight: bold;">R/3 system landscape</i><span style="font-weight: bold;"> </span>(Entorno del sistema R/3) es el numero de sistemas de sap instalación: desarrollo,test,producción....<br />Recordar que un sistema R/3 es básicamente decir una base de datos (con miles de tablas).<br />R/2 era de tipo mainframe, y para crear R/3 de tipo cliente/servidor, tuvieron que crear este sistema.<br /><hr style="border: medium solid rgb(0, 0, 255);"><i style="font-weight: bold;">Transacciones importantes</i>.<br />SE11 para ver diseño de tablas.<br />SRET seleccion general de informes<br />SE16 browser de tablas<br />SU3 user profile (valores prefijados propios).<br />SE37 modulo funciones (en pasar a, podemos crear grupos de funciones)<br /><hr style="border: medium solid rgb(0, 0, 255);"><i style="font-weight: bold;">Programas clientes (customer programs)</i><br />Son los programas que hacemos los mortales. Que trabajamos para clientes de SAP, luego por logica SAPERA, los programas son programas clientes.<br /><br /><hr style="border: medium solid rgb(0, 0, 255);"><span style="font-weight: bold;">Tablas transparentes.</span><br />Se refire a tablas que se definene en SAP y se corresponden directamente con tablas de base de datos tradicionales<br /><br /><hr style="border: medium solid rgb(0, 0, 255);"><span style="font-weight: bold;">Tabla pool</span>. (Propiedad de SAP).<br /><span style="font-weight: bold;">Pooled tabla.</span><br /><br />Tabla pool es una tabla de la base de datos que contiene varias tablas.<br />Se basa en un campo llamado nombre de tabla y un campo genérico.<br /><br />Una pooled tabla es una tabla 'virtual' contenida en una Tabla pool.<br />Las pooled tablas se manejan de forma parecida a tablas 'reales', pero en realidad se utiliza la Tabla Pool para crear/visualizar/modificar datos de la tabla.<br /><br />Una Tabla Pool puede contener muchas 'subtablas'. Realmente su efectividad consiste en tener muchas subtablas y así ahorrar accesos a distintas tablas.<br />Las pooled tablas tienen ciertas restricciones.<br /><br /><hr style="border: medium solid rgb(0, 0, 255);"><span style="font-weight: bold;">Tabla cluster</span>. (Propiedad de SAP).<br /><span style="font-weight: bold;">Cluster(ed) tabla.</span><br /><br />Tabla cluster es una tabla de la base de datos que contiene varias tablas.<br />Se basa en que las 'subtablas' tienen un índice común, y un campo genérico donde se guarda todos los datos de las 'subtablas'.<br /><br />Una Cluster(ed) tabla es una tabla 'virtual' contenida en una Tabla cluster.<br />Las cluster(ed) tablas se manejan de forma parecida a tablas 'reales', pero en realidad se utiliza la Tabla cluster para crear/visualizar/modificar datos de la tabla.<br />La principal propiedad de una tabla cluster es que guarda varios registros de una 'clustered table' en un solo registro de la tabla cluster.<br />Una Tabla Cluster es util cuando tiene pocas subtablas pero muchos datos (registros grandes). Realmente su efectividad consiste en conseguir en un solo acceso a la base de datos a los contenidos de muchas tablas.<br />Las clustr(ed) tablas tienen ciertas restricciones.<br />Un ejemplo para entender la efectividad de estas tablas, es suponer que guardamos la cabecera y detalle de un pedido en un unico registro de la base de datos (tabla cluster). Sin embargo en sap leeremos el detalle como si estuviera en varios registros a parte de que tenemos la cabecera ya leida (pues está todo en un mismo registro).<br /><br /><hr style="border: medium solid rgb(0, 0, 255);"><span style="font-weight: bold;">Dominio.</span><br /><br />En SAP un dominio es la especificación tecnica de un campo de la base de datos (o tambien de una estructura).<br />Se guarda en el diccionario y es reutilizable para otros campos.<br />Básicamente se especifica:<br /><ul> <li>Nombre del Dominio</li> </ul> <blockquote>Comezando con (y o z)</blockquote> <ul> <li>Una descripción</li> </ul> <ul> <li>Como se va a guardar en la base de datos (input):</li> </ul> <blockquote>tipo de datos (char, decimal....) su longitud y una descripción</blockquote> <ul> <li>Como sacaremos el dato de la base de datos(output).</li> </ul> <blockquote>con signo, sin signo....longitud.</blockquote> Todo campo de una tabla o estructura del diccionario de datos tiene asignado un dominio.<br />Los dominios no se asignan directamente a los campos, sino que forman parte de un Elemento de Datos.<br /><br /><hr style="border: medium solid rgb(0, 0, 255);">Elemento de Datos.<br />Un elemento de datos para SAP es la descripción semántica y técnica de un campo de una tabla o estructura.<br />Todo campo de tabla o estructura tiene asignado un Elemento de Datos directamente.<br />Se guarda en el diccionario y es reutilizable para otros campos.<br /><br /><ul> <li>Especificación Semántica.</li> </ul> <blockquote>Son descripciones y comentarios obligatorios para ayuda en linea sobre el campo en los browsers y aplicaciones.<br /></blockquote> <ul> <li>Especificación Técnica.</li> </ul> <blockquote>Se basa en asignar un dominio.</blockquote> Todo campo de una tabla o estructura del diccionario de datos tiene asignado un Elemento de datos y por lo tanto un dominio.<br /><br /><br /><hr style="border: medium solid rgb(0, 0, 255);">Grupo de funciones.<br />Los modulos de funciones se agrupan en grupos de funciones.<br />SE37<br />........<br /><hr style="border: medium solid rgb(0, 0, 255);"><span style="font-weight: bold;font-size:130%;">pbo</span><br /><h3><span style=";font-family:Arial;font-size:85%;">ABAP Runtime Environment (BC-ABA)</span></h3> <p><span style=";font-family:Arial;font-size:85%;"><span style=";font-family:Arial;font-size:85%;">Process Before Output.</span></span></p> <p><span style=";font-family:Arial;font-size:85%;"><span style=";font-family:Arial;font-size:85%;">Block of code processed after a screen is called but before it is actually displayed.</span></span></p><br /><hr style="border: medium solid rgb(0, 0, 255);"><br /><br /><hr style="border: medium solid rgb(0, 0, 255);"><br /><br /><hr style="border: medium solid rgb(0, 0, 255);">Rauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0tag:blogger.com,1999:blog-8820473466351324723.post-45123493587413097542008-07-23T07:39:00.000-07:002008-07-23T07:41:42.817-07:00sap, primeros pasos<a href="http://help.sap.com/saphelp_46c/helpdata/en/fc/eb2c46358411d1829f0000e829fbfe/frameset.htm">http://help.sap.com/saphelp_46c/helpdata/en/fc/eb2c46358411d1829f0000e829fbfe/frameset.htm</a><br />un Dynpro es una pantalla que se puede crear en la transacción SE52 y se relacionan a un programa Z, es parecido al uso de Visual Basic. http://sap4.com/wiki/index.php?title=Dynpro<br /><br /><br /><br />El <b><span style="color: rgb(0, 0, 128);font-family:Arial;" >ABAP Workbench </span></b>Es un entorno de desarrollo de sap<br />multi-tier : Son aplicaciones cliente-servidor en las que se separan varias partes(tier,nivel). De alguna forma, han de distinguirse en el programa las partes de cada nivel (tier).<br />three-tier : Es una clase de multitier donde se separa presentacion-aplicacion- y datos.<br /><br />(cuidado con el multi-tier, que puede tener varias interpretaciones según el contexto).<br /><b><span style="color: rgb(0, 0, 128);font-family:Arial;" ><br />LA CAPA DE BASE DE DATOS.<br /></span></b>Hay que distinguir el d<span><span style=";font-family:Arial;font-size:85%;" >atabase management system (DBMS) ???<br />y las propias bases de datos.<br /><br />Hay que tener en cuenta que la propia configuración de sap, sus ficheros y programas tambien forman parte de la base de datos.<br /><br /></span></span><b><span style="color: rgb(0, 0, 128);font-family:Arial;" >LA CAPA DE APLICACION.<br /></span></b>Los servidores de aplicaciones pueden estar en varios ordenadores. Esto significa que no todos los servidores de aplicaciones pueden hacer de todo(<span><span style=";font-family:Arial;font-size:85%;" >not...provide the full range of services).<br />Servidor de mensajes: Es un servicio que pertenece a la capa de aplicación y que permite comunicarse a los distintos servidores de aplicaciones, y tambien permite manejar los llamados grupos de servidores de aplicación y buscar el mejor lugar para ejecutar aplicaciones de un usuario (donde logear para que vaya mejor).<br /><br /></span></span><b><span style="color: rgb(0, 0, 128);font-family:Arial;" >LA CAPA DE PRESENTACION.<br /></span></b>Un usuario crea una sesion en el sistema R/3 y envia datos a la capa de aplicación, y recibe datos que los displaya.<br /><b><span style="color: rgb(0, 0, 128);font-family:Arial;" ><br />OTRAS CAPAS.<br /></span></b>Este sistema de capas puede extenderse para otros servicios y crear nuevas capas como por ejemplo:<br /><span><span style=";font-family:Arial;font-size:85%;" >Intenet Transaction Server (ITS).<br /><br />Un Programa consta de una o mas pantallas que se rellenan(dialogos). Cada pantalla presumiblemente necesita una confirmación y un paso a un siguiente dialogo.<br /></span></span><span><span style=";font-family:Arial;font-size:85%;" ><b>dialog step</b>: Es una parte de la lógica del programa en el que el GUI ha terminado un dialogo, lo está procesando y esta parádo esperando que la capa de programa envíe una pantalla al GUI. Todo es parte de un mismo proceso o programa.<br />Digamos que un programa son una secuencia dialogo-dialog step-dialogo-dialog step.......final<br /></span></span><span><span style=";font-family:Arial;font-size:85%;" ><span style="font-weight: bold;"><br />logon</span>: Antes de entrar al sistema R/3, el SAP-GUI tiene que conectarse a una capa de aplicación. El SAP-GUI conecta con el servidor de mensajes del que obtiene la direción de un adecuado servidor de aplicaciones.</span></span><br />Con un logon se pueden abrir hasta 5 sesiones.<br /><br /><hr style="border: medium solid rgb(0, 0, 255);"><br /><br /><b><span style="color: rgb(0, 0, 128);font-family:Arial;" >LA CAPA DE APLICACION.DETALLES<br /><br /></span></b><b><span style="color: rgb(0, 0, 128);font-family:Arial;font-size:85%;" >Work Processes<br /></span></b> Los <span style="font-weight: bold;">Work Processes</span> son los procesos que pueden ejecutar programas. <span style="font-weight: bold;">Usan una memoria compartida </span>por todos los Work Processes. La parte de memoria que le corresponde se llama <span style="font-weight: bold;">contexto</span>(<span style=";font-family:Arial;font-size:85%;" >contexto is the data relevant to the current state of the program that is running)</span>. Parece ser que el numero de work processes es fijo. Estan íntimamente relacionados con las transaciones de bases de datos.<br />El hecho de que todos los Work Processes usen memoria compartida, necesita un mappeador de memoria muy eficiente y depurado, pero tambien minimiza las copias de memoria.<br /><span style="color: rgb(204, 51, 204);">N.T Si los Work Processes son independientes ¿para que sirve tanta memoria compartida?. Quizá tenga que ver con el despachador. No lo entiendo muy bien.</span><br /><br /><b><span style="color: rgb(0, 0, 128);font-family:Arial;font-size:85%;" >El despachador</span></b><br />Es el proceso que habla con los SAP'GUIS, y tienen que encontrar un Work Process libre(??) para despachar las peticiones de GUI.<br />El número de usuarios conectados a un servidor de aplicaciones suele ser muchas veces mayor que el número de Work Processes. Además, cada usuario puede ejecutar varias aplicaciones a la vez. El Despachador tiene la importante tarea de distribuir todas las peticiones del gui entre los Work Proccesses en el servidor de aplicaciones.<br /><span style="font-weight: bold;">(esto es mio) Gui-Despachador-Work Process y Memoria compartida</span>:<br />Parte del contexto de un Work Process, se corresponde al gui original que hizo la peticion al despachador de un trabajo y este le asigno un Work Process libre. La idea de shared memory, se corresponde al contexto que ha de ser similar si el trabajo proviene del mismo gui y lo ejecuta otro Work Process, en tal caso el contexto ya existe en shared memory, y hay que direccionarlo a otro Work Process.<br />De todas formas, el despachador intenta hacer la asociación gui-Work Process siempre sea la misma.<br /><br /><br /><b><span style="color: rgb(0, 0, 128);font-family:Arial;" >Database Connection<br /></span></b>Los work processes, cuando se les asigna un trabajo, usan una conexion a basse de datos unica y que no se puede cambiar. <span><span style=";font-family:Arial;font-size:85%;" >Un work process puede solo hacer cambios en la base de datos dentro de una<span style="font-weight: bold;"> unica</span> LOW (unidad logica de trabajo).<br /><br /><br /></span></span><b><span style="color: rgb(0, 0, 128);font-family:Arial;font-size:85%;" >Un Work Process es un LOW y un LOW es un Work Process por lo que un Work Process es un LOW y un Dialog Step.<br /></span></b>Mucha shared memory, pero en principio un Work Process tiene que empezar y terminar un LOW. Esto indica que cada <span style="font-weight: bold;">dialog step es un Work Process </span>el que se encarga de procesarlo.<br /><br /><b><span style="color: rgb(0, 0, 128);font-family:Arial;font-size:85%;" >Tenemos un problema: Segun esto, un LOW es un dialog step, pero.... ¿Y si quermos que un programa con distintos dialog step sea una unidad de base de datos(i.e. una transacón)? ¿Podemos?.<br /></span></b>Si porque SAP nos guarda otra sorpresa:<br />El modelo de programación de SAP contiene una serie de técnicas de agrupación que nos permiten agrupar actualizaciones de base de datos en unidades lógicas. La sección de un programa R / 3 que permite agrupar operaciones de bases de datos en unidades lógicas se llama SAP LUW. A diferencia de una base de datos LUW, un SAP LUW incluye todos los Dialog step en una unidad lógica, incluidas actualizaciones de base de datos.<br /><br /><br /><br /><hr style="border: medium solid rgb(0, 0, 255);"><br /><a name="Z_609"><span><span style=";font-family:Arial;font-size:85%;" ><li>Access to R/3 Repository objects (ABAP programs, screens and so on)</li> <li>Access to catalog information (ABAP Dictionary)</li></span></span></a><span><span style=";font-family:Arial;font-size:85%;" ><a name="Z_609"></a></span></span> <span style="font-weight: bold;">Abap diccionary DDIC</span> http://help.sap.com/saphelp_webas620/helpdata/en/cf/21ea31446011d189700000e8322d00/frameset.htm<br /><br /><span><span style=";font-family:Arial;font-size:85%;" >The ABAP Dictionary centrally describes and manages all the data definitions used in the system. The ABAP Dictionary is completely integrated in the ABAP Workbench. All the other components of the Workbench can actively access the definitions stored in the ABAP Dictionary.<br /><br /><hr /><br />Project manager task<br />aqui pone algo :<br />http://help.sap.com/saphelp_46c/helpdata/en/2e/d9461494f911d283d40000e829fbbd/frameset.htm<br /><br /></span></span> El DDIC(diccionario ABAP) forma parte del sistema R/3. Basicamente podemos pensar en en el como un supernivel de acceso a una base de datos como Oracle o Informix y que actuamos sobre el como un control remoto enviando sentencias SQL. Si creamos una definición de tabla en el DDIC, basicamente lo que hacemos es enviar la correspondiente sentencia SQL a la base de datos y crear la tabla. Lo mismo cuando modificamos la tabla.<br />Pensar en el DDIC como ver y crear tablas, <span style="font-weight: bold;">no como un sitio para cambiar el contenido de las tablas</span>.<br /><br /><br /><hr style="border: medium solid rgb(0, 0, 255);"><br /><span style="font-size:130%;"><b><span style="color: rgb(0, 0, 128);font-family:Arial;" >Más sobre Work Processes</span></b></span><br /><span><span style=";font-family:Arial;font-size:85%;" ><br />Pues resulta que lo podemos dividir en :<br /></span></span> <ul> <li><span><span style=";font-family:Arial;font-size:85%;" >screen processor</span></span></li><li><span><span style=";font-family:Arial;font-size:85%;" >abap processor</span></span></li><li><span><span style=";font-family:Arial;font-size:85%;" >database interface.</span></span></li> </ul> <span><span style=";font-family:Arial;font-size:85%;" >El screen processor se encarga sobre todo del flujo del programa en sintonia con los dialogos(gui)<br />El abap processor son los programas divididos seguramente en modulos y que el screen processor va llamando cuando lo requiere.<br />El database interface requiere un poco mas de tiempo ver lo que hace.<br /></span></span><br /><span><span style=";font-family:Arial;font-size:85%;" ><br /></span></span><b><span style="color: rgb(0, 0, 128);font-family:Arial;font-size:85%;" >El database interface.<br /></span></b> Hace esto:<br /><span><a name="Z_609"><span style=";font-family:Arial;font-size:85%;" ><ul><li>Establishing and terminating connections between the work process and the database.</li><li>Access to database tables</li><li>Access to R/3 Repository objects (ABAP programs, screens and so on)</li><li>Access to catalog information (ABAP Dictionary)</li><li>Controlling transactions (commit and rollback handling)</li><li>Table buffer administration on the application server.</li></ul></span></a></span><a name="Z_609"><b><span style="color: rgb(0, 0, 128);font-family:Arial;font-size:85%;" >Open SQL VS Native SQL.<br /><br /></span></b></a><span><a name="Z_609">Los programas de ABAP pueden usar secuencias Open SQL genéricas que son administradas por R/3 dbms.<br />Las secuencias Native SQL se supone que son especiales para un tipo de basse de datos. No deberían usarse, el R/3 Basic usa un pequeño grupo de ellas, sobretodo para crear tablas.<br /><br />¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿???????????????????<br />BUFFER MANAGEMENT, parece querer decir que todos los WORK PROCESS esten en una o varias máquinas tienen la misma SHARED MEMORY y hay un BUFFER MANAGEMENT que se dedica a esto.<br />¿¿¿¿¿¿¿¿¿SERA VERDAD??????????<br />PRESUPONGO QUE ESTOS BUFFERES SON PERSISTENTES EN EL SENTIDO QUE CUANDO UN WORKING PROCESS TERMINA, LO PUEDE DEJAR PENDIENTE PARA QUE EL SIGUIENTE LO UTILICE.<br /><br />Aquí nos esplican que se pueden guardar parte de tablas en memoria, pero hay que tener cuidado porque ¿No siempre estan actualizadas?. SUPONGO QUE SE REFERIRÁ A QUE LA TABLA SE HA PODIDO ACTUALIZAR POR OTRO LADO, Y NO SE REFERIRA AL BUFFER MANAGEMENT.<br /><br />TAMBIEN SACO COMO CONCLUSION (EN PARTE LOGICA) DE QUE HAY UNA CAPA DE PROGRAMACIÓN QUE ES DEPENDIENTE DE LA BASE DE DATOS (AUNQUE HA DE SER TRANSPARENTE AL ABAP).<br /><br /><br /><br /></a></span><a name="Z_609"></a><span><a name="Z_609"><br /></a></span>Rauer Karjchhttp://www.blogger.com/profile/01017434158769712776noreply@blogger.com0