ABAP Capacitacion Para Funcionales DL- 2

ABAP SAP AÑO 2006/7 Página 2 de 63 INDICE I. Introducción_________________________________________________________

Views 181 Downloads 52 File size 898KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

ABAP

SAP

AÑO 2006/7

Página 2 de 63

INDICE I. Introducción_________________________________________________________________________________________________6

Características del lenguaje:.........................................................................................................6 Sintaxis y formato de un programa ABAP..................................................................................6 Concatenación de sentencias.........................................................................................................7 Declaración de datos.......................................................................................................................7 Objetos de datos..............................................................................................................................8 Sentencias de declaración de datos...............................................................................................9 II. Sentencias Básicas de Procesamiento de Datos____________________________________________________________________10 III. Control interno del flujo de un programa_______________________________________________________________________13

Ejemplos de expresiones lógicas..................................................................................................13 Sentencias de control....................................................................................................................13 Sentencias de salida en bucles.....................................................................................................14 IV. Tablas Internas (parte I)_____________________________________________________________________________________15

Concepto de tabla interna............................................................................................................15 Definición de tablas internas.......................................................................................................15 V.Elementos de Texto___________________________________________________________________________________________16 VI. Diccionario ABAP__________________________________________________________________________________________16 VII. Pantalla de selección (parte I)________________________________________________________________________________17

Definición de parámetros de selección .......................................................................................17 VII. Pantallas de selección (parte II)______________________________________________________________________________18

Definición de Select-options.........................................................................................................18 VIII. Campos del sistema (SYST)_________________________________________________________________________________19 IX. SQL ABAP________________________________________________________________________________________________21

Open SQL......................................................................................................................................21 SQL Nativo....................................................................................................................................21 Sentencias "Open SQL"..............................................................................................................21 X. Bases de datos lógicas________________________________________________________________________________________24 XI.Salida estándar de datos______________________________________________________________________________________25

Listas sencillas...............................................................................................................................25 Listas complejas............................................................................................................................25 XII. Procesamiento de tablas internas_____________________________________________________________________________26

Acceso a los registros de una tabla interna................................................................................26 Operaciones con tablas internas..................................................................................................26 Usos de LOOP..ENDLOOP para recorrer una tabla interna..................................................27 Procesamiento de niveles de control en tablas internas............................................................28 Página 3 de 63

Uso de SUM para calcular totales y subtotales en un evento AT.............................................28 Ordenamiento de registros de una tabla interna.......................................................................29 Determinación de la cantidad de entradas de una tabla interna.............................................29 Comparación de tablas internas..................................................................................................29 XIV. Control externo del flujo de un programa______________________________________________________________________31

Eventos principales.......................................................................................................................31 Eventos que se procesan en la salida de datos...........................................................................31 Eventos que se procesan después de la salida principal de un programa...............................32 Abandono de bloques de proceso................................................................................................32 XV. Programas interactivos______________________________________________________________________________________33 XVI. Modularización de un programa_____________________________________________________________________________37

Modularización en declaración de datos....................................................................................37 Transacciones................................................................................................................................37 Programas....................................................................................................................................39 Módulos de función......................................................................................................................39 Subrutinas.....................................................................................................................................40 Macroinstrucciones......................................................................................................................40 Salida de procesos.........................................................................................................................41 XVII. Debugging de un programa_________________________________________________________________________________42

Pantallas del debugger.................................................................................................................43 Watchpoints..................................................................................................................................43 Ejecución paso a paso en el debugger.........................................................................................43 Sentencias de depuración.............................................................................................................43 Memoria SAP y memoria ABAP.................................................................................................44 E/S en memoria SAP....................................................................................................................44 E/S en memoria ABAP.................................................................................................................44 E/S en archivos externos..............................................................................................................44 Servidor de presentación.............................................................................................................45 Método “Batch Input Clásico”....................................................................................................47 Programas estándar de Batch Input...........................................................................................49 Ejecutar un juego de datos desde el programa ABAP..............................................................49 Transacción grabadora de batch-input......................................................................................49 XXI. User Exits_______________________________________________________________________________________________50

Cómo sé si una transacción estándar tiene asociada un User Exit?........................................50 Página 4 de 63

XXII.Field Exits_______________________________________________________________________________________________51 XXIV.Field Symbols____________________________________________________________________________________________53

Declaración de field symbols ......................................................................................................53 Procesamiento de field symbols...................................................................................................53 XXV.Transacciones del Entorno de Desarrollo______________________________________________________________________55 XXVI.Creación de Módulos de Función____________________________________________________________________________59

Página 5 de 63

I. Introducción Las aplicaciones R/3 están escritas en el lenguaje de programación ABAP (Advanced Business Application Programming). Los programas ABAP se comunican con la base de datos y con la interfaz gráfica de usuario (SAPgui).

Características del lenguaje: • Basado en programación estructurada. • Interpretado, no compilado. • Dirigido por eventos. • Integrado por completo en SAP R/3. • Soporta elementos de texto multilenguaje. • Manejo transparente y abierto del sistema de gestión de bases de datos mediante ABAP OpenSQL. • Permite ampliar la funcionalidad estándar del sistema R/3. Sintaxis y formato de un programa ABAP Un programa ABAP está compuesto por sentencias. Cada sentencia comienza con una palabra clave (keyword) y termina con un punto. Ej: REPORT PRIMER_PROGRAMA. WRITE 'Primer programa’. Además de las sentencias, los programas pueden contener comentarios (textos entre sentencias del programa ABAP para cuyo objetivo es explicar el propósito de dichas sentencias). Los comentarios se distinguen porque comienzan con * (al principio de la línea) o con “ (en cualquier posición de la línea). PROGRAM SAPMTEST. ************************************************ * DECLARACIONES * ************************************************ DATA: FLAG, " UN FLAG NUMBER TYPE I. " CONTADOR ......

Página 6 de 63

El lenguaje ABAP no tiene restricciones de formato. Las palabras deben separarse al menos por un espacio (el fin de línea se considera como un espacio). Ej: PROGRAM TEST. WRITE 'esto es una sentencia'. Es igual a PROGRAM TEST. WRITE 'Esto es una sentencia'. Y a su vez es igual a PROGRAM TEST. WRITE ‘Esto es una sentencia’. Caso especial: literales de texto El fragmento de código: PROGRAM WRITE es una setencia'.

TEST.

'Esto

Inserta espacios entre cada línea del literal. En este caso se debe resolver de la siguiente manera: PROGRAM TEST. WRITE 'Esto' & ' es ' & 'una sentencia'. Estructura básica de las sentencias

Concatenación de sentencias El lenguaje ABAP permite concatenar sentencias consecutivas que tienen la misma keyword, usando : (dos puntos) Ej: WRITE: SPFLI-CITYFROM, SPFLI-CITYTO, SPFLI-AIRPTO. Declaración de datos

Página 7 de 63

Tipos de datos : • Son descripciones • No ocupan memoria en tiempo de ejecución • Describen propiedades técnicas que luego serán asociadas a un programa. Tipos de datos predefinidos

Tipos de datos locales de programa Todos los programas ABAP permiten definir tipos de datos propios. Los tipos de datos locales de un programa se definen usando la sentencia TYPES: TYPES ... [TYPE |LIKE ] ... Ej: TYPES: number TYPE i, length TYPE p DECIMALS 2, code(3) TYPE c. TYPES: BEGIN OF linea, columna1(3) TYPE C, columna2(2) TYPE N, END OF LINEA.

Objetos de datos Unidades físicas que ocupan espacio en memoria y un programa puede utilizar en tiempo de ejecución. Cada objeto de dato tiene asociado un tipo de dato. Ej: Variables, constantes

Página 8 de 63

Sentencias de declaración de datos TABLES Ej: TABLES bkpf. TABLES: bkpf, bseg. DATA Ej: DATA numero(2) TYPE P. DATA: numero(2) TYPE P, texto(15), texto2(20) TYPE C. DATA

numero2 LIKE numero.

DATA

cliente LIKE kna1-kunnr.

DATA

texto(25) TYPE C VALUE ‘Texto inicial’.

DATA

numero(4) TYPE P DECIMALS 2 value ‘123,15’.

DATA: BEGIN OF cliente, nombre(30) TYPE C, direccion(50) TYPE C, END OF cliente.

CONSTANTS Ej: CONSTANTS pi(3) TYPE P DECIMALS 2 VALUE ‘3,14’. RANGES : Tablas internas con la estructura de los SELECT-OPTIONS. Ej: RANGES belnr FOR bkpf-belnr.

Página 9 de 63

II. Sentencias Básicas de Procesamiento de Datos 1) Asignación y Conversión MOVE: Se corresponde con el operador de asignación “=”. Ej: MOVE: var1 TO var2, Var3 to var4. Es igual a var2 = var1. Var4 = var3. Ej: var2 = var1 = var3. Asignación de valores de estructuras Copiar el contenido de la estructura STRUCT1 en STRUCT2. Ej: struct2 = struct1. MOVE-CORRESPONDING: Copia el contenido de los campos de la estructura STRUCT1 en los campos de STRUCT2 que tienen idéntico nombre. Ej: MOVE-CORRESPONDING struct1 to struct2. Asignación de valores con WRITE TO WRITE...TO: Convierte el contenido de var1 en tipo C y lo guarda en var2. A diferencia de MOVE, guarda con formato. Se tienen en cuenta los formatos de separador decimal y fecha que tiene definido cada usuario. Ej: WRITE var1 TO var2. Resetear variables (a su valor inicial) CLEAR: Asigna a una variable su valor inicial. Ej: CLEAR . Asignación entre campos tipo C y tipo P PACK: Convierte un campo caracter en un campo empaquetado (tipo P). UNPACK: Convierte un campo empaquetado en un campo caracter. Ej: PACK varC TO varP. UNPACK varP TO varC. Determinación de offset y longitud en asignaciones Las sentencias MOVE y WRITE..TO permiten utilizar el offset y la longitud que deseemos para hacer asignaciones entre objetos de datos. Ej: MOVE nombre+2(5) to texto. MOVE nombre TO texto+4. MOVE nombre(4) TO texto. WRITE nombre(6) TO texto+offset(long).

"offset y long son

variables de tipo I

Página 10 de 63

Asignación de valores tipo fecha Ej: fecha = sy-datum. fecha+6(2) = '01'. fecha = fecha -1. Nota para las sentencias de asignación y conversión: Cuando los tipos de datos de las variables origen y destino no son los mismos, se aplican reglas de conversión. ABAP provee un gran número de conversiones de tipo automático. 2) Procesamiento numérico Sentencias básicas:

Otras sentencias: ABS: Valor absoluto Ej: N = ABS( M ). CEIL: Valor entero superior. Ej: N = CEIL( M ). FLOOR: Valor entero inferior. Ej: N = FLOOR( M ). TRUNC: Parte entera de un número. Ej: N = TRUNC( M ). FRAC: Parte decimal de un número. Ej: N = FRAC( M ). STRLEN: Devuelve la longitud de un string. Ej: N = STRLEN( M ). Entre campos de estructuras, se pueden llevar a cabo operaciones aritméticas usando las siguientes sentencias: ADD-CORRESPONDING SUBTRACT-CORRESPONDING MULTIPLY-CORRESPONDING DIVIDE-CORRESPONDING

Página 11 de 63

Ej: DATA: BEGIN OF a, uno TYPE I VALUE '5', dos TYPE I VALUE '6', END OF a. DATA: BEGIN OF b, dos TYPE I VALUE '3', tres TYPE I VALUE '9', END OF b. ADD-CORRESPONDING a TO b. WRITE: B-DOS, B-TRES. El resultado en pantalla sería: 9 9 3) Sentencias de manejo de strings Pueden encontrar programas que necesiten modificar la salida de una variable, para estos casos, las sentencias siguientes son las mas utilizadas: CONCATENATE - SPLIT – SHIFT - CONDENSE -OVERLAY -REPLACE -SEARCH

Página 12 de 63

III. Control interno del flujo de un programa Mediante el control interno del flujo de un programa se pueden realizar bifurcaciones o bucles. La mayoría de las sentencias de control interno utiliza “expresiones lógicas”. El formato básico de una expresión lógica es: Operadores para cualquier objeto de dato OPERADOR EQUIVALENTE DESCRIPCIÓN EQ = Igual a… NE , >< No igual a… LT < Menor que… LE

Mayor GE >= Mayor o igual que… Operadores para strings carácter (C) y numéricos (N) OPERADOR DESCRIPCIÓN CO Contiene sólo… CN No contiene sólo… CA Contiene algún… NA No contiene algún… CS Contiene el string… NS No contiene el string… CP Contiene el pattern…(*) NP No contiene el pattern…(*) (*) Permite usar los caracteres especiales '*' (Cualquier número de caracteres) y '+' (cualquier caracter). Para buscar un '*' o '+' o para diferenciar mayúsculas de minúsculas hay que anteponer el '#'. Operadores especiales OPERADOR BETWEEN .. AND IS INITIAL IN

DESCRIPCIÓN Rango de valores Valor inicial Valor perteneciente a un criterio de selección

Las expresiones lógicas pueden combinarse con AND, OR y NOT. Ejemplos de expresiones lógicas f >= p i LE f str1 CO substr str2 CA 'Aa'. str3 CP '*texto'. fecha BETWEEN fecha_inicio AND '20020412' contador IS INITIAL sociedad IN s_bukrs Sentencias de control IF: Bifurcación condicional. Ej:

Página 13 de 63

1)

IF c1 = c2. ... ELSE. ... ENDIF.

2)

IF c1 > c2. ... ELSEIF c1 < c2. ... ELSE. ... ENDIF.

CASE: Bifurcación múltiple condicional. Ej: CASE string. WHEN ‘A’. … WHEN 'B' OR ‘C’. … WHEN OTHERS. … ENDCASE. DO: Bucle incondicional. Ej: 1) DO. WRITE SY-INDEX. IF SY-INDEX = 3. EXIT. ENDIF. ENDDO. 2)

DO 3 TIMES. WRITE SY-INDEX. ENDDO.

WHILE: Bucle condicional. Ej: WHILE indice > 1. factorial = factorial * indice. indice = indice – 1. ENDWHILE. Sentencias de salida en bucles CONTINUE: Termina el paso de un bucle de forma incondicional. CHECK : Termina el paso de un bucle de forma condicional (si no se cumple la expresión evaluada). EXIT: Termina un bucle de forma incondicional.

Página 14 de 63

IV. Tablas Internas (parte I) Concepto de tabla interna • • • •

• •

La tablas internas proveen una forma de almacenar datos en memoria línea por línea. Cada línea tiene la misma estructura. Los datos almacenados en tablas internas solamente existirán durante el tiempo de ejecución del programa. El número de registros de una tabla interna no es fijo, el sistema incrementa el tamaño de la misma en tiempo de ejecución (a medida que se van agregando datos). Las tablas internas están compuestas por Header line y Table lines. La header line es el área de trabajo, cuando se leen datos de una tabla interna estos quedan almacenados en la header line. Los datos solamente pueden leerse (o modificarse) en el header line, y de ahí recién transferirse a la tabla interna. El header line es opcional, por lo tanto si quiere leerse una línea de una tabla interna definida sin header line debe guardarse el resultado en otra área de trabajo (con INTO). El header line y la tabla interna (table lines) tienen el mismo nombre. El sistema sabe en cada sentencia si nos referimos al área de trabajo o a la tabla interna (según el tipo de sentencia). Tabla interna

Área de trabajo

Definición de tablas internas Las tablas internas se declaran con la cláusula OCCURS de la sentencia DATA o TYPES. El parámetro OCCURS determina el número de líneas creadas cuando la tabla es creada en memoria. Sin embargo, en tiempo de ejecución la tabla se extiende dinámicamente, ‘on demand’ (a medida que se requieren nuevos registros). Crear una tabla interna en base a un tipo de estructura: TYPES: BEGIN OF linea, columna1(2) TYPE C, columna2 TYPE I, END OF LINEA. DATA DATA DATA DATA

itab TYPE linea OCCURS 10. itab2 TYPE linea OCCURS 0 WITH HEADER LINE. itab3 LIKE itab. itab4 LIKE itab WITH HEADER LINE.

2. Crear una tabla interna directamente, sin definir antes un tipo. DATA: BEGIN OF itab OCCURS n, ... END OF itab.

Página 15 de 63

V.Elementos de Texto Los elementos de texto permiten guardar textos en el programa sin necesidad de especificarlos en el código fuente mediante hard-coding. Los elementos de texto de un programa se mantienen desde el editor ABAP (SE38): Pasar a -> elementos de texto. VI. Diccionario ABAP A través de la transacción del diccionario de datos (SE11) se pueden mantener todos los objetos de base de datos relacionados directamente con el entorno de programación: • Tablas. • Estructuras: Se definen en forma similar a las tablas pero físicamente es sólo una definición, no se pueden almacenar datos en ellas. • Vistas de tablas. • Elementos de datos: Un elemento de datos es un tipo elemental que describe los atributos de tipo (tipo de datos, longitud de campo y, en caso necesario, cantidad de decimales) y contiene información relevante para dynpros (textos explicativos o Ayuda para campos). • Dominios: Los dominios definen formatos de campos. Un dominio describe los atributos técnicos de un campo, tales como el tipo de datos o la cantidad de posiciones del campo, la tabla de verificación de posibles valores valores, longitud de salida y rutina de conversión. • Ayudas para búsqueda (Matchcode). • Objetos de bloqueo: Las bases de datos soportadas por SAP realizan bloqueos físicos en la actualización de la información. Los objetos de bloqueo permiten realizar bloqueos lógicos en lo programas.

Página 16 de 63

VII. Pantalla de selección (parte I) Las pantallas de selección se componen de: • •

PARAMETROS: Equivale a una variable que acepta un único valor. SELECT-OPTIONS: Se asocia a campos de la base de datos. Permite al usuario introducir combinaciones complejas de selección, que se guardan en una tabla interna con un formato particular. Al definir un SELECT-OPTION el programa crea una tabla RANGES con el mismo nombre.

Definición de parámetros de selección PARAMETERS: Define parámetros en la pantalla de selección. Ej: PARAMETERS:

campo1(10) type c, "Parámetro tipo char, long 10 campo2 type d, "Parámetro tipo fecha campo3 LIKE kna1-kunnr,"Como nro.cte (hereda matchcode) campo4 TYPE I DEFAULT 100, "Tipo entero (propone '100') campo5 LIKE SY-DATUM, "Tipo fecha campo6 OBLIGATORY, "Char de long. 1 obligatorio campo7 AS CHECKBOX DEFAULT ‘X’,"Checkbox marcado p/defecto campo8 RADIOBUTTON GROUP rad1, "Radiobutton campo9 RADIOBUTTON GROUP rad1 DEFAULT ‘X’, "Radiobutton (seleccionado por "defecto) campo10 MEMORY ID buk, "Toma el valor por defecto de memoria campo11 LIKE KNA1-KUNNR MATCHCODE OBJECT debi. "usa matchcode "'debi'

Página 17 de 63

VII. Pantallas de selección (parte II) Las pantallas de selección se componen de: • PARAMETROS: Equivale a una variable que acepta un único valor. • SELECT-OPTIONS: Se asocia a campos de la base de datos. Permite al usuario introducir combinaciones complejas de selección, que se guardan en una tabla interna con un formato particular. Al definir un SELECT-OPTION el programa crea una tabla RANGES con el mismo nombre. Definición de Select-options Campos de la tabla RANGES de un SELECT-OPTION: CAMPO SIGN

LONGITUD 1

OPTION

2

LOW

La del referenciado La del referenciado

HIGH

campo

VALORES POSIBLES ‘I’: Inclusión ‘E’: Exclusión ‘EQ’: Igual a… ‘NE’: No igual a… ‘GE’: Mayor o igual que… ‘GT’: Mayor que… ‘LE’: Menor o igual que… ‘LT’: Menor que… ‘CP’: Contiene patrón… (usa caracteres especiales “+” y “*”). ‘NP’: No contiene el patrón… (usa caracteres especiales “+” y “*”). ‘BT’: Entre los valores… (usa el campo HIGH). ‘NB’: No está entre los valores…(usa el campo HIGH). Según el campo de referencia

campo

Según el campo de referencia

SELECT-OPTIONS: Define un criterio de selección en la pantalla de selección. Ej: SELECT-OPTIONS:

s_kunnr FOR kna1-kunnr, s_brsch FOR kna1-brsch DEFAULT ‘0200’ TO ‘0400’ OPTION BT SIGN I, s_pstlz FOR kna1-pstlz NO-EXTENSION, s_ort01 FOR kna1-ort01 NO INTERVALS.

Página 18 de 63

VIII. Campos del sistema (SYST) En la siguiente tabla se describen los campos del sistema (SY-campo) más importantes para utilizar en los programas ABAP. La lista completa puede verse desde el diccionario de datos (estructura SYST). CAMPO INDEX PAGNO TABIX TFILL TOCCU DBCNT FDPOS COLNO LINCT LINNO LINSZ MACOL MAROW TLENG LILLI SUBRC CUCOL CUROW LSIND LISTI STEPL SROWS SCOLS LOOPC TZONE DAYST FDAYW LANGU MODNO BATCH BINPT CALLD DYNNR DYNGR WTITL CPAGE DBNAM MANDT PEXPI PRIMM PRREL PRBIG PRNEW PDEST

TIPO INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 INT4 CHAR INT1 LANG CHAR CHAR CHAR CHAR CHAR CHAR CHAR INT4 CHAR CLNT NUMC CHAR CHAR CHAR CHAR CHAR

LONGITUD 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 3 1 1 1 1 1 4 4 1 10 20 3 1 1 1 1 1 4

DESCRIPCIÓN Loops, ejecución de loop actual Creación lista, página actual Tablas internas, índice de líneas actual Tablas internas, cantidad de líneas actual Tablas internas, valor del parámetro OCCURS Accesos base datos, cantidad de líneas de tabla leídas Strings, offset en string (lugar de hallazgo) Creación de listas, columna actual en la creación de la lista Creación listas, longitud página de la lista Creación listas, línea actual Creación listas, ancho línea de la lista Imprimir listas, columnas de la sentencia SET MARGIN Imprimir listas, líneas de la sentencia SET MARGIN Tablas internas, tamaño de la línea Tratamiento listas, línea de lista seleccionada Código retorno, código retorno tras sentencia Imágenes pantalla, posición del cursor horizontal (columna) Imágenes pantalla, posición del cursor vertical (fila) Tratamiento listas, índice del listado actual Tratamiento listas, nivel del listado desde el cual se activó el evento actual Dynpros, índice de línea de tabla actual (en LOOP) Imágenes pantalla, cantidad líneas Imágenes pantalla, cantidad columnas Dynpros, cantidad de líneas visibles en STEP LOOP de dynpro Fecha y hora, dif.tiempo con "Hra estándar Greenwich" en segundos Fecha y hora, indic.horario verano activo Fecha y hora, día de la semana en calendario fábrica Sistema R/3, idioma actual Sistema R/3, cantidad de modos externos Ejecución en proceso de fondo (X)? Batch input, programa ejecutado en batch input (X)? Programa ABAP, modo de llamada del programa activo Programa ABAP, Número del dynpro actual Programa ABAP, grupo de imágenes del dynpro actual Creación listas, indicador para cabecera estándar de página Tratamiento de listas, número de página actual Programa ABAP, base de datos lógica usada Sistema R/3, Nº mandante desde entrada al sistema Parámetro impr., tmpo.permanencia en SPOOL Parámetro impr., salida inmediata Parámetro impr., borrar tras salida Parámetro impr., portada de selección Parámetro impr., nueva orden SPOOL Parámetro impr., disp.salida

Página 19 de 63

PLIST PRDSN CALLR RTITL PRREC PRTXT PRABT PAART PRCOP DBSYS SYSID OPSYS PFKEY SAPRL TCODE UCOMM SPONO DATUM SLSET UZEIT REPID UNAME LSTAT ABCDE MSGLI TITLE LISEL ULINE CPROG LDBPG TVAR0 TVAR1 TVAR2 TVAR3 TVAR4 TVAR5 TVAR6 TVAR7 TVAR8 TVAR9 MSGID MSGTY

CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR NUMC CHAR CHAR CHAR CHAR CHAR CHAR CHAR NUMC DATS CHAR TIMS CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR

12 6 8 70 12 68 12 16 3 10 8 10 20 4 20 70 10 8 14 6 40 12 16 26 60 70 255 255 40 40 20 20 20 20 20 20 20 20 20 20 20 1

Parámetro impr., nombre de la orden SPOOL Parámetro impr., nombre set de datos SPOOL Imprimir listas, identif.función de diálogo Parámetro impresión, título programa impresón Parámetro impr., destinatario Parámetro impr., texto para portada Parámetro impr., departamento en la portada Parámetros impresión, edición impresión Parámetro impr., cantidad impresiones Sistema R/3, nombre sistema base de datos Sistema SAP, nombre del sistema SAP Sistema R/3, sistema operativo del servidor SAP Imágenes pantalla, status GUI actual Sistema SAP, versión release del sistema Programa ABAP, código transacción actual Imágenes pantalla, código función que se ingresó en campo comandos Imprimir listas, número SPOOL Fecha y hora, fecha (servidor de aplicación) Imágenes selección, nombre variante Fecha y hora, hora (servidor de aplicación) Programa ABAP, programa de control actual Sistema SAP, nombre de acceso del usuario Tratamiento listas, denominador p.nivel Constantes: Alfabeto (A,B,C,...) Mensajes, línea de mensajes Imágenes pantalla, texto de la línea de cabecera Tratamiento listas, contenido línea seleccionada Constantes, barra horizontal de longitud (-) Programa ABAP, nombre del programa principal Programa ABAP, programa de base de datos (para SY-DBNAM) Creación listas, variable texto para elemento de texto Creación listas, variable texto para elemento de texto Creación listas, variable texto para elemento de texto Creación listas, variable texto para elemento de texto Creación listas, variable texto para elemento de texto Creación listas, variable texto para elemento de texto Creación listas, variable texto para elemento de texto Creación listas, variable texto para elemento de texto Creación listas, variable texto para elemento de texto Creación listas, variable texto para elemento de texto Mensajes, clase de mensaje Mensajes, tipo de mensaje

Página 20 de 63

IX. SQL ABAP En un sistema R/3, los datos que deben permanecer en el sistema se almacenan en las tablas de base de datos. El lenguaje ABAP permite acceder a la base de datos por diferentes caminos: Open SQL Open SQL es un subconjunto de comandos de SQL Standard completamente integrado en ABAP. Nos permite leer (SELECT) y modificar (INSERT, UPDATE, DELETE) información. Es independiente del motor de base de datos que se está utilizando. SQL Nativo Es la posibilidad de incluir sentencias nativas SQL en un programa ABAP. Al ser nativas, estas sentencias dependen del motor que se este utilizando. (Informix, Oracle, etc.). Sentencias "Open SQL" SELECT: Lectura de datos de las tablas de base de datos. El formato básico es: SELECT [SINGLE/DISTINCT] INTO

FROM

[WHERE ] [GROUP BY ] [HAVING ] [ORDER BY [ASCENDING/DESCENDING]]. Ej: TABLES kna1. SELECT * FROM kna1 WHERE kunnr > '0001561000'. WRITE: / kna1-kunnr, kna1-name1. ENDSELECT. * Lectura de un solo registro de base de datos SELECT SINGLE * FROM kna1 WHERE kunnr = '0000000001'. DATA struct LIKE kna1. SELECT * FROM kna1 INTO struct WHERE land1 = 'AR'. WRITE: / struct-kunnr. ENDSELECT. DATA: BEGIN OF struct, kunnr LIKE kna1-kunnr, name1 LIKE kna1-name1, END OF struct. SELECT name1 kunnr INTO CORRESPONDING FIELDS OF struct FROM kna1. WRITE: / struct-kunnr. ENDSELECT. DATA tabla LIKE kna1 OCCURS 10 WITH HEADER LINE. * Guardar el resultado de la consulta en una tabla interna SELECT * FROM kna1 INTO TABLE tabla WHERE land1 = 'AR'. DATA: BEGIN OF tabla OCCURS 0, kunnr LIKE kna1-kunnr, name1 LIKE kna1-name1,

Página 21 de 63

END OF tabla. SELECT name1 kunnr INTO CORRESPONDING FIELDS OF TABLE tabla FROM kna1 WHERE land1 = 'AR'. *En lugar de INTO, en este caso se puede usar APPENDING * Se pueden usar funciones de agregación SELECT MAX(dmbtr) INTO resultado FROM BSIS. SELECT SUM(DISTINCT dmbtr) INTO RESULTADO FROM BSIS. * Funciones de agregación disponibles: MAX, MIN, AVG, SUM y COUNT * Lectura especificando campos de saida y ORDER BY... SELECT name1 kunnr INTO ( nombre , codigo ) FROM kna1 WHERE land1 = 'AR' ORDER BY name1 DESCENDING. * Lectura con especificación de tabla dinámica DATA tabla(10) TYPE C. tabla = 'BKPF'. SELECT SINGLE * FROM (tabla)... * Chequeo de valores con SELECT-OPTIONS SELECT-OPTIONS s_kunnr FOR kna1-kunnr. SELECT * FROM kna1 WHERE kunnr IN s_kunnr. * Lectura de dos tablas a través de INNER JOIN SELECT A~KUNNR A~NAME1 B~BUKRS B~ALTKN INTO CORRESPONDING FIELDS OF TABLE ITAB FROM ( KNA1 AS A INNER JOIN KNB1 AS B ON A~KUNNR = B~KUNNR ) WHERE A~KUNNR BETWEEN ‘1’ AND ‘25000’ AND B-ALTKN BETWEEN ‘1’ AND ‘25000’.

IMPORTANTE: En la cláusula WHERE pueden utilizarse todos los valores lógicos de comparación (los aplicables a todos los objetos de datos). INSERT: Inserta un registro en tabla de base de datos. El formato básico es: INSERT INTO VALUES . El contenido de la variable o estructura wa es insertado en la tabla target. La variable o estructura wa debe contener la misma longitud que la tabla del diccionario. Es conveniente definir wa like target. Otras formas de lograr lo mismo son: INSERT FROM . INSERT . Cuando se ha completado con información la cabecera de la tabla. Para insertar varias líneas: INSERT FROM TABLE [ACCEPTING DUPLICATE KEYS] . Ej:

TABLES kna1. kna1-kunnr = '0001561003'. kna1-name1 = 'Cliente Test'. INSERT kna1.

MODIFY: La sintaxis es como INSERT, pero se diferencia en el funcionamiento. Si el registro no existe lo inserta en la tabla, y si ya existe, lo modifica.

Página 22 de 63

UPDATE: Modifica el contenido de uno o más registros de la base de datos. El formato básico es: UPDATE SET ... [WHERE ]. También puede usarse de la forma: UPDATE FROM . UPDATE . UPDATE FROM TABLE . Ej: UPDATE kna1 SET spras = 'S' TELTX = ' ' WHERE kunnr > '0001560000'. DELETE: Elimina registros de la base de datos. El formato básico es: DELETE FROM WHERE . También se puede usar de la forma: DELETE . Cuando se ha completado con información la cabecera de la tabla. O para borrar múltiples líneas: DELETE FROM TABLE . Ej: TABLES kna1. kna1-kunnr = '0001561003'. DELETE kna1. En todos los casos: SY-SUBRC = 0 indica que se seleccionó al menos un registro. Otro valor indica que la lectura/modificación no tuvo éxito. SY-DBCNT contiene la cantidad de registros seleccionados.

Página 23 de 63

X. Bases de datos lógicas Una base de datos lógica (BDL) es un programa de acceso a base de datos que se asocia a un programa principal. La BDL y el programa principal se unen en el proceso de generación para formar un único programa. Ventajas de usar BDL: Si varios programas leen los mismos datos, se puede centralizar el acceso a las tablas de base de datos en un único programa, la BDL. Si se quiere usar la misma pantalla de seleción para varios programas, esto se realiza con la pantalla de selección de la BDL. El programa de BDL puede realizar los chequeos de autorización. La transacción mediante la cual se pueden definir, modificar y visualizar las BDL es SE36. Una BDL está compuesta principalmente por: • Estructura: Es la relación entre las tablas que componen la BDL. Es jerárquica. • Selección: Es la interfaz de usuario asociada a la BDL (pantalla de selección). • Programa de base de datos: Son las rutinas de acceso a los datos. • Textos de selección: Son los textos que aparecen en la pantalla de selección, dependientes del idioma. • Documentación. La lógica de acceso a los datos de una BDL se da en forma jerárquica:

Tabla A Tabla B Tabla C 1) Se accede al 1° registro de A. 2) Se accede al primer registro de B relacionado con el registro leído de A. 3) Se accede a todos los registros de C relacionados con el registro de B. 4) Después se accede al siguiente registro de B (siempre relacionado con el de A). 5) Se accede a todos los de C relacionados a este registro de B. 6) Una vez que se procesaron todos los registros de B relacionados al primer registro de A, se lee el siguiente registro de A.

Página 24 de 63

XI.Salida estándar de datos Las sentencias de salida estándar de datos se dividen en dos grupos. En el primero figuran sentencias elementales, mientras que en el segundo figuran sentencias secundarias, bien por afectar la salida de forma indirecta, o bien por ser poco utilizadas. Listas sencillas WRITE: Sentencia básica de escritura. Ej: WRITE ‘Hola’. WRITE BKPF-BELNR. WRITE: ‘El número’ , num , ‘es negativo’. Listas complejas. REPORT: Define las características del listado (ancho de página, cant. de líneas por página, id de mensaje, etc.). Ej: REPORT zreporte LINE-SIZE 40 LINE COUNT 40. REPORT zreporte LINE-SIZE 40 LINE COUNT 30(2) NO STANDARD PAGE HEADING. REPORT zreporte MESSAGE-ID ZFI.

Página 25 de 63

XII. Procesamiento de tablas internas Acceso a los registros de una tabla interna Para acceder a los registros de una tabla interna el sistema proporciona los siguientes métodos: Indice de la tabla interna: Es un número secuencial de cada registro de la tabla interna. No es un campo de la tabla. Después de procesar un registro de una tabla interna, el campo del sistema SY-TABIX contiene el índice del registro. Clave definida por sentencia: Cuando se lee un registro de la tabla interna con la sentencia READ se pueden especificar los campos que se quieren usar como filtro en el criterio de lectura. Clave estándar:.Por definición, los campos clave de una tabla interna son aquellos campos no numéricos (tipos F. I, P) y que no son tablas internas. Esta clave estándar puede ser usada en sentencias como COLLECT, READ, SORT y SUM. Operaciones con tablas internas Borrado de tablas internas: Sentencia REFRESH CLEAR FREE Ej:

Descripción Borra todas las líneas de la tabla interna (las table lines). No borra la cabecera. Borra el header line (la cabecera). Libera la memoria usada por la tabla interna.

REFRESH itab. CLEAR itab. FREE itab.

Inserción de registros en tablas internas. Sentencia APPEND COLLECT INSERT

Descripción Añade registros al final de la tabla interna. Es la que se recomienda por razones de rendimiento. Añade o modifica registros de la tabla interna en función de la clave estándar de la tabla. Si la clave estandar ya existe en la tabla, modifica el registro acumulando los campos numéricos. Si no existe, es equivalente a APPEND. Insertar un registro en una posición determinada de la tabla interna.

Copia de tablas internas. Sentencia APPEND MOVE INSERT

Descripción También puede ser utilizada para copiar el contenido de tablas internas. Copia el contenido de una tabla interna sobre otra, sobreescribiendo la tabla destino. También puede ser utilizada para copiar el contenido de tablas internas.

Ej: * Copiar algunas entradas de una tabla interna en otra, agregándolas al final de la tabla * destino APPEND LINES OF itab1 FROM 1 TO 5 TO itab2. * Copiar las entradas de una tabla interna en otra, insertándolas en una posición de la *tabla destino. INSERT LINES OF itab1 INTO itab2 INDEX 2. * Copiar una tabla interna en otra, sobreescribiendo la tabla destino. * Si las tablas internas tienen header line, el mismo y las table lines tienen el mismo * nombre, por esto para referenciar las table lines se usa [].

Página 26 de 63

MOVE itab2 TO itab1. MOVE itab2[] TO itab1[]. itab1[] = itab2[].

"Si las tablas no tienen header line "Si las tablas tienen header line.

* Recordar que silas tablas internas tiene header line, la sentencia: itab1 = itab2. * Solamente copia el header line (cabecera).

Lectura de registros de tablas internas. Sentencia LOOP .. ENDLOOP READ AT .. ENDAT SUM

Descripción Lectura de registros de tablas internas, recorriendo registro a registro. Lectura de un registro particular de una tabla interna usando un índice o una clave. Eventos internos e la sentencia LOOP que se activan cuando se cumplen ciertas condiciones. Suma los campos numéricos de los registros de una tabla interna (dentro de un loop).

Lectura de un registro de la tabla interna usando READ. El formato básico de la sentencia es: READ TABLE [index n | with key f1 = v1 .. fn = vn]. La sentencia READ lee un registro de la tabla interna y lo guarda en el header line o un área de trabajo para su tratamiento. * Leer el cuarto registro de una tabla interna READ TABLE itab INDEX 4. * Leer el registro que cumpla determinada condición READ TABLE itab WITH KEY col1 = val1 col2 = val2. * Guardar la línea en un área de trabajo READ TABLE itab INDEX 2 INTO wa. En la variable del sistema SY-TABIX queda almacenado el índice del registro leído, mientras que SY-SUBRC se setea con valor 0 si se leyó un registro, o 0 si no se pudo leer ningún registro. Usos de LOOP..ENDLOOP para recorrer una tabla interna * 1) Recorrido de la tabla completa. En cada paso del LOOP se guarda el contenido del registro en la header line. LOOP AT itab. ... ENDLOOP. * 2) Recorrido condicional de la tabla interna. Solamente se leen los registros que cumplan * la condición especificada. LOOP AT itab WHERE col1 = valor AND col2 > '9'. ... ENDLOOP. * 3) Recorrer un intervalo de registros de la tabla interna LOOP AT itab FROM 10 TO 25. ... ENDLOOP. En cada paso del loop, SY-TABIX contiene el índice del registro que se está tratando. Si la tabla interna está vacía, el flujo de control no entra al LOOP..ENDLOOP y SY-SUBRC 0.

Página 27 de 63

La adición INTO (LOOP AT itab INTO wa) permite recorrer la guardando el contenido de cada registro en un área de trabajo (WA). Procesamiento de niveles de control en tablas internas El procesamiento de niveles de control se permite dentro de un LOOP de una tabla interna. Esto significa que pueden agruparse secuencias de entradas de la tabla interna según el contenido de ciertos campos. Los niveles de control se forman ordenando la tabla interna primero por su primer columna, luego por la segunda, etc. Cada cambio de color en una columna activa un evento AT dentro del LOOP de la tabla.

El siguiente ejemplo muestra los diferentes eventos AT que se activan al recorrer la tabla: LOOP AT itab. AT FIRST. "Esto se ejecuta cuando se leyó el primer registro ENDAT. AT NEW col. "Esto se ejecuta cuando se leyó un nuevo valor en COL ENDAT. "Lo que no está dentro de ningún AT se ejecuta para todos los registros AT END OF col. "Esto se ejecuta cuando se lee el último registro en COL antes de un "cambio de valor. ENDAT. AT LAST. "Esto se ejecuta cuando se lee el último registro de la tabla int. ENDAT. ENDLOOP.

Dentro de un AT..ENDAT, el header line de la tabla interna solamente se carga con el valor de la línea actual para los registros que están a la izquierda del campo clave del grupo que se está evaluando. Los campos a la izquierda del mismo se llenan con '*'. Uso de SUM para calcular totales y subtotales en un evento AT. Dentro de un evento AT, puede usarse la sentencia SUM para calcular los totales de los campos numéricos de la tabla interna. Los registros que se van a totalizar dependen del evento en el que se incluya el SUM. Ej: LOOP AT itab. AT END OF col1. SUM. ENDAT. ... AT LAST. SUM. ENDAT. ENDLOOP.

"Totales por COL1

"Totales de la tabla interna

Página 28 de 63

Los totales se almacenan en el header line, en los campos de tipo numérico. Modificación de registros de tablas internas. Sentencia MODIFY WRITE .. TO DELETE

Descripción Modifica el contenido de un registro de la tabla interna. Modifica el contenido de un registro de la tabla interna. Borra un registro de la tabla interna.

En todos los casos, SY-SUBRC es 0 si la tabla interna pudo ser borrada/modificada. En caso contrario es 0. Ordenamiento de registros de una tabla interna Se usa la sentencia SORT. SORT [by f1 .. fn]. – Ordena la tabla interna. SORT SORT * Se SORT

itab. "Ordena por la clave estándar de ITAB en forma ascendente. itab BY col1 col2. "Ordena por COL1 y COL2 en forma ascendente. puede especificar si el criterio es ascendente o descendente: itab BY col2 ASCENDING col3 DESCENDING.

Determinación de la cantidad de entradas de una tabla interna DESCRIBE TABLE LINES . La variable VAR debe ser de tipo numérico, en ella se almacena la cantidad de entradas de la tabla interna ITAB. Comparación de tablas internas Las tablas internas pueden usarse como operandos en expresiones lógicas (con operadores EQ, NE, LT, LE, GT, GE). Cabe recordar que si las tablas tienen header line hay que usar [] para referirse a las table lines. El primer criterio al comparar tablas internas es la cantidad de entradas. Una tabla será mayor que otra si tiene más entradas. Si las tablas son iguales en cantidad de entradas se continúa la comparación registro a registro. La comparación para en cuanto se encuentra un componente de la tabla que es distinto entre las dos. En ese caso devuelve el resultado de la comparación entre sos componentes.

Página 29 de 63

XIII.Mensajes Los mensajes se gestionan desde la transacción SE91. Los mensajes se agrupan por clases de mensaje (MESSAGE ID). La misma agrupa mensajes que tengan la misma unidad funcional. La clase de mensaje se define luego en los programas ABAP mediante la sentencia REPORT (cláusula MESSAGE-ID). Recordar que los mensajes se invocan con la sentencia MESSAGE.

Nro. Mensaje

Texto mensaje

Variables de mensaje No necesita texto explicativo Si se quiere asociar un texto explicativo a un mensaje, se hace posicionandose en el mismo y con el botón .

Página 30 de 63

XIV. Control externo del flujo de un programa El flujo de un programa ABAP puede controlarse externamente, a través de eventos. Cada sentencia de evento marca el inicio de un bloque de proceso. Un bloque de proceso está compuesto por todas las sentencias entre dos palabras clave de evento o entre una palabra clave de evento y la sentencia FORM (sentencia de inicio de subrutina). Toda sentencia escrita entre la sentencia REPORT y la primer palabra clave de evento o una subrutina (sentencia FORM) es automáticamente añadida al evento por defecto: START-OF-SELECTION. Si el evento START-OF-SELECTION existe, dichas líneas se insertan al principio del mismo. Toda sentencia entre una sentencia ENDFORM (cierre de subrutina) y una palabra clave de evento, o entre una sentencia ENDFORM y el final del programa no forman parte de ningún bloque de proceso, y por lo tanto no se ejecutan. Eventos principales PALABRA CLAVE INITIALIZATION AT SELECTION-SCREEN START-OF-SELECTION GET END-OF-SELECTION

EVENTO Se procesa antes de que aparezca la pantalla de selección. Se procesa mientras la pantalla de selección está activa. Se procesa después de la pantalla de selección. Punto de control entre un report y una base de datos lógica. Se ejecuta cuando se leyeron registros de una tabla de la BD lógica. Se activa luego de procesar todos los eventos GET (cuando ya se han leído todos los registros de la BD lógica).

Ejemplos: INITIALIZATION. AT SELECTION-SCREEN. * Si hay error habilitar solamente el parámetro indicado para cargar datos AT SELECTION-SCREEN ON parm. * Para chequear los valores cargados en un select-options AT SELECTION-SCREEN ON END OF s_bukrs. * Si hay error habilitar solamente los campos radiobutton del grupo RAD1 para cargar datos AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1. * Si hay error habilitar solamente los campos que pertenecen al bloque indicado AT SELECTION-SCREEN ON BLOCK bloque-sel. START-OF-SELECTION. GET kna1. * Obtener solamente determinados campos de la BD Lógica GET kna1 FIELDS kunnr. * Procesar el nodo de BD Lógica cuando ya se procesaron sus subordinados GET kna1 LATE. END-OF-SELECTION.

Eventos que se procesan en la salida de datos PALABRA CLAVE EVENTO TOP-OF-PAGE Se active cuando el programa procesa la primera sentencia de escritura de una nueva página del informe. END-OF-PAGE Se active cuando el programa procesa la última sentencia de escritura de cada

Página 31 de 63

página del informe. Ej: TOP-OF-PAGE. END-OF-PAGE.

Eventos que se procesan después de la salida principal de un programa PALABRA CLAVE EVENTO AT USER-COMMAND Se active cuando se selecciona una función (menú, pulsador), o se introduce un comando en el campo de comandos. AT LINE-SELECTION Se activa cuando se selecciona una línea de la salida principal. AT PFnn Se activa cuando se presiona una tecla de función (PF1 .. PF24). Abandono de bloques de proceso STOP: En un evento GET termina el procesamiento de la BD lógica y pasa al evento END-OF-SELECTION. Ej: ... START-OF-SELECTION. WRITE: ‘Prueba STOP’. GET KNA1. WRITE KNA1-KUNNR. STOP. END-OF-SELECTION. WRITE: / ‘Fin del programa’. El programa imprime el nro. del primer cliente y luego ‘Fin de programa’. EXIT: Termina la ejecución del evento. En un evento GET termina el procesamiento de la BD lógica. No ejecuta el evento END-OF-SELECTION. En START-OF-SELECTION finaliza la ejecución del programa, mostrando la pantalla de salida. Ej: ... START-OF-SELECTION. WRITE: ‘Prueba STOP’. GET KNA1. WRITE KNA1-KUNNR. EXIT. END-OF-SELECTION. WRITE: / ‘Fin del programa’.

El programa imprime solamente el nro. del primer cliente (no imprime 'Fin del programa'). CHECK : El evento continúa procesándose si se cumple la expresión lógica . En caso contrario finaliza la ejecución del evento pero no el programa, sino que se continúa con el siguiente registro recuperado de la BD lógica. Ej: ... GET bkpf. CHECK bkpf-budat BETWEEN ‘20020301’ AND ‘20020305’. REJECT: Finaliza la ejecución del evento para el registro de la BD lógica que se está tratando, pasando al siguiente registro. Ej: ... GET kna1. IF kna1-kunnr ge ‘0001002000’. REJECT. ENDIF.

Página 32 de 63

XV. Programas interactivos ABAP permite crear listados interactivos. Un listado interactivo amplía el típico listado clásico con funcionalidades tales como seleccionar líneas, realizar entradas, introducir comandos, etc. Los programas que generan listados interactivos trabajan con ciertos campos del sistema. Los más utilizados son los siguientes. Variable Significado Índice del listado creado. En el listado principal tiene valor 0, y se incrementa en 1 por cada SY-LSIND listado secundario. Cuando se abandona un listado secundario para ir al anterior la variable disminuye en 1. SY-LISTI Nivel del listado desde el cual el evento (selección de línea) fue activado. En general, SY-LISTI = SY-LSIND – 1. SY-LILLY Nro. (absoluto) de la línea desde la cual fue activado el evento. SY-LISEL Contenido de la línea seleccionada SY-CUROW Número de línea de la ventana en la cual se posicionó el cursor al activar el evento (empieza en 1). SY-CUCOL Número de columna en la ventana en la cual se activó el evento (empieza en 1). SY-CPAGE Nro. De página en la cual se activó el evento. SY-UCOMM Código de función activado. SY-PFKEY Status actual de la interfaz de usuario (Menu Painter). Los eventos relacionados con los programas interactivos son los siguientes. Palabra clave Evento AT USER-COMMAND Se active cuando se selecciona una función (menú, pulsador), o se introduce un comando en el campo de comandos. AT LINE-SELECTION Se activa cuando se selecciona una línea de la salida principal. AT PFnn Se activa cuando se presiona una tecla de función (PF1 .. PF24). TOP-OF-PAGE DURING Es como el TOP-OF-PAGE pero se activa cuando se imprimen los listados LINE-SELECTION secundarios. Ej:

REPORT ZTEST. WRITE ‘Listado principal’. AT LINE-SELECTION. WRITE: ‘Listado secundario, Nivel:’, SY-LSIND. AT USER-COMMAND. CASE SY-UCOMM. WHEN ‘FUN1’. ... WHEN ‘FUN2’. ... ENDCASE.

AT PF5.

WRITE ‘Pulsó F5’.

AT PF12. WRITE ‘Pulsó F12’. TOP-OF-PAGE DURING LINE-SELECTION. CASE SY-LSIND.

Página 33 de 63

WHEN 1. WRITE ‘Listado secundario 1’. WHEN 2. WRITE ‘Listado secundario 2’. ENDCASE. ULINE. Las sentencias relacionadas con los programas interactivos son las siguientes: Sentencia Descripción MESSAGE Activa un mensaje SET PF-STATUS Define el código de status, para que el sistema active la interfaz de usuario correspondiente (Menu Painter). SET TITLEBAR Define el título de pantalla. SET USER-COMMAND Activa un comando (por lo tanto activa el evento AT USER-COMMAND). WINDOW Define una ventana con formato de pantalla. HIDE Retiene el contenido de un campo, cargándolo con el valor de la línea seleccionada en cada AT LINE-SELECTION. GET CURSOR Obtiene el nombre del campo en el cual se encuentra posicionado el cursor. SET CURSOR Posiciona el cursor en un campo determinado de la pantalla. DESCRIBE LIST Obtiene los atributos de un listado. SCROLL LIST Realiza un desplazamiento del listado. READ LINE Lee una línea del listado. READ CURRENT LINE Lee la línea actual del listado. MODIFY LINE Modifica el contenido de una línea MODIFY CURRENT LINE Modifica el contenido de la línea actual. MESSAGE: Los mensajes se guardan en la tabla T100 y se mantienen a través de la transacción SE91. Hay 6 clases de mensajes: A (Abend) E (Error) I (info) S (Status) W (Warning) X (Exit) Ej:

REPORT ZTEST MESSAGE-ID Z1. MESSAGE E001. REPORT ZTEST. MESSAGE I002(Z1). * Incluír variables del programa en el mensaje MESSAGE A003(Z1) WITH var1 var2.

SET PF-STATUS: Define el código de status, para que el sistema active la interfaz de usuario correspondiente. Este código de status debe haberse definido en el Menu Painter. Ej: SET PF-STATUS ‘TEST’. * Usar un PF-STATUS excluyendo funciones SET PF-STATUS ‘TEST’ EXCLUDING ‘FC1’. SET PF-STATUS ‘TEST’ EXCLUDING itab.

Página 34 de 63

SET USER-COMMAND: Activa un comando (por lo tanto activa también el evento AT USER-COMMAND). Ej: SET USER-COMMAND ‘COMD’. HIDE field: Cuando se imprime el listado en pantalla, al emplear la sentencia HIDE sobre un campo se retiene el contenido del campo para cada línea de salida. Cuando el usuario selecciona una línea del listado, field se carga automáticamente con el valor que tiene en la línea seleccionada. Ej: GET kna1. WRITE: kna1-kunnr, kna1-name1. HIDE: kna1-kunnr, kna1-pstlz. ... AT LINE-SELECTION. WRITE: ‘Se seleccionó el cliente’, kna1-kunnr. WRITE: ‘El C.P. es:’, kna1-pstlz. GET CURSOR: Obtiene el nombre del campo en el cual se encuentra posicionado el cursor. Ej: DATA v_var(20) TYPE C. ... AT LINE-SELECTION. GET CURSOR FIELD v_var. SET CURSOR: Posiciona el cursor en un campo determinado de pantalla. Ej: DATA v_var(5) TYPE C VALUE ‘CAMPO’. DATA campo(3) TYPE C. ... AT LINE-SELECTION. SET CURSOR FIELD v_var LINE SY-LILLI. DESCRIBE LIST: Obtiene los atributos de un listado. Ej: * Obtener la cantidad de líneas del listado DESCRIBE LIST NUMBER OF LINES lin. * Obtener la cantidad de páginas del listado DESCRIBE LIST NUMBER OF PAGES n. * Obtener el nro. de página de la línea seleccionada DESCRIBE LIST LINE lin PAGE pag. READ LINE: Lee una línea del listado, quedando el contenido de la misma en SY-LISEL. Ej: AT LINE-SELECTION. READ LINE SY-LILLI. WRITE SY-LISEL. MODIFY LINE: Modifica el contenido de una línea del listado. Ej: * Modificar el formato de una línea AT LINE-SELECTION. MODIFY LINE SY-LILLI LINE FORMAT COLOR 6.

Página 35 de 63

* Modificar el contenido de una línea WRITE: 'Valor:', var. AT LINE-SELECTION. * Se modifica el contenido de VAR. ADD 1 TO var. * Y se modifica el contenido de SY-LISEL SY-LISEL(2) = '**'. MODIFY LINE SY-LILLY FIELD VALUE var. MODIFY CURENT LINE: Modifica el contenido de la línea del listado seleccionada actualmente. Ej: AT LINE-SELECTION. MODIFY CURRENT LINE LNE FORMAT INVERSE.

Página 36 de 63

XVI. Modularización de un programa Las técnicas de modularización que se presentarán permiten que la lectura y mantenimiento de los programas sean más fáciles. Modularización en declaración de datos. Sentencia Descripción INCLUDE STRUCTURE Incluye una estructura del diccionario de datos. Transacciones Las siguientes sentencias permiten acceder a transacciones desde un programa ABAP. Sentencia Descripción CALL TRANSACTION Llama a una transacción sin abandonar el proceso actual. LEAVE TO TRANSACTION Llama a una transacción abandonando el proceso actual. CALL TRANSACTION: Llama a una transacción. Cuando ésta termina de ejecutarse, el control vuelve al programa que realizó el call transaction. * Forma básica CALL TRANSACTION ‘FB02’. * Si quiero completar los datos de la pantalla inicial directamente desde el programa, y * saltear la primer pantalla de la transacción invocada. SET PARAMETER ID ‘BUK’ FIELD ‘0100’. SET PARAMETER ID ‘BLN’ FIELD v_belnr. SET PARAMETER ID ‘GJR’ FIELD ‘2002’. CALL TRANSACTION ‘FB02’ AND SKIP FIRST SCREEN. * Definir desde el programa todo el pantalleo de la transacción a invocar CALL TRANSACTION ‘FB02’ USING itab. * En este último caso se pueden agregar las siguientes opciones: CALL TRANSACTION ‘FB02’ USING itab MODE ‘A’ UPDATE ‘S’ MESSAGES INTO msg_tab. Estas opciones significan: MODE: Forma de visualización de la transacción: ‘A’: Visible (default). ‘E’: Solo errores. ‘N’: Invisible. UPDATE: Método de actualización que se va a usar. ‘A’: Update asincrónico (default). El proceso envía el request del update a otro proceso, y no espera que éste termine. ‘S’: Update sincrónico. El proceso envía el request del update a otro proceso, y espera que éste termine antes de continuar. ‘L’: Update local. El mismo work process realiza el update. Obviamente el proceso espera que finalize el update. MESSAGES INTO: Devuelve los mensajes de la transacción en una tabla interna, que debe definirse como BDCMSGCOLL. LEAVE TO TRANSACTION: Llama a una transacción. La transacción actual se finaliza.

Página 37 de 63

* Forma básica LEAVE TO TRANSACTION ‘FB02’. * Si quiero completar los datos de la pantalla inicial directamente desde el programa, y * saltear la primer pantalla de la transacción invocada. SET PARAMETER ID ‘BUK’ FIELD ‘0100’. SET PARAMETER ID ‘BLN’ FIELD v_belnr. SET PARAMETER ID ‘GJR’ FIELD ‘2002’. LEAVE TO TRANSACTION ‘FB02’ AND SKIP FIRST SCREEN. La variable del sistema SY-TCODE tiene en cada proceso el código de transacción actual.

Página 38 de 63

Programas Sentencia INCLUDE SUBMIT LEAVE PROGRAM

Descripción Incluye código de otro programa. Ejecuta un programa. Abandona el programa actual.

INCLUDE: Generalmente se utiliza para separar la declaración de datos, el proceso y las subrutinas de un programa. Supongamos que definimos todos los datos de un programa ZREPORT en un programa (tipo include) llamado ZDATOS. A su vez creamos otro programa ZRUTINAS (también de tipo include) donde guardamos todas las subrutinas que usa el programa ZREPORT. La estructura de ZREPORT quedaría así: REPORT zreport. INCLUDE zdatos.

INCLUDE zrutinas. SUBMIT: Ejecuta un programa desde al actual. Si no se especifica lo contrario, el control pasa al programa submitido (no vuelve al llamador). * Forma básica SUBMIT zreport. * Si se desea que al terminar de ejecutarse el programa submitido el control SUBMIT zreport AND RETURN. * Submitir un reporte cuyo nombre está en una variable V_PROG_NAME SUBMIT (v_prog_name). * Submitir un reporte pasándole los parámetros de selección SUBMIT zreport WITH bukrs = v_bukrs WITH monat IN s_monat. LEAVE PROGRAM: Abandona la ejecución del programa actual. IF sy-uname ‘USR01’. LEAVE PROGRAM. ENDIF. Módulos de función Son subrutinas externas especiales centralizadas en una librería. El sistema provee numerosos módulos de función predefinidos que pueden ser utilizados por los programas ABAP. También el sistema permite al cliente crear sus propios módulos de función. La principal diferencia entre un módulo de función y una subrutina es la interfaz definida para pasar y recibir datos en un módulo de función. También se soporta el manejo de excepciones. Sentencia Descripción CALL FUNCTION Realiza una llamada a un módulo de función RAISE Activa una excepción. Solamente puede ser usada dentro de la definición de un módulo de función. Ej: * Invocar a una función. SY-SUBRC contiene el código de retorno (si terminó OK es 0). CALL FUNCTION 'STRING_SPLIT' EXPORTING DELIMITER = ':' STRING = var_1 IMPORTING

Página 39 de 63

HEAD = var_2 TAIL = var_3 EXCEPTIONS NOT_FOUND = 1 OTHERS = 2. * Activar una excepción desde un módulo de función FUNCTION Z_DIVIDE. ... IF DIVISOR = 0. RAISE DIVISOIN_ZERO. ENDIF. ... ENDFUNCTION. Subrutinas Las subrutinas son módulos de programa que pueden ser llamados desde programas ABAP. Mediante las subrutinas es posible escribir solamente una vez partes de un programa que se ejecutan en forma repetitiva. Sentencia Descripción FORM .. ENDFORM Definición de una subrutina PERFORM Llamada a una subrutina FORM .. ENDFORM: La sintaxis de la definición de una subrutina es la siguiente: FORM subrutina USING parm_1 .. parm_n CHANGING par_1 .. par_n TABLES itab STRUCTURE estructura_1 itabn STRUCTURE estructura_n. USING: Se utilizan como parámetros de entrada a la subrutina. CHANGING: Se utilizan como parámetros de salida de la subrutina. TABLES: Son tablas internas (pueden ser parámetros de entrada o salida). Ej: * Llamado básico a una subrutina PERFORM f_rutina USING dato CHANGING retorno. ... FORM f_rutina USING p_dato CHANGING p_retorno. p_retorno = p_dato * 2. ENDFORM. * Llamado a subrutinas que están en otros programas. PERFORM f_rutina(zrutinas) USING dato CHANGING retono. * Otra forma de llamar a una subrutina en otro programa v_rutina = 'F_RUTINA'. v_programa = 'ZRUTINAS'. PERFORM (v_rutina) IN PROGRAM (v_programa) USING dato CHANGING retorno.

Macroinstrucciones Una macroinstrucción es la definición de una sentencia interna en un programa. Sentencia Descripción DEFINE .. END-OF-DEFINITION Definición de una macroinstrucción. La ejecución de la misma se realiza con el nombre de ésta. Ej: * Definir una macroinstrucción que realiza una operación aritmética DATA resultado TYPE I. ...

Página 40 de 63

DEFINE operación. resultado = &1 &2 &3. WRITE resultado. END-OF-DEFINITION. ... * Invocar a la macroinstrucción operacion 4 + 3. operacion 2 ** 7. Se pueden definir macros globales, que pueden ser utilizadas por todos los programas. Las mismas se llaman macros RMAC, y se encuentran an la tabla TRMAC. Salida de procesos Para abandonar el flujo de alguno de los procesos anteriormente vistos se utilizan las siguientes setencias. Sentencia Descripción LEAVE Abandona el proceso iniciado por un CALL TRANSACTION o SUBMIT .. AND RETURN. El control se devuelve donde se realizó la llamada. EXIT Abandona una subrutina o cualquier unidad de modularización en forma incondicional. CHECK Abandona una subrutina o cualquier unidad de modularización en forma condicional.

Página 41 de 63

XVII. Debugging de un programa • • • • •

La herramienta de depuración (debugger) permite ejecutar paso a paso una transacción o programa ABAP. Se puede ver el contenido de campos o tablas internas, así como crear puntos de ruptura dinámicos (watchpoint). La transacción de depuración se puede activar a través de: Las sentencias BREAK y BREAK-POINT. Introduciendo “/h” en el campo de comandos (OK_CODE) de cualquier programa o transacción y pulsando INTRO. Con break-points externos al programa. Desde el editor ABAP, posicionando el cursor en la línea en la que se quiere fijar y a través de “Utilidades -> Breakpoints -> Fijar/borrar” (o directamente botón ).

La siguiente pantalla muestra la transacción de depuración:

Programa de Control. Programa que se está ejecutando Número de línea del programa Próxima sentencia que se va a ejecutar

Break-point fijado

Ver el contenido de una tabla interna Variables ingresadas para ver su contenido Valor de campos del sistema Modificar valor de campo o variable

Página 42 de 63

Pantallas del debugger En la parte superior de la pantalla de la transacción de depuración se encuentran los botones que permiten pasar a las distintas pantallas del debugger.

TABLA: Permite visualizar el contenido de una tabla interna. BREAKPOINTS: Lista de breakpoints activos para el programa. WATCHPOINTS: Lista de breakpoints condicionales (watchpoints). LLAMADAS: Resumen del flujo de proceso (llamadas realizadas, eventos, etc. que se ejecutaron hasta llegar al punto de ejecución actual). RESUMEN: Lista de los bloques de proceso del programa actual. OPCIONES: Opciones de depuración. Watchpoints Los watchpoints son breakpionts opcionales. El sistema evalúa si un campo determinado cambió su valor, y si se da esto, se produce un breakpoint en la sentencia posterior al cambio de valor. Los watchpoints se crean con el botón Aparece la siguiente pantalla:

.

Variable a evaluar Comparador lógico (si no se pone nada se activa cuando cambia el valor). Valor o variable contra el que se compara Ejecución paso a paso en el debugger Los siguientes botones permiten hacer el seguimiento paso a paso del programa.

1) PASO A PASO (F5): Ejecuta el programa paso a paso. 2) EJECUTAR (F6): Ejecuta paso a paso, pero no entra a una subrutina, módulo de función, etc. 3) RETORNAR (F7): Vuelve al evento, subrutina, etc que invocó al módulo que se está ejecutando. 4) CONTINUAR (F8): Sigue ejecutando hasta el siguiente breakpoint, watchpoint o hasta que termine el programa. Sentencias de depuración Sentencia BREAK BREAK-POINT Ej: * Activa el debugger BREAK-POINT.

Descripción Activa el debugging de un programa para un usuario determinado. Activa el debugging de un programa. para todo usuario

* Activa el debugger para el usuario USR01 BREAK usr01.

Página 43 de 63

Memoria SAP y memoria ABAP La memoria SAP (memoria global) está disponible para el usuario durante todo el ciclo de vida de su sesión. Es decir que sus contenidos se mantienen más allá de la duración de una transacción. El contenido de la memoria ABAP permanece durante el transcurso de una sesión externa (MODO) y durante el ciclo de vida de un proceso (por ejemplo, transacción). No es compartida entre dos o más modos. E/S en memoria SAP Sentencia Descripción SET PARAMETER Actualiza un parámetro de memoria. GET PARAMETER Recupera un parámetro de memoria. SET PARAMETER: Guarda un valor en la memoria SAP. Cualquier valor existente en la memoria SAP con el mismo ID es sobreescrito. El ID puede tener hasta 20 caracteres. Ej: v_sociedad = ‘0900’. SET PARAMETER ID ‘BUK’ FIELD v_sociedad. GET PARAMETER: Recupera un valor de la memoria SAP. Si se pudo encontrar en la memoria SAP un valor con el ID especificado, se setea SY-SUBRC = 0. En caso contrario SY-SUBRC = 4. Ej: GET PARAMETER ID ‘BLN’ FIELD v_nro_doc. E/S en memoria ABAP Sentencia EXPORT TO MEMORY IMPORT FROM MEMORY FREE MEMORY

Descripción Exporta datos a la memoria ABAP. Recupera datos de la memoria ABAP. Libera la memoria ABAP.

EXPORT TO MEMORY: Guarda datos en clusters de la memoria ABAP. Estos datos pueden ser variables, estructuras, tablas internas, etc.). Cada EXPORT TO MEMORY sobreescribe la memoria ABAP para el ID indicado. IMPORT FROM MEMORY: Importa objetos de datos de un cluster de datos de la memoria ABAP. Si se pudo encontrar en la memoria ABAP un cluster de datos con el ID especificado, se setea SY-SUBRC = 0. En caso contrario SY-SUBRC = 4. E/S en archivos externos SAP permite trabajar con archivos secuenciales localizados tanto en el servidor de aplicación como en el servidor de presentación. Servidor de aplicación Las sentencias que permiten trabajar con archivos en el servidor de aplicación son: Sentencia Descripción OPEN DATASET Abre un archivo del servidor de aplicación. TRANSFER Transfiere un registro al archivo del servidor de aplicación. READ DATASET Lee un registro del archivo del servidor de aplicación. DELETE DATASET Borra un archivo del servidor de aplicación. CLOSE DATASET Cierra un archivo del servidor de aplicación. OPEN DATASET: Las siguientes opciones se utilizan para especificar la forma en que se va a abrir el archivo: FOR INPUT: Abre el archivo para lectura FOR OUTPUT: Abre el archivo para escritura (si tenía algún contenido lo sobreescibe). Si el archivo no existe lo crea. FOR APPENDING: Abre el archivo para escritura (si tenía algún contenido, lo mantiene y agrega lo nuevo al final). Si el archivo no existe lo crea.

Página 44 de 63

IN TEXT MODE: Los contenidos del archivo se estructuran en líneas. Cada READ DATASET o TRANSFER leen o escriben una línea del archivo. IN BINARY MODE: Los contenidos del archivo no se estructuran en líneas. El resultado de OPEN DATASET puede comprobarse verificando el valor de SY-SUBRC (si es 0 significa que el archivo se abrió correctamente). Ej: * Escritura de un archivo de texto PARAMETERS p_file(80) TYPE C. DATA registro LIKE bkpf. ... OPEN DATASET p_file FOR OUTPUT IN TEXT MODE. "abrir el archivo IF SY-SUBRC = 0. ... TRANSFER registro TO p_file. * graba un registro (línea) en el archivo ... CLOSE DATASET p_file. "cerrar el archivo ENDIF. * Lectura del archivo de texto OPEN DATASET p_file FOR INPUT IN IF SY-SUBRC = 0. DO. READ DATASET p_file IF SY-SUBRC 0. EXIT. ENDIF. ENDDO. CLOSE DATASET p_file. ENDIF.

TEXT MODE.

"abrir el archivo

INTO registro.

"Leer un registro

"Salir si ya no hay registros en el archivo "cerrar el archivo

* Borrar un archivo DELETE DATASET p_file.

Servidor de presentación Para trabajar con archivos de la PC local, el sistema no ofrece sentencias ABAP sino una serie de módulos de función. Módulo de función Descripción DOWNLOAD Crea un archivo en el servidor de presentación, CON diálogo con el usuario. WS_DOWNLOAD Crea un archivo en el servidor de presentación, SIN diálogo con el usuario. UPLOAD Lee un archivo del servidor de presentación, CON diálogo con el usuario. El contenido del archivo se guarda en una tabla interna. WS_UPLOAD Lee un archivo del servidor de presentación, SIN diálogo con el usuario. El contenido del archivo se guarda en una tabla interna.

Página 45 de 63

XX. Procesos Batch Input El concepto de Batch Input consiste en la actualización de la base de datos a través de las transacciones del sistema en forma automática. Los métodos Batch Input ofrecen las siguientes ventajas: • Sin intervención: No se requiere intervención manual durante la transferencia de datos. • Integridad de datos: Un batch input introduce los datos al sistema SAP de la misma forma en que lo haría un usuario, introduciendo los datos manualmente, a través de las transacciones SAP. Todos los controles y chequeos de la transacción también están presentes en la transferencia de datos con Batch Input. Para realizar un batch input el sistema ofrece los siguientes métodos: • Método “Batch Input clásico”: Un programa ABAP lee los datos externos y genera una sesión (juego de datos) de Batch Input. Luego de generarla hay que procesarla desde la transacción SM35 (Sistema -> Servicios -> Batch Input -> Carpetas). • Método “Call transaction using”: Este método utiliza la sentencia “Call transaction” para ejecutar la transacción. No genera juego de datos, las transacciones son ejecutadas online. Todos los métodos Batch Input se apoyan en tablas internas con la estructura BDCDATA. Estructura BDCDATA CAMPO TIPO LONGITUD SIGNIFICADO PROGRAM CHAR 8 Nombre del module-pool (programa) de la transacción. DYNPRO NUMC 4 Nombre del dynpro de la transacción. DYNBEGIN CHAR 1 Inicio de datos de un dynpro. FNAM CHAR 35 Nombre de campo. FVAL CHAR 80 Valor de campo. Esta estructura se utiliza de la siguiente manera: Identificación del dynpro: Lo primero que se hace es identificar el dynpro sobre el cual vamos a cargar datos. Para esto se inserta un registro en la tabla BDCDATA con la información en los campos PROGRAM (nombre de programa), DYNPRO (número de dynpro) y DYNBEGIN = ‘X’ (comienza una nueva dynpro). Los campos FNAM y FVAL deben estar en blanco. Ej: CLEAR TABLA. TABLA-PROGRAM = ‘SAPMS38M’. TABLA-DYNPRO = ‘0100’. TABLA-DYNBEGIN = ‘X’. APPEND TABLA. Introducción de valores de un campo: Después de registrar los valores del dynpro, se especifican los valores de los campos que se quieren cargar en pantalla, generando entradas en la tabla BDCDATA con los campos FNAM (nombre de campo) y FVAL (valor). Ej: CLEAR TABLA. TABLA-FNAM = ‘BKPF-BLDAT’. TABLA-FVAL = sy-datum. APPEND TABLA. Ejecución de una función: Para ejecutar una función en una transacción hay que introducir el código de función en el campo de comandos. Para esto se genera una entrada en la tabla BDCDATA con el campo FNAM con valor ‘BDC_OKCODE’ (para indicar que es un comando) y el campo FVAL con el código de comando a ejecutar. Ej: CLEAR TABLA. TABLA-FNAM = ‘BDC_OKCODE’. TABLA-FVAL = ‘/11’. APPEND TABLA.

Página 46 de 63

Campos especiales (bucles): Para poder especificar un campo en un bucle (por ejemplo en una grilla con datos) hay que especificar en FNAM el nombre de campo seguido del subíndice entre paréntesis. Ej: CLEAR TABLA. TABLA-FNAM = ‘Q0391-LGART(04)’. TABLA-FVAL = ‘7B01’. APPEND TABLA. Posicionamiento del cursor: Para posicionar el cursor en un campo determinado, se genera una entrada en BDCTAB con FNAM = ‘BDC_CURSOR’ y FVAL con el nombre de campo donde se desea situar el cursor. Ej: CLEAR TABLA. TABLA-FNAM = ‘BDC_CURSOR’. TABLA-FVAL = ‘BKPF-BLDAT’. APPEND TABLA. Método “Batch Input Clásico” Este método crea sesiones (juegos de datos) de batch input. Para ello se utilizan los siguientes módulos de función: MÓDULO DE FUNCIÓN SIGNIFICADO BDC_OPEN_GROUP Crear un juego de datos de Batch Input BDC_INSERT Insertar una transacción en el juego de datos de Batch Input. Toda la información correspondiente a la ejecución de la transacción estará contenida en una tabla interna con estructura BDCDATA. BDC_CLOSE_GROUP Cerrar un juego de datos de Batch Input. Ej: * Crear un juego de datos Batch Input CALL FUNCTION 'BDC_OPEN_GROUP' EXPORTING CLIENT = SY-MANDT " Mandante GROUP = 'FACTURAS' " Nombre J.Datos HOLDDATE = v_fecha " Fecha de bloqueo (opcional) KEEP = 'X' " Mantener J.datos procesado (opcional) USER = sy-uname " Usuario propietario de sesión EXCEPTIONS CLIENT_INVALID = 1 DESTINATION_INVALID = 2 GROUP_INVALID = 3 GROUP_IS_LOCKED = 4 HOLDDATE_INVALID = 5 INTERNAL_ERROR = 6 QUEUE_ERROR = 7 RUNNING = 8 SYSTEM_LOCK_ERROR = 9 USER_INVALID = 10 OTHERS = 11 . * Ahora hay que llenar la tabla interna. REFRESH tabla. * Primer pantalla clear tabla. tabla-program = ‘SAPMS38M’. tabla-dynpro = ‘0100’. tabla-dynbegin = ‘X’. append tabla. * Campo de la primer pantalla clear tabla. tabla-fnam = ‘RF02K-EKORG’. tabla-fval = v_ekorg. append tabla.

“Podría ir un literal

Página 47 de 63

* Comando de la primer pantalla clear tabla. tabla-fnam = ‘BDC_OKCODE’. tabla-fval = ‘P+’. append tabla. * Siguiente pantalla clear tabla. tabla-program = ‘SAPMS38M’. tabla-dynpro = ‘0200’. tabla-dynbegin = ‘X’. append tabla. * Comando de la segunda pantalla clear tabla. tabla-fnam = ‘BDC_OKCODE’. tabla-fval = ‘/11’. append tabla. * Insertar una transacción en el juego de datos CALL FUNCTION 'BDC_INSERT' EXPORTING TCODE = 'FB01' “Transacción TABLES DYNPROTAB = tabla “Tabla interna (BDCDATA) EXCEPTIONS INTERNAL_ERROR = 1 NOT_OPEN = 2 QUEUE_ERROR = 3 TCODE_INVALID = 4 PRINTING_INVALID = 5 POSTING_INVALID = 6 OTHERS = 7 . * Cerrar in juego de datos Batch Input CALL FUNCTION 'BDC_CLOSE_GROUP' EXCEPTIONS NOT_OPEN = 1 QUEUE_ERROR = 2 OTHERS = 3.

Método “CALL TRANSACTION using” Este método es el visto en la sentencia CALL TRANSACTION. En USING se le pasa la tabla interna con estructura BDCDATA (la misma que en el “batch input clásico”). Ej: CALL TRANSACTION ‘SU01’ USING TABLA “Tabla con formato BDCDATA MODE ‘N’ “No visible MESSAGES INTO msgtab. “Tabla interna con los mensajes

Página 48 de 63

Programas estándar de Batch Input Existen transacciones estándar que son bastante complejas. Realizar un batch input con ellas supondría un gran esfuerzo. Por ejemplo, la transacción FB01 permite contabilizar documentos de finanzas (FI). Las dynpros que se presentan en cada caso son en función de los indicadores de operación y cuentas de mayor utilizadas. Para solucionar este problema SAP provee programas estándar de Batch Input. Estos programas leen los datos de un archivo secuencial en un formato especial, de manera que lo que queda por hacer es un programa que lea los datos a levantar, los grabe en un archivo con este formato especial y ejecutar el programa estándar. Ej: RFBIBL00 (crea documentos FI), RFBIDE00 (Crea y modifica deudores) RMMMBIM0 (Crea/modifica materiales) Ejecutar un juego de datos desde el programa ABAP Una vez que generamos un juego de datos desde el programa ABAP, éste queda listo para procesar manualmente desde la transacción SM35. Si se desea que el programa ya ejecute el juego de datos, puede hacerse haciendo un SUBMIT del programa RSBDCSUB, que procesa juegos de datos en background. Ej: SUBMIT RSBDCSUB WITH MAPPE EQ v_sesion “Nombre j. datos WITH VON EQ sy-datum “Fecha de creación WITH Z_VERARB EQ 'X' “Status: NUEVO WITH FEHLER EQ ' ' “Status: ERRONEO AND RETURN.

Transacción grabadora de batch-input Mediante la transacción SHDB se puede grabar una sesión Batch Input, de manera de poder ver los nombres de campos y dynpros que intervienen. Esa grabación se puede crear un programa o un módulo de función para procesar el Batch Input de la forma en la que se grabó en la grabadora e Batch Input. Para iniciar una grabación nueva:

Grabación nueva Crear un programa en base a una grabación

Página 49 de 63

XXI. User Exits Las User Exits son funciones que SAP proporciona dentro de sus transacciones estándar, y que permiten ampliar la funcionalidad de dichas transacciones sin modificar los programas estándar de SAP. Esto es lo que en SAP se denominan Ampliaciones, porque se amplía la funcionalidad del sistema. La gran ventaja es que se tiene la seguridad de que las ampliaciones al estándar no se van a sobreescribir por la aplicación de parches o upgrades al sistema. Cómo sé si una transacción estándar tiene asociada un User Exit? Hay varias formas de buscar un user exit en la transacción estándar: • Buscar en el código del programa la sentencia:  CALL CUSTOMER-FUNCTION 'xxx'. Dicha sentencia es la que invoca la user exit si está activa. • Buscar por clase de desarrollo: en la transacción CMOD, entrar por menú Utilidades -> Ampliaciones SAP. Ingresar la clase dedesarrollo de la transacción estándar y ejecutar. • Buscar por jerarquía de aplicaciones: acceder a Herramientas -> Workbench ABAP-> Resumen-> Jerarquía de Aplicaciones. Pararse en la rama correspondiente al módulo al que pertenece la transacción estándar (por ejemplo: LO –Logística general-) y marcarla. Seleccionar el botón "Sistema de información" y en el árbol de informes que aparece . Desplegar la rama Ent. -> Técnicas Exit -> Exits de Cliente -> Ampliaciones y ejecutar. Una vez encontrada la User Exit adecuada, hay que codificarla: Acceder a la transacción CMOD, desde aquí hay que crear un Proyecto.

Una vez creado seleccionar el radiobutton “Asignación ampliaciones cliente” y pulsar “Modificar”.

Ingresar el nombre del Exit que se va a usar, y pulsar “Componentes”.

Haciendo doble click en el nombre del módulo de función, nos lleva al módulo de función que contiene un Include. Dentro de ese include debemos ingresar el código de nuestra user exit. Luego de esto HAY QUE ACTIVAR EL PROYECTO para que funcione el EXIT.

Página 50 de 63

XXII.Field Exits Los Field Exits son validaciones particulares que se aplican a un campo de pantalla determinado. A diferencia de las user exits, puede crearse un field exit que actúe sobre cualquier campo de cualquier transacción de diálogo, pero actúa solamente sobre el valor de ese campo, es decir que en el momento de ejecutarlo desconoce el valor de el resto de los campos ingresados en la transacción. Los field exits se definen sobre ELEMENTOS DE DATOS, y nosotros decimos en que programa/pantalla se va a activar. Para crear/modificar/visualizar un field exit, debe ejecutarse el porgrama RSMODPRF. Al ejecutarlo (sin indicar parámetros de selección) vemos la siguiente pantalla:

Para crear un field exit, hay que ejecutar la opción de menú Exit Campo -> Crear.

Cargar el elemento de datos sobre el cual se quiere crear el field exit, y pulsar ”Continuar”. Nos lleva a la transacción SE37, donde nos propone el nombre del módulo de función que se va a crear. En dicho módulo de función se va a codificar el field exit. Este módulo de función tiene un parámetro INPUT de entrada y un parámetro OUTPUT de salida. Lo mímimo que debe tener esta función es OUTPUT = INPUT, para que el valor ingresado se siga viendo en pantalla luego de ejecutarse.

Página 51 de 63

Grabar y activar la función. Volver a la pantalla de field exits.

Una vez creado el field exit, hay que asignarlo al programa/dynpro sobre el cual queremos que se ejecute. Para esto lo marcamos y pulsamos “Asignar prog./dynpro”.

En “ExitCamp”, se pone el número de field exit. Esto solamente es necesario si para un mismo elemento de datos queremos crear field exits diferentes en distintos programas/dynpros. Para terminar, marcar el field exit y acceder al menú Exit Campo -> Activar.

Página 52 de 63

XXIV.Field Symbols Hay veces que en el programa que se está desarrollando se presenta la problemática de que el nombre de campo que se tiene que utilizar no se conoce hasta el momento de ejecución. En estos casos se usan los FIELD-SYMBOLS. Un field symbol es un “puntero” a un campo existente. No tiene reservado espacio físico, ya que apunta a otro campo existente, que puede ser cualquier objeto de datos ABAP (variables, estructuras, campos de estructuras) o cualquier tabla o estructura definida en el diccionario de datos. Declaración de field symbols La forma básica de declarar un field symbol es: FIELD-SYMBOLS . “Field symbol de cualquier tipo También puede definirse un field symbol de un tipo determinado (con TYPE o LIKE como cualquier variable): Ej: FIELD-SYMBOLS TYPE N. Procesamiento de field symbols Antes de poder utilizar un field symbol, hay que asignarle un objeto de datos (variable, campo de estructura, etc.). Este objeto de datos debe ser conocido para el programa en el momento de la asignación. Luego de la asignación el field symbol pasa a “apuntar” al objeto especificado, de manera que tiene su mismo valor y cambia cuando cambia el objeto de datos original. Luego de un ASSIGN, el field symbol hereda el tipo (y por lo tanto las características) del objeto de datos que se le asignó. Sentencia Descripción ASSIGN Asigna un objeto de datos a un field symbol. UNASSIGN Desasigna el objeto de datos del field symbol. El field symbol ahora no apunta a nada. Ej: *** Asignación estática DATA: fecha LIKE SY-DATUM. FIELD-SYMBOLS . Fecha = SY-DATUM. ASSIGN fecha TO . WRITE .

“Ahora el field symbol apunta a FECHA “Imprime la fecha del día.

*** Asignación dinámica. Ahora tenemos en una variable tipo C un nombre de campo. DATA V_SUB(2) TYPE N. DATA V_CAMPO(10) TYPE C. DATA salida LIKE pa0008-bet01. FIELD-SYMBOLS . ... CONCATENATE 'PA0008-BET' v_sub INTO v_campo. ASSIGN (v_campo) TO . “Asigna a el valor de PA0008-BETxx IF SY-SUBRC eq 0. “Si existe el campo MOVE TO salida. ENDIF. *** Ejemplo del uso de UNASSIGN UNASSIGN . “ ahora no apunta a nada *** Otros ejemplos del uso de field symbols - OFFSETS FIELD-SYMBOLS .

Página 53 de 63

DATA texto(15) TYPE C. ... ASSIGN texto+5(10) TO . “Asigna especificando un offset. tiene longitud 10 ... ASSIGN texto+5 TO . “ERROR de protección de memoria. TIENE LONGITUD 15 ... ASSIGN texto+5(*)TO . “Evito el error anterior, con ‘*’ hago que no se pase la long. *** Otros ejemplos del uso de field symbols – ASIGNAR CON TIPOS DATA fecha(8) TYPE C value ‘20020315’. FIELD SYMBOLS . ... ASSIGN fecha TO . WRITE . “Imprime 20020315 ( es texto) ASSIGN fecha TO type 'D'. WRITE . “Imprime 15032002 ( es fecha –‘D’-)

Página 54 de 63

XXV.Transacciones del Entorno de Desarrollo A continuación se detallan las principales transacciones del entorno de programación ABAP. Algunas de ellas ya fueron vistas durante el desarrollo del curso: SE38: Editor ABAP. SE51: Screen Painter - Diseño y lógica de proceso de dynpros. SE41: Menu Painter - Definición de status de programas. SE11: Diccionario ABAP - Definición de tablas, vistas, estructuras, elementos de datos, dominios, ayudas para búsqueda, objetos de bloqueo. SE37: Bibliteca de funciones - Definición de módulos de función. SE36: Gestión de bases de datos lógicas. SM35: Gestión de juegos de datos batch input. SM37: Gestión de jobs. SE91: Gestión de mensajes. CMOD: Gestión de proyectos de ampliación - Desde aquí se crean los user-exits. Otras transacciones aún no fueron vistas en detalle: SE16: Data browser - Permite ver el contenido de cualquier tabla de base de datos. SE80: Browser de repository - Definición de Clases de desarrollo, grupos de funciones. SE39: Editor split screen - Permite comparar dos programas. SE93: Gestión de transacciones - Permite crear transacciones para los module pool, así como asignar códigos de transación a los reportes. SE43: Menús de ámbito - Permite tratar la estructura del menú SAP, agregando/quitando o modificando componentes. SE30: Análisis de tiempo de ejecución. Permite evaluar los tiempos de ejecución de un programa o una transación. El análisis puede limitarse a accesos a base de datos, llamadas a módulos de función, subrutinas, etc, generando luego un reporte del mismo. SM21: System Log. Permite ver el log con los mensajes del sistema que se producen. En el log pueden aparecer errores que se producen en la ejecución de los programas ABAP, conexiones y desconexiones de usuarios, etc. ST05: SQL Trace - Permite analizar las sentencias relacionadas con el acceso a bases de datos por parte del usuario. ST22: Análisis dumps - Permite ver el log de los dumps (cancelaciones) que ocurrieron en el sistema. SE61: Documentación - Permite asociar un texto de documentación a los objetos del sistema (programas, elementos de datos, mensajes, etc.). SE63: Traductor - Permite convertir textos de un idioma a otro. STMS: Sistema de transporte - Permite transportar y gestionar órdenes de workbench y customizing. SE81: Jerarquía de aplicación - Permite consultar los componentes de un módulo. Estos componentes son objetos del diccionario, programas, transacciones, grupos de funciones, bases de datos lógicas, etc.

Página 55 de 63

Gestión de Versiones Se utiliza para ver las versiones de los objetos y realizar comparaciones entre los mandantes. Ir al menú UTILIDADES  VERSIONES Gestión de Versiones.

Ejemplo: Mandante: 210

Trx: SE11

TABLA: ZFN_ODS.

Al seleccionar Gestión de versiones, aparecerá una lista de todas las versiones de ese objeto.

Página 56 de 63

La opción que tiene el tilde es la que esta activa, en este en desarrollo. Para comparar con la versión de Producción o QAS, ir a COMPARACION REMOTE.

Completar el sistema Destino (TEP, TEQ) y Ejecutar.

Esta es la versión que esta en PRD.

Página 57 de 63

Si se quiere ver el código o los objetos que fueron modificados, hay que ir a COMPARACION REMOTE. Aparecerá:

Página 58 de 63

XXVI.Creación de Módulos de Función La transacción desde la cual se crea un módulo de función es SE37. La primer pantalla pide un nombre de módulo de función. Los módulos de función del cliente deben comenzar con 'Z' o 'Y'.

Una vez que se ingresa el nombre del módulo de función, se presiona 'Crear' y aparece la siguiente pantalla:

Se pide (en forma obligatoria) ingresar un grupo de funciones. Cada módulo de función tiene que formar parte de un grupo de funciones. Puede usarse uno existente o crear uno nuevo (desde la pantalla anterior). A su vez debe ingresarse en 'Texto Breve' una descripción del módulo de función que se va a crear. Luego hacer click en 'Grabar'. Se pide clase de desarrollo y orden de transporte (si la clase de desarrollo no es '$TMP').

Página 59 de 63

En la pantalla de atributos del módulo de función se ven las propiedades del mismo, y puede determinarse el tipo de módulo de función (normal, de acceso remoto -RFC-, etc.).

Las siguientes pantallas permiten definir la interfase del módulo de función, es decir sus parámetros de entrada (IMPORT), sus parámetros de salida (EXPORT) y las tablas internas, que pueden ser tanto parámetros de entrada como de salida (TABLES). También pueden definirse excepciones (EXCEPTIONS) que son eventos de error que dispara el módulo de función y es capturable por el programa que lo invocó (a través de la sentencia RAISE).

Finalmente, la última pantalla es la que permite definir el código fuente, el cual se incluye entre las sentencias FUNCTION y ENDFUNCTION. El módulo de función debe activarse para poder ser utilizado.

Página 60 de 63

ERRORES DEL SISTEMA Ya sabemos que la variable SY-SUBRC controla los errores del sistema, lo valores que puede tomar depende de la instrucción que utilizamos, por ello voy a dar que error da en las siguientes instrucciones: - Cuando hacemos operaciones con tablas ya sean de diccionario o internas: 0 -> No hay errores. 2 -> Se ha producido algún error ya sea a leer, añadir, borrar o modificar. - Cuando realizamos un algún SCROLL, con la orden SCROLL: 0 -> OK 4 -> Límite de la lista rechazado. Scrolling imposible 8 -> Lista no existe. Scrolling imposible - Cuando leemos un fichero secuencial: 0-> No ha llegado al final del fichero. 4-> Ha llegado al final del fichero. - Cuando hacemos la orden OVERLAY: 0->La sustitución ha sido un éxito. 4->Cuando STR1 es mayor que STR2 - Cuando realizamos la orden SEARCH:

Página 61 de 63

Notas Implementable por versión Las notas pueden o no ser implementables en nuestro sistema, todo depende del nivel de support package que tenemos. Para ver eso tenemos que ir a SISTEMA -> STATUS -> VERSION COMPONENTES (click en la lupa). Ahí aparece un listado de todos los que hay en el sistema.

Tomando una nota cualquiera podemos ver que tenemos dos nros de support package: Uno indica el package en el que viene incluidas las modificaciones de la nota actual. Si el nuestro es igual o mayor, la nota no es implementable, caso contrario, si. En la nota, esto se encuentra inmediatamente antes de las instrucciones de corrección. Links to Support Packages Software Component Release Package Name ________________________________________________________________________ R/3 Standard 470 SAPKH47012 ________________________________________________________________________

El otro nro de support package que podemos encontrar es al comienzo de cada instrucción de corrección e indica hasta que nivel esas correcciones son aplicables: *&---------------------------------------------------------------------* *$*$----------------------------------------------------------------$*$* *$ Instrucc.corrección 0120031469 0000245090 $* *$ Instr.correc.requeridas 0120061532 0000498981 Nota 0000584049 *$ 0120061532 0000545670 Nota 0000615367 $* *$--------------------------------------------------------------------$* *$ Validez : $*

$*

Página 62 de 63

*$ Comp.software SAP_APPL R/3 Standard *$ Release 470 Al SAPKH47014 *$*$----------------------------------------------------------------$*$* *&---------------------------------------------------------------------* *& Objeto DYNP SAPLCOMD3100 *& Cabecera obj. FUGR COMD *&---------------------------------------------------------------------*

$* $*

Notas requeridas Es común que al intentar aplicar una nota, el sistema avise que hay otras notas como prerrequisito. En este caso hay que bajarlas y aplicarlas antes de aplicar la nuestra. El sistema se encarga de todo eso. Nuestra preocupación tiene que ser el revisar las notas y chequear que no haya que hacer alguna modificación a mano. Visualizando la nota podemos ver las notas que requiere que estén aplicadas. Esto lo vemos en la cabecera de las instrucciones de corrección. *&---------------------------------------------------------------------* *$*$----------------------------------------------------------------$*$* *$ Instrucc.corrección 0120031469 0000245090 $* *$ Instr.correc.requeridas 0120061532 0000498981 Nota 0000584049 *$ 0120061532 0000545670 Nota 0000615367 $* *$--------------------------------------------------------------------$* *$ Validez : $* *$ Comp.software SAP_APPL R/3 Standard $* *$ Release 470 Al SAPKH47014 $* *$*$----------------------------------------------------------------$*$* *&---------------------------------------------------------------------* *& Objeto DYNP SAPLCOMD3100 *& Cabecera obj. FUGR COMD *&---------------------------------------------------------------------*

$*

Página 63 de 63