Curso ABAP - Manual v1
Curso ABAP - Manual v1
Curso ABAP - Manual v1
Temario y
material de soporte
Curso programación ABAP IV
1. INTRODUCCION
2. INTRODUCCION A LA PROGRAMACIÓN
Pág. 2
Curso programación ABAP IV
3. DICCIONARIO
4. REPORTS
Pág. 3
Curso programación ABAP IV
5. PROGRAMACIÓN DE DIÁLOGO
5.1 INTRODUCCIÓN
5.2 MODULE POOLS
5.2.1 Introducción
5.2.2 Programa marco o principal
5.2.3 Atributos de la pantalla
5.2.4 Diseño gráfico
5.2.5 Status de pantalla (barra menús, teclas función, barra
herramientas, barra pulsadores, …)
5.2.6 Lógica del proceso
PBO
PAI
PROCESS ON HELP-REQUEST
PROCESS ON VALUE-REQUEST
5.2.7 Sentencias
SET PF-STATUS
SET TITLEBAR
MODULE
LEAVE PROGRAM
AT EXIT-COMMAND
AT CURSOR-SELECTION
MESSAGE
FIELD
CHAIN…ENDCHAIN
ON INPUT
ON CHAIN-INPUT
ON REQUEST
ON CHAIN-REQUEST
ETC
5.2.8 Asignación de transacciones (SE93)
5.2.9 Modificación dinámica de una pantalla (LOOP AT SCREEN)
5.2.10 TABLE CONTROL Y TABS
Pág. 4
Curso programación ABAP IV
6-FUNCIONES
6.1 INTRODUCCIÓN
6.2 CREACIÓN DE UN GRUPO DE FUNCIONES
6.3 CREACIÓN DE UNA FUNCIÓN
6.4 PARÁMETROS DE UNA FUNCIÓN
6.4.1 Import
6.4.2 Export
6.4.3 Changing
6.4.4 Tablas
6.5 EXCEPCIONES
6.6 DATOS GLOBALES
6.7 CÓDIGO FUENTE
6.8 EJECUCIÓN
6.9 RFCs y BAPIs
7.1 INTRODUCCIÓN
7.2 PARÁMETROS DE MEMORIA SAP (SET, GET, DATOS PROPIOS)
7.3 SENTENCIAS DE LLAMADAS A PROGRAMAS (SUBMIT, CALL
TRANSACTION)
7.4 INTERCAMBIO DE DATOS A TRAVÉS DE LA MEMORIA ABAP/4
(EXPORT, IMPORT, FREE MEMORY)
8-INTERFASES
8.1 INTRODUCCIÓN
8.2 TRATAMIENTO DE FICHEROS
8.3 INSTRUCCIONES
8.3.1 Lectura/Escritura de ficheros físicos (GUI_DOWLOAD,
GUI_UPLOAD)
8.3.2. Lectura ficheros servidor
OPEN DATASET
READ DATASET
TRANSFER
CLOSE DATASET
DELETE DATASET
8.3.3 EXPLORAR FICHEROS (AL11)
8.3.4 TRANSACCIÓN FILE (FICHEROS LÓGICOS)
8.3.5 PROGRAMAS DE CARGA
8.3.6 BATCH INPUT
Introducción
Pág. 5
Curso programación ABAP IV
Grabadora (SHDB).
BDC_OPEN_GROUP
BDC_INSERT
CLOSE_GROUP
Creación de juegos de datos
Tratamiento/Ejecución de juegos de datos
CALL TRANSACTION (OPCIONES)
DIRECT INPUT
8.3.7 LEGACY SYSTEM MIGRATION WORKBENCH (LSMW)
9-FORMULARIOS
9.1 INTRODUCCIÓN
9.2 ESTRUCTURA DE UN FORMULARIO (PROG.IMPRESIÓN, FORMULARIO)
9.3 EDITOR DEL FORMULARIO (SE71)
9.3.1 Cabecera
9.3.2 Páginas
9.3.3 Ventanas
9.3.4 Ventana página
9.3.5 Formatos de párrafo
9.3.6 Formatos caracteres
9.3.7 Elementos de texto
9.4 SAPSCRIPT
9.4.1 Cajas, líneas y sombreados
9.4.2 Comandos de control
9.4.3 Símbolos SAPScript
9.4.4 Símbolos del sistema
9.4.5 Campos generales de SAPScript
9.4.6 Opciones de formato de los símbolos
9.4.7 Formularios en varios idiomas
9.4.8 Inclusión de gráficos
9.5 PROGRAMA DE IMPRESIÓN
9.5.1 OPEN_FORM
9.5.2 WRITE_FORM
9.5.3 CLOSE_FORM
9.5.4 ETC
9.6 SMARTFORMS
9.6.1 Parametrización global
9.6.2 Paginas y ventanas (MAIN)
9.6.3 Elementos para control de flujo
10.1 INTRODUCCIÓN
10.2 CLASES Y OBJETOS
10.3 METODOS Y PROPIEDADES
10.4 HERENCIA
Pág. 6
Curso programación ABAP IV
10.5 POLIMORFISMO
10.6 TABLAS INTERNAS DE OBJETOS
10.7 EJEMPLOS
Pág. 7
Curso programación ABAP IV
1. Introducción
Pág. 8
Curso programación ABAP IV
Pág. 9
Curso programación ABAP IV
Menú de usuario
Pág. 10
Curso programación ABAP IV
Favoritos, transacciones.
Pág. 11
Curso programación ABAP IV
2. Introducción a la programación
Pág. 12
Curso programación ABAP IV
2.1.2 Variables
Las variables se definen con la sentencia DATA.
Si no se indica lo contrario las variables se definirán por defecto de tipo carácter (Texto)
con longitud 1.
DATA D_CARACTER. “Se creará una variable de texto con longitud 1
DATA D_CARACTER (8). “Se creará una variable de texto con longitud 8
Con el parámetro VALUE podemos inicializar la variable con un valor distinto al que
tiene por defecto.
Con la cláusula LIKE podemos declarar una variable con los mismos atributos de
longitud y tipo que un campo del diccionario de datos o que otra variable definida
previamente.
2.1.3 Constantes
Las constantes se definen con la sentencia CONSTANTS.
Para la definición de constantes se aplican las mismas reglas que para la definición de
variables pero siempre hay que darle un valor inicial que no podrá ser modificado
durante la ejecución del programa.
2.1.4 Estructuras
Una estructura es un conjunto de campos relacionados lógicamente y se define con la
sentencia DATA:
Pág. 13
Curso programación ABAP IV
END OF <estructura>.
Estas instrucciones crean una estructura con todos los campos de la tabla del
diccionario T001 y el campo CONTADOR como último campo.
Para hacer referencia posteriormente a los campos de la estructura se especificará el
nombre de la estructura y del campo separados por un guión.
R_PROVEEDOR-NOMBRE = ‘JOSE’.
2.1.5 Rangos
Los rangos son tablas internas con una estructura determinada que se utilizan para
almacenar rangos de valores para un tipo de campo y se definen con la sentencia
RANGES:
Los rangos se utilizan para chequear valores válidos en sentencias condicionales del
campo al que hace referencia. Si un rango no contiene ningún registro, asume que
cualquier valor del campo al que hace referencia es válido.
TABLES: LFA1.
RANGES G_PROVEEDOR FOR LFA1-LIFNR.
Pág. 14
Curso programación ABAP IV
G_PROVEEDOR-SIGN = “I”.
G_PROVEEDOR-OPTION = “BT”. “Operador ENTRE
G_PROVEEDOR-LOW = “1”.
G_PROVEEDOR-HIGH = “9”.
APPEND G_PROVEEDOR.
El rango creado hace referencia a los valores del campo LFA1-LIFNR comprendidos
entre el valor “1” y “9” ambos inclusive.
2.1.6 FIELD-SYMBOLS
Los FIELD-SIMBOLS son campos simbólicos que se pueden referenciar a un campo
concreto en tiempo de ejecución del programa, y se definen con la sentencia FIELD-
SYMBOLS:
FIELD-SYMBOLS: <CAMPO>.
DATA: D_CONTADOR_1 TYPE I,
D_CONTADOR_2 TYPE I.
2.2 Modularización
2.2.1 Subrutinas.
Las subrutinas son conjuntos de instrucciones que pueden ser llamadas desde el
programa en diversas ocasiones, evitando así su codificación cada vez que se
necesiten ejecutar y dando además mayor claridad al programa.
Para definir una subrutina se utilizan las sentencias FORM y ENDFORM, que se
especifican respectivamente al inicio y final de las instrucciones que forman la subrutina.
Pág. 15
Curso programación ABAP IV
…
PERFORM <nombre> USING parametro1 parametro2 ...
...
FORM <nombre> USING parametro1 parametro2 ...
...
ENDFORM.
...
PERFORM <nombre> USING parametro1 parametro2 ...
...
FORM <nombre> USING VALUE(parametro1) VALUE(parametro2) ...
...
ENDFORM.
Pág. 16
Curso programación ABAP IV
También se puede pasar como parámetro una tabla interna por referencia con la
cláusula TABLES.
Pág. 17
Curso programación ABAP IV
ENDFORM.
2.2.2 Includes
Los INCLUDES son unos programas que contienen definiciones que pueden ser
utilizadas en otros programas insertando en estos la sentencia INCLUDE <nombre>.
Este tipo de programas no son ejecutables directamente, han de estar incluidos en otros
para que puedan ser ejecutado el código que contienen.
CAMPO CONTENIDO
ABCDE Alfabeto (A, B, C, D, ….)
COLNO Columna actual en la creación de una lista
CPAGE Nº de la página actual
CPPROG Nombre del programa principal
CUCOL Posición del cursor, columna
CURROW Posición del cursor, línea
DATUM Fecha del sistema
DBNAME Base de datos lógica usada en Report
DYNGR Grupo de dynpros al que pertenece la dynpro actual
DYNNR Nº de la pantalla actual
FDPOS Lugar de hallazgo de un string
FMKEY Menú de teclas de función
INDEX Cantidad de ejecuciones del LOOP
LILLI Nº de línea en la lista actual
LINCT Cantidad de líneas de la lista
LINNO Línea actual en la creación de una lista
Pág. 18
Curso programación ABAP IV
Pág. 19
Curso programación ABAP IV
2.4.1 Asignación
Existen diversas formas de asignar valores a una variable en ABAP/4:
Asignación directa
Se asigna un valor a una variable directamente utilizando el operador “=”.
<variable> = valor.
Sentencia MOVE.
Asigna un valor a una variable.
MOVE <valor> TO <variable>.
Sentencia MOVE-CORRESPONDING.
Mueve el contenido de los campos de una estructura a los campos que tengan el mismo
nombre de otra estructura.
MOVE-CORRESPONDING <estructura_origen> TO <estructura_destino>.
Sentencia CLEAR.
Inicializa el contenido de un campo a su valor inicial según el tipo de dato (espacios en
el tipo carácter, cero en el tipo entero, etc.).
CLEAR <campo>.
OFFSETS.
Se puede hacer referencia parcial a una parte de un campo indicando el número de
posiciones que hay hasta la posición en la que se comienza a referenciar utilizando el
operador ‘+’, y la cantidad de posiciones que se referencian entre paréntesis.
MOVE <campo1>+<posiciones>(longitud) TO <campo2>.
D_CARACTER_2 = D_CARACTER_1+2(4) .
Pág. 20
Curso programación ABAP IV
2.4.2 Condicionales
Las sentencias condicionales permiten ejecutar una serie de instrucciones solamente
cuando se cumplan una serie de condiciones.
Operadores condicionales.
Las condiciones se construyen utilizando los siguientes operadores condicionales:
<valor> 1 EQ <valor2>.
La condición se cumple si <valor1> es igual que <valor2>. (También se puede utilizar el
carácter “=” en lugar de “EQ”).
<valor1> NE <valor2>.
La condición se cumple si <valor1> es distinto que <valor2>. (También se pueden
utilizar los caracteres “<>” en lugar de “NE”).
<valor1> GT <valor2>.
La condición se cumple si <valor1> es mayor que <valor2>. También se puede utilizar el
carácter “>” en lugar de “GT”).
<valor1> LT <valor2>.
La condición se cumple si <valor1> es menor que <valor2>. También se puede utilizar el
carácter “<” en lugar de “LT”).
<valor1> GE <valor2>.
La condición se cumple si <valor1> es mayor o igual que <valor2>. También se pueden
utilizar los caracteres “>=” en lugar de “GE”).
<valor1> LE <valor2>.
La condición se cumple si <valor1> es menor o igual que <valor2>. También se pueden
utilizar los caracteres “<=” en lugar de “LE”).
<valor1> BETWEEN <valor2> AND <valor3>.
La condición se cumple si <valor1> está comprendido entre los valores <valor2> y
<valor3>.
<valor1> IS INITIAL.
La condición se cumple si <valor1> tiene valor inicial según el tipo de dato (espacios en
el tipo carácter, cero en el tipo entero, etc.).
<valor> IN <rango>.
La condición se cumple si <valor> tiene un valor comprendido en el rango <rango>.
Operadores lógicos.
Los operadores lógicos permiten combinar condiciones:
<condición1> AND <condición2> .
La condición formada se cumple si las dos condiciones <condición1> y <condición2> se
cumplen.
<condición1> OR <condición2> .
La condición formada se cumple si al menos una de las dos condiciones se cumple.
NOT <condición>.
La condición formada se cumple si la condición <condición> es falsa.
Pág. 21
Curso programación ABAP IV
ENDFORM.
El valor “OTHERS” comprende todos los valores que no hayan sido especificados en las
anteriores cláusulas WHEN.
CASE PE_ALINEACION.
WHEN C_L_CENTRADO.
* Se escribe el texto en la pantalla centrado
WRITE PE_TEXTO CENTERED.
WHEN C_L_IZQUIERDA.
* Se escribe el texto en la pantalla justificado a
* la izquierda
WRITE PE_TEXTO LEFT-JUSTIFIED.
WHEN C_L_DERECHA.
* Se escribe el texto en la pantalla justificado a
* derecha
WRITE PE_TEXTO RIGHT-JUSTIFIED.
WHEN OTHERS.
* Se escribe el texto en la pantalla sin justificar
WRITE PE_TEXTO.
ENDCASE.
ENDFORM.
Pág. 22
Curso programación ABAP IV
Esta subrutina escribirá por pantalla el texto recibido en el parámetro PE_TEXTO según
el valor recibido en el parámetro PE_ALINEACION:
Si se recibe el valor ‘C’ se escribe centrado.
Si se recibe el valor ‘I’ se escribe justificado a la izquierda.
Si se recibe el valor ‘D’ se escribe justificado a la derecha.
Si se recibe cualquier otro valor se escribe sin justificar.
<cadena1> CN <cadena2>.
La condición se cumple si alguno de los caracteres contenidos en <cadena1>,
incluyendo espacios en blanco, no existe en <cadena2>.
Si la condición es cierta, la variable del sistema SY-FDPOS contendrá el OFFSET del
primer carácter de <cadena1> que no existe en <cadena2>, sino contendrá la longitud
de <cadena1>.
<cadena1> CA <cadena2>.
La condición se cumple si alguno de los caracteres contenidos en <cadena1>,
incluyendo espacios en blanco, existe en <cadena2>.
Si la condición es cierta, la variable del sistema SY-FDPOS contendrá el OFFSET del
primer carácter de <cadena1> que existe en <cadena2>, sino contendrá la longitud de
<cadena1>.
<cadena1> NA <cadena2>.
La condición se cumple si ninguno de los caracteres contenidos en <cadena1>,
incluyendo espacios en blanco, existe en <cadena2>.
Si la condición es cierta, la variable del sistema SY-FDPOS contendrá la longitud de
<cadena1>, sino contendrá el OFFSET del primer carácter de <cadena1> que existe
en <cadena2>.
<cadena1> CS <cadena2>.
La condición se cumple si <cadena1> contiene <cadena2>.
Si la condición es cierta, la variable del sistema SY-FDPOS contendrá el OFFSET del
primer carácter de <cadena2> que existe en <cadena1>, sino contendrá la longitud de
<cadena1>.
Pág. 23
Curso programación ABAP IV
<cadena1> NS <cadena2>.
La condición se cumple si <cadena1> no contiene <cadena2>.
Si la condición es cierta, la variable del sistema SY-FDPOS contendrá la longitud de
<cadena1>, sino contendrá el OFFSET del primer carácter de <cadena2> que existe en
<cadena1>.
<cadena> CP <patrón>.
La condición se cumple si <cadena> contiene el patrón de búsqueda <patrón>. Este
patrón permite utilizar el carácter “*” para representar cualquier cadena de caracteres y
el carácter “+” para representar cualquier carácter.
Si la condición es cierta, la variable del sistema SY-FDPOS contendrá el OFFSET del
primer carácter de <cadena2> que existe en <cadena1>, sino contendrá la longitud de
<cadena1>.
<cadena> NP <patrón>.
La condición se cumple si <cadena> no contiene el patrón de búsqueda <patrón>.
Si la condición es cierta, la variable del sistema SY-FDPOS contendrá la longitud de
<cadena1>, sino contendrá el OFFSET del primer carácter de <cadena2> que existe en
<cadena1>.
Sentencias DO … ENDDO.
Ejecuta las sentencias delimitadas por DO y ENDDO hasta que se ejecute una
sentencia de salida como EXIT.
DO.
D_CONTADOR = D_CONTADOR + 1.
IF D_CONTADOR = 10.
EXIT.
ENDIF.
ENDDO.
Las sentencias del bucle DO se ejecutarán hasta que se ejecuta la sentencia EXIT, que
finaliza la ejecución del bucle después de haber ejecutado las sentencias 10 veces. La
variable D_CONTADOR tendrá el valor 10. La variable del sistema SY-INDEX contiene
el número de vueltas del bucle. Con la cláusula TIMES se puede especificar el número
máximo de vueltas del bucle.
Pág. 24
Curso programación ABAP IV
DO 3 TIMES.
D_CONTADOR = D_CONTADOR + 1.
IF D_CONTADOR = 10.
EXIT.
ENDIF.
ENDDO.
Las sentencias del bucle WHILE se ejecutarán hasta que se deja de cumplir la condición
cuando la variable D_CONTADOR alcanza el valor 10. La variable del sistema SY-
INDEX contiene el número de vueltas del bucle.
Sentencia CONTINUE.
Esta sentencia se utiliza dentro de un bucle y provoca que se finalice la vuelta actual sin
ejecutar las sentencias posteriores y se inicie la ejecución de la siguiente vuelta del
bucle.
Las sentencias del bucle WHILE se ejecutarán 10 veces pero solamente se ejecuta la
asignación a la variable D_NUMERO solo se ejecuta las 4 primeras vueltas. Al finalizar
Pág. 25
Curso programación ABAP IV
Las sentencias del bucle WHILE se ejecutarán 10 veces pero solamente se ejecuta la
asignación a la variable D_NUMERO solo se ejecuta las 4 primeras vueltas. Al finalizar
la ejecución del bucle la variable D_CONTADOR tendrá el valor 10 y la variable
D_NUMERO el valor 4. La ejecución de esta sentencia fuera de un bucle finaliza
inmediatamente la ejecución de la subrutina donde se ejecuta.
Esta subrutina solamente sumará números positivos ya que si alguno de los números
que recibe como parámetros es negativo se finaliza la ejecución de la subrutina sin
ejecutar el resto de las sentencias.
Sentencia EXIT.
Provoca la salida de un bucle o el final de la ejecución de la subrutina donde se ejecuta.
2.4.4 Aritméticas
Sentencia SQRT.
Devuelve la raíz cuadrada de un valor.
<campo> = SQRT( <valor> ).
Sentencia ADD.
Pág. 26
Curso programación ABAP IV
Sentencia SUBTRACT.
Resta un valor al contenido de un campo.
SUBTRACT <valor> FROM <campo>.
Sentencia MULTIPLY.
Multiplica por un valor el contenido de un campo.
MULTIPLY <campo> BY <valor>.
Sentencia DIV.
Devuelve el cociente de una división entera.
<campo> = <valor1> DIV <valor2>.
Sentencia MOD.
Devuelve el resto de una división entera.
<campo> = <valor1> MOD <valor2>.
Sentencia CONCATENATE.
Concatena cadenas en un campo.
CONCATENATE <cadena1> <cadena2> INTO <campo>.
Sentencia SHIFT.
Elimina caracteres por la izquierda de un campo.
SHIFT <campo>.
Pág. 27
Curso programación ABAP IV
Con la cláusula CIRCULAR se provoca que los carácteres que se eliminan por la
izquierda se inserten por la derecha de la cadena.
Sentencia CONDENSE.
Elimina los espacios en blanco por la izquierda de una cadena y reduce los espacios
intermedios consecutivos a un solo espacio.
CONDENSE <campo>.
Sentencia TRANSLATE.
Permite convertir a mayúsculas o minúsculas una cadena con las cláusulas TO UPPER
CASE y TO LOWER CASE.
TRASLATE <campo> TO UPPER/LOWER CASE.
Sentencia REPLACE.
Reemplaza una parte de una cadena por otra cadena.
REPLACE <subcadena> WITH <subcadena_nueva> INTO <campo>.
Sentencia STRLEN.
Devuelve la longitud de una cadena sin tener en cuenta los espacios finales por la
derecha.
Pág. 28
Curso programación ABAP IV
Sentencia PACK.
Almacena un valor en formato empaquetado en el campo especificado.
PACK <valor> TO campo.
Sentencia UNPACK.
Desempaqueta un valor y lo almacena con ceros a la izquierda en el campo
especificado.
UNPACK <valor> TO <campo>.
2.4.7 Mensajes
En los programas ABAP se pueden mostrar mensajes creados previamente en una
clase de mensajes utilizando la instrucción MESSAGE.
MESSAGE <tipo>NNN(<clase>)
Pág. 29
Curso programación ABAP IV
Para tratar los mensajes de una clase de mensajes se ejecuta la opción de menú
‘Herramientas à Workbench Abap/4 à Desarrolloà Entorno de programación
àMensajes’.
2.4.8 Comentarios
En el código de los programas se deberán introducir comentarios que ayuden a
comprender su lógica de proceso y así facilitar su mantenimiento posterior. Existen dos
tipos de comentarios:
Comentario en línea: Al especificar el carácter “ en una
línea de programa, todos los literales que se escriban a su derecha hasta el final de la
línea se considerarán comentarios.
Línea de comentario: Al especificar el carácter * en la
primera posición de una línea de texto, todos los literales de la línea se considerarán
comentarios.
2.5.1 Declaración
Las tablas internas se declaran con la sentencia DATA.
Pág. 30
Curso programación ABAP IV
FECHA TYPE D,
END OF I_PROVEEDORES.
Al declarar una tabla interna se define automáticamente una línea de cabecera con la
estructura de la tabla. Esta línea de cabecera es una estructura con el nombre de la
tabla interna que nos permite recuperar, modificar o borrar registros de la misma.
ENFORM.
Esta subrutina crea entradas en la tabla de materiales con los datos recibidos como
parámetros.
Pág. 31
Curso programación ABAP IV
ENDFORM.
La línea de cabecera contendrá los siguientes valores (en función de los registros
añadidos en el ejemplo anterior de creación de registros):
Si se logra modificar el registro la variable del sistema SY-SUBRC contendrá el valor ‘0’.
Pág. 32
Curso programación ABAP IV
CLEAR I_MATERIALES-CANTIDAD.
MODIFY TABLE I_MATERIALES
TRANSPORTING CANTIDAD
WHERE CODIGO > ‘0’
AND CODIGO < ‘101’.
Se modificará con el valor ‘0’ el campo cantidad en todos los materiales de la tabla cuyo
código este comprendido entre ‘1’ y ‘100’.
Si se logra borrar el registro, la variable del sistema SY-SUBRC contendrá el valor ‘0’.
El registro del material con código ‘1’ se ha borrado de la tabla interna. La variable SY-
SUBRC almacenará el valor ‘0’.
Pág. 33
Curso programación ABAP IV
Especificando una condición de borrado con la cláusula WHERE se borrarán todas las
entradas de la tabla interna que cumplan la condición (está cláusula es incompatible con
la cláusula INDEX).
También se pueden borrar todas las entradas de una tabla interna con la instrucción
REFRESH <tabla>
Ordena los registros de la tabla interna por código de material de forma descendente.
Por defecto, los registros de la tabla interna se ordenan de forma ascendente por la
clave por defecto, compuesta por los campos no numéricos de la tabla.
Pág. 34
Curso programación ABAP IV
2.6.1 Declaración
Las tablas del diccionario de datos se declaran con la sentencia TABLES.
Al declarar una tabla del diccionario se define automáticamente una línea de cabecera
con la estructura de la tabla. Esta línea de cabecera es una estructura con el nombre de
la tabla que nos permite recuperar, modificar o borrar registros en la misma.
No se podrá añadir un registro si ya existe uno en la tabla con la misma clave primaria o
con la misma clave de un índice de valores únicos.
ENFORM.
Esta subrutina crea entradas en la tabla del diccionario MATERIALES con los datos
recibidos como parámetros.
Pág. 35
Curso programación ABAP IV
SELECT SINGLE *
FROM MATERIALES
WHERE CODIGO = 1.
Se puede seleccionar un registro de una tabla y bloquearlo para que no pueda ser
modificado por otros procesos utilizando la cláusula SINGLE FOR UPDATE y
especificando obligatoriamente la clave completa de la tabla como criterio de selección.
UPDATE <tabla>.
Utilizando la cláusula SET se podrán especificar los campos que se van a modificar,
pudiendo modificar también los campos clave de la tabla y no teniendo en cuenta los
valores almacenados en la línea de cabecera. Al utilizar esta cláusula se deberá tener
especial cuidado, ya que actualizará todos los registros de la tabla a menos que se
especifique la cláusula WHERE para delimitar los registros que queremos modificar.
Pág. 36
Curso programación ABAP IV
UPDATE MATERIALES
SET CANTIDAD = CANTIDAD + 1
WHERE CODIGO > 0
AND CODIGO < 101.
Esta sentencia incrementa en una unidad el campo CANTIDAD en todos los materiales
que tengan un valor comprendido entre 1 y 100 en el campo CODIGO.
MATERIALES-CODIGO = ‘1’.
DELETE MATERIALES.
También se pueden borrar uno o más registros de una tabla del diccionario
especificando una condición de borrado.
DELETE <tabla> WHERE <condiciones>.
ENDSELECT.
ENDFORM.
Pág. 37
Curso programación ABAP IV
Cuando se van a tratar grandes cantidades de registros de una tabla del diccionario, es
preferible almacenar los registros en una tabla interna con la cláusula INTO TABLE
<tabla_interna> y realizar un tratamiento posterior de dicha tabla. Esta cláusula provoca
la realización de un sólo acceso de lectura a la tabla del diccionario, en lugar de realizar
una lectura por cada registro recuperado, optimizándo así el tiempo de ejecución del
programa. En este caso no se genera un bucle para el tratamiento de los registros, por
lo que no se utiliza la sentencia ENDSELECT.
La tabla interna especificada en la cláusula INTO TABLE debe tener la misma estructura
que los campos recuperados de la tabla del diccionario, sino es así, se puede utilizar en
su lugar la cláusula INTO CORRESPONDING FIELDS OF TABLE <tabla_interna> para
almacenar los valores recuperados de la tabla del diccionario en los campos de la tabla
interna que tengan el mismo nombre y tipo.
DEBUGGING (FALTA)
3. Diccionario
El Diccionario de datos lo componen todas las definiciones de datos, tipos de datos así
como las tablas de la base de datos en la que se almacenan los datos.
El diccionario, lo componen todos los objetos tanto los Estándares como los
desarrollados a medida.
Pág. 38
Curso programación ABAP IV
3.2 Dominios.
Un dominio es el objeto que define las características técnicas de un atributo. Mediante
el dominio se definen el tipo de datos, longitud, valores posibles, propiedades de salida
(Por pantalla, impresión…)…
Pág. 39
Curso programación ABAP IV
En la pestaña Definición:
Descripción breve: Descripción del dominio a crear, ha de ser un texto explicativo del
dominio. En nuestro caso escribiremos ‘Meses de Año’.
Tipo de datos: Seleccionaremos uno de los tipos existentes eligiendo el que mejor se
adapte a las características del objeto que estamos definiendo. En nuestro caso
seleccionaremos ‘CHAR’
Los tipos de datos existentes se pueden visualizar (F4) nos mostrará la siguiente
ventana:
Pág. 40
Curso programación ABAP IV
Los elementos del marco Atributos de salida, varían dependiendo del tipo datos
seleccionado así por ejemplo para el tipo CHAR tendremos la opción de minúsculas y
para un tipo CURR tendremos la opción del signo…
Longitud de salida: Representa la longitud en la que se va a representar el valor a la
hora de imprimirse en un informe, visualizarse en una pantalla, etc. (Dejamos en valores
propuestos 10)
Rutina de conversión: Es una referencia a los procedimientos de conversión entre el
formato interno del dato y su representación externa. (En blanco)
Flag de Minúsculas: Se permite la utilización de letras minúsculas (No marcado).
Pág. 41
Curso programación ABAP IV
Como vemos, podemos introducir valores fijos junto con su descripción así como
introducir intervalos de valores introduciendo el límite inferior y superior.
Una vez completados todos los campos deseados grabamos el dominio mediante la
opción grabar (F11)
Cuando grabemos por primera vez (no así en las modificaciones) nos preguntará por la
clase de desarrollo a la que pertenece el objeto. La clase de desarrollo sirve para
agrupar objetos pertenecientes a una misma aplicación y de esta manera poder
transportar los objetos. Utilizaremos la clase de desarrollo ‘$TMP’ que es la
correspondiente a los objetos locales y pulsamos el botón de grabar o bien pulsamos
directamente el botón que asignará directamete la clase de sarrollo temporal
(Esto es extensible a todos los objetos posibles , dominios , elementos de datos ,
tablas , programas …) .
Una vez grabado el dominio, verificamos que no contiene errores para ello pulsamos el
botón de verificar (Ctrl. + F2), posteriormente será necesario activarlo para poder
ser utilizado pulsaremos el botón de activar (Ctrl. + F3). (Es necesario activar los
objetos que se crean ya que hasta que no son activados no podrán ser utilizados en
otros objetos).
Pág. 42
Curso programación ABAP IV
En la pestaña Definición:
Opción Tipo elemental:
Dominio: Dominio al que hace referencia el elemento de datos. (ZMESESXX).
Tipo Instalado: Tipo de datos y longitud con el mismo significado que el que se define
en los dominios.
ID parámetro: Permite referenciar a un parámetro de memoria SAP. Será útil para
mostrar valores por defecto en pantallas, ya que este campo se completará con el valor
que tenga el parámetro de memoria SAP al mostrar la pantalla. (En nuestro caso lo
dejamos en blanco.)
Pág. 43
Curso programación ABAP IV
3.4 Tablas.
Pág. 44
Curso programación ABAP IV
Pestaña Atributos:
Clase de entrega: Indica quién es el responsable del mantenimiento de la tabla, si es
una tabla de parametrización,… (Pondremos de tipo A (Aplicación)).
Permitida Actualización tabla: Habilita/ Deshabilita la posibilidad de que el contenido
de la tabla pueda ser modificado en la transacción de visualización del contenido de la
tabla. (Si no se marca no se podrán modificar los registros de la tabla por esta
transacción). (Marcamos con una X)
Pestaña Campos:
Nombre campo: Nombre del campo.
Clave: Indica si el campo forma parte de la clave primaria de la tabla. Un campo o
conjunto de campos son clave en una tabla si determinan de forma unívoca un único
registro de dicha tabla. Toda tabla tiene que tener clave primaria.
Tipo de datos: Nombre del elemento de datos que describe al campo. (*)
Tipo y longitud: Tipo de dato y longitud. (*)
Tabla de Verificac.: En está tabla aparecerá un ‘*’ cuando el elemento de datos
introducido, haga referencia a un dominio que tenga una tabla de valores permitidos, o
bien cuando se asocie una clave externa (Visto más adelante).
Descripción breve: Descripción del campo. (*)
Pág. 45
Curso programación ABAP IV
(*) Podemos crear campos en la tabla que no necesariamente han de estar vinculados a
un elemento de datos, si no que directamente le podemos asignar un tipo, longitud y
descripción. Mediante el botón de esta manera se
habilitan para entrada estos campos. Para volver a introducir tipos de datos pulsaremos
nuevamente esta opción. (Aunque existe esta posibilidad, no es muy recomendable).
Nota: El campo MANDT, mandante, se añade como un atributo en las tablas de esta
forma, se pueden tener varias colecciones de datos distintas según el mandante. En las
selecciones, actualizaciones… de la tabla este campo es trasparente ya que tendrá
siempre el valor indicado al iniciar la sesión en el sistema. (No es obligatorio definir el
mandante en todas las tablas aunque si es lo más habitual).
OPCIONES TÉCNICAS
Una vez completados todos los campos, grabamos la tabla (F11). Posterioremente
será necesario completar las definiciones técnicas de la tabla para ello seleccionaremos
la opción de menú ‘Pasar a à Opciones técnicas’ o el botón . Aparecerá
la siguiente pantalla , donde hay que completar los campos:
Pág. 46
Curso programación ABAP IV
Clase Datos: Con la clase de datos se define de forma lógica el ámbito físico en la base
de datos en el que se grabará la tabla. Este lugar físico donde se ubicará la tabla se
determinará en función del tipo de utilización de la tabla, es decir, predominio de
actualizaciones ó consultas…. Por ejemplo una tabla con datos maestros sufrirá pocas
actualizaciones y muchas consultas… (Para nuestro ejemplo seleccionaremos APPL0)
Categoría tamaño: Determina el número aproximado de registros que va a albergar la
tabla. (Seleccionamos tamaño 3)
Una vez completados, pulsamos el botón verificar (Ctrl. + F2) y grabamos botón
(F11). Volveremos a la pantalla inicial con el botón (F3) verificamos (Ctrl. + F2)
y activamos la tabla (Ctrl. + F3).
3.4.2 Índices.
Un índice es la ordenación de los registros de una tabla, por uno o varios de los campos
que la componen Por tanto la definición de un índice consisten en la enumeración de los
campos que lo componen.
Para crear un índice a una tabla, en la pantalla:
Pág. 47
Curso programación ABAP IV
Al pulsar la opción ‘Si’ aparecerá la ventana donde nos pide un identificador para el
índice. (Pondremos Z01).
Pág. 48
Curso programación ABAP IV
Cuando se han completado los datos grabamos (F11), verificamos (Ctrl. + F2) y
activamos (Ctrl. + F3).
Para modificar el índice pulsaremos el botón nos mostrará una ventana con
los índices existentes :
Pág. 49
Curso programación ABAP IV
Podremos seleccionar uno de los existentes para modificarlo o crear uno nuevo
Toda tabla está ordenada por los campos clave, luego hay un ‘índice’ implícito por estos
campos, y no tendrá sentido definir un índice con los todos los campos clave. (En el
ejemplo sería absurdo definir un índice con los campo MANDT, BUKRS y NCLIE).
Pág. 50
Curso programación ABAP IV
Pág. 51
Curso programación ABAP IV
Pág. 52
Curso programación ABAP IV
Existen otras formas de llegar a la visualización del contenido de una tabla sin pasar por
la transacción del diccionario de datos.
Con la transacción SE16, indicaremos el nombre de la tabla y llegaremos directamente
a la pantalla de selección de datos de la tabla.
Con la transacción SM30 (sólo si hemos generado las vistas de diálogo de actualización
de la tabla).
Aunque no es estrictamente necesario crear este diálogo para mantener las tablas si es
muy aconsejable para aquellas tablas que el usuario mantiene ya que de esta forma se
puede controlar de manera sencilla la seguridad de la tabla. (Esta opción es muy
utilizada en las tablas de parametrización, por ejemplo).
Pág. 53
Curso programación ABAP IV
Para generar el diálogo, la tabla ha de estar activada. Una vez activada seleccionamos
la opción de menú ‘Utilidades à Generador Actualiz.Tab.’ llegaremos a la siguiente
pantalla:
Pág. 54
Curso programación ABAP IV
no existan en grupo de funciones elegido aunque existe una utilidad para que el sistema
elija de manera automática estos valores para ello pulsamos el botón
nos llevará a la siguiente ventana
Con la primera opción nos propondrá unos números no existentes. Las otras opciones
permiten visualizar los nº todavía libres y los ya asignados. Al seleccionar la primera
opción volveremos a la pantalla anterior, donde se habrán informado los campos de la
imagen resumen y sencilla. Pulsamos el botón crear (Si el grupo de funciones
indicado no esta creado, nos pedirá una clase de desarrollo… pondremos
seleccionaremos objeto local). Grabamos (F11) y retornamos a la pantalla anterior
(F3).
Vamos a crear la siguiente tabla teniendo en cuenta las indicaciones que se detallan a
continuación para los campos NCLIE e IMPNT
En esta tabla el campo NCLIE tendrá unos valores limitados a los existentes en la tabla
maestro de clientes. (No deberíamos tener facturas de clientes que no existen) Para
Pág. 55
Curso programación ABAP IV
asociar esta clave externa, situados sobre este campo seleccionamos la opción de
menú ‘Pasar a à Claves Externas’ o botón nos aparecerá la ventana:
Pág. 56
Curso programación ABAP IV
En esta tabla tenemos un campo IMPNT que es de tipo importe (CURR) por tanto es
necesario referenciarlo. Para ello podemos seleccionar la pestaña ‘Campos moneda /
Cantidad) e informar directamente los campo TabRef y CpoRef. o bien situados sobre el
campo hacemos Doble-Click (F2) aparecerá la ventana donde también podemos indicar
estos datos
Pág. 57
Curso programación ABAP IV
3.5 Estructuras.
Una estructura es similar a una tabla en cuanto a su definición pero con la diferencia
que una estructura no puede albergar registros. Una estructura es simplemente la
definición de una entidad.
Donde introduciremos los campos y su definición, bien a través del campo elemento de
datos o bien introduciendo el tipo, longitud y descripción (Del mismo modo que en la
creación de tablas). (Introduciremos, los campos Nombr, Apel1, Apel2, con sus
respectivos elementos de datos ZNOMBRXX, ZAPELLXX. En el texto pondremos ‘
Datos personales’).
3.6 Vistas.
Una vista es una particularización de una o varias tablas en la que se pueden
seleccionar uno o varios de los campos de las tabla/s…. Por ejemplo podemos realizar
una vista para seleccionar únicamente algunos campos de una tabla pero
principalmente utilizaremos vistas para obtener datos de tablas relacionadas. Bajo una
Pág. 58
Curso programación ABAP IV
vista podemos ‘unir ‘dos o más tablas y poder ver la intersección entre dichas tablas
como si se tratará de una única tabla.
Cuando se trata de una vista de más de una tabla, es necesario definir las condiciones
por las que se unen las tablas, es decir, los campos de intersección de las tablas. Las
vistas no contienen datos sino que los datos se obtienen en tiempo de ejecución al
realizar consultas sobre ellas.
Por ejemplo: Si quisiéramos ver todas las facturas de un cliente (Nombre y primer
apellido), deberemos realizar una intersección entre la tabla de clientes y la tabla de
facturas para obtener una vista con los campos:
Facturas/ Cliente.
Campo Descripción
NFACT Nº de factura
NCLIE Nº de cliente
NOMBR Nombre cliente
APEL1 Primer apellido
IMPNT Importe Neto
MONEDA Moneda
Crear/Modificar/Visualizar.
Pág. 59
Curso programación ABAP IV
Tablas: Seleccionaremos las tablas de las que se desee obtener información. (En
nuestro caso la tablas ZCLIENXX y ZFACTUXX).
Condiciones Join: Definen los campos por los que se realiza la intersección entre las
tablas seleccionadas. Para indicar las relaciones podemos utilizar el botón
o escribir directamente las relaciones.
Para facilitar la selección de campos de una tabla, situados sobre la tabla pulsamos el
botón donde marcaremos los campos deseados , una vez seleccionados
aparecerán automáticamente en la pantalla. Una vez completada la vista grabamos
(F11), verificamos (Ctrl. + F2) y activamos (Ctrl. + F3).
Pág. 60
Curso programación ABAP IV
Crear/modificar/Visualizar:
En la pantalla principal del diccionario seleccionamos la opción Matchcode (Ayudas de
búsqueda) introducimos el nombre del matchcode a crear, (ZCXX), y pulsamos el botón
de crear, seleccionamos el tipo para ayuda elemental, llegaremos a la pantalla:
Pág. 61
Curso programación ABAP IV
Parám.Ayuda busq: Formado por cada uno de los campos que se utilizarán para la
búsqueda.
IMP: Flag de parámetro EXPORT, este campo se utilizará como campo en el que
informar valores de condición para la búsqueda de registros.
EXP: Flag de parámetro IMPORT, este campo se utilizará como parámetro de salida, es
decir, se volcará el valor del registro seleccionado sobre el campo.
P.I: Posición del campo para lista de aciertos, indica la posición que ocupará el campo
en la ventana de ayuda donde se mostrarán los registros seleccionados. (Si se indica ‘0’
o Blanco, significará que el campo no se muestra en la lista de aciertos).
PoS: Posición del campo para la pantalla de condiciones de la selección.
V.s: Valor no modificable en la selección.
Valor Propuesta: Valor de propuesta para la selección.
Pág. 62
Curso programación ABAP IV
En la pestaña Parám.bloqueo.
Parám.bloqueo: Corresponden a los parámetros del argumento de bloqueo.
Una vez completados todos los campos, grabamos (F11)., verificamos (Ctrl. +
F2) y activamos (Ctrol + F3).
Pág. 63
Curso programación ABAP IV
4.1 Introducción.
En el proceso de tratamiento de la información es necesario poder consultar los datos
almacenados en el sistema de una forma organizada, para realizar este tipo de
operaciones se utilizan programas tipo REPORT, con estos programas podemos
generar listados en los que mostrar dicha información. Estos listados pueden estar
orientados a visualización en pantalla y/o a impresora.
Podríamos distinguir dos tipos de listados por su grado de interacción con el usuario:
Reports planos: Orientados a visualizar información de una manera plana en único
nivel. En este tipo de listados las opciones de usuario sobre el tratamiento de la
información es nula.
Reports interactivos: Orientados a presentar información en varios niveles, es decir,
pudiendo acceder desde un nivel de información a otro nivel de más detalle y así
sucesivamente. Las opciones de usuario para el tratamiento de la información son
amplias ya que se puede ir navegando a través de los distintos niveles de detalle.
Por otra parte se da la necesidad de actualizar las bases de datos en las que no es
necesaria la intervención directa del usuario, son los procesos que conocemos como
‘procesos batch’. Estos programas también se realizan mediante programas tipo
REPORT pero lógicamente sin la parte de presentación de datos por pantalla.
Por tanto con programas tipo REPORT podemos realizar listados para la visualización
de información así como programas de actualización masiva de datos. Estos programas
se realizan en un lenguaje de programación propio de SAP, es el lenguaje ABAP/4.
Pág. 64
Curso programación ABAP IV
Desde esta pantalla podremos crear, visualizar, modificar y ejecutar (también podremos
ejecutar en DEBUG mediante la opción , ya veremos su significado más
adelante) los programas.
Pág. 65
Curso programación ABAP IV
Aplicación: Módulo al que pertenece el programa (FI, HHRR…) (En nuestro caso
pondremos un Aplicación Desconocida ‘*’)
Una vez completado estos campos obligatorios pulsaremos el botón de grabar
(F11). Nos pedirá, como en los objetos de diccionario una clase de desarrollo,
grabaremos como objeto local botón a continuación pasaremos a la pantalla
del editor:
Pág. 66
Curso programación ABAP IV
Vamos a ver las funciones básicas del editor para poder escribir, verificar, generar los
programas.
Pág. 67
Curso programación ABAP IV
Navegar a objeto.
Esta función, permite ‘navegar’ hasta el objeto seleccionado, estos objetos pueden ser
desde variables, procedimientos, símbolos de texto … definidos dentro del propio
programa hasta objetos definidos fuera del programa como pueden ser llamadas a
transacciones, funciones, includes …
Pág. 68
Curso programación ABAP IV
Opción ‘DEBUG’.
Para poder depurar los programas, podemos ejecutarlos en modo ‘DEBUG’, es decir,
ejecutando el programa pero pasando por las líneas del código escrito y viendo el
resultado de cada una de ellas de forma individual, de esta forma podemos comprobar
el efecto de cada una de las instrucciones escritas. Para poder ejecutar un programa en
modo ‘DEBUG’ desde el editor, será necesario fijar un ‘Breakpoint’, es decir un punto de
ruptura. El punto de ruptura hace que la ejecución del programa se detenga cuando
llega a la línea de código donde se encuentra y a partir de ese punto se puede ejecutar
en modo ‘DEBUG’. Para fijar un ‘Breakpoint’ nos situamos el la línea de código deseada
y pulsamos el botón .
Pág. 69
Curso programación ABAP IV
Pág. 70
Curso programación ABAP IV
Pág. 71
Curso programación ABAP IV
(En nuestro ejemplo que va a consistir en programa que muestra un listado de los
clientes existentes, con el siguiente formato)
************************************************************************
* PROGRAMA: ZREPORXX
* DESCRIPCION: Muestra un listado de los clientes existentes en el
* que se detalla en nº de cliente junto con el nombre y
* apellidos.
* AUTOR: Nombre y Apellidos FECHA: 13/08/2001
*----------------------------------------------------------------------*
* CONTROL DE MODIFICACIONES
* FECHA. AUTOR. DESCRIPCION MODIFICACION.
************************************************************************
Nota: Para obtener ayuda sobre una instrucción, situando el cursor sobre ella pulsamos
F1 nos saldrá una pantalla de ayuda con la sintaxis y opciones de cada una de ellas.
Para la sentencia REPORT se muestra la ayuda:
Pág. 72
Curso programación ABAP IV
TABLES: zclienxx.
Pág. 73
Curso programación ABAP IV
Parameters: Recogen único valor, es decir, como criterio solamente se podrá indicar un
único valor. Para incluir parámetros de selección podremos la palabra clave
PARAMETERS seguida del nombre de parámetro y su tipo.
En nuestro ejemplo, vamos a definir un parámetro para seleccionar por Sociedad para
ello escribiremos:
Vamos a definir tres rangos de selección uno para el nº de cliente, otro para el nombre
y otro para la fecha de nacimiento, para ello escribiremos:
SELECT-OPTIONS:
s_nclie FOR zclienxx-nclie, " Nº de cliente
s_nombr FOR zclienxx-nombr, " Nombre cliente
s_fnaci FOR zclienxx-fnaci. " Fecha de nacimiento
Pág. 74
Curso programación ABAP IV
Podemos hacer que la pantalla de selección tenga un aspecto más elaborado para ello
tenemos la posibilidad de incluir marcos, saltos de línea…Para conseguir estos efectos
utilizaremos la palabra clave SELECTION SCREEN.
En nuestro ejemplo vamos a crear dos marcos uno que va a incluir al parámetro
P_BUKRS y otro que va a contener a los rangos de selección S_NCLIEN, S_NOMBR y
S_FNACI. Para ello incluiremos las siguientes instrucciones, de tal forma que
tendremos:
Pág. 75
Curso programación ABAP IV
Los marcos creados, no tienen texto esto es debido a que los símbolos de texto ‘001’ y
‘002’ referenciados con la palabra clave TEXT, no están definidos.
Pág. 76
Curso programación ABAP IV
Pág. 77
Curso programación ABAP IV
En nuestro ejemplo, pondremos ‘C. Cliente Nombre Primer Apellido Segundo Apellido
F.Nacimiento’. Reservando para cada campo la longitud de salida correspondiente. Una
vez completados los títulos y cabeceras grabamos (F11) y volvemos al editor del
programa.
Pág. 78
Curso programación ABAP IV
WRITE:
Nos permite escribir el contenido de una variable declarada con DATA, el
contenido de un registro de una tabla, el contenido de un FIELD-SYMBOL, un
TEXT-SYMBOL o un literal en alguna posición del listado Las opciones a añadir
a esta instrucción son:
... AT pl (posición y longitud)
... options (formato de salida)
... ofmt (salida formateada para el campo)
... AS CHECKBOX
... AS SYMBOL
... AS ICON
... AS LINE
... AT /pl
Pág. 79
Curso programación ABAP IV
Con el símbolo (/) podemos hacer que ejecute un salto de línea. Con ‘p’
se especifica la columna de la línea actual en la que queremos que
empiece a escribir y con ‘l ’la longitud máxima de lo que vamos a escribir.
Por ejemplo:
WRITE AT /5(15) ‘Esto es una cadena’.
Resultado:
Fila antes del WRITE
Esto es una cad
Pág. 80
Curso programación ABAP IV
... ofmt
La salida se escribirá con los formatos de color, intensidad, etc. Las opciones
disponibles en este punto se detallarán más adelante, dentro de la instrucción
FORMAT.
Por ejemplo:
DATA F.
WRITE F INVERSE COLOR 3.
... AS CHECKBOX
Hace que el campo escrito tenga la forma de es una caja de selección.
La caja saldrá marcada o no marcada en función del valor del campo.
(SPACE es no marcada y ‘X ‘es marcada). Para poder hacer la caja de
entrada/salida o solamente de salida añadiremos la opción INPUT
ON/OFF.
Por ejemplo:
DATA D_CAJA(1) TYPE C VALUE SPACE.
WRITE CAJA AS CHECKBOX. ó WRITE CAJA AS CHECKBOX INPUT
OF.
(Será de entrada/salida, valor por defecto)
WRITE CAJA AS CHECKBOX INPUT OFF. (Será sólo de salida).
... AS SYMBOL
Permite escribir símbolos predefinidos. Para poder acceder a ellos
será necesario incluir en nuestro programa la biblioteca de símbolos.
Para ello incluiremos la sentencia INCLUDE <SYMBOL>. (para ver los
símbolos disponibles buscaremos a través de la ayuda).
... AS ICON
Similar a la opción anterior pero con la biblioteca de iconos. Par acceder
a ella incluiremos la sentencia INCLUDE <ICON>. (Podemos ver los
iconos con la ayuda).
Por ejemplo:
WRITE: ICON_GREEN_LIGHT AS ICON, ‘...Semáforo verde’.
Pág. 81
Curso programación ABAP IV
... AS LINE
La forma de hacer líneas horizontales o verticales en un report y que
éstas formen cuadrículas es escribir los caracteres SY-VLINE (línea
vertical) y SY-ULINE (línea horizontal). Son equivalentes los caracteres
‘ê‘y ‘-’. La forma exacta en la que aparecen estos segmentos depende
de los caracteres adyacentes. Cuando tenemos un carácter de línea en
una posición vertical y otro horizontal en la posición adyacente
automáticamente se produce la unión de ambas. Si en la posición
adyacente no hay otro carácter de línea ese carácter permanece
inalterado.
FORMAT.
Sirve para definir los atributos de salida de lo que se va a escribir en la pantalla.
A diferencia de la opción ‘ofmt’ del la instrucción WRITE el efecto de esta
instrucción comprende todas las escrituras realizadas hasta la siguiente
sentencia FORMAT. (Los cambios de evento, START-OF-SELECTION, TOP-
OF-PAGE… provocan que se inicialicen todas las opciones ). Las posibles
opciones de la sentencia FORMAT son:
Pág. 82
Curso programación ABAP IV
Ejemplo:
FORMAT COLOR COL_BACKGROUND ON.
WRITE F. “ Se escribirá en color BACK..
WRITE D. “ Se escribirá en color BACK..
FORMAT COLOR COL_BACKGROUND OFF.
WRITE F. “ Se escribirá en color normal
ULINE
Escribe una línea horizontal en la línea actual. Por defecto el tamaño de la
línea comprende todo el ancho del listado. Podemos seleccionar el ámbito
de la línea con añadiendo AT pl donde:
p Se corresponde con la
columna en la que
comienza la línea.
l Se corresponde con la
longitud que tiene la
línea.
SKIP y POSITION
Estas dos instrucciones SKIP y POSITION. Permiten situar el puntero de
escritura en una posición determinada.
POSITION n Hace que el puntero se sitúe en la columna n.
SKIP n Hace que el puntero salte n líneas.
SKIP TO LINE n Hace que el puntero se mueva a la línea n del listado.
Las siguientes instrucciones producen un resultado equivalente a la instrucción
(WRITE AT /5(15) ‘Esto es una cadena’.)
NEW-LINE
Provoca una nueva línea en el listado.
Mediante la opción NO-SCROLLING podemos hacer que la línea permanezca
fija durante el desplazamiento (Scroll) horizontal. (El valor por defecto es que se
pueda desplazar por tanto la opción SCROLLING se suele omitir).
NEW-PAGE
Provoca una nueva página en el listado. Tiene varias opciones mediante las
cuales se puede determinar el tamaño (nº filas y nº de columnas) de la nueva
página, si se imprime o no el título….
Pág. 83
Curso programación ABAP IV
RESERVE
Sirve para reservar un cierto nº de líneas antes de un salto de página.
RESERVE n LINES. Si en la página actual no hay n líneas disponibles
entonces se provocará un salto de página.
De esta forma se puede asegurar que las n líneas escritas a continuación
estarán en la misma página.
MESSAGE.
Pág. 84
Curso programación ABAP IV
4.2.7 Eventos
4.2.7.1 INITIALIZATION
Se ejecuta antes de mostrarse la pantalla de selección. Normalmente se utiliza
para inicializar las variables de programa y las opciones de la pantalla de
selección.
4.2.7.2 START-OF-SELECTION
Este evento se lanza cuando se procesa la instrucción REPORT... En ese
momento se empieza a ejecutar el código que se encuentra entre REPORT y la
palabra START-OF-SELECTION. Inmediatamente después se procesa el bloque
contenido dentro de este evento.
En este evento se sitúan las instrucciones de acceso a bases de datos una vez
terminada este código se ejecuta el evento END-OF-SELECTION (Si está
definido).
(Siguiendo con nuestro ejemplo, vamos a realizar la selección de los clientes que
cumple los criterios definidos por los parámetros de selección. Los datos de
estos clientes los vamos a almacenar en una tabla interna.
Definimos la siguiente tabla interna que situaremos en la parte correspondiente
del programa.
* Tabla interna de datos a listar
DATA: BEGIN OF I_ZCLIENXX OCCURS 0.
INCLUDE STRUCTURE ZCLIENXX.
DATA: END OF I_ZCLIENXX.
Pág. 85
Curso programación ABAP IV
4.2.7.3 END-OF-SELECTION.
El código asociado a este evento se procesa cuando se termina la selección de datos
de tablas o bases de datos lógicas, es decir, cuando termina el evento START-OF-
SELECTION.
(En nuestro ejemplo escribiremos los datos de los clientes seleccionados, para ello
añadiremos el siguiente código:
END-OF-SELECTION.
Pág. 86
Curso programación ABAP IV
4.2.7.4 TOP-OF-PAGE
Se ejecuta al inicio de cada nueva página.
Se suele utilizar para dar formato a la cabecera de página, cuando no se utilizan
las definidas en ‘Títulos y cabeceras’. (Se añade la opción NO STANDARD
PAGE HEADING).
4.2.7.5 END-OF-PAGE
Se ejecuta cuando una página finaliza bien porque no tiene más líneas bien
porque se ejecuta la instrucción RESERVE n LINES. Este evento no se
ejecutará si el nº de líneas de la página no está definido en la sentencia
REPORT, tampoco se ejecutará se fuerza una nueva página con NEW-PAGE.
4.2.7.6 AT SELECTION-SCREEN
Se utiliza para controlar la pantalla de selección.
Sus opciones permiten mostrar valores de ayuda en los campos de selección,
mostrar/ocultar campos de selección….
(En nuestro ejemplo, vamos a dar la posibilidad de mostrar los valores posibles para el
rango de selección nombre del cliente. De esta forma aparecerá, al situarnos sobre el
campo, el botón de ayuda de valores posibles (F4), al pulsarlo mostrará una ventana
con los distintos nombres existentes en nuestra tabla.
Los rangos de selección tiene implícitos dos valores el mínimo y el máximo, para que
aparezca la ayuda en los dos es necesario añadir dos eventos, uno para cada valor. La
Pág. 87
Curso programación ABAP IV
Para implementar este procedimiento, nos hemos ayudado con una función
predefinida en el STANDARD. 'HELP_VALUES_GET_WITH_TABLE’. Esta función
permite mostrar datos en una ventana y seleccionar uno de ellos. Permite mostrar
información de más de un campo, para ello en la tabla interna de definición de campos
añadiremos tantas entradas como campos deseemos visualizar. Para indicar los valores
lo haremos de forma secuencial es decir, el la entrada uno, el valor para el campo 1 en
la entrada 2 el valor para el campo 2 …así hasta completar todos los campos, a
continuación otra vez la entrada para el campo 1, campo 2 y así sucesivamente para
cada secuencia .
************************************************************************
* PROGRAMA: ZREPORXX. *
* DESCRIPCION: Muestra un listado de los clientes existentes en el *
* que se detalla en nº de cliente junto con el nombre y *
* apellidos *
* AUTOR : MAD00 FECHA: 13/08/2001 *
*----------------------------------------------------------------------*
* CONTROL DE MODIFICACIONES *
* FECHA. AUTOR. DESCRIPCION MODIFICACION. *
************************************************************************
REPORT zreporxx NO STANDARD PAGE HEADING LINE-SIZE 120 LINE-COUNT 80.
************************************************************************
* Tablas del diccionario de datos *
************************************************************************
TABLES: zclienxx. " Maestro de clientes.
************************************************************************
* Definición de constantes *
************************************************************************
Pág. 88
Curso programación ABAP IV
CONSTANTS:
c_pos_nclie(3) TYPE n VALUE 1, " Posición nº cliente
c_pos_nombr(3) TYPE n VALUE 12, " Posición nombre
c_pos_apel1(3) TYPE n VALUE 33, " Posición apellido1
c_pos_apel2(3) TYPE n VALUE 59, " Posición apellido2
c_pos_fnaci(3) TYPE n VALUE 85, " Posición F. Nacimiento
c_pos_final(3) TYPE n VALUE 96, " Posición final
c_ancho_total(3) TYPE n VALUE 96, " Ancho total del informe,
c_pos_titul(3) TYPE n VALUE 1, " Posición título,
c_pos_usuar(3) TYPE n VALUE 37, " Posición usuario
c_pos_fecha(3) TYPE n VALUE 60, " Posición fecha
c_pos_pagno(3) TYPE n VALUE 85. " Posición nº de página.
************************************************************************
* Tablas internas *
************************************************************************
************************************************************************
* Pantalla de selección *
************************************************************************
* Parámetros
SELECTION-SCREEN BEGIN OF BLOCK bloq1 WITH FRAME TITLE text-001.
* Sociedad
PARAMETERS p_bukrs LIKE zclienxx-bukrs OBLIGATORY DEFAULT '0001'.
* Rangos de selección
SELECTION-SCREEN BEGIN OF BLOCK bloq2 WITH FRAME TITLE text-002.
SELECT-OPTIONS:
************************************************************************
* Comienzo de selección *
************************************************************************
Pág. 89
Curso programación ABAP IV
START-OF-SELECTION.
ENDIF.
************************************************************************
* Final de la selección *
************************************************************************
END-OF-SELECTION.
Pág. 90
Curso programación ABAP IV
************************************************************************
* Cabecera de página *
************************************************************************
TOP-OF-PAGE.
* Fecha de creación
WRITE AT c_pos_fecha text-011.
WRITE sy-datum INTENSIFIED ON USING EDIT MASK '__/__/____'.
* Nº de página.
WRITE AT c_pos_pagno text-012.
WRITE sy-pagno INTENSIFIED ON.
* Fecha de creación
WRITE AT c_pos_fecha text-011.
WRITE sy-datum INTENSIFIED ON.
* Nº de página.
WRITE AT c_pos_pagno text-012.
WRITE sy-pagno INTENSIFIED ON.
Pág. 91
Curso programación ABAP IV
************************************************************************
* Control de la pantalla de selección. *
************************************************************************
* Valores posibles para el rango S_Nombre valor desde.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_nombr-low.
************************************************************************
* Rutinas adicionales. *
************************************************************************
*&---------------------------------------------------------------------*
*& Form VALORES_POSIBLES_NOMBRE
*&---------------------------------------------------------------------*
* Muestra una ventana con los distintos nombres existentes en *
* la tabla maestro de clientes ZCLIENXX. Dando la posibilidad de *
* seleccionar uno de ellos. Devuelve en el parámetro PS_NOMBR el *
* nombre seleccionado o vacío si no se realiza selección. *
*----------------------------------------------------------------------*
* -->PS_NOMBR Nombre seleccionado *
*----------------------------------------------------------------------*
FORM valores_posibles_nombre USING ps_nombr LIKE zclienxx-nombr.
************************************************************************
* Variables locales *
************************************************************************
* Tabla interna para almacenar los campos y atributos a visualizar.
DATA : BEGIN OF i_fields OCCURS 1.
INCLUDE STRUCTURE help_value.
Pág. 92
Curso programación ABAP IV
************************************************************************
* Proceso *
************************************************************************
* Insertamos en la tabla I_FIELDS los atributos del campo a mostrar
CLEAR i_fields.
i_fields-tabname = 'ZCLIENXX'. " Nombre de la tabla
i_fields-fieldname = 'NOMBR'. " Nombre del campo
i_fields-selectflag = 'X'. " Valor seleccionable
APPEND i_fields.
Pág. 93
Curso programación ABAP IV
OTHERS = 4.
Pág. 94
Curso programación ABAP IV
Para el tratamiento de los registros de una tabla interna con la instrucción LOOP-
ENDLOPP, podemos utilizar las siguientes instrucciones de control. Para que el
funcionamiento de los eventos AT NEW y AT END sea correcto, la tabla interna ha de
estar ordenada por los campos controlados.
AT FIRST … ENDAT.
Este evento se ejecuta para el primer registro de la tabla interna, por tanto las
instrucciones escritas en este bloque únicamente se ejecutarán una vez. (Dentro
del evento, no estará disponible el valor de ningún campo de la tabla interna).
AT LAST … ENDAT
Este evento se ejecuta cuando se está procesando el último registro de la tabla
interna, por tanto también sus instrucciones se ejecutarán una única vez. (Dentro
del evento, no estará disponible el valor de ningún campo de la tabla interna).
Pág. 95
Curso programación ABAP IV
del evento, estarán disponibles los valores de los campos de esta ‘subcabecera’,
el resto de campos, no estarán disponibles).
Dentro de estos eventos podemos utilizar la instrucción SUM, que lo que hace es sumar
todos los campo numéricos de la tabla interna, es decir, acumula en el campo actual de
la tabla la suma de los registros tratados hasta la entrada en el evento.
Vamos a ver un ejemplo de utilización de estos eventos. Vamos a mostrar las facturas
de cada uno de los clientes, totalizando por moneda.
Para ello vamos a partir del programa anterior y haremos una copia, el nuevo programa
se llamará ‘ZREPO1XX’.
Para hacer una copia de un programa, en la pantalla de acceso al editor de programas:
Pág. 96
Curso programación ABAP IV
************************************************************************
* PROGRAMA: ZREPO1 XX. *
* DESCRIPCION: Muestra un listado de los clientes existentes en el *
* que se detalla en nº de cliente junto con el nombre y *
* apellidos, además, muestra el detalle de cada una de *
Pág. 97
Curso programación ABAP IV
************************************************************************
* Tablas del diccionario de datos *
************************************************************************
TABLES: zclienxx, " Maestro de clientes.
zfactuxx. " Facturas
************************************************************************
* Definición de constantes *
************************************************************************
CONSTANTS:
c_pos_nclie(3) TYPE n VALUE 1, " Posición nº cliente
c_pos_nombr(3) TYPE n VALUE 12, " Posición nombre
c_pos_apel1(3) TYPE n VALUE 33, " Posición apellido1
c_pos_apel2(3) TYPE n VALUE 59, " Posición apellido2
c_pos_fnaci(3) TYPE n VALUE 85, " Posición F. Nacimiento
c_pos_final(3) TYPE n VALUE 96, " Posición final
c_ancho_total(3) TYPE n VALUE 96, " Ancho total del informe,
c_pos_titul(3) TYPE n VALUE 1, " Posición título,
c_pos_usuar(3) TYPE n VALUE 37, " Posición usuario
c_pos_fecha(3) TYPE n VALUE 60, " Posición fecha
c_pos_pagno(3) TYPE n VALUE 85, " Posición nº de página
c_pos_nfact(3) TYPE n VALUE 12, " Posición nº factura
c_pos_fefac(3) TYPE n VALUE 23, " Posición fecha fact
c_pos_impnt(3) TYPE n VALUE 34, " Posición importe neto
c_pos_moned(3) TYPE n VALUE 51, " Posición moneda
c_pos_fifac(3) TYPE n VALUE 57, " Posición final factura.
c_pos_total(3) TYPE n VALUE 21. " Posción total moneda
************************************************************************
* Tablas internas *
************************************************************************
* Tabla interna de datos a listar
DATA: BEGIN OF i_zclienxx OCCURS 0.
INCLUDE STRUCTURE zclienxx.
DATA: END OF i_zclienxx.
* Tabla interna con las facturas por cliente
DATA: BEGIN OF i_factu OCCURS 5,
moneda LIKE zfactuxx-moned, " Moneda de la factura
fecha LIKE zfactuxx-fecha, " Fecha
impnt LIKE zfactuxx-impnt, " Importe neto.
Pág. 98
Curso programación ABAP IV
************************************************************************
* Pantalla de selección *
************************************************************************
* Parámetros
SELECTION-SCREEN BEGIN OF BLOCK bloq1 WITH FRAME TITLE text-001.
PARAMETERS p_bukrs LIKE zclienxx-bukrs OBLIGATORY
DEFAULT '0001'. " Sociedad
SELECTION-SCREEN END OF BLOCK bloq1.
* Rangos de selección
SELECTION-SCREEN BEGIN OF BLOCK bloq2 WITH FRAME TITLE text-002.
SELECT-OPTIONS:
* Añadimos el match-code para el código de cliente
s_nclie FOR zclienxx-nclie MATCHCODE OBJECT zcxx, " Nº de cliente
s_nombr FOR zclienxx-nombr, " Nombre cliente
s_fnaci FOR zclienxx-fnaci. " Fecha de nacimiento
SELECTION-SCREEN END OF BLOCK bloq2.
************************************************************************
* Comienzo de selección *
************************************************************************
START-OF-SELECTION.
* Inicializamos la tabla interna.
REFRESH i_zclienxx.
CLEAR i_zclienxx.
* Seleccionamos los datos de los clientes que cumplen criterios
SELECT *
FROM zclienxx INTO TABLE i_zclienxx
WHERE bukrs = p_bukrs
AND nclie IN s_nclie
AND nombr IN s_nombr
AND fnaci IN s_fnaci.
* Comprobamos si no hay datos seleccionados en cuyo caso,
* escribiremos un texto que lo indique.
IF NOT ( sy-subrc = 0 ).
WRITE / text-003. " No hay datos para la selección indicada
ENDIF.
************************************************************************
* Final de la selección *
************************************************************************
END-OF-SELECTION.
* Vamos a escribir el listado con los clientes seleccionados en la
* tabla interna I_ZCLIENXX y para cada uno de ellos sus facturas
LOOP AT i_zclienxx.
* Escribimos el nº de cliente en color clave, el resto en otro color
FORMAT COLOR COL_KEY.
Pág. 99
Curso programación ABAP IV
Pág. 100
Curso programación ABAP IV
* Línea de separación
ULINE AT /c_pos_nclie(c_ancho_total).
ENDAT.
ENDLOOP.
ENDLOOP.
* Si se han seleccionado datos, escribimos la línea final.
IF ( sy-subrc = 0 ).
ULINE AT /c_pos_nclie(c_ancho_total).
ENDIF.
************************************************************************
* Cabecera de página *
************************************************************************
TOP-OF-PAGE.
* Hacemos que la línea permanezca fija en el scroll horizontal
NEW-LINE NO-SCROLLING.
* Activamos el color de cabecera
FORMAT COLOR COL_HEADING INTENSIFIED OFF.
* Escribimos información de cabecera resaltando los valores
* Título y sociedad
WRITE: AT c_pos_titul text-009.
WRITE p_bukrs INTENSIFIED ON.
* Usuario de creación del informe
WRITE AT c_pos_usuar text-010.
WRITE sy-uname INTENSIFIED ON.
* Fecha de creación
WRITE AT c_pos_fecha text-011.
WRITE sy-datum INTENSIFIED ON USING EDIT MASK '__/__/____'.
* Nº de página.
WRITE AT c_pos_pagno text-012.
WRITE sy-pagno INTENSIFIED ON.
* Escribimos una línea horizontal
ULINE AT /c_pos_nclie(c_ancho_total).
* Activamos el color de cabeceras intensificado
FORMAT COLOR COL_HEADING INTENSIFIED ON.
* Escribimos la cabecera de la columnas separadas por el caracter '|'.
* Hacemos que la columna de nº de cliente sea fija en el scroll horiz.
WRITE: AT /c_pos_nclie '|' NO-GAP, text-004.
* Hasta la columna hacemos fijo
SET LEFT SCROLL-BOUNDARY.
* Escribimos el detalle de cabecera de cliente
WRITE: AT c_pos_nombr '|' NO-GAP, text-005,
AT c_pos_apel1 '|' NO-GAP, text-006,
AT c_pos_apel2 '|' NO-GAP, text-007,
AT c_pos_fnaci '|' NO-GAP, text-008,
AT c_pos_final '|' NO-GAP.
* Escribimos una línea horizontal
ULINE AT /c_pos_nclie(c_ancho_total).
Pág. 101
Curso programación ABAP IV
************************************************************************
* Rutinas adicionales. *
************************************************************************
*&---------------------------------------------------------------------*
*& Form VALORES_POSIBLES_NOMBRE
*&---------------------------------------------------------------------*
* Muestra una ventana con los distintos nombres existentes en *
* la tabla maestro de clientes ZCLIENXX. Dando la posibilidad de *
* seleccionar uno de ellos. Devuelve en el parámetro PS_NOMBR el *
* nombre seleccionado o vacio si no se realiza selección. *
*----------------------------------------------------------------------*
* -->PS_NOMBR Nombre seleccionado *
*----------------------------------------------------------------------*
FORM valores_posibles_nombre USING ps_nombr LIKE zclienxx-nombr.
************************************************************************
* Variables locales *
************************************************************************
* Tabla interna para almacenar los campos y atributos a visualizar.
DATA : BEGIN OF i_fields OCCURS 1.
INCLUDE STRUCTURE help_value.
DATA: END OF i_fields.
* Tabla interna para almacenar el valor de campos a mostrar.
DATA : BEGIN OF i_values OCCURS 0,
valor(20) TYPE c,
Pág. 102
Curso programación ABAP IV
END OF i_values.
************************************************************************
* Proceso *
************************************************************************
Pág. 103
Curso programación ABAP IV
Una base de datos lógica (LDB) proporciona una visión lógica de las tablas físicas,
pudiendo relacionar tablas entre si. Las bases de datos lógicas (LDB) son herramientas
en los que se definen los accesos a la información almacenada en las tablas del
diccionario así como las relaciones entre ellas, proporcionan por tanto, una visión lógica
de las tablas. Están formadas por un conjunto de programas en los que se detallan las
tablas utilizadas, las relaciones entre ellas, los parámetros de acceso….
Podemos crear nuestras propias bases se datos lógicas a través del menú
‘Herramientas à Workbench ABAP à Desarrollo à Entorno de programación à Bases de
datos lógicas’ (SE36). La creación de una base de datos lógica pasa por definir:
Pág. 104
Curso programación ABAP IV
Evento GET.
GET permite obtener los datos de las tablas. El evento GET ‘tablan’ llamará al
procedimiento PUT ‘tablan’ codificado en el programa de la base de datos lógica.
La estructura de acceso a los datos desde los reports que utilicen esta base de
datos lógica será algo así:
GET LFA1.
Sentencias.
GET LFB1.
Sentencias.
GET BSIK.
…..
LATE: Hace que esta instrucción se ejecute una vez procesados todos los
registros.
FIELDS:Hace que solamente se recoja la información de los campos que se
indican a continuación.
************************************************************************
* PROGRAMA: ZREPO1XX. *
* DESCRIPCION: Muestra un listado de las facturas pendientes *
Pág. 105
Curso programación ABAP IV
************************************************************************
* Evento de comienzo de selección.
************************************************************************
START-OF-SELECTION.
* Obtenemos los datos de acreedores
GET lfa1.
FORMAT COLOR COL_KEY.
* Escribimos nº y nombre del acreedor
WRITE: / lfa1-lifnr, " Nº de acreedor
lfa1-name1. " Nombre
* Obtenemos datos de sociedad
GET lfb1.
* Obtenemos la moneda de la sociedad
SELECT SINGLE waers INTO (t001-waers)
FROM t001
WHERE bukrs = lfb1-bukrs.
* Obtenemos los datos de las partidas abiertas de los acreedores.
GET bsik.
FORMAT COLOR COL_NORMAL.
* Obtenemos el signo en función del campo debe/haber
IF ( bsik-shkzg = 'S' ).
bsik-wrbtr = bsik-wrbtr * -1.
bsik-dmbtr = bsik-dmbtr * -1.
ENDIF.
* Escribimos los valores
Pág. 106
Curso programación ABAP IV
Pág. 107
Curso programación ABAP IV
4.2.11 FIELD-GROUPS.
Son útiles cuando hay que mostrar varias líneas de diferente tipo dentro de un mismo
informe, por ejemplo en caso anterior, mostramos líneas con datos de los proveedores
junto con sus documentos.
Vamos a generar un Report, que genera el mismo listado que en el ejemplo anterior
pero ayudándonos de FIELD-GROUPS.
Definir el HEADER implicará que los tipos de registros de DIRECCION estén formados
por los campos:
Pág. 108
Curso programación ABAP IV
De esta manera los campos del HEADER se convierten en campos claves para la
ordenación.
************************************************************************
* PROGRAMA: ZREPO2XX. *
* DESCRIPCION: Muestra un listado de las facturas pendientes *
* de pago de los acreedores existentes. *
* AUTOR : MAD00 FECHA: 20/08/2001 *
*----------------------------------------------------------------------*
* CONTROL DE MODIFICACIONES *
* FECHA. AUTOR. DESCRIPCION MODIFICACION. *
************************************************************************
REPORT zrepo2xx LINE-SIZE 75.
************************************************************************
* Tablas de diccionario de datos
************************************************************************
TABLES: t001, " Maestro de sociedades
lfa1, " Maestro acreedores general
lfb1, " Maestro acreedores sociedad
bsik. " Partidas abiertas acreedor
************************************************************************
* Definición de variables globales *
************************************************************************
DATA :d_dmbtr LIKE bsik-dmbtr. " Total sociedad
************************************************************************
* Definición de FIELD-GROUPS *
************************************************************************
************************************************************************
* Evento de comienzo de selección.
************************************************************************
START-OF-SELECTION.
Pág. 109
Curso programación ABAP IV
GET lfa1.
GET bsik.
************************************************************************
* Evento de comienzo final de selección
************************************************************************
END-OF-SELECTION.
* Ordenamos, será por los campos de la cabecera, es decir,
* los campos del conjunto HEADER.
SORT.
* Activamos color
FORMAT COLOR COL_KEY.
ENDAT.
ENDAT.
Pág. 110
Curso programación ABAP IV
ENDIF.
* Inicializamos el total
CLEAR d_dmbtr.
ENDAT.
ENDLOOP.
(La salida de este programa es idéntica al anterior, salvo que se muestran más datos
personales del acreedor, dirección…).
4.3.1 Introducción.
Como hemos visto en el apartado anterior, mediante los listados planos
podemos mostrar información sin que el usuario actúe sobre el informe,
únicamente se limita a indicar los parámetros de selección. Además de mostrar
esta información podemos hacer que el usuario tenga opciones sobre el informe
Pág. 111
Curso programación ABAP IV
4.3.2 Eventos
Para manejar las opciones de usuario, disponemos de varios eventos en los cuales
podemos codificar cada una de las funciones del listado.
AT LINE-SELECTION
Este evento se ejecuta cada vez que se selecciona una línea de la pantalla, para
seleccionar una línea de un listado, existen varias formas, las más habituales son
hacer Doble-click sobre la línea, hacer Click sobre la línea cuando nos aparece el
cursor con la forma de mano o situados sobre la línea pulsar una tecla de función
generalmente (F2).
AT USER-COMMAND
Este evento se ejecuta cada vez que el usuario pulsa una opción, bien a través de un
menú, bien a través de un botón…
CASE SY-UCOMM.
WHEN ‘OPC1’.
* Tratamiento de la opción 1
WHEN ‘OPC2’.
* Tratamiento de la opción 2.
….
WHEN ‘OPCn’.
* Tratamiento de la opción n.
Hay opciones que ya están predefinidas en un informe, por ejemplo las opción de
seleccionar una línea del evento AT LINE-SELCTION que tiene el valor PICK, las
opciones de paginar (P+, P-, P++ y P--). …
AT PFn
‘n’ representa un número entre 0 y 99, por tanto podemos tener hasta 100 eventos
distintos cada uno ‘gobernará’ la tecla de función correspondiente.
Este evento se ejecuta cada vez que se ejecute la tecla de función n. Normalmente este
evento no se utiliza ya que las teclas de función van asociadas a comandos que se
pueden controlar en el evento AT USER-COMAND.
Pág. 112
Curso programación ABAP IV
Por ejemplo:
WRITE D_NCLIENTE, D_NOMBRE.
HIDE D_NCLIENTE.
READ LINE...
Lee el contenido de una línea del informe y lo almacena sobre los campos indicados.
Tiene las siguientes variantes:
READ LINE lin.
READ LINE lin OF CURRENT PAGE.
READ LINE lin OF PAGE pag.
READ CURRENT LINE.
Nivel 0
Nivel 1
Nivel 2
Pág. 113
Curso programación ABAP IV
De tal forma que esta será incrementando después de cada opción de usurario, si tras
un evento de usuario queremos permanecer en el mismo nivel deberemos indicarlo
decrementando en uno esta variable. (SY-LSIND = SY-LSIND – 1). Otra variable
relacionada con el nivel de lista es la variable SY-LISTI, que indica el nivel de lista
actual, normalmente vale SY-LSIND – 1.
Para ello:
AT LINE-SELECTION.
* Comprobamos si es una línea válida, es decir el campo está informado
IF ( I_ZCLIENXX-NCLIE IS INITIAL ).
MESSAGE E000(38) WITH TEXT-013.
* Si se ha seleccionado una línea válida.
ELSE.
MESSAGE I000(38) WITH TEXT -014 I_ZCLIENXX-NCLIE.
ENDIF.
* Inicializamos el contenido del campo.
CLEAR I_ZCLIENXX-NCLIE.
Pág. 114
Curso programación ABAP IV
Podemos comprobar como con un Click sobre el campo NCLIE se muestra el mensaje,
pero se necesita un Doble-click para conseguir el mismo efecto en el resto de la línea.
Vamos a complicar nuestro listado de tal forma que, en lugar de mostrar un mensaje
con el cliente seleccionado, muestre en un nivel superior otro listado con las facturas del
cliente.
Por otra parte será necesario añadir un nuevo evento TOP-OF-PAGE DURING LINE-
SELECTION para escribir la cabecera de página del detalle de las facturas.
Pág. 115
Curso programación ABAP IV
*&---------------------------------------------------------------------*
*& Form MOSTRAR_FACTURAS_CLIENTE
*&---------------------------------------------------------------------*
* Selecciona las facturas correspondientes al cliente recibido *
* como parámetro y las muestra en pantalla. *
* Si no se seleccionan facturas, se muestra el mensaje correspondiente
*----------------------------------------------------------------------*
* -->PE_CLIENX -- Nº de cliente. *
*----------------------------------------------------------------------*
FORM MOSTRAR_FACTURAS_CLIENTE USING VALUE(PE_NCLIE) LIKE
ZCLIENXX-NCLIE.
************************************************************************
* Variables locales *
************************************************************************
* Tabla interna para almacenar las facturas del cliente
DATA: BEGIN OF I_ZFACTUXX OCCURS 0.
INCLUDE STRUCTURE ZFACTUXX.
DATA: END OF I_ZFACTUXX.
************************************************************************
* Proceso *
************************************************************************
Pág. 116
Curso programación ABAP IV
FACTURA Nº xxxxxxxxxx
Cliente: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Fecha: dd.mm.aaaa
Pág. 117
Curso programación ABAP IV
Dentro del evento AT-LINE SELECTION será necesario distinguir el nivel de detalle en
el que nos encontramos para actuar de un modo u otro, es decir, mostrando la lista de
facturas, si estamos en el nivel 0 o mostrando el detalle de la factura si estamos en el
nivel 1. Mediante la variable del sistema SY-LISTI podemos saber en todo momento en
que nivel de lista nos encontramos.
Del mismo modo tendremos que controlar en el evento TOP-OF-PAGE DURING LINE-
SELECTION para escribir o no la cabecera de listado, ya que en el detalle de factura, no
vamos a escribir ninguna cabecera de página.
Otra modificación importante que debemos realizar es hacer global la tabla interna de
facturas I_ZFACTUXX, hasta ahora local al procedimiento,
MOSTRAR_FACTURAS_CLIENTE, de este modo podremos almacenar su valor con
HIDE inmediatamente después de su escritura y este podrá ser recuperado con
posterioridad en el evento AT LINE-SELECTION.
************************************************************************
* PROGRAMA: ZREPO3XX. *
* DESCRIPCION: Muestra un listado de los clientes existentes en el *
* que se detalla en nº de cliente junto con el nombre y *
* apellidos. Así mismo se podrán visualizar las facturas *
* de un cliente y también el detalle de las mismas. *
* AUTOR: MAD00 FECHA: 13/08/2001 *
*----------------------------------------------------------------------*
* CONTROL DE MODIFICACIONES *
* FECHA. AUTOR. DESCRIPCION MODIFICACION. *
************************************************************************
REPORT ZREPO3XX NO STANDARD PAGE HEADING LINE-SIZE 120 LINE-COUNT
80.
Pág. 118
Curso programación ABAP IV
************************************************************************
* Tablas del diccionario de datos *
************************************************************************
TABLES: ZCLIENXX, " Maestro de clientes.
ZFACTUXX. " Facturas clientes
************************************************************************
* Definición de constantes *
************************************************************************
CONSTANTS:
* Constantes posiciones clientes
C_POS_NCLIE(3) TYPE N VALUE 1, " Posición nº cliente
C_POS_NOMBR(3) TYPE N VALUE 12, " Posición nombre
C_POS_APEL1(3) TYPE N VALUE 33, " Posición apellido1
C_POS_APEL2(3) TYPE N VALUE 59, " Posición apellido2
C_POS_FNACI(3) TYPE N VALUE 85, " Posición F. Nacimiento
C_POS_FINAL(3) TYPE N VALUE 96, " Posición final
C_ANCHO_TOTAL(3) TYPE N VALUE 96, " Ancho total del informe,
C_POS_TITUL(3) TYPE N VALUE 1, " Posición título,
C_POS_USUAR(3) TYPE N VALUE 37, " Posición usuario
C_POS_FECHA(3) TYPE N VALUE 60, " Posición fecha
C_POS_PAGNO(3) TYPE N VALUE 85, " Posición nº de página
* Constantes posiciones facturas.
C_POS_NFACT(3) TYPE N VALUE 1, " Posición Nº de factura
C_POS_FEFAC(3) TYPE N VALUE 12, " Posición Fecha
C_POS_MESFA(3) TYPE N VALUE 23, " Posición Mes
C_POS_IMPNT(3) TYPE N VALUE 34, " Posición Importe
C_POS_MONED(3) TYPE N VALUE 51, " Poscición moneda
C_POS_FIFAC(3) TYPE N VALUE 57, " Posición final factura.
C_ANCHO_FAC(3) TYPE N VALUE 57, " Ancho detalle factura.
* Constantes de posiciones de detalle de factura
C_POS_D_INICI(3) TYPE N VALUE 1, " Posición inicial
C_POS_D_FINAL(3) TYPE N VALUE 80, " Posición final
C_POS_D_NFACT(3) TYPE N VALUE 20, " Posicíon nfactura
C_POS_D_IMPOR(3) TYPE N VALUE 20. " Posición importes
************************************************************************
* Tablas internas *
************************************************************************
* Tabla interna de datos a listar
DATA: BEGIN OF I_ZCLIENXX OCCURS 0.
INCLUDE STRUCTURE ZCLIENXX.
DATA: END OF I_ZCLIENXX.
* Tabla interna con datos de facturas
DATA: BEGIN OF I_ZFACTUXX OCCURS 0.
INCLUDE STRUCTURE ZFACTUXX.
Pág. 119
Curso programación ABAP IV
************************************************************************
* Pantalla de selección *
************************************************************************
* Parámetros
SELECTION-SCREEN BEGIN OF BLOCK BLOQ1 WITH FRAME TITLE TEXT-001.
PARAMETERS P_BUKRS LIKE ZCLIENXX-BUKRS OBLIGATORY
DEFAULT '0001'. " Sociedad
SELECTION-SCREEN END OF BLOCK BLOQ1.
* Rangos de selección
SELECTION-SCREEN BEGIN OF BLOCK BLOQ2 WITH FRAME TITLE TEXT-002.
SELECT-OPTIONS:
* Añadimos el match-code para el código de cliente
S_NCLIE FOR ZCLIENXX-NCLIE MATCHCODE OBJECT ZCXX, " Nº de cliente
S_NOMBR FOR ZCLIENXX-NOMBR, " Nombre cliente
S_FNACI FOR ZCLIENXX-FNACI. " Fecha de nacimiento
SELECTION-SCREEN END OF BLOCK BLOQ2.
************************************************************************
* Comienzo de selección *
************************************************************************
START-OF-SELECTION.
* Inicializamos la tabla interna.
REFRESH I_ZCLIENXX.
CLEAR I_ZCLIENXX.
* Seleccionamos los datos de los clientes que cumplen criterios
SELECT *
FROM ZCLIENXX INTO TABLE I_ZCLIENXX
WHERE BUKRS = P_BUKRS
AND NCLIE IN S_NCLIE
AND NOMBR IN S_NOMBR
AND FNACI IN S_FNACI.
* Comprobamos si no hay datos seleccionados en cuyo caso,
* escribiremos un texto que lo indique.
IF NOT ( SY-SUBRC = 0 ).
WRITE / TEXT-003. " No hay datos para la selección indicada
ENDIF.
************************************************************************
* Final de la selección *
************************************************************************
END-OF-SELECTION.
* Vamos a escribir el listado con los clientes seleccionados en la
* tabla interna I_ZCLIENXX
LOOP AT I_ZCLIENXX.
* Escribimos el nº de cliente en color clave, el resto en otro color
FORMAT COLOR COL_KEY.
* Escribimos en modo Click.
Pág. 120
Curso programación ABAP IV
************************************************************************
* Cabecera de página *
************************************************************************
TOP-OF-PAGE.
* Hacemos que la línea permanezca fija en el scroll horizontal
NEW-LINE NO-SCROLLING.
* Activamos el color de cabecera
FORMAT COLOR COL_HEADING INTENSIFIED OFF.
* Escribimos información de cabecera resaltando los valores
* Título y sociedad
WRITE: AT C_POS_TITUL TEXT-009.
WRITE P_BUKRS INTENSIFIED ON.
* Usuario de creación del informe
WRITE AT C_POS_USUAR TEXT-010.
WRITE SY-UNAME INTENSIFIED ON.
* Fecha de creación
WRITE AT C_POS_FECHA TEXT-011.
WRITE SY-DATUM INTENSIFIED ON USING EDIT MASK '__/__/____'.
* Nº de página.
WRITE AT C_POS_PAGNO TEXT-012.
WRITE SY-PAGNO INTENSIFIED ON.
* Escribimos una línea horizontal
ULINE AT /C_POS_NCLIE(C_ANCHO_TOTAL).
* Activamos el color de cabeceras intensificado
FORMAT COLOR COL_HEADING INTENSIFIED ON.
* Escribimos la cabecera de la columnas separadas por el caracter '|'.
* Hacemos que la columna de nº de cliente sea fija en el scroll horiz.
WRITE: AT /C_POS_NCLIE '|' NO-GAP, TEXT-004.
* Hasta la columna hacemos fijo
SET LEFT SCROLL-BOUNDARY.
* Escribimos el detalle de cabecera de cliente
Pág. 121
Curso programación ABAP IV
ENDCASE.
************************************************************************
* Evento de selección de línea *
************************************************************************
AT LINE-SELECTION.
* En función del nivel de lista en el que nos encontremos
CASE SY-LISTI.
* Si nivel 0, mostrar facturas cliente
WHEN 0.
* Comprobamos si es una línea válida,
* es decir el campo de código de cliente está informado
IF ( I_ZCLIENXX-NCLIE IS INITIAL ).
MESSAGE E000(38) WITH TEXT-013.
* Si se ha seleccionado un línea válida.
ELSE.
* Llamamos al procedimiento para mostrar las facturas del cliente.
Pág. 122
Curso programación ABAP IV
************************************************************************
* Control de la pantalla de selección. *
************************************************************************
* Valores posibles para el rango S_Nombre valor desde.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_NOMBR-LOW.
* Llamada a la rutina que muestra los valores existentes
PERFORM VALORES_POSIBLES_NOMBRE USING S_NOMBR-LOW.
************************************************************************
* Rutinas adicionales. *
************************************************************************
*&---------------------------------------------------------------------*
*& Form VALORES_POSIBLES_NOMBRE
*&---------------------------------------------------------------------*
* Muestra una ventana con los distintos nombres existentes en *
* la tabla maestro de clientes ZCLIENXX. Dando la posibilidad de *
* seleccionar uno de ellos. Devuelve en el parámetro PS_NOMBR el *
* nombre seleccionado o vacio si no se realiza selección. *
*----------------------------------------------------------------------*
* -->PS_NOMBR Nombre seleccionado *
*----------------------------------------------------------------------*
FORM VALORES_POSIBLES_NOMBRE USING PS_NOMBR LIKE ZCLIENXX-
NOMBR.
Pág. 123
Curso programación ABAP IV
************************************************************************
* Variables locales *
************************************************************************
* Tabla interna para almacenar los campos y atributos a visualizar.
DATA : BEGIN OF I_FIELDS OCCURS 1.
INCLUDE STRUCTURE HELP_VALUE.
DATA: END OF I_FIELDS.
* Tabla interna para almacenar el valor de campos a mostrar.
DATA : BEGIN OF I_VALUES OCCURS 0,
VALOR(20) TYPE C,
END OF I_VALUES.
************************************************************************
* Proceso *
************************************************************************
Pág. 124
Curso programación ABAP IV
VALUETAB = I_VALUES
EXCEPTIONS
FIELD_NOT_IN_DDIC =1
MORE_THEN_ONE_SELECTFIELD = 2
NO_SELECTFIELD =3
OTHERS = 4.
ENDFORM. " VALORES_POSIBLES_NOMBRE
*&---------------------------------------------------------------------*
*& Form MOSTRAR_FACTURAS_CLIENTE
*&---------------------------------------------------------------------*
* Selecciona las facturas correspondientes al cliente recibido *
* como parámetro y las muestra en pantalla. *
* Si no se seleccionan facturas, se muestra el mensaje correspondiente
*----------------------------------------------------------------------*
* -->PE_CLIENX -- Nº de cliente. *
*----------------------------------------------------------------------*
FORM MOSTRAR_FACTURAS_CLIENTE USING VALUE(PE_NCLIE) LIKE
ZCLIENXX-NCLIE.
************************************************************************
* Proceso *
************************************************************************
Pág. 125
Curso programación ABAP IV
ULINE AT /C_POS_NFACT(C_ANCHO_FAC).
* Si no se han seleccionado
ELSE.
* Mostramos mensaje de información con
* 'No existen facturas para el cliente:'xxx 'para la sociedad:' xxx
MESSAGE I000(38) WITH TEXT-015 PE_NCLIE TEXT-016 P_BUKRS.
ENDIF.
ENDFORM. " MOSTRAR_FACTURAS_CLIENTE
*&---------------------------------------------------------------------*
*& Form MOSTRAR_DETALLE_FACTURA
*&---------------------------------------------------------------------*
* Muestra el detalle de una factura, mostrando el cliente *
* al que pertenece y calculando el IVA correspondiente a la misma *
* su poniendo un tipo de IVA fijo del 16 %. *
*----------------------------------------------------------------------*
* --> PE_NFACT Código de factura *
*----------------------------------------------------------------------*
FORM MOSTRAR_DETALLE_FACTURA USING VALUE(PE_NFACT) LIKE
ZFACTUXX-NFACT.
************************************************************************
* Definición de variables locales *
************************************************************************
************************************************************************
* Proceso *
************************************************************************
Pág. 126
Curso programación ABAP IV
Vamos a ver otro ejemplo de listado interactivo, es este caso va a consistir en mostrar
un listado con los clientes existentes y poder marcar y desmarcar algunos de ellos para
su posterior tratamiento.
Para ello vamos a realizar una copia del programa anterior ‘ZREPO3XX’ a la que
llamaremos ‘ZREPO4XX ‘y sobre este realizaremos las siguientes modificaciones:
Pág. 127
Curso programación ABAP IV
En la tabla interna I_ZCLIENXX, será necesario añadir un nuevo campo (CHAR 1) para
poder ser usado como campo para marcar y desmarcar. Para ello definiremos la tabla
del siguiente modo:
Pág. 128
Curso programación ABAP IV
El siguiente paso será dar la posibilidad de mostrar una ventana con las facturas con
los clientes seleccionados, mediante la opción de un botón en la barra de pulsadores.
Para crear opciones de usuario, bien como botones el la barra de pulsadores, bien
como opciones de menú en la barra de menús, es necesario definir un STATUS.
Dynpro
Ventana de diálogo
Lista
Lista en Ventana de dialogo
Pág. 129
Curso programación ABAP IV
Vamos a crear un STATUS tipo lista al que llamaremos ‘S00’ para ello escribimos la
instrucción para activar el STATUS, en nuestro caso, la situaremos al comienzo del
evento END-OF-SELECTION
Usamos la utilidad del editor de navegar al objeto haciendo Doble-Click sobre él , nos
saldrá una ventana indicando que el Status no existe, pero nos da la posibilidad de
crearlo, nos aparecerá la siguiente ventana donde deberemos indicar los atributos del
STATUS, pondremos ‘Listado clientes’ en texto breve y seleccionaremos el tipo ‘Lista’.
Pág. 130
Curso programación ABAP IV
Por defecto, aparecen todas las opciones existentes en los listados (En los ejemplos
anteriores teníamos ya estas opciones sin crear nuestro propio STATUS), podemos
eliminar estas opciones, borrando el código de comando correspondiente de la barra de
símbolos. (En nuestro caso no vamos a eliminar ninguna).
Creamos nuestro botón facturas, para ello, escribimos el código de comando que vamos
a asociar al botón en el primer hueco disponible de la barra de pulsadores, pondremos
‘FACT’ al pulsar ENTER nos saldrá una ventana para elegir la tecla de función asociada
al comando, seleccionaremos ‘F5’, a continuación nos saldrá la siguiente ventana:
Pág. 131
Curso programación ABAP IV
Donde pondremos el texto que mostrará el botón, ‘Visualizar Facturas’ en nuestro caso.
Tras aceptar tendremos nuestro primer botón.
Aprovechamos para incluir dos nuevos botones, un botón que nos servirá para marcar a
todos los clientes del listado y otro que permita desmarcarlos. Estos botones van a tener
la particularidad de que van a tener asociado un Icono.
Vamos a crear el botón ‘MARCAR’ al que le asociaremos el ICONO ( ). Para ello, nos
situamos en la primera tecla de función de libre definición, que este libre (las veremos
haciendo un avance de página) en nuestro caso (‘F6’), seleccionamos la opción del
menú ‘TrataràInsertaràFunción con Icono (Ctrl. + F10), nos aparecerá una ventana
donde pondremos el código de comando asociado ‘MARC’ en nuestro caso, nos llevará
a la siguiente ventana:
Pág. 132
Curso programación ABAP IV
Pág. 133
Curso programación ABAP IV
S01: Será de tipo lista en ventana de diálogo, será el que activemos cuando llamemos
a la ventana donde mostrar las facturas de los clientes.
Tendrá las opciones que se crean por defecto más la opción ‘PICK’ que
añadiremos a la barra de pulsadores.
Para el listado de detalle de factura, no será necesario definirse ningún STATUS ya que
utilizaremos el STATUS estándar, activándolo con ’SET PF-STATUS SPACE’.
De vuelta al código del programa ya tendremos un nuevo STATUS con las opciones
disponibles. Ahora falta realizar el tratamiento de dichas opciones. Este tratamiento se
realiza en el evento AT USER-COMMAND, en el que hay que controlar:
Visualizar facturas:
Para visualizar las facturas de los clientes seleccionados, será necesario, hacer dos
cosas.
En primer lugar, leer las marcas del listado, es decir, ver que clientes están marcados
en pantalla, actualizaremos el campo marca en la tabla interna I_ZCLIENTES. Esta
tarea se realiza dentro del procedimiento ‘LEER_MARCAS_LISTADO’.
Por otra parte será necesario mostrar las facturas de aquellos clientes seleccionados,
es decir, de aquellos clientes que tengan el campo marca activado. Esto se hace dentro
del procedimiento ‘MOSTRAR_FACTURAS_CLIENTES’ en el que se activa el STATUS
‘S01’ correspondiente al listado de facturas y se activa el listado en forma de ventana
utilizando la instrucción WINDOW STARTING AT… ENDING AT… En la llamada al
STATUS, eliminamos la opción de selección para impedir que se muestre el detalle de
la factura. Posteriormente se llama al procedimiento, ya existente,
‘MOSTRAR_FACTURAS_CLIENTE’ para mostrar las facturas de cada cliente
seleccionado.
Pág. 134
Curso programación ABAP IV
************************************************************************
* PROGRAMA: ZREPO4XX. *
* DESCRIPCION: Muestra un listado de los clientes existentes en el *
* que se detalla en nº de cliente junto con el nombre y *
* apellidos . Así mismo se podrán visualizar las facturas *
* de un cliente/s y también el detalle de las mismas. *
* AUTOR : Nombre y Apellidos FECHA: 13/08/2001 *
*----------------------------------------------------------------------*
* CONTROL DE MODIFICACIONES *
* FECHA. AUTOR. DESCRIPCION MODIFICACION. *
************************************************************************
REPORT ZREPO4XX NO STANDARD PAGE HEADING LINE-SIZE 120 LINE-COUNT
80.
************************************************************************
* Tablas del diccionario de datos *
************************************************************************
TABLES: ZCLIENXX, " Maestro de clientes.
ZFACTUXX. " Facturas clientes
************************************************************************
* Definición de constantes *
************************************************************************
CONSTANTS:
* Constantes posiciones clientes
C_POS_INICI(3) TYPE N VALUE 1, " Posición de inicio
C_POS_NCLIE(3) TYPE N VALUE 3, " Posición nº cliente
C_POS_NOMBR(3) TYPE N VALUE 14, " Posición nombre
C_POS_APEL1(3) TYPE N VALUE 35, " Posición apellido1
C_POS_APEL2(3) TYPE N VALUE 61, " Posición apellido2
C_POS_FNACI(3) TYPE N VALUE 87, " Posición F. Nacimiento
C_POS_FINAL(3) TYPE N VALUE 98, " Posición final
C_ANCHO_TOTAL(3) TYPE N VALUE 98, " Ancho total del informe,
C_POS_TITUL(3) TYPE N VALUE 1, " Posición título,
C_POS_USUAR(3) TYPE N VALUE 37, " Posición usuario
C_POS_FECHA(3) TYPE N VALUE 60, " Posición fecha
C_POS_PAGNO(3) TYPE N VALUE 85, " Posición nº de página
* Constantes posiciones facturas.
C_POS_NFACT(3) TYPE N VALUE 1, " Posición Nº de factura
C_POS_FEFAC(3) TYPE N VALUE 12, " Posición Fecha
C_POS_MESFA(3) TYPE N VALUE 23, " Posición Mes
C_POS_IMPNT(3) TYPE N VALUE 34, " Posición Importe
C_POS_MONED(3) TYPE N VALUE 51, " Poscición moneda
C_POS_FIFAC(3) TYPE N VALUE 57, " Posición final factura.
C_ANCHO_FAC(3) TYPE N VALUE 57, " Ancho detalle factura.
Pág. 135
Curso programación ABAP IV
************************************************************************
* Tablas internas *
************************************************************************
************************************************************************
* Pantalla de selección *
************************************************************************
* Parámetros
SELECTION-SCREEN BEGIN OF BLOCK BLOQ1 WITH FRAME TITLE TEXT-001.
PARAMETERS P_BUKRS LIKE ZCLIENXX-BUKRS OBLIGATORY
DEFAULT '0001'. " Sociedad
SELECTION-SCREEN END OF BLOCK BLOQ1.
* Rangos de selección
SELECTION-SCREEN BEGIN OF BLOCK BLOQ2 WITH FRAME TITLE TEXT-002.
SELECT-OPTIONS:
* Añadimos el match-code para el código de cliente
S_NCLIE FOR ZCLIENXX-NCLIE MATCHCODE OBJECT ZCXX, " Nº de cliente
S_NOMBR FOR ZCLIENXX-NOMBR, " Nombre cliente
S_FNACI FOR ZCLIENXX-FNACI. " Fecha de nacimiento
SELECTION-SCREEN END OF BLOCK BLOQ2.
************************************************************************
* Comienzo de selección *
************************************************************************
START-OF-SELECTION.
* Inicializamos la tabla interna.
REFRESH I_ZCLIENXX.
CLEAR I_ZCLIENXX.
* Seleccionamos los datos de los clientes que cumplen criterios
SELECT *
FROM ZCLIENXX INTO CORRESPONDING FIELDS OF TABLE I_ZCLIENXX
Pág. 136
Curso programación ABAP IV
************************************************************************
* Final de la selección *
************************************************************************
END-OF-SELECTION.
* Activamos el status de listado de clientes
SET PF-STATUS 'S00'.
* Llamamos al procedimiento que muestra el listado de clientes
PERFORM MOSTRAR_CLIENTES.
************************************************************************
* Cabecera de página *
************************************************************************
TOP-OF-PAGE.
* Llamamos al proce. que escribe la cabecera del listado de clientes
PERFORM MOSTRAR_CABECERA_CLIENTES.
************************************************************************
* Cabecera de página durante la selección *
************************************************************************
TOP-OF-PAGE DURING LINE-SELECTION.
* Comprobamos el STATUS activo en función del cual mostraremos la
* cabecera correspondiente
CASE SY-PFKEY.
* Si status S00, activa cabecera clientes
WHEN 'S00'.
* Llamamos al proce. que escribe cabecera de clientes
PERFORM MOSTRAR_CABECERA_CLIENTES.
* Si status S01, actvivamos cabecera facturas
WHEN 'S01'.
* Escribimos una línea horizontal
ULINE AT /C_POS_NFACT(C_ANCHO_FAC).
* Activamos color de cabecera
FORMAT COLOR COL_HEADING.
* Escribimos el detalle de la cabecera de factura.
WRITE: AT /C_POS_NFACT '|' NO-GAP, TEXT-017,
AT C_POS_FEFAC '|' NO-GAP, TEXT-018,
AT C_POS_MESFA '|' NO-GAP, TEXT-019,
AT C_POS_IMPNT '|' NO-GAP, TEXT-020,
Pág. 137
Curso programación ABAP IV
ENDCASE.
************************************************************************
* Evento de selección de línea *
************************************************************************
AT LINE-SELECTION.
* En función del STATUS existente
CASE SY-PFKEY.
* Si Listado de clientes 'S00'.
WHEN 'S00'.
* Comprobamos si es una línea válida,
* es decir el campo de código de cliente está informado
IF ( I_ZCLIENXX-NCLIE IS INITIAL ).
MESSAGE E000(38) WITH TEXT-013.
* Si se ha seleccionado un línea válida.
ELSE.
* Activamos el STATUS del listado de facturas
SET PF-STATUS 'S01'.
* Llamamos al procedimiento para mostrar las facturas del cliente.
PERFORM MOSTRAR_FACTURAS_CLIENTE USING I_ZCLIENXX-NCLIE.
ENDIF.
* Inicializamos el contenido del campo.
CLEAR I_ZCLIENXX-NCLIE.
* Si listado de facturas 'S01'.
WHEN 'S01'.
* Comprobamos si es una línea válida, nfact informado
IF ( I_ZFACTUXX-NFACT IS INITIAL ).
MESSAGE E000(38) WITH TEXT-013.
* Si se ha seleccionado una línea válida
ELSE.
* Activamos el STATUS por defecto.
SET PF-STATUS SPACE.
* Mostramos el detalle de factura.
PERFORM MOSTRAR_DETALLE_FACTURA USING I_ZFACTUXX-NFACT.
* Inicializamos el contenido del campo.
CLEAR I_ZFACTUXX-NFACT.
ENDIF.
ENDCASE.
************************************************************************
* Evento de comandos de usuario *
************************************************************************
AT USER-COMMAND.
Pág. 138
Curso programación ABAP IV
************************************************************************
* Rutinas adicionales. *
************************************************************************
*&---------------------------------------------------------------------*
*& Form VALORES_POSIBLES_NOMBRE
*&---------------------------------------------------------------------*
* Muestra una ventana con los distintos nombres existentes en *
* la tabla maestro de clientes ZCLIENXX. Dando la posibilidad de *
* seleccionar uno de ellos. Devuelve en el parámetro PS_NOMBR el *
Pág. 139
Curso programación ABAP IV
************************************************************************
* Proceso *
************************************************************************
Pág. 140
Curso programación ABAP IV
************************************************************************
* Proceso *
************************************************************************
Pág. 141
Curso programación ABAP IV
************************************************************************
* Definición de variables locales *
************************************************************************
************************************************************************
* Proceso *
************************************************************************
Pág. 142
Curso programación ABAP IV
CHECK ( SY-SUBRC = 0 ).
* Escribimos los datos en la forma adecuada
ULINE AT /C_POS_D_INICI(C_POS_D_FINAL).
* Nº de factura.
WRITE: AT /C_POS_D_INICI '|',
AT C_POS_D_NFACT TEXT-022, I_ZFACTUXX-NFACT,
AT C_POS_D_FINAL '|' NO-GAP.
Pág. 143
Curso programación ABAP IV
************************************************************************
* Definición de variables locales
*
************************************************************************
DATA: L_LINEA LIKE SY-INDEX, " Nº de línea de pantalla
L_MARCA(1) TYPE C, " Marca de pantalla
L_NCLIE LIKE ZCLIENXX-NCLIE. " Cliente de pantalla
************************************************************************
* Proceso *
************************************************************************
* Inicializamos el contador de líneas
L_LINEA = 0.
* Leemos las líneas todas las líneas de pantalla
DO.
* Incrementamos el contador de líneas
L_LINEA = L_LINEA + 1.
* Leemos la línea correspondiente
READ LINE L_LINEA FIELD VALUE I_ZCLIENXX-MARCA INTO L_MARCA
I_ZCLIENXX-NCLIE INTO L_NCLIE.
* Si no hay error en la lectura
IF ( SY-SUBRC = 0 ).
* Comprobamos si es una línea de detalle
CHECK NOT ( L_NCLIE IS INITIAL ).
* Leemos la entrada de la tabla correspondiente
READ TABLE I_ZCLIENXX WITH KEY NCLIE = L_NCLIE BINARY SEARCH.
* Si no hay error
CHECK ( SY-SUBRC = 0 ).
* Comprobamos si el campo marca es distinto al de la tabla
IF ( I_ZCLIENXX-MARCA <> L_MARCA ).
* Modificamos la entrada con el valor de pantalla
I_ZCLIENXX-MARCA = L_MARCA.
MODIFY I_ZCLIENXX INDEX SY-TABIX.
ENDIF.
* Si hay error en la lectura significará final de lista, terminamos
ELSE.
EXIT.
ENDIF.
ENDDO.
ENDFORM. " LEER_MARCAS_LISTADO
*&---------------------------------------------------------------------*
*& Form MOSTRAR_FACTURAS_CLIENTES
*&---------------------------------------------------------------------*
* Muestra las facturas de los clientes seleccionados, es decir *
Pág. 144
Curso programación ABAP IV
Pág. 145
Curso programación ABAP IV
*----------------------------------------------------------------------*
FORM MOSTRAR_CLIENTES.
************************************************************************
* Proceso *
************************************************************************
************************************************************************
* Proceso *
************************************************************************
Pág. 146
Curso programación ABAP IV
5. Programación de diálogo.
5.1 Introducción
Los programas de diálogo están orientados al intercambio dinámico de
información entre el usuario y el sistema. Un programa de diálogo necesita
necesitan.
Pág. 147
Curso programación ABAP IV
Los programas de tipo Module Pool deben comenzar con el literal 'SAPMZ'.
Ejemplo práctico: Se creará el programa SAPMZBXX.
Pág. 148
Curso programación ABAP IV
El programa se ha creado sin ninguna sentencia, pero al crear las pantallas se irán
creando automáticamente una serie de programas de tipo INCLUDE (que
comenzarán con los cinco últimos caracteres del programa marco) que se añadirán
automáticamente a nuestro programa a través de las sentencias INCLUDE:
MZBXXTOP: Contendrá las definiciones globales del
programa.
MZBXXO01: Contendrá los módulos PBO de las pantallas.
MZBXXI01: Contendrá los módulos PAI de las pantallas.
MZBXXF01: Contendrá las subrutinas del programa. Si
nuestro programa no contiene subrutinas, este INCLUDE no estará presente.
Pág. 149
Curso programación ABAP IV
Pág. 150
Curso programación ABAP IV
Ej. ‘Normal’.
Otros atributos :
Dynpro siguiente: Indica el número de la pantalla
que se ejecutará automáticamente al finalizar la ejecución de la actual si no se
controla específicamente desde la lógica de proceso, presentando por defecto el
número de la pantalla actual. El valor ‘0’ finalizará la transacción.
Pág. 151
Curso programación ABAP IV
Pág. 152
Curso programación ABAP IV
Ej.: Se crearán los campos donde se podrán introducir los valores que se darán de
alta en la tabla de clientes.
Una vez recuperado el campo falta posicionarlo en pantalla haciendo doble click en
la posición en la que debe aparecer. (En algunos casos aparece siempre pegado al
margen izquierdo debido a las opciones de usuario que se tengan definidas,
pudiendo moverse posteriormente como se explicará más adelante).
Pág. 153
Curso programación ABAP IV
Pág. 154
Curso programación ABAP IV
Pág. 155
Curso programación ABAP IV
Pág. 156
Curso programación ABAP IV
Una vez especificados los atributos del elemento se finaliza la pantalla pulsando el
botón .
Pág. 157
Curso programación ABAP IV
Pulsando el botón aparecerá una pantalla con todos los campos definidos
en la pantalla. Estos campos deben estar declarados en el INCLUDE MZXXXTOP
del programa marco (excepto los literales y los marcos).
Al final de la lista de campos aparece un campo vacío que se utiliza para asignarle
una variable en la que se almacenará el código de función seleccionado por el
usuario en la pantalla. Esta variable debe tener la misma estructura que la variable
del sistema SY-UCOMM, que también almacena dicho código de función
automáticamente.
Ej.: Se asignará la variable D_OKCODE al campo de pantalla que recibe el código
de función seleccionado por el usuario.
Pág. 158
Curso programación ABAP IV
Pág. 159
Curso programación ABAP IV
Pág. 160
Curso programación ABAP IV
Después de realizar el diseño gráfico de una pantalla se debe crear un STATUS que
definirá las funciones que tendrá disponibles la pantalla en las barras de menús, de
herramientas del sistema y de pulsadores.
Para crear los Status de pantalla del Module Pool se utiliza el MENU PAINTER.
Ruta de acceso: (En el menú principal de SAP) Herramientasà Workbench ABAP à
DesarrolloàInterfase de usuario àMenu painter (SE41).
Pág. 161
Curso programación ABAP IV
Pág. 162
Curso programación ABAP IV
Barra de menús.
Para definir el menú informaremos la descripción del mismo en el campo ‘Barra
menús’. (Ej.: ‘Menú de altas de clientes’), y el texto de las opciones de menú en los
campos que aparecen vacíos debajo de la descripción (E.: ‘Opciones’).
Para informar las opciones de cada una de las opciones del menú , haremos Doble-
Click sobre cada una de ellas. Una vez desplegado se crearán las funciones que
contendrá la opción de menú informando el código de función asociado (primer
campo) y la descripción que aparecerá (segundo campo).
Ej.: Crearemos la función ‘ALTA’-‘Alta de cliente’ y ‘EXIT’-‘Finalizar’ que realizarán
un alta o finalizarán la ejecución de la pantalla respectivamente al ser
seleccionadas.
Pág. 163
Curso programación ABAP IV
Para borrar una función de un menú se debe borrar el código de función asociado y
la descripción.
Pág. 164
Curso programación ABAP IV
Barra de pulsadores.
Definiremos las opciones de la barra de pulsadores que tendrá la pantalla, para ello
definimos , los códigos de función indicado en el apartado de lista de funciones.(En
nuestro caso indicaremos u único botón correspondiente a la opción de borrar).
Pág. 165
Curso programación ABAP IV
Por defecto se crean los eventos PROCESS BEFORE OUTPUT (PBO) y PROCESS
AFTER INPUT (PAI).
Pág. 166
Curso programación ABAP IV
Las pantallas deben tener asignado un título y un Status que definen el título , los
menús,la barra de herramientas estandar y pulsadores que tendrán activos. Para
realizar la asignación se utilizarán las siguientes sentencias dentro de un módulo en
el evento PBO, ya que no se pueden utilizar directamente en la lógica de proceso de
la pantalla:
SET PF-STATUS <nombre>: Asigna un
Status a la pantalla pudiendo excluir funciones con la cláusula EXCLUDING.
SET TITLEBAR <número>: Asigna un título
a la pantalla.
Sentencia MODULE.
Las sentencias de la lógica de proceso se suelen estructurarse en módulos
delimitados por las sentencias MODULE y ENDMODULE. Estos módulos se
Pág. 167
Curso programación ABAP IV
Para ejecutar los módulos desde la lógica de proceso del editor Screen Painter se
utiliza la sentencia MODULE <nombre>.
Pág. 168
Curso programación ABAP IV
*&------------------------------------------------------------------------------------------*
*& Module INICIALIZAR_9000 OUTPUT
*&------------------------------------------------------------------------------------------*
* Inicializa los campos de la pantalla de altas de clientes.
*---------------------------------------------------------------------------------------------*
MODULE INICIALIZAR_9000 OUTPUT.
Pág. 169
Curso programación ABAP IV
**************************************************************************************
* Definición de constantes
**************************************************************************************
CONSTANTS: C_BUKRS LIKE ZCLIENXX-BUKRS " Sociedad por defecto
VALUE '0001'.
*&-----------------------------------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&-----------------------------------------------------------------------------------------------*
* Ejecuta las sentencias asociadas al código de función devuelto por
* la pantalla de altas de clientes.
*---------------------------------------------------------------------------------------------------*
MODULE USER_COMMAND_9000 INPUT.
CASE D_OKCODE.
WHEN 'ALTA'. " Alta de cliente
PERFORM ALTA_CLIENTE.
WHEN 'BORR'. " Borrado de datos de cliente
PERFORM BORRAR_DATOS.
ENDCASE.
*&-----------------------------------------------------------------------------------------------*
*& Form ALTA_CLIENTE
*&-----------------------------------------------------------------------------------------------*
* Añade una entrada a la tabla de clientes ZCLIENXX con los datos
* introducidos por pantalla.
*---------------------------------------------------------------------------------------------------*
FORM ALTA_CLIENTE.
Pág. 170
Curso programación ABAP IV
*&-----------------------------------------------------------------------------------------------*
*& Form NUMERO_CLIENTE
*&-----------------------------------------------------------------------------------------------*
* Comprueba que el número de cliente se informa correctamente
*---------------------------------------------------------------------------------------------------*
FORM NUMERO_CLIENTE.
DATA: L_NCLIE LIKE ZCLIENXX-NCLIE. " Número de cliente.
IF ZCLIENXX-NCLIE IS INITIAL.
* Númeración automática: Se selecciona el último número de cliente
* dado de alta
SELECT NCLIE INTO ZCLIENXX-NCLIE
FROM ZCLIENXX
WHERE BUKRS = ZCLIENXX-BUKRS.
ENDSELECT.
IF SY-SUBRC = 0.
* Se informa el número de cliente con el posterior al seleccionado
ZCLIENXX-NCLIE = ZCLIENXX-NCLIE + 1.
ELSE.
* No existen clientes dados de alta, se inicializa el número
ZCLIENXX-NCLIE = 1.
ENDIF.
ELSE.
Pág. 171
Curso programación ABAP IV
IF SY-SUBRC = 0.
* Se inicializa el código de función de la pantalla para que no se
* vuelva a ejecutar el alta al pulsar ENTER después del error.
CLEAR D_OKCODE.
* Error: El número de cliente ya existe.
MESSAGE E000(38) WITH TEXT-003.
ENDIF.
ENDIF.
*&-----------------------------------------------------------------------------------------------*
*& Form BORRAR_DATOS
*&-----------------------------------------------------------------------------------------------*
* Borra los datos de los campos de pantalla.
*---------------------------------------------------------------------------------------------------*
FORM BORRAR_DATOS.
La sentencia MODULE dispone las siguientes cláusulas, que solo tienen sentido en
el evento PAI, que condicionan su ejecución al tipo de función seleccionado en la
pantalla:
AT EXIT-COMMAND: Provoca que
solamente se ejecute el módulo cuando se seleccione una función de pantalla del
tipo ‘E’ (Comando Exit). Al seleccionar una función de este tipo, el sistema no
ejecutará los módulos que no tengan esta cláusula y tampoco ejecutará chequeos
Pág. 172
Curso programación ABAP IV
como los que realiza con los campos de entrada obligatoria, pasando directamente a
ejecutar los módulos que tengan la cláusula AT EXIT-COMMAND. Esta cláusula se
suele utilizar para los módulos que controlan las funciones de salida de las
pantallas, permitiendo finalizar su ejecución sin realizar ninguna verificación sobre
los valores que contengan sus campos.
AT CURSOR-SELECTION: Provoca
que solamente se ejecute el módulo cuando se ejecute sobre un campo una función
de selección asociada a la tecla de función F2 o se haga doble click sobre él.
*&-----------------------------------------------------------------------------------------------*
*& Module SALIR_9000 INPUT
*&-----------------------------------------------------------------------------------------------*
* Ejecuta las sentencias asociadas a los código de función del tipo
* EXIT COMMAND en la pantalla 9000.
*---------------------------------------------------------------------------------------------------*
MODULE SALIR_9000 INPUT.
CASE D_OKCODE.
* Regresar, Finalizar y Cancelar
WHEN 'BACK' OR 'EXIT' OR 'CANC'.
LEAVE PROGRAM.
ENDCASE.
Se modifican las funciones ‘BACK’, ‘EXIT’ y ‘CANC’ del Status ‘STA_9000’ desde la
opción de menú ‘Pasar aàLista funciones’ del Menu Painter, estableciéndolas de
tipo ‘E’ (Comando Exit), grabando y activando el Status.
Pág. 173
Curso programación ABAP IV
Sentencia FIELD.
Esta sentencia permite asociar la ejecución de un módulo a un campo de pantalla
permitiendo utilizar las siguientes cláusulas (que solamente tienen sentido en el
evento PAI) con la sentencia MODULE:
ON INPUT: Provoca que solamente
se ejecute el módulo si el campo asociado contiene un valor distinto al inicial en
función del tipo de dato (por ejemplo espacios en los campos de tipo carácter).
ON REQUEST: Provoca que
solamente se ejecute el módulo si el campo asociado ha sido modificado.
ON -INPUT: Provoca que solamente
se ejecute el módulo si el campo asociado contiene el valor ‘*’ y además tiene activo
el atributo de campo ‘* Entry’.
Lógica de proceso:
PROCESS AFTER INPUT.
* Chequeo de la sociedad
FIELD ZCLIENXX-BUKRS
MODULE CHEQUEAR_SOCIEDAD ON REQUEST.
Include MZBXXI01:
*&-----------------------------------------------------------------------------------------------*
*& Module CHEQUEAR_SOCIEDAD INPUT
*&-----------------------------------------------------------------------------------------------*
* Chequea que la sociedad introducida existe en la tabla de sociedades.
*---------------------------------------------------------------------------------------------------*
MODULE CHEQUEAR_SOCIEDAD INPUT.
Pág. 174
Curso programación ABAP IV
IF SY-SUBRC <> 0.
* Error: La sociedad & no está prevista.
MESSAGE E165(F5) WITH ZCLIENXX-BUKRS.
ENDIF.
Include MZBXXTOP:
************************************************************************
* Definición de tablas
************************************************************************
TABLES: ZCLIENXX, " Maestro de clientes
T001. " Sociedades
Lógica de proceso:
Pág. 175
Curso programación ABAP IV
Include MZBXXI01:
*&-----------------------------------------------------------------------------------------------*
*& Module CHEQUEAR_AUTOMATICO INPUT
*&-----------------------------------------------------------------------------------------------*
* Chequea que el numero de cliente y el flag de numeración automática
* no estan informados o vacíos simultáneamente.
*---------------------------------------------------------------------------------------------------*
MODULE CHEQUEAR_AUTOMATICO INPUT.
IF D_AUTOMATICO IS INITIAL.
* Flag de numeración automática desmarcado
IF ZCLIENXX-NCLIE IS INITIAL.
* Número de cliente no informado
* Error: Informe el número de cliente o marque el flag de num. aut.
MESSAGE E000(38) WITH TEXT-004 TEXT-005.
ENDIF.
ELSE.
* Flag de numeración automática marcado
IF NOT ZCLIENXX-NCLIE IS INITIAL.
* Número de cliente informado
* Error: Borre el número de cliente o desmarque el flag de num. aut.
MESSAGE E000(38) WITH TEXT-006 TEXT-005.
ENDIF.
ENDIF.
Lógica de proceso:
* Chequeo de tipo de cliente
CHAIN.
FIELD: ZCLIENXX-FNACI,
D_PARTICULAR,
Pág. 176
Curso programación ABAP IV
Include MZBXXI01:
*&-----------------------------------------------------------------------------------------------*
*& Module CHEQUEAR_TIPO_CLIENTE INPUT
*&-----------------------------------------------------------------------------------------------*
* Chequea que la fecha de nacimiento está informada si el cliente es un
* particular y que no lo está si es una empresa.
*---------------------------------------------------------------------------------------------------*
MODULE CHEQUEAR_TIPO_CLIENTE INPUT.
IF D_EMPRESA IS INITIAL.
* Cliente tipo particular
IF ZCLIENXX-FNACI IS INITIAL.
* Fecha de nacimiento de cliente no informada
* Error: Los particulares deben tener informada la f. de nacimiento
MESSAGE E000(38) WITH TEXT-007 TEXT-008.
ENDIF.
ELSEIF NOT ZCLIENXX-FNACI IS INITIAL.
* Cliente tipo empresa con la fecha de nacimiento informada
* Error: Las empresas no deben tener informada la f. de nacimiento
MESSAGE E000(38) WITH TEXT-009 TEXT-008.
ENDIF.
5.2.6 Transacciones
Se deberá crear al menos una transacción para ejecutar un Module Pool desde la
opción del menú principal de SAP ‘Herramientasà Workbench ABAP
àDesarrolloàMás herramientasàTransacciones’ (SE93).
Pág. 177
Curso programación ABAP IV
Pág. 178
Curso programación ABAP IV
Pág. 179
Curso programación ABAP IV
Pág. 180
Curso programación ABAP IV
Se informará el primer campo del atributo ‘Grupos’ con el literal ‘CLI’ en el editor
gráfico SCREEN PAINTER en los siguientes campos: ‘ZCLIENXX-BUKRS’,
‘ZCLIENXX-NCLIE’, ‘ZCLIENXX-NOMBR’, ‘ZCLIENXX-APEL1’, ‘ZCLIENXX-APEL2’,
‘ZCLIENXX-FNACI’, ‘D_PARTICULAR’, ‘D_EMPRESA’ y ‘D_AUTOMATICO’. En las
casillas y botones de selección hay que tener cuidado en escoger el campo de
entrada de longitud 1 y no el literal descriptivo.
Pág. 181
Curso programación ABAP IV
Pág. 182
Curso programación ABAP IV
Include MZBXXTOP:
************************************************************************
* Definición de variables
************************************************************************
DATA: D_OKCODE LIKE SY-UCOMM, " Código de función de pantalla
D_PARTICULAR(1) TYPE C, " Flag de cliente particular
D_EMPRESA(1) TYPE C, " Flag de empresa
D_AUTOMATICO(1) TYPE C, " Flag de numeración automática
D_CLIENTE_CORRECTO(1) type c. " Flag de cliente correcto
CASE D_OKCODE.
WHEN 'ALTA'. " Alta de cliente
PERFORM ALTA_CLIENTE.
WHEN 'BORR'. " Borrado de datos de cliente
PERFORM BORRAR_DATOS.
Pág. 183
Curso programación ABAP IV
Se modifica la subrutina ‘ALTA_CLIENTE’ para que borre los datos del cliente
después de realizar un alta correcta realizando una llamada a la subrutina
‘BORRAR_DATOS’.
Lógica de proceso:
PROCESS BEFORE OUTPUT.
* Modificación de atributos de pantalla
MODULE MODIFICAR_PANTALLA_9000.
Include MZBXXO01:
*&-----------------------------------------------------------------------------------------------*
*& Module MODIFICAR_PANTALLA_9000 OUTPUT
*&-----------------------------------------------------------------------------------------------*
* Modifica los atributos de los campos de la pantalla de altas
*---------------------------------------------------------------------------------------------------*
MODULE MODIFICAR_PANTALLA_9000 OUTPUT.
LOOP AT SCREEN.
IF SCREEN-NAME = 'D_ALTA'.
* Solamente se visualizará el botón de altas si está marcado el flag
* de cliente correcto.
IF D_CLIENTE_CORRECTO IS INITIAL.
SCREEN-INVISIBLE = 1.
ELSE.
SCREEN-INVISIBLE = 0.
Pág. 184
Curso programación ABAP IV
ENDIF.
ENDIF.
IF SCREEN-GROUP1 = 'CLI'.
* Los campos de entrada agrupados con el literal 'CLI' en el grupo 1
* solo permitirán entradas si está desmarcado el flag de cliente
* correcto
IF D_CLIENTE_CORRECTO IS INITIAL.
SCREEN-INPUT = 1.
ELSE.
SCREEN-INPUT = 0.
ENDIF.
ENDIF.
ENDLOOP.
*&-----------------------------------------------------------------------------------------------*
*& Module STATUS_9100 OUTPUT
*&-----------------------------------------------------------------------------------------------*
* Establece el Status y el título de la pantalla de visualización de
* clientes.
*---------------------------------------------------------------------------------------------------*
Pág. 185
Curso programación ABAP IV
*&-----------------------------------------------------------------------------------------------*
*& Module USER_COMMAND_9100 INPUT
*&-----------------------------------------------------------------------------------------------*
* Ejecuta las sentencias asociadas al código de función devuelto por
* la pantalla de visualización de clientes.
*---------------------------------------------------------------------------------------------------*
MODULE USER_COMMAND_9100 INPUT.
CASE D_OKCODE.
WHEN 'EXIT'. " Finalizar
* Se finaliza la ejecución del programa
LEAVE PROGRAM.
ENDCASE.
************************************************************************
* Definición de tablas internas
************************************************************************
* Tabla interna de clientes
DATA: BEGIN OF I_CLIENTES OCCURS 0.
INCLUDE STRUCTURE ZCLIENXX.
DATA: MARCA,
END OF I_CLIENTES.
Pág. 186
Curso programación ABAP IV
Pág. 187
Curso programación ABAP IV
Pág. 188
Curso programación ABAP IV
Ej.: ‘sin’.
Con columna marca: Al activar esta opción
se incluye una columna de marcadores para poder seleccionar líneas, al inicio del
TABLE CONTROL. Se deberá especificar un campo asociado que deberá estar
definido como caracter de longitud 1. Esta opción es incompatible con la selección
‘Sin posibilidad de marcar líneas’.
Ej.: marcado y asociado al campo I_CLIENTES-MARCA.
Ctd. Columnas fijas: Especifica el número
de columnas, comenzando por la izquierda, que permanecerán fijas en el TABLE
CONTROL. Las columnas fijas no se podrán mover con el ratón ni se desplazarán al
paginar horizontalmente.
Pág. 189
Curso programación ABAP IV
Se informan los títulos de los campos con los literales ‘Soc.’, ‘Número’, ‘Nombre’,
‘Primer apellido’, ‘Segundo apellido’ y ‘Fecha nac.’
Pág. 190
Curso programación ABAP IV
Ej.: Se desmarca el atributo ‘Campo entrada’ en todos los campos del TABLE
CONTROL para evitar que se pueda modificar su contenido.
Pág. 191
Curso programación ABAP IV
Los campos que componen el TABLE CONTROL hacen referencia a los campos de
una tabla interna que contiene los datos que se van a editar.
Cada vuelta del bucle LOOP se corresponde con una línea del TABLE CONTROL
que se informa automáticamente con los valores contenidos en el registro de la tabla
interna.
*&-----------------------------------------------------------------------------------------------*
*& Module INFORMAR_CLIENTES OUTPUT
*&-----------------------------------------------------------------------------------------------*
* Carga los registro de clientes de la tabla ZCLIENXX en la tabla
* interna de clientes.
*---------------------------------------------------------------------------------------------------*
MODULE INFORMAR_CLIENTES OUTPUT.
DATA: L_LINEAS TYPE I. " Contador de registros de clientes
Pág. 192
Curso programación ABAP IV
ENDIF.
En el evento PAI se leen las líneas del TABLE CONTROL con las instrucciones
LOOP y ENDLOOP de la siguiente forma:
LOOP AT <tabla_interna>.
…
MODULE <modulo>.
…
ENDLOOP.
En cada vuelta del bucle LOOP se informa el contenido de una línea del TABLE
CONTROL en la cabecera de la tabla interna.
Ej.: Se crean las sentencias LOOP y ENDLOOP en el evento PAI antes de ejecutar
el módulo ‘USER_COMMAND_9100’, aunque no se realiza ningún tratamiento con
los datos del TABLE CONTROL.
Pág. 193
Curso programación ABAP IV
Cada vuelta del bucle LOOP se corresponde con una línea del TABLE CONTROL,
debiendo asignar el contenido a sus campos en un módulo. Los campos de un
TABLE CONTROL se referencian igual que los de una tabla interna (control-campo).
Se puede finalizar la introducción de líneas en el TABLE CONTROL con la sentencia
EXIT FROM STEP-LOOP, que provoca la salida del bucle LOOP.
En el evento PAI se leen las líneas del TABLE CONTROL con las instrucciones
LOOP y ENDLOOP de la siguiente forma:
En cada vuelta del bucle LOOP se puede acceder al contenido de una línea del
TABLE CONTROL en un módulo.
Pág. 194
Curso programación ABAP IV
Pantalla 1
Pantalla 2
…
Se puede modificar dinámicamente la secuencia de ejecución de las pantallas en el
programa utilizando las siguientes sentencias:
SET SCREEN.
LEAVE SCREEN.
Esta sentencia finaliza la ejecución de la pantalla y provoca la ejecución de la
pantalla especificada en el atributo ‘Dynpro siguiente’.
LEAVE TO SCREEN.
La sentencia ‘LEAVE TO SCREEN <pantalla>’ finaliza la ejecución de la pantalla y
provoca la ejecución de la pantalla especificada sin tener en cuenta el atributo
‘Dynpro siguiente’.
CALL SCREEN.
La sentencia ‘CALL SCREEN <pantalla>’ ejecuta la pantalla especificada. Al finalizar
la ejecución de la pantalla especificada (con la sentencia ‘LEAVE TO SCREEN 0’ o
Pág. 195
Curso programación ABAP IV
LEAVE PROGRAM.
Esta sentencia finaliza inmediatamente la ejecución del programa.
Pág. 196
Curso programación ABAP IV
Pág. 197
Curso programación ABAP IV
Ej.: Se mostrará un listado con las facturas del cliente que tenga marcada la casilla
de selección del TABLE CONTROL de la pantalla de visualización de clientes al
pulsar ENTER.
************************************************************************
* Definición de tablas
************************************************************************
TABLES: ZCLIENXX, " Maestro de clientes
T001, " Sociedades
ZFACTUXX. " Facturas de clientes
************************************************************************
* Definición de variables
************************************************************************
DATA: D_OKCODE LIKE SY-UCOMM, " Código de función de pantalla
D_PARTICULAR(1) TYPE C, " Flag de cliente particular
D_EMPRESA(1) TYPE C, " Flag de empresa
D_AUTOMATICO(1) TYPE C, " Flag de numeración automática
D_CLIENTE_CORRECTO(1) TYPE C, " Flag de cliente correcto
D_BUKRS_SEL LIKE ZCLIENXX-BUKRS, " Sociedad de cliente selec.
D_NCLIE_SEL LIKE ZCLIENXX-NCLIE. " Cliente seleccionado
Lógica de proceso:
* Se accede a los datos del TABLE CONTROL
LOOP AT I_CLIENTES.
Pág. 198
Curso programación ABAP IV
FIELD I_CLIENTES-MARCA
MODULE CLIENTE_SELECCIONADO ON INPUT.
ENDLOOP.
Include MZBXXI01:
*&-----------------------------------------------------------------------------------------------*
*& Module CLIENTE_SELECCIONADO INPUT
*&-----------------------------------------------------------------------------------------------*
* Informa la sociedad y el número del cliente seleccionado en el TABLE
* CONTROL de clientes en las variables correspondientes.
*---------------------------------------------------------------------------------------------------*
MODULE CLIENTE_SELECCIONADO INPUT.
D_BUKRS_SEL = I_CLIENTES-BUKRS.
D_NCLIE_SEL = I_CLIENTES-NCLIE.
WHEN OTHERS.
PERFORM LISTADO_FACTURAS.
ENDCASE.
*&-----------------------------------------------------------------------------------------------*
*& Form LISTADO_FACTURAS
*&-----------------------------------------------------------------------------------------------*
* Visualiza un listado con las facturas del cliente seleccionado.
*---------------------------------------------------------------------------------------------------*
FORM LISTADO_FACTURAS.
Pág. 199
Curso programación ABAP IV
ZFACTUXX-MONEDA.
ENDSELECT.
* Se comprueba si se ha escrito alguna factura
IF SY-SUBRC <> 0.
* Error: No existen facturas para el cliente seleccionado
MESSAGE S000(38) WITH TEXT-010.
ENDIF.
* Se inicializan los datos del cliente seleccionado
CLEAR: D_BUKRS_SEL,
D_NCLIE_SEL.
Se crea el elemento de texto TEXT-010 con el texto ‘No existen facturas para el
cliente seleccionado’.
PROGRAM SAPMZBXX.
INCLUDE MZBXXTOP.
INCLUDE MZBXXO01.
INCLUDE MZBXXI01.
INCLUDE MZBXXF01.
INCLUDE MZBXXF02.
*---------------------------------------------------------------------------------------------------*
* INCLUDE MZBXXF02 *
*---------------------------------------------------------------------------------------------------*
TOP-OF-PAGE.
* Se escribe el número del cliente seleccionado
WRITE: 'Cliente:',
D_NCLIE_SEL.
ULINE.
* Se escriben las cabeceras de columna
WRITE: (10) 'Factura',
(16) 'Importe' RIGHT-JUSTIFIED,
'Moneda'.
SKIP.
Pág. 200
Curso programación ABAP IV
6. Módulos de Funciones
6.1 Introducción
Los módulos de funciones son objetos que realizan operaciones que pueden ser
utilizadas en varios programas. Al crear un módulo de función con el código que realiza
una operación, se evita tener que repetirlo en todos los programas que realicen esa
Pág. 201
Curso programación ABAP IV
operación añadiendo en ellos una llamada al módulo de función. Además de evitar que
se repita el mismo código en diferentes programas, se facilita el mantenimiento del
proceso, ya que las modificaciones que se realicen en un módulo de función afectan a
todos los programas que lo utilicen.
Los módulos de función pertenecen a grupos de funciones, que los agrupan según su
funcionalidad. Los módulos de funciones de un mismo grupo de funciones comparten
las definiciones de datos globales.
Aparecerá una ventana el la que definir los atributos del grupo de funciones.
Pág. 202
Curso programación ABAP IV
Desde esta pantalla se pueden crear, modificar o visualizar todas las partes de un
módulo de función marcando las distintas opciones de objetos parciales.
Ej.: Se creará una función que recibirá como parámetro de entrada una sociedad y
devolverá como parámetro de salida el primer número de cliente desocupado en la tabla
de clientes ZCLIENXX para esa sociedad.
Pág. 203
Curso programación ABAP IV
Una vez especificado el grupo de función se deberán informar los datos de gestión del
módulo de función.
Clasificación:
Aplicación: Módulo al que pertenece el programa ( FI , HHRR … ).
Ej.: ‘*’ Multiaplicación.
Texto breve: Descripción de la funcionalidad del módulo de función.
Ej.: ‘Determinación de número de cliente’.
Forma ejec.:
Normal: Módulo de función normal.
Apoyo Remote Function Call: Funciones de jecución remota. Estas funciones
pueden ser ejecutadas desde otros sistemas externos a SAP.
Actualizable: Funciones de actualización asíncrona. Se puede especificar el
modo de tratamiento de la tarea de actualización (Inicio inmediato, inicio
inmediato sin actualización posterior, inico retardado o lanzamiento colectivo.
Ej.: ‘Normal’.
Pág. 204
Curso programación ABAP IV
Pág. 205
Curso programación ABAP IV
6.5 Tablas
Además de los parámetros de entrada y salida definidos anteriormente, también se
pueden traspasar tablas por referencia en la llamada al módulo de función.
6.6 Excepciones
Las excepciones son una serie de errores predefinidos en los módulos de función que
pueden devolver como valor de retorno de su ejecución en la variable del sistema SY-
SUBRC.
Pág. 206
Curso programación ABAP IV
Por defecto siempre existe la excepción ‘OTHERS’, aunque aparezca definida, que se
utiliza para devolver un error genérico y devuelve en la variable SY-SUBRC el valor
siguiente al de la última excepción creada.
Para devolver una excepción desde el código del modulo de función se utiliza la
sentencia RAISE <excepción>, finalizando así la ejecución de la función y devolviendo
el código asociado a la excepción en la variable SY-SUBRC. En caso de devolver una
excepción no se actualiza el valor de salida de los parámetros CHANGING.
Nota: Las definiciones globales y el texto fuente del módulo de función se codifican
realmente en el editor ABAP/4 utilizando los mismos comandos que en la codificación
de listados.
Include LZCLITOP:
FUNCTION-POOL ZCLI. "MESSAGE-ID ..
************************************************************************
* Definición de tablas
************************************************************************
TABLES: T001, " Sociedades
ZCLIENXX. " Clientes
Pág. 207
Curso programación ABAP IV
Los parámetros definidos en el módulo de función son locales, por lo tanto solo son
visibles en el cuerpo principal de la función. Para que puedan ser utilizados en las
subrutinas, sin necesidad de pasarlos como parámetros, se deberán globalizar
utilizando la opción de menú ‘TrataràInterfaseàGlobalizar parám.’ en la pantalla de
mantenimiento de parámetros de entrada/salida. Para eliminar la globalización se utiliza
la opción de menú ‘TrataràInterfaseàLocalizar parám.’.
Al crear una subrutina, haciendo doble click sobre el nombre en la llamada, el sistema
propondrá la creación de un Include que contendrá todas las subrutinas del grupo de
funciones.
Al finalizar la introducción del texto fuente se deberá grabar, verificar y activar el módulo
de función.
Include LZCLIU01:
FUNCTION Z_OBTENER_NUMERO_CLIENTE.
*"----------------------------------------------------------------------
*"*'Interfase local
*" IMPORTING
*" VALUE(BUKRS) LIKE ZCLIENXX-BUKRS
*" EXPORTING
*" VALUE(NCLIE) LIKE ZCLIENXX-NCLIE
*" EXCEPTIONS
*" SOCIEDAD_INEXISTENTE
*"----------------------------------------------------------------------
* Se chequea la sociedad
PERFORM CHEQUEAR_SOCIEDAD USING BUKRS.
ENDFUNCTION.
Include LZCLIF01:
*-------------------------------------------------------------------
Pág. 208
Curso programación ABAP IV
***INCLUDE LZCLIF01 .
*-------------------------------------------------------------------
*&---------------------------------------------------------------------*
*& Form CHEQUEAR_SOCIEDAD
*&---------------------------------------------------------------------*
* Chequea que la sociedad recibida como parámetro existe en la tabla
* de sociedades.
*----------------------------------------------------------------------*
* --> PE_BUKRS Sociedad
*----------------------------------------------------------------------*
FORM CHEQUEAR_SOCIEDAD USING VALUE(PE_BUKRS) LIKE ZCLIENXX-
BUKRS.
Pág. 209
Curso programación ABAP IV
ENDIF.
* Completamos con ceros por la Izq.
UNPACK PS_NCLIE.
6.9 Ejecución
Para ejecutar un módulo de función desde la biblioteca de funciones se utiliza la opción
de menú ‘UtilidadesàEntorno test’ (F8) de la biblioteca de funciones o pulsando el botón
en la pantalla inicial.
Nota: Los campos que se utilizan en la llamada a un módulo de función deben ser del
mismo tipo que los parámetros a los que hacen referencia (definidos en el módulo de
función), sino se pueden producir errores en la ejecución del programa.
7.1 Introducción
Para intercambiar datos entre diferentes programas se puede utilizar la memoria SAP y
la memoria ABAP/4.
o Memoria SAP.
Es un área de memoria específica para cada usuario que se utiliza para
almacenar valores que son retenidos durante toda la sesión del usuario.
o Memoria ABAP/4.
Los valores almacenados en la memoria ABAP/4 solamente son retenidos
durante la ejecución de un programa. Esta memoria es utilizada para la
transferencia de datos entre dos programa cuando uno de ellos realiza una
llamada al otro.
En los campos de las pantallas existen tres atributos relacionados con los parámetros
de memoria:
Pág. 210
Curso programación ABAP IV
Desde un programa se pueden almacenar y recuperar datos de la memoria SAP con las
siguientes sentencias:
o SET PARAMETER.
La sentencia SET PARAMETER ID <identificador> FIELD <campo> almacena el
valor del campo en la memoria SAP asociado al identificador especificado.
o GET PARAMETER.
La sentencia GET PARAMETER ID <identificador> FIELD <campo> almacena el
valor asociado al identificador en la memoria SAP en el campo especificado.
Los parámetros de memoria se inicializan al comenzar una sesión con los valores
almacenados en los parámetros de usuario, que se mantienen desde la opción de menú
‘SistemaàValores prefijadosàDatos propios’ (SU3).
Pág. 211
Curso programación ABAP IV
Pág. 212
Curso programación ABAP IV
8. Interfaces
8.1 Introducción.
Podemos definir el concepto de interfase como el nexo de unión entre dos sistemas
diferentes. Por tanto queda claro que este concepto no es exclusivo de los sistemas de
información sino que abarca un espectro más grande.
Pág. 213
Curso programación ABAP IV
o En cuanto a su naturaleza :
Basadas en ficheros.
FTP, Internet,…
Fich.. Fich…
Pág. 214
Curso programación ABAP IV
.. FOR APPENDING.
Abre un fichero para escritura si el fichero no existe se crea. Si ya
existe, se comenzará a escribir al final del fichero.
..IN BINARY MODE.
Abre el fichero en modo binario , es decir, la información se
tratará por bloques. De tal modo que en cada lectura se leerán
/escribirán n caracteres.
Pág. 215
Curso programación ABAP IV
Se lee del fichero tantos bytes como tamaño tenga el campo ‘wa’.
TRANSFER wa TO nfich.
Pág. 216
Curso programación ABAP IV
************************************************************************
* PROGRAMA: ZINTERXX *
* DESCRIPCION: Vuelca los registros seleccionado de la tabla *
* maestro de clientes ZCLIENXX a un fichero de texto. *
* AUTOR : MAD00 FECHA: 28/08/2001 *
*----------------------------------------------------------------------*
* CONTROL DE MODIFICACIONES *
* FECHA. AUTOR. DESCRIPCION MODIFICACION. *
************************************************************************
REPORT ZINTERXX.
************************************************************************
* Tablas del diccionario de datos *
************************************************************************
TABLES: ZCLIENXX. " Maestro de clientes.
************************************************************************
* Tablas internas *
************************************************************************
* Tabla interna de selección de clientes
DATA: BEGIN OF I_ZCLIENXX OCCURS 0,
BUKRS LIKE ZCLIENXX-BUKRS, "Sociedad
NCLIE LIKE ZCLIENXX-NCLIE, "Número de cliente
NOMBR LIKE ZCLIENXX-NOMBR, "Nombre cliente
APEL1 LIKE ZCLIENXX-APEL1, "Primer apellido
APEL2 LIKE ZCLIENXX-APEL2, "Segundo apellido
FNACI LIKE ZCLIENXX-FNACI, "Fecha de nacimiento
END OF I_ZCLIENXX.
************************************************************************
* Definición de variables globales *
************************************************************************
DATA :D_MERROR(100) TYPE C. " Mensaje de error
************************************************************************
* Pantalla de selección *
************************************************************************
* Parámetros
SELECTION-SCREEN BEGIN OF BLOCK BLOQ1 WITH FRAME TITLE TEXT-001.
PARAMETERS P_BUKRS LIKE ZCLIENXX-BUKRS OBLIGATORY
DEFAULT '0001'. " Sociedad
SELECT-OPTIONS:
S_NCLIE FOR ZCLIENXX-NCLIE. " Nº de cliente
SELECTION-SCREEN END OF BLOCK BLOQ1.
* Parámetro nombre de fichero destino.
SELECTION-SCREEN BEGIN OF BLOCK BLOQ2 WITH FRAME TITLE TEXT-002.
* Nombre del fichero (activamos minúsculas permitidas).
PARAMETERS P_NFICH(50) TYPE C OBLIGATORY DEFAULT
‘/usr/sap/tmp/zclienxx.dat’ LOWER CASE
.
Pág. 217
Curso programación ABAP IV
************************************************************************
* Comienzo de selección *
************************************************************************
START-OF-SELECTION.
* Seleccionamos los datos de los clientes que cumplen criterios
SELECT *
FROM ZCLIENXX INTO CORRESPONDING FIELDS OF TABLE I_ZCLIENXX
WHERE BUKRS = P_BUKRS
AND NCLIE IN S_NCLIE.
* Comprobamos si hay datos seleccionados en cuyo caso ,
* crearemos el fichero
IF ( SY-SUBRC = 0 ).
* Abrimos el fichero para escritura en modo texto
OPEN DATASET P_NFICH FOR OUTPUT IN TEXT MODE MESSAGE D_MERROR.
* Comprobamos si no hubo error
IF ( SY-SUBRC = 0 ).
* Para cada uno de los registros seleccionados
LOOP AT I_ZCLIENXX.
* Escribimos en el fichero
TRANSFER I_ZCLIENXX TO P_NFICH.
ENDLOOP.
* Cerramos el fichero
CLOSE DATASET P_NFICH.
* Mostramos mensaje 'Fichero creado con éxito'.
MESSAGE I000(38) WITH TEXT-003.
* Si hay error , mostramos el mensaje, con un mensaje de error
ELSE.
MESSAGE E000(38) WITH D_MERROR.
ENDIF.
* Si no hay datos seleccionados.
ELSE.
* Mostramos mensaje 'No se seleccionaron datos'.
MESSAGE E000(38) WITH TEXT-004.
ENDIF.
************************************************************************
* PROGRAMA: ZINTE1XX *
* DESCRIPCION: Muestra un listado con el contenido de un fichero *
* AUTOR : MAD00 FECHA: 28/08/2001 *
*----------------------------------------------------------------------*
Pág. 218
Curso programación ABAP IV
* CONTROL DE MODIFICACIONES *
* FECHA. AUTOR. DESCRIPCION MODIFICACION. *
************************************************************************
REPORT ZINTE1XX NO STANDARD PAGE HEADING.
************************************************************************
* Definición de variables globales *
************************************************************************
DATA :D_MERROR(100) TYPE C, " Mensaje de error
D_LINEA(255) TYPE C. " Línea de fichero.
************************************************************************
* Pantalla de selección *
************************************************************************
************************************************************************
* Comienzo de selección *
************************************************************************
START-OF-SELECTION.
* Abrimos el fichero para lectura en modo texto.
OPEN DATASET P_NFICH FOR INPUT IN TEXT MODE MESSAGE
D_MERROR.
* Comprobamos si no hubo error
IF ( SY-SUBRC = 0 ).
* Leemos el primer registro del fichero
READ DATASET P_NFICH INTO D_LINEA.
* Mientras no haya error de lectura
WHILE ( SY-SUBRC = 0 ).
* Escribimos la línea leída
WRITE / D_LINEA.
* Leemos el siguiente registro
READ DATASET P_NFICH INTO D_LINEA.
ENDWHILE.
* Una vez procesado el fichero, borramos el fichero si está
* marcado el flag de borrado
CHECK NOT ( P_DELETE IS INITIAL ).
DELETE DATASET P_NFICH.
* Comprobamos si se pudo borrar
IF ( SY-SUBRC = 0 ).
Pág. 219
Curso programación ABAP IV
Pág. 220
Curso programación ABAP IV
Nota: Esta es una herramienta bastante limitada ya que únicamente nos dejará
visualizar el contenido de esta ruta (/usr/sap) , normalmente dispondremos de
otras herramientas para poder visualizar y tratar ficheros en el servidor de
aplicación.
En capítulos anteriores , hemos visto como se introducen datos, que actualizan las
bases de datos, a través de pantallas o dynpros que se llaman dentro de una
transacción . Introducimos los datos , navegando por cada una de las pantallas
completando los datos en los campos y pulsando las opciones oportunas (pantalla
siguiente , grabar …). En todo este proceso , es necesario la intervención de un
usuario.
El sistema Batch Input o BDC (Batch Data Communication) para introducir datos en la
base de datos de SAP tiene las siguientes características:
Pág. 221
Curso programación ABAP IV
Pág. 222
Curso programación ABAP IV
BDC_OKCODE Comando
Programa2 2ccc X
Campo 1c Valor campo 1c
Campo 2c Valor campo 2c
BDC_OKCODE Comando
….
Programa n Njjj X
Campo 1c Valor campo 1c
Campo 2c Valor campo 2c
BDC_OKCODE Comando
BDC_OPEN_GROUP.
Nos permite abrir la sesión para la creación del juego de datos y que éste se almacene
en la cola de juegos de datos pendientes.
Permite incluir los registros al juego de datos a través de una tabla interna.
CLOSE_GROUP.
Cierra el Juego de datos.
Una vez creado el fichero BDC o ‘Juego de datos’, este quedará almacenado para su
posterior tratamiento: Ejecución , borrado … .
Para saber el nombre del programa ,dynpro , nombre de los campos …. con los que
debemos completar la tabla DBC tenemos dos posibilidades:
Pág. 223
Curso programación ABAP IV
Pág. 224
Curso programación ABAP IV
Pág. 225
Curso programación ABAP IV
Suponemos el siguiente caso. Tenemos que dar de alta a todos los clientes en nuestra
tabla maestro de clientes ZCLIENXX , para ello , disponemos:
De la transacción ‘ZBXX’(alta de clientes que creamos en capítulos anteriores).
Tenemos la información de los clientes almacenada en un fichero
‘/usr/sap/tmp/zclienxx.dat’. (Cuya estructura es la que vimos en el apartado anterior).
Vamos a crear un programa ‘ZINTE2XX’que lea los datos del fichero y elabore un juego
de datos para dar de alta clientes .
El nombre del juego de datos y el nombre del fichero , serán parámetros del programa.
************************************************************************
* PROGRAMA: ZINTE2XX *
Pág. 226
Curso programación ABAP IV
Pág. 227
Curso programación ABAP IV
* Comienzo de selección *
************************************************************************
START-OF-SELECTION.
* Abrimos el fichero para lectura en modo texto.
OPEN DATASET P_NFICH FOR INPUT IN TEXT MODE MESSAGE D_MERROR.
* Comprobamos si no hubo error
IF ( SY-SUBRC = 0 ).
* Inicializamos la tabla interna
REFRESH I_ZCLIENXX.
CLEAR I_ZCLIENXX.
* Leemos el primer registro del fichero sobre la tabla interna
READ DATASET P_NFICH INTO I_ZCLIENXX.
* Mientras no haya error de lectura
WHILE ( SY-SUBRC = 0 ).
* Añadimos el registro leído a la tabla interna
APPEND I_ZCLIENXX.
* Inicializamos la cabecera
CLEAR I_ZCLIENXX.
* Leemos el siguiente registro
READ DATASET P_NFICH INTO I_ZCLIENXX.
ENDWHILE.
* Creamos el juego de datos con el contenido de la tabla I_ZCLIENXX
PERFORM CREAR_JUEGO_DATOS.
* Mostramos mensaje de 'Juego de datos creado'.
MESSAGE I000(38) WITH TEXT-003 P_JDATOS.
* Si hay error , mostramos el mensaje, con un mensaje de error
ELSE.
MESSAGE E000(38) WITH D_MERROR.
ENDIF.
***********************************************************************
Rutinas adicionales. *
***********************************************************************
*&---------------------------------------------------------------------*
*& Form CREAR_JUEGO_DATOS
*&---------------------------------------------------------------------*
* Crea un juego de datos con el nombre indicado por el parámetro *
* P_JDATOS, para la transacción ZBXX con el contenido de la *
* tabla interna I_ZCLIENXX. *
*----------------------------------------------------------------------*
FORM CREAR_JUEGO_DATOS.
************************************************************************
*Definición de variables locales *
************************************************************************
Pág. 228
Curso programación ABAP IV
************************************************************************
Pág. 229
Curso programación ABAP IV
Pág. 230
Curso programación ABAP IV
VALUE(PE_FVAL).
* Proceso *
************************************************************************
* Incializamos la cabecera de la tabla
CLEAR I_BDCTAB.
* Informamos el flag de pantalla
I_BDCTAB-DYNBEGIN = PE_DYNBEGIN.
* En función si es o no pantalla
IF ( PE_DYNBEGIN = 'X' ).
I_BDCTAB-PROGRAM = PE_FNAM.
I_BDCTAB-DYNPRO = PE_FVAL.
* Si se trata de un campo
ELSE.
I_BDCTAB-FNAM = PE_FNAM.
I_BDCTAB-FVAL = PE_FVAL.
ENDIF.
* Insertamos el registro en la tabla interna
APPEND I_BDCTAB.
ENDFORM. " BDC_INSERT
Pág. 231
Curso programación ABAP IV
Donde podremos seleccionar los juegos de datos , por nombre y fecha de creación así
como por su Status de proceso....
Aparecerá nuestro juego de datos, en esta pantalla , podremos realizar las siguientes
funciones:
Pág. 232
Curso programación ABAP IV
Ejecutar visible: Se visualizan las pantallas por las que va pasando proceso
deteniéndose en cada una de ellas hasta que se pulse enter.
Visualizar sólo errores Únicamente se visualizará la secuencia de pantallas
cuando se encuentre un error .
Ejecutar Invisible: Tendrá el mismo efecto que la opción ‘Procesar en Fondo’
Pág. 233
Curso programación ABAP IV
determinada con la misma estructura que para el juego de datos que se ejecuta
de forma inmediata.
Pág. 234
Curso programación ABAP IV
************************************************************************
* PROGRAMA: ZINTE2XX *
* DESCRIPCION: Con los datos de los clientes leídos de un fichero *
* da la posibilidad de crear un juego de datos o cargar *
* directamente los datos con Call transaction. *
* AUTOR : MAD00 FECHA: 28/08/2001 *
*----------------------------------------------------------------------*
* CONTROL DE MODIFICACIONES *
* FECHA. AUTOR. DESCRIPCION MODIFICACION. *
************************************************************************
REPORT ZINTE2XX NO STANDARD PAGE HEADING.
************************************************************************
* Tablas del diccionario de datos *
************************************************************************
TABLES: ZCLIENXX. " Maestro de clientes.
************************************************************************
* Definición de tablas internas *
************************************************************************
* Tabla interna para almacenar los registros del fichero
DATA: BEGIN OF I_ZCLIENXX OCCURS 0,
BUKRS LIKE ZCLIENXX-BUKRS, "Sociedad
NCLIE LIKE ZCLIENXX-NCLIE, "Número de cliente
NOMBR LIKE ZCLIENXX-NOMBR, "Nombre cliente
APEL1 LIKE ZCLIENXX-APEL1, "Primer apellido
APEL2 LIKE ZCLIENXX-APEL2, "Segundo apellido
FNACI LIKE ZCLIENXX-FNACI, "Fecha de nacimiento
END OF I_ZCLIENXX.
* Tabla interna para almacenar los registros del juego de datos
DATA: BEGIN OF I_BDCTAB OCCURS 0.
INCLUDE STRUCTURE BDCDATA.
DATA: END OF I_BDCTAB.
************************************************************************
* Definición de variables globales *
************************************************************************
DATA :D_MERROR(100) TYPE C. " Mensaje de error
************************************************************************
* Pantalla de selección *
************************************************************************
Pág. 235
Curso programación ABAP IV
Pág. 236
Curso programación ABAP IV
************************************************************************
* Control de la pantalla de selección. *
************************************************************************
* Control de la salida de la pantalla de selección
AT SELECTION-SCREEN OUTPUT.
* Si esta seleccionada la opción de juego de datos
* hacemos que la entrada para el parámetro P_JDATOS sea obligatoria.
IF NOT ( P_JDFL IS INITIAL ).
* Recorremos todos los elementos de la pantalla.
LOOP AT SCREEN.
* Al parámetro P_JDATOS le hacemos obligatorio
CHECK SCREEN-NAME = 'P_JDATOS'.
SCREEN-REQUIRED = '1'.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
************************************************************************
* Rutinas adicionales. *
************************************************************************
*&---------------------------------------------------------------------*
*& Form CREAR_JUEGO_DATOS
*&---------------------------------------------------------------------*
* Crea un juego de datos con el nombre indicado por el parámetro *
* P_JDATOS, para la transacción ZBXX con el contenido de la *
Pág. 237
Curso programación ABAP IV
************************************************************************
* Proceso *
************************************************************************
Pág. 238
Curso programación ABAP IV
QUEUE_ERROR =3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID = 6
OTHERS = 7.
* Comprobamos si hubo error, mostramos mensaje de error
IF ( SY-SUBRC <> 0 ).
MESSAGE E000(38) WITH SY-SUBRC.
ENDIF.
* Una vez completado el Juego de datos , lo cerramos
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
ENDFORM. " CREAR_JUEGO_DATOS
*&---------------------------------------------------------------------*
*& Form COMPLETAR_BDCTAB
*&---------------------------------------------------------------------*
* Completa la tabla interna I_BDCTAB con los datos necesarios *
* para llamar a la transacción ZBXX existentes en la tabla interna *
* I_ZCLIENXX. *
*----------------------------------------------------------------------*
FORM COMPLETAR_BDCTAB.
************************************************************************
* Definición de variables locales *
************************************************************************
************************************************************************
* Proceso *
************************************************************************
* Inicializamos la tabla interna BDC
REFRESH I_BDCTAB.
* Completamos la tabla BDC de la forma oportuna
LOOP AT I_ZCLIENXX.
* Formateamos el campo fecha para salida (dd.mm.aaaa)
* en la pantalla no podemos indicar el formato interno (aaaammdd)
WRITE I_ZCLIENXX-FNACI TO L_FNACI.
* Completamos la pantalla inicial con los datos del cliente actual
PERFORM BDC_INSERT USING:
'X' 'SAPMZBXX' '9000',
' ' 'ZCLIENXX-BUKRS' I_ZCLIENXX-BUKRS,
' ' 'ZCLIENXX-NCLIE' I_ZCLIENXX-NCLIE,
' ' 'ZCLIENXX-NOMBR' I_ZCLIENXX-NOMBR,
' ' 'ZCLIENXX-APEL1' I_ZCLIENXX-APEL1,
' ' 'ZCLIENXX-APEL2' I_ZCLIENXX-APEL2,
Pág. 239
Curso programación ABAP IV
*&---------------------------------------------------------------------*
*& Form BDC_INSERT
*&---------------------------------------------------------------------*
* Inserta en la tabla interna global I_BDCTAB los campos recibido *
* Distinguiendo si se trata de un registro de dynpro o de un registro *
* de campo. *
*----------------------------------------------------------------------*
* -->PE_DYNBEGIN Flag de pantalla/ campo *
* -->PE_FNAM Nombre de programa / campo *
* -->PE_FVAL Valor pantalla / campo *
*----------------------------------------------------------------------*
FORM BDC_INSERT USING VALUE(PE_DYNBEGIN)
VALUE(PE_FNAM)
VALUE(PE_FVAL).
************************************************************************
* Proceso *
************************************************************************
* Incializamos la cabecera de la tabla
CLEAR I_BDCTAB.
* Informamos el flag de pantalla
I_BDCTAB-DYNBEGIN = PE_DYNBEGIN.
* En función si es o no pantalla
IF ( PE_DYNBEGIN = 'X' ).
I_BDCTAB-PROGRAM = PE_FNAM.
I_BDCTAB-DYNPRO = PE_FVAL.
* Si se trata de un campo
ELSE.
I_BDCTAB-FNAM = PE_FNAM.
I_BDCTAB-FVAL = PE_FVAL.
ENDIF.
* Insertamos el registro en la tabla interna
Pág. 240
Curso programación ABAP IV
APPEND I_BDCTAB.
ENDFORM. " BDC_INSERT
Del mismo modo que la carga de datos en el sistema a través de Batch input o
Call transaction utilizan la interfaz de pantallas , el sistema Direct Input utiliza una
interfaz especial propia. Esta interfaz especial consiste en un conjunto de
programas que actualizan las bases de datos sin necesidad de que los datos se
introduzcan por pantalla, estos programas toman los datos , normalmente, de un
fichero con la estructura esperada por el programa.
Existen dos funciones estándares que nos permiten importar y exportar datos a
ficheros locales:
************************************************************************
* PROGRAMA: ZINTE3XX *
* DESCRIPCION: Baja los datos de la tabla ZCLIENXX a un fichero local *
* *
* AUTOR : MAD00 FECHA: 28/08/2001 *
*----------------------------------------------------------------------*
* CONTROL DE MODIFICACIONES *
Pág. 241
Curso programación ABAP IV
************************************************************************
* Pantalla de selección *
************************************************************************
Pág. 242
Curso programación ABAP IV
* BIN_FILESIZE =''
* CODEPAGE =''
FILENAME = P_NFICH
FILETYPE = 'ASC'
* MODE =''
* WK1_N_FORMAT =''
* WK1_N_SIZE =''
* WK1_T_FORMAT =''
* WK1_T_SIZE =''
* COL_SELECT =''
* COL_SELECTMASK =''
* NO_AUTH_CHECK =''
* IMPORTING
* FILELENGTH =
TABLES
DATA_TAB = I_ZCLIENXX
* FIELDNAMES =
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE =5
NO_BATCH =6
UNKNOWN_ERROR =7
OTHERS = 8.
* Mostramos mensaje de fichero creado
MESSAGE I000(38) WITH TEXT-001.
Para realizar una carga utilizando cualquier método de los anteriores, es necesario
definir el tipo de objeto a cargar.
Pág. 243
Curso programación ABAP IV
La primera vez que se entra en la transacción y antes de definir los datos que van a ser
cargados, aparece una pantalla que indica los pasos que se deben definir.
Pág. 244
Curso programación ABAP IV
9. Formularios
9.1 Introducción
Pág. 245
Curso programación ABAP IV
Pág. 246
Curso programación ABAP IV
Pág. 247
Curso programación ABAP IV
Pág. 248
Curso programación ABAP IV
Nombre de la ventana
en la que se define el
elemento de texto.
Tipo de párrafo
Pág. 249
Curso programación ABAP IV
Pág. 250
Curso programación ABAP IV
9.3.1 Cabecera
La cabecera de un formulario consiste en atributos globales del
formulario. Estos pueden ser datos de gestión (Nombre del formulario,
Pág. 251
Curso programación ABAP IV
Datos de gestión
Info gestión:
Formulario: El nombre de un formulario no deberá tener
más de 16 posiciones y sólo deberán utilizarse letras
mayúsculas y cifras, comenzando siempre por una letra.
Significado: Descripción breve del formulario
Atributos idioma:
Se define el idioma principal y si el formulario podrá ser
traducido a otros idiomas, o solo podrá mostrarse en el idioma
original.
Pág. 252
Curso programación ABAP IV
Parametrizaciones básicas
Configurar página:
Formato de página: Indica el tamaño del papel.
Formato hoja: Indica la orientación del papel.
Líneas/pulg: Indica la cantidad de líneas de impresión por pulgada.
Carácter/pulg: Indica la cantidad de caracteres de impresión por pulgada.
Página inicial: Primera página que se va ha imprimir de nuestro formulario.
Pág. 253
Curso programación ABAP IV
9.3.2 Páginas
Representan las distintas páginas del documento. Estas suelen tener distinto
aspecto unas de otras, la primera página de un fax contiene información distinta
a la que se mostrara en las páginas siguientes. Para cada formulario se ha de
definir al menos una página. En este apartado daremos una descripción a la
página, indicaremos cual es la página siguiente y cómo se actualiza el contador
de páginas, así como los atributos de impresión como son el modo de impresión
(Por defecto, SYMPLEX, DUPLEX o TRIPLEX) y el nombre del recurso que será
la bandeja de la impresora de donde tomará el papel (TRY01, TRY02, TRY03).
9.3.3 Ventanas
Las ventanas representan áreas que se posicionarán sobre las páginas. En ellas
pondremos el párrafo por defecto, el nombre de la ventana, su significado y el
tipo de ventana.
Pág. 254
Curso programación ABAP IV
Pág. 255
Curso programación ABAP IV
Pág. 256
Curso programación ABAP IV
Datos estándar
Párrafo: Define el nombre con el cual se identificara con posterioridad las distintas
características del párrafo creado.
Significado: Breve descripción identificativa del párrafo.
Margen izquierdo y derecho: Distancia con la ventana que contenga el párrafo.
Pág. 257
Curso programación ABAP IV
Datos de Fuentes
Contiene las características de la fuente así como su formato.
Datos de tabuladores
Aquí se definen las distintas posiciones de tabulación que necesitemos para cada
párrafo.
Datos de esquema
Pág. 258
Curso programación ABAP IV
El signo fijo será el carácter que se antepondrá siempre al párrafo, si el signo es ‘_’
está se convertirá en espacio en blanco.
Atributos estándar
Formato caráct.: Nombre con un máximo de dos letras con el cual se identificara
el tipo de formato de carácter creado.
Signific.: Breve descripción que defina el formato de caracteres.
Pág. 259
Curso programación ABAP IV
Atributos font
Contiene los datos de la fuente que se usara en el formato de carácter.
Las características en los atributos Font son los mismos que para los formatos
de párrafo.
9.4 SAPScript
Pág. 260
Curso programación ABAP IV
Ejemplo:
Creamos una nueva ventana de tipo CONST de idénticas proporciones que la
ventana MAIN que dibuje una caja que rodee las dos columnas de la ventana
MAIN del ejemplo.
Pág. 261
Curso programación ABAP IV
Pág. 262
Curso programación ABAP IV
Pág. 263
Curso programación ABAP IV
Una vez finalizado el diseño del formulario es necesario crear un programa que
gestione la impresión del mismo. Para ello hay una serie de funciones Standard
de SAP que gestionan todos los parámetros de salida. De todas ellas, las más
relevantes son:
OPEN_FORM
WRITE_FORM
CLOSE_FORM
Pág. 264
Curso programación ABAP IV
Ejemplo de formulario
Formulario
--------------------------------------------------------------------------------
Formulario ZPRUEBA
--------------------------------------------------------------------------------
Atributos std.
Página inicial PRICIPAL
Párrafo defecto DF
Tabulaciones 1,00 CM
Formato página DINA4
Formato hoja Formato vertical
Líneas/pulg. 6,00
Carácter/pulg. 10,00
Pág. 265
Curso programación ABAP IV
Atributos font
Familia fonts COURIER
Altura font 12,0 Punto
Negrita no
Cursiva no
Subrayado no
--------------------------------------------------------------------------------
Carácteres Atributos
--------------------------------------------------------------------------------
DF Normal
Atributos std.
Marca no
Atributos font
Familia fonts HELVE
Altura font 10,0 Punto
NG Negrita
Atributos std.
Marca no
Atributos font
Familia fonts HELVE
Altura font 10,0 Punto
Negrita sí
--------------------------------------------------------------------------------
Párrafos Atributos
--------------------------------------------------------------------------------
AD Dirección propia
Atributos std.
Interlineado 0.50 LN
Alineación Alin.derecha
Atributos font
Familia fonts HELVE
Altura font 8,0 Punto
NG Negrita
Pág. 266
Curso programación ABAP IV
Atributos std.
Interlineado 1.00 LN
Alineación alin.izq.
Atributos font
Familia fonts HELVE
Altura font 10,0 Punto
Negrita sí
--------------------------------------------------------------------------------
Ventanas Atributos
--------------------------------------------------------------------------------
ADDRESS Dirección
Tipo ventana VAR
Párr.p.defecto DF
Pág. 267
Curso programación ABAP IV
--------------------------------------------------------------------------------
Páginas Atributos
--------------------------------------------------------------------------------
Pág. 268
Curso programación ABAP IV
--------------------------------------------------------------------------------
Elementos texto para ventanas:
--------------------------------------------------------------------------------
ADDRESS
* <ng>DIRECCIÓN POSTAL</>
/: ADDRESS
* &CALLE&
* &CIUDAD&
* &PAIS&
/: ENDADDRESS
*
CONTROL
* <ng>CONTROL</>
*
D_FISCAL
* <ng>DATOS FISCALES</>
* &C_NIF&
* &N_RESERVA&
FACTURA
NG NºFACTURA,,COD CLIENTE,,NOMBRE,, ,, ,,FECHA PEDIDO,,FECHA
FACTURA
DF &CABECERA-NUMERO_FACTURA&,,&CABECERA-
IDCLIENTE&,,&CABECERA-DESCRIPCION&
,,&cabecera-fecha_pedido&,,&Cabecera-fecha_factura&
LOGO
*
/: BITMAP IDES_LOGO OBJECT GRAPHICS ID BMAP TYPE BMON DPI 300
*
Pág. 269
Curso programación ABAP IV
MAIN
Elemento ITEM_HEADER
NG POSICION,,CONCEPTO,, ,, ,, ,, ,, ,, ,, ,, CANTIDAD,, ,,PRECIO
Elemento DATOS
DF &i_posicion-posicion&,, ,,&i_posicion-concepto(50)&,,
&i_posicion-cantidad&,, ,, &I_POSICION-PRECIO(5)&
Elemento PUBLICIDAD
/: PROTECT
NG ************************************************************************
NG &C_MENSAJE&
NG ************************************************************************
/: ENDPROTECT
Elemento TOTAL
DF
DF
DF ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, SUBTOTAL,, &SUBTOTAL&
DF ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, IVA,, ,, ,, &IVA&
NG ,, ,, ,, ,, ,, ,, ,, ,, ,, ,,TOTAL,, &TOTAL&
MARCO
/: BOX XPOS 0 CM WIDTH '16.57' CM HEIGHT '12.47' CM FRAME 10 TW.
MY_ADD
AD IDES Holding AG
AD Neurottstrasse 16
AD Waldorf, 69190
AD Germany
PAGO
* FORMA DE PAGO
Programa de control
REPORT zform .
************************************************************************
* VARIABLES
************************************************************************
DATA BEGIN OF itcpo.
INCLUDE STRUCTURE itcpo. "SAPscript Salida interfase
DATA END OF itcpo.
Pág. 270
Curso programación ABAP IV
total(10),
subtotal(10),
iva(10).
c_mensaje =
'¡Nueva línea de productos !'.
* Configuración de la impresora
PERFORM configurar_impresora.
* Abrimos el formulario
CALL FUNCTION 'OPEN_FORM'
EXPORTING
form = 'ZPRUEBA'
* LANGUAGE = P_IDIOMA
options = itcpo
device = 'PRINTER'
* DIALOG = 'X'
dialog = space " Sin diálogo
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
WRITE /'error al abrir formulario'.
STOP.
ENDIF.
Pág. 271
Curso programación ABAP IV
IF sy-subrc NE 0.
WRITE /'error al escribir en ventana DIRECCION'.
STOP.
ENDIF.
Pág. 272
Curso programación ABAP IV
i_posicion-posicion = '2'.
i_posicion-concepto = 'Boligrafo tinta azul'.
i_posicion-cantidad = 100.
i_posicion-precio = '50.00'.
APPEND i_posicion.
i_posicion-posicion = '3'.
i_posicion-concepto = 'Portaminas 0.5'.
i_posicion-cantidad = 50.
i_posicion-precio = '99.35'.
APPEND i_posicion.
i_posicion-posicion = '4'.
i_posicion-concepto = 'Caja grapas (500)'.
i_posicion-cantidad = 25.
i_posicion-precio = '12.50'.
APPEND i_posicion.
i_posicion-posicion = '5'.
i_posicion-concepto = 'Hojas transparencias'.
i_posicion-cantidad = 15.
i_posicion-precio = '90.50'.
APPEND i_posicion.
* TOTALES
total = '302.59 Euros'.
Pág. 273
Curso programación ABAP IV
ENDLOOP.
Pág. 274
Curso programación ABAP IV
9.7. Smartforms
Pág. 275
Curso programación ABAP IV
Pág. 276
Curso programación ABAP IV
Pág. 277
Curso programación ABAP IV
10.1 Introducción
Objeto
Pág. 278
Curso programación ABAP IV
Antes de crear un objeto de una clase es necesario declarar una variable referenciada
con la referencia a la clase. Una vez que se ha declarado la referencia <obj> a la clase
<class>, se puede crear el objeto usando la sentencia CREATE OBJECT <cref>. Esta
sentencia crea una instancia de la clase <class>, y la variable referenciada <cref>
contiene la referencia al objeto.
Los programas sólo pueden acceder a los componentes de las instancias usando las
referencias de las variables referenciadas. La sintaxis es la siguiente, siendo ref la
variable referenciada:
− Para acceder al atributo attr: ref->attr.
− Para llamar al método meth: CALL METHOD ref->meth.
Para los componentes estáticos (independientes de instancia, sólo dependientes de
clase) se puede usar tanto el nombre de la clase como la variable referenciada.
También es posible acceder a los componentes estáticos de una clase antes de que un
objeto de la clase haya sido creado. La sintaxis, siendo class la clase es la siguiente:
Clases
Una clase es una entidad teórica que describe el comportamiento de un objeto. Desde
un punto de vista meramente técnico, un objeto es una instancia en tiempo de ejecución
de una clase. En principio se pueden crear cualquier número de objetos basados en una
Pág. 279
Curso programación ABAP IV
única clase. Cada instancia de una clase (objeto) tiene su propia identidad y su propio
conjunto de valores para sus atributos. Dentro de un programa un objeto es identificado
por su referencia, la cual le proporciona un nombre que define inequivocamente al
objeto y permite acceder a sus métodos y atributos.
Las clases son las plantillas de los objetos. A la inversa, podemos decir que el tipo de
un objeto es el mismo que el de su clase. Una clase es la descripción abstracta de un
objeto. También podemos decir que una clase es un conjunto de instrucciones que
tienen como objetivo construir un objeto. Los atributos de los objetos están definidos por
los componentes de la clase (atributos, métodos y eventos), que son los que describen
y controlan el comportamiento de los objetos.
Las clases en ABAP Objects se pueden declarar bien globalmente o bien localmente.
Las clases globales se definen en el generador de clases (transacción SE24) en el
ABAP Workbench. Estas clases son almacenadas en class pools en la librería de clases
en el R/3 Repository. Todos los programas ABAP en un sistema R/3 pueden acceder a
las clases globales. Las clases locales se definen en un programa ABAP.
Las clases locales y sus interfaces sólo pueden ser invocadas desde el programa en el
que se han definido.
Cuando se usa una clase en un programa ABAP el sistema busca primero una clase
local con el nombre especificado. Si no encuentra ninguna entonces busca una clase
global. A parte de la cuestión de la visibilidad, no hay ninguna diferencia entre usar una
clase global o una clase local.
Una definición completa de una clase constará de una parte declarativa en la que se
definen los componentes, y si es necesario una parte de implementación en la que se
implementan estos componentes.
La parte declarativa de una clase está comprendida entre las sentencias:
Pág. 280
Curso programación ABAP IV
Métodos
Los métodos son procedimientos internos de una clase que definen el comportamiento
de un objeto. Los métodos pueden acceder a todos los atributos de una clase. Esto les
permite cambiar el contenido de los atributos de un objeto. Los métodos poseen
también una interface con parámetros que les permite recibir valores cuando son
invocados y devolver valores después de la llamada. Los atributos privados de una
clase sólo pueden ser cambiados por métodos de la misma clase.
La definición y la interface de un método son similares a las de los módulos de
funciones. Un método se define en la parte declarativa de la clase y se implementa en la
parte de implementación usando las sentencias:
METHOD <meth>.
…
ENDMETHOD.
Atributos
Los atributos son los campos de datos internos de una clase y pueden tener cualquier
tipo de datos ABAP.
El estado de un objeto viene determinado por el contenido de sus atributos. Un tipo de
atributos son las variables referenciadas. Estas variables permiten crear y acceder a los
Pág. 281
Curso programación ABAP IV
objetos, de manera que si se definen en una clase permiten acceder a otros objetos
desde dentro de la clase.
− Atributos dependientes de instancia. – El contenido de estos atributos es
específico de cada objeto. Se declaran usando la sentencia DATA.
− Atributos estáticos – El contenido de los atributos estáticos define el estado
de la clase y es válido para todas las instancias la clase. Los atributos estáticos existen
sólo una vez para la clase. Se declaran usando la sentencia CLASS-DATA. Son
accesibles desde todo el entorno de ejecución de la clase. Todos los objetos de una
clase pueden acceder a sus atributos estáticos. Si se cambia un atributo estático en un
objeto, el cambio es visible en todos los demás objetos de la clase.
METHOD INCREMENTAR_CONTADOR.
ADD 1 TO CONT.
ENDMETHOD.
METHOD OBTENER_CONTADOR.
OBTENER_VALOR = CONT.
ENDMETHOD.
ENDCLASS.
10.4 Herencia
La herencia permite crear una nueva clase a partir de una nueva existente heredando la
nueva clase sus propiedades. Esto se realiza añadiendo la adición INHERITING FROM
a la sentencia de definición de la clase:
Pág. 282
Curso programación ABAP IV
El nodo raíz de todos los árboles de herencia en ABAP Objects es la clase predefinida
vacía OBJECT. Esta es la más general de todas las clases posibles ya que no contiene
ni atributos ni métodos. Cuando se define una nueva clase no se tiene que especificar
explícitamente esta clase como superclase, esta relación está definida implícitamente.
Redefinición de métodos
Todas las subclases contienen los componentes de todas las clases existentes entre
ellas mismas y el nodo raiz del árbol de herencia. La visibilidad de un componente no
puede ser cambiada nunca. En cambio se puede usar la adición REDEFINITION en la
sentencia METHODS para redefinir un método público o
protegido dependiente de instancia en una subclase y hacer que realice una función
más especializada.
Pág. 283
Curso programación ABAP IV
La subclase c2 deriva de la superclase c1. En lo más alto del árbol de herencia está la
clase OBJECT.
Pág. 284
Curso programación ABAP IV
La herencia simple consiste en que cada clase sólo deriva directamente de una
superclase, pero puede tener varias subclases directas. La clase vacía OBJECT es el
nodo raíz de cada árbol de herencia en ABAP Objects
Este gráfico muestra cómo variables referenciadas con referencia a una superclase
pueden apuntar a objetos de sus subclases. Tenemos una instancia de la clase 3. Las
variables referenciadas a clases cref1, cref2 y cref3 tienen el tipo de las clases 1, 2 y 3
respectivamente. Las tres variables referenciadas pueden apuntar a la clase 3, pero la
variable cref1 sólo puede acceder a los componentes públicos de la clase 1, cref2
Pág. 285
Curso programación ABAP IV
puede acceder a los componentes públicos de las clases 1 y 2, y cref3 puede acceder a
los componentes públicos de todas las clases.
10.5 Polimorfismo
El polimorfismo quiere decir que métodos que se llaman exactamente igual pueden
comportarse de manera distinta en clases diferentes. La orientación a objetos tiene
unas estructuras llamadas interfaces que permiten acceder a métodos con el mismo
nombre en diferentes clases.
Dentro de cada clase particular se puede redifinir el método obteniendo distintos
métodos con el mismo nombre. Asi es que un método no se define exactamente con su
nombre, si no con su nombre y el nombre de la clase a la que pertenece.
En este ejemplo veremos cómo crear y usar una instancia de la clase c_counter
Pág. 286
Curso programación ABAP IV
El programa ABAP puede acceder a los componentes públicos de los objetos usando la
variable referenciada cref1, lo cual en este caso se corresponde a llamar a los métodos
públicos de la clase c_contador. Después que el programa haya sido ejecutado la
variable numero y el atributo privado del objeto cont tienen ambos el valor 8.
Podemos también manejar varias instancias de la misma clase.
Así creamos tres variables referenciadas a la clase c_contador. Todas ellas contienen
el valor initial.
El sistema crea tres objetos de la clase a partir de las tres variables referenciadas a la
clase. Las referencias en las tres variables apuntan a cada uno de los objetos.
Internamente las instancias se llaman c_contador <1>, c_contador <2>, y c_contador
<3>. El número se asigna en el orden en que son creadas.
Pág. 287
Curso programación ABAP IV
…
CALL METHOD cref1->incrementar_contador.
…
CALL METHOD: cref1->obtener_contador
IMPORTING obtener_valor = numero1,
cref2->obtener_contador
IMPORTING obtener_valor = numero2,
…
El programa ABAP usa las variables referenciadas para acceder a los objetos, en este
caso a los métodos publicos de la clase c_contador.
Cada objeto tiene su propia identidad y su propio estado, ya que el atributo privado
dependiende de instancia cont tiene distintos valores en cada objeto. El programa
administra varios contadores.
Ahora declaramos tres variables referenciadas para la clase c_contador y se crean dos
objetos para la clase. Las referencias en las variables referenciadas cref1 y cref2
apuntan a cada uno de los objetos.
La referencia cref3 se mantiene initial.
Después de la sentencia MOVE, cref3 contiene la misma referencia que cref2 y ambas
referencias apuntan al objeto c_contador<2>. Un usuario puede usar cualquiera de
ellas para acceder al objeto.
Pág. 288
Curso programación ABAP IV
Utilizamos las transacciones CMOD y SMOD para para gestionar las user
exits. Antes de implemetar una exit es necesario crear un proyecto a través
de la transacción CMOD.
Si queremos por tanto crear una exit, vemos cómo creamos el proyecto en la
CMOD. Lo veremos con capturas de pantallas.
Pág. 289
Curso programación ABAP IV
Para iplementar nuestra exit deberemos hacer doble clic sobre la exit. Esto
nos lleva a la transacción de visualización funciones SE37, en la que
podemos ver que hay una única línea dentro de la función, es un incluye
Pág. 290
Curso programación ABAP IV
Este incluye comienza con “Z” (espacio reservado al usuario), lo que nos
permite mantener nuestro código separado del de sap. Haemos doble click
sobre en incluye lo que nos lleva al editor de programas ABAP (SE38).
11.3 BADIS
Pág. 291
Curso programación ABAP IV
Básicamente cumplen la misma función que las USER EXITS y las FIELD EXITS
amen de algunas diferencias que se exponen a continuación.
BADI se puede utilizar todas las veces que quieras, donde las users exits
solo se pueden usar una sola vez. Ejemplo: Si se asigna una user-exit a un
proyecto usando la transacción CMOD, entonces no se puede asignar a
ningún otro proyecto. Es decir varios programadores pueden implementar la
misma BADI independientemente.
Las BADI’s son mucho más moldeables a las necesidades del programador
en cuanto a que se pueden definir los puntos de salida, junto con la lógica de
programación que necesitemos. Es decir posee todas las propiedades de una
programación orientada a objetos
C:\Documents and
Settings\rdemiguel\My Documents\Cursos Formación ABAP\INSTRUCCIONES ABAP.pdf
TABLAS DE DATOS
A continuación se detalla el nombre de las tablas SAP más utilizadas, clasificadas por
módulos
FI
AGKO Cuentas compensadas
AVIK Cabecera de aviso
AVIP Pos. de aviso
AVIR Subposición de aviso
AVIT Cabecera de aviso: texto de libre definición Maestros
BKPF Cabecera de documento para Contabil.
BSAD Cont.: índice sec. para deudores (partidas compensadas)
BSAK Cont.: índice sec. para acreedores (partidas compensadas)
BSAS Cont.: índice secundario para ctas. mayor (partidas compensadas)
BNKA Maestro de banco
BSBM Campos de valoración del documento
BSBW Campos de valoración del documento
BSEC Segm. de documento para datos CPD
BSED Segm. de documento - campos de efectos
Pág. 292
Curso programación ABAP IV
SD
TVDC Plazos de entrega: Clases
VBAG Documento ventas: Fecha para repartos en planes de entrega
VBAK Documento de ventas: Datos de cabecera
VBAP Documento de ventas: Datos de posición
VBEH Historial repartos entrega
VBEP Documento de ventas: Datos de reparto
VBKD Documento de ventas: Datos comerciales
VBLB Doc. de ventas: Datos ord.-entrega
VBSN Estados de modificación p. pl.-entregas
VBSP Documento RV posición para ejecutar estructura de artículo
VBFA Flujo de documentos de ventas
VBPA Documento Comercial: Interlocutor
VEDA Datos contractuales
VLPKM Planes entrega para mat.de cliente
LIKP Doc.comercial: Entrega - Datos de cabecera
LIPS Doc.comercial: Entrega - Datos de posición
VBUP Documento comercial: Status de posición
VBUK Documento comercial: Status cabecera y datos gestión
VBRK Doc.comercial: Factura: Datos de cabecera
VBRP Doc. Comercial: Factura: Datos de posición
VTTK Cab. Transporte
VTTP Posición de transporte
VTTS Etapa de transporte
CO
COSP Objeto CO: Totales de costes – contabilizaciones externas
COBK Objeto CO: Cabecera de documento
COEP Objeto CO: Partida individual por períodos
CSKS Maestro de centros de costo
CSKB Clases de Costos
CKHS Cabecera – cálculo de costes unitario (control + sumas)
CKIS Posiciones del CCU/Vis. Detallada costes del producto
COKP Objeto CO: Cabecera del documento
COEJ Objeto CO: partida ind. por año
CSKA Clases de coste (datos dependientes del plan ctas)
CSKB Clases de coste (datos dependientes de la sociedad CO)
CA
AUSP Valores prop. de las características
CABS Resultado evaluación estad. de AUSP
KLAH Datos cabecera clase
KLAT Clases: Textos explicativos
KSML Características de clases
Pág. 293
Curso programación ABAP IV
MM
EKKO Cabecera de documento de compras
EKPO Posiciones de documento de compras
EBNA Solicitud de pedido
MKPF Cabecera de documentos de materiales
MSEG Posiciones de documento de materiales
MARA Maestro materiales general
MARC Materiales por centro
MARD Almacén por centro
ABEW Valoraciones de los materiales
EKKN Imputación en documentos de compra
MARM Unidad de medida
EINA Registro info de compras: Datos generales
RBKP Cabecera documento factura recibida
PP
AFFL Secuencia orden de trabajo
AFKO Datos cabecera orden para órdenes PCP
AFPO Posición de orden
AFVC Operación de orden
FAPW Índice de centro de producción / suministro para orden fabricación
CRCA Asignación de capacidad al puesto de trabajo
CRCO Asignación de puesto de trabajo a centro de coste
CRHD Cabecera del puesto de trabajo
CRHH Datos cabecera jerarquía
CRHS Jerarquía Estructura
CRID Recursos de producción – Entidades
CRTX Puesto de trabajo / Denominación breve del medio auxiliar fabric.
KAKT Denominación de la capacidad
KAKO Capacidad segmento de cabecera
MAPL Asignación de hojas de ruta para materiales
PLAS Hoja de ruta - Selección de posiciones
PLFH Hoja de ruta - Medios auxiliares de fabricación
PLFL Secuencias hoja de ruta
PLKO Hoja de ruta – Cabecera
PLKZ HRuta: cab.central
PLMZ Asignación de posiciones de lista materiales a operaciones
PLPO Hoja de ruta – operación
KAPA Capacidad - Valores del turno
KAPE Capacidad asignación unidad de base
KAZY Capacidad - Intervalo de oferta
PS
Pág. 294
Curso programación ABAP IV
Pág. 295
Curso programación ABAP IV
Imaginemos que queremos conocer los datos técnicos del campo Acreedor. Nos
posicionaríamos con el ratón en el campo y pulsaríamos la tecla de función F1.
Pág. 296
Curso programación ABAP IV
Pág. 297
Curso programación ABAP IV
Datos dynpro
Datos referentes a la pantalla.
- Programa: El nombre del programa estándar que invoca a la pantalla
- Nº imagen: El número de pantalla.
Datos GUI
Datos referentes a la interfaz gráfica
- Programa: El nombre del programa estándar que invoca a la pantalla
- Status: Estado.
Datos Campo
Datos referentes al campo que hemos seleccionado
- Estruct: La estructura que contiene el campo. Existen casos en los que aparece
directamente la tabla a la que pertenece, en lugar de la estructura.
- Nombre del campo: Nombre técnico del campo
- Elemento de datos: Tipo de elemento de datos del campo en cuestión
- ID parámetro: ID al que está vinculado ese campo.
La transacción ST05 nos permite generar una traza del sistema. Es decir, visualiza
todas las acciones que se dan lugar en el sistema, desde un momento determinado
(cuando activamos la traza) hasta otro (cuando la desactivamos).
Directamente ST05
Por menú: Sistema Utilidades Traza de rendimiento
Pág. 298
Curso programación ABAP IV
Una vez realizadas las acciones que queremos analizar, pulsaremos el botón
“DEACTIVATE TRACE”.
Para visualizar la traza, deberemos pulsar el botón “DISPLAY TRACE”, y aparecerá una
pantalla como la que se muestra a continuación:
Pág. 299
Curso programación ABAP IV
En ella podemos ver todos los accesos que se han llevado a cabo en el sistema
mientras hemos creado a un proveedor, a través de la transacción XK01.
Las transacciones SE10 y STMS se utilizan por ejemplo, cuando se quiere ejecutar el
programa que hayamos creado en un mandante distinto al mandante en el que lo
estamos desarrollando.
Pág. 300
Curso programación ABAP IV
A la hora de liberar las órdenes es importante que seleccionemos el tipo de orden que
vamos a liberar, si es de workbench o de customzing, y si está o no liberada. Es decir, si
vamos a liberarla, debemos seleccionar la opción “Modificable” y deseleccionar la
opción “Liberadas”, y aparecerán todas las órdenes que no estén liberadas. A
continuación pulsamos el botón “Visual.”
Pág. 301
Curso programación ABAP IV
Pág. 302
Curso programación ABAP IV
Listado de sistemas:
Pág. 303
Curso programación ABAP IV
La transacción ST22 permite visualizar los errores en tiempo de ejecución que se hayan
producido desde un momento determinado a otro.
Pág. 304
Curso programación ABAP IV
Los errores de ejecución que se han producido hoy o ayer. Si pulsamos sobre
cualquiera de los dos botones obtenemos un listado con los errores en tiempo de
ejecución de hoy y ayer respectivamente. A la derecha de los botones se
muestra un número que representa el número de errores.
Pág. 305
Curso programación ABAP IV
La transacción SP01 nos permite hacer una selección de las órdes de SPOOL. Para
verlo, seleccionaremos la orden que queremos visualizar y pulsaremos el botón
Pág. 306
Curso programación ABAP IV
Pág. 307
Curso programación ABAP IV
En el campo que está etiquetado con “Job”, deberemos especificar el job que vamos a
ejecutar, es decir, el que vamos a programar.
En el cuadro “Condición de inicio del job”, informamos del momento en el que queremos
que se ejecute nuestro job. Podemos proporcinar un rango de fechas y de horas. Si
queremos que el job se ejecute sólo tras la ejecución de un evento, entonces
deberemos seleccionar el evento en la opción “O tras evento”.
Podemos hacer una programación del job más ampliada. Para ello deberemos pulsar el
botón “Selección de job ampliada”, con lo que se mostrará la siguiente pantalla.
Pág. 308
Curso programación ABAP IV
Aquí aparecen más opciones para definir la programación del job. No sólo podremos
seleccionar si el job se quiere ejecutar tras un evento determinado, sino que también se
presenta la opción de ejecutarlo tras la ejecuión de otro job o en forma de opración.
Pág. 309
Curso programación ABAP IV
De esta manera podemos determinar el período con el que queremos que se ejecute
nuestro job.
14.7 SXDA
Pág. 310
Curso programación ABAP IV
Se deben especificar los programas que deben compararse, y no aparece opción para
indicar el sistema.
Pág. 311
Curso programación ABAP IV
Pág. 312
Curso programación ABAP IV
La transacción SE80 nos lleva a object navigator, que constituye un navegador de SAP.
Nos permite ver y editar los objetos de SAP, packages, tablas, órdenes de transporte,
programas, etc…
Pág. 313
Curso programación ABAP IV
Pág. 314
Curso programación ABAP IV
Este menú crea un enlace a cada uno de los programas que han de ejecutarse para
realizar las cargas y descargas que se llevan a cabo en una reestructuración societaria
Para añadir un nodo a la misma altura del nodo raíz deberemos pulsar el botón ,
como se muestra a continuación:
Pág. 315
Curso programación ABAP IV
Y obtendremos lo siguiente:
La transacción SQ01 nos sirve para definir las queries. A una query siempre se le
asigna un grupo de usuarios que la va a utilizar, y un info set, en el que se determinan
las tablas y la selección de campos de la query.
Pág. 316
Curso programación ABAP IV
La transacción SQ03 permite crear los grupos de usuarios que van a tener acceso a esa
query.
Pág. 317
Curso programación ABAP IV
14.12 Workflow
Se trata de una herramienta que se utiliza para facilitar, automatizar y encadenar las
tareas preestablecidas en los procedimientos de trabajo de cada usuario, es decir,
automatiza los procesos de negocio de una empresa.
Pág. 318
Curso programación ABAP IV
Pág. 319
Curso programación ABAP IV
Pág. 320
Curso programación ABAP IV
Pág. 321