Paso 5: Entorno de Programación

ENTORNO DE
PROGRAMACIÓN
¿Cómo se crea un programa ABAP?
Para crear un programa ABAP, lo podemos hacer a través de 2 transacciones:
• SE38: Editor ABAP.
• SE80: Object Navigator.
Como mencionamos en el tema anterior, podemos teclear el código de una transacción a
través de la barra de pulsadores del sistema (2da línea de arriba hacia abajo).
Teclear el código, pulsar ENTER o el botón check verde, nos llevará a dicha transacción.
SE38
Al ingresar a la transacción SE38, nos lleva a la siguiente ventana:
Entorno de Programación – RichardRey.com - 2
Para efectos de este curso rápido, solo nos interesan los siguientes campos:
En el cuadro programa indicaremos el nombre del programa a crear, nos interesa que
entre la lista de objetos parciales, este marcada la opción “Código Fuente”.
Como verás, a través de esta transacción podremos crear un programa, modificarlo o
simplemente visualizarlo en un modo de no edición.
También dispondremos, entre otras, de las siguientes funciones en la barra de pulsadores:
- Verificar la sintaxis del programa. (Ver si contiene errores sintácticos).
- Activar un programa. (Lo hará si no contiene errores).
- Procesar/ejecutar un programa. (También se puede hacer pulsando la tecla F8).
- Borrar un programa. (Te pedirá que confirmes que quieres eliminarlo).
- Copiar un programa. (Te pedirá el nombre del nuevo programa).
- Renombrar un programa. (Te pedirá que le indiques el nuevo nombre al programa).
El nombre de nuestro programa debe empezar obligatoriamente por la letra Z o la letra Y,
ya que son nombres reservados por SAP para la creación de programas propios; cualquier
otro programa que comience por una letra diferente será interpretado como un programa
estándar del sistema y no solicitará una clave de acceso especial para su modificación,
esto como medida de seguridad para evitar alteraciones no planificadas al sistema
estándar.
Si escribimos un nombre válido y pulsamos el botón “Crear”, nos saldrá la siguiente
ventana:
Entorno de Programación – RichardRey.com - 3
En la que debemos indicar el título que llevará nuestro programa, y el tipo de programa
que estamos creando (por ahora vamos a quedarnos con la primera opción, programa
ejecutable), la seleccionamos y pulsamos el botón “grabar”.
La siguiente ventana que nos saldrá es la siguiente:
Entorno de Programación – RichardRey.com - 4
Esta ventana nos muestra algunas cosas interesantes; en primera instancia, la línea
superior nos indica el nombre completo del objeto que estamos creando en el sistema
(Estoy creando un programa llamado ZPRUEBA):
Luego, en la caja de atributos, debemos indicar en qué paquete de desarrollo vamos a
incluir nuestro nuevo programa, estos paquetes no son más que una manera de mantener
organizados todos los desarrollos y parametrizaciones que se van creando a lo largo de un
proyecto, para nuestros efectos, pulsamos el botón “Objeto local”, el cual creará el
programa como un objeto interno del sistema (mandante) al que estamos conectados.
Una vez hecho esto, ingresamos a la siguiente pantalla:
Entorno de Programación – RichardRey.com - 5
Este es el editor ABAP en el cual podrás escribir el código de tus programas.
Entorno de Programación – RichardRey.com - 6
SE80
Al ingresar a la transacción SE80, nos lleva a la siguiente ventana:
Desde esta transacción, tendremos el control de todos los objetos del Repositorio de
Objetos del sistema.
Por ahora, nos interesa que de las pestañas superiores, este seleccionada “Browser de
Repository”.
Entorno de Programación – RichardRey.com - 7
¿Qué es un programa ABAP?
Un programa ABAP consiste en una serie de instrucciones (líneas de programa), que empiezan por
una palabra clave y terminan en un punto.
El punto señala de manera inequívoca el fin de una instrucción.
Los tipos de palabras claves que se utilizan para darle inicio a una instrucción pueden ser:
•
•
•
•
Declarativas.
Eventos.
Control.
Operativas.
Las declarativas nos permiten, como su nombre lo indica, declarar las variables que vamos a
utilizar a lo largo del programa. Ejemplo de instrucciones declarativas: DATA , TYPES y TABLES.
Los eventos son la base de la programación ABAP, ya que se trata de un lenguaje orientado a
eventos como vimos en el primer capítulo; es el punto donde en ABAP se ejecuta un cierto
proceso. Ejemplos: START-OF-SELECTION, TOP-OF-PAGE, AT-SELECTION-SCREEN.
Las sentencias de control nos permite inducir el flujo del programa que estamos creando, ejemplo
de estos son las sentencias condicionales como IF, WHILE, CASE.
Las sentencias operativas realizan funciones propias según el tipo de palabra clave, por ejemplo:
WRITE, MOVE, SORT.
Podemos combinar sentencias consecutivas en una misma instrucción cerrando las líneas con
coma en vez de punto. Veamos un ejemplo:
WRITE <campo1>.
WRITE <campo2>.
WRITE <campo3>.
Lo podemos escribir en una única instrucción de la siguiente manera:
WRITE: <campo1>,
<campo2>,
<campo3>.
Entorno de Programación – RichardRey.com - 8
El punto nos indicará el final de la sentencia; ésta también puede ser escrita en una única línea:
WRITE: <campo1>, <campo2>, <campo3>.
Nótese los dos puntos que siguen a la instrucción WRITE, éstos le indican a ABAP que la
instrucción actuará sobre más de una variable.
Esto puede aplicar a otros tipos de instrucciones, veamos un ejemplo con sentencias declarativas:
DATA <campo1>.
DATA <campo2>.
DATA <campo3>
Puede rescribirse de la siguiente forma:
DATA: <campo1>,
<campo2>,
<campo3>.
O también: DATA: <campo1>, <campo2>, <campo3>.
Comentarios
Existen dos formas de utilizar comentarios dentro de ABAP:
Si queremos comentar toda una línea, colocamos un asterisco (*) como primer carácter de dicha
línea; por su parte, si solo queremos dejar un comentario al final de una línea, éste debe comenzar
en comillas (“).
Ejemplo:
*Comentario completo.
WRITE <campo1>. “comentario al final
Entorno de Programación – RichardRey.com - 9
Objetos de Datos
En ABAP, existen tres tipos de objetos de datos que podemos utilizar en nuestros programas:
•
•
•
Literales.
Campos del Diccionario de Datos.
Variables internas.
Los literales son textos o cantidades que escribimos entre comillas, se trata de utilizar
directamente el valor requerido sin declararlo en alguna variable. Un par de ejemplos:
WRITE ‘TITULO’. (Escribir la palabra TITULO en un reporte).
ventas = balance / 100.
(ventas y balance son dos variables ; pero el número 100 es un literal, directamente le indicamos
a ABAP que divida el contenido de la variable balance entre 100).
Los campos del Diccionario los declaramos con la sentencia TABLES; lo que se busca es utilizar las
propiedades de las tablas del Diccionario para utilizarlas en un programa. Ejemplo:
TABLES: KNA1. (declaración de una tabla interna con la misma estructura que la tabla del
Diccionario KNA1).
WRITE: KNA1-KUNNR, KNA1-NAME1. (utilizar como variables, los campos de la tabla
KNA1.)
NOTA: Estos no son los campos de la tabla propiamente dicho, son variables con su misma
estructura, tampoco se trata de una tabla, sino de su línea de cabecera, no contienen los registros
de la tabla a menos que los obtengamos en una sentencia SQL; por ejemplo: podemos llenar los
valores de KNA1 en la estructura creada con la sentencia TABLES: KNA1 de la siguiente manera:
SELECT SINGLE * FROM KNA1 WHERE kunnr = <clientes>.
En tercera instancia están las variables internas del programa, estas se crean con la sentencia
DATA, y pierden su vigencia al terminarse la ejecución del programa; las tablas internas están
incluidas aquí. Ejemplo:
Entorno de Programación – RichardRey.com - 10
DATA: ventas TYPE p,
cliente TYPE KNA1-KUNNR,
itab TYPE TABLE OF <estructura>.
Estructura básica de un programa ABAP.
REPORT <nombre>. (nombre del programa).
TABLES <tabs>. (declaración de estructuras de Diccionario)
DATA: < . . . > . (declaración de variables internas)
TOP-OF-PAGE. (evento de inicio de página, útil para pintar un reporte)
<sentencias> (instrucciones relativas a este evento.
END-OF-PAGE. (Sentencia para finalizar el evento).
START-OF-SELECTION. (evento que controla el flujo principal del programa)
<sentencias> (intrucciones a ejecutarse)
END-OF-SELECTION. (fin del evento).
Existen otros eventos como LOAD-OF-PROGRAM, que permite controlar el momento previo al
despliegue en pantalla de un programa, útil para inicializar algún campo de entrada/salida de un
reporte.
El orden de los eventos no es relevante,
Control de flujo en ABAP
Como en cualquier lenguaje de programación, en ABAP se cuenta con una serie de instrucciones
que permiten condicionar ciertas secciones de código a que se cumplan algunas condiciones
particulares.
La instrucción condicional más básica es el IF – ELSE – ENDIF.
Entorno de Programación – RichardRey.com - 11
IF <cond>.
. . A. .
ELSE.
. . B. .
ENDIF.
Si se cumple <cond>, se procesarán las instrucciones del bloque con la letra A, si no se cumplen, se
procesará el bloque B. La sentencia ELSE es opcional.
Dentro de la condición <cond>, son permitidos los siguientes condicionales:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
AND. Si todas las condiciones se cumplen, se ejecuta el código A.
OR. Con que se cumplan una de las condiciones ser ejecuta el código A.
EQ o ‘=’. EQUAL. Evalúa si dos o más variables son iguales.
NE o ‘<>’. NOT-EQUAL. Evalúa si dos variables son diferentes.
GT ó ‘>’. GREAT-THAT. Evalúa si una primera variable es mayor que otra.
LT ó ‘<’. LESS-THAT. Evalúa si una variables es menor que otra.
GE ó ‘>=’. GREAT-EQUAL. Evalúa que una variable sea mayor o igual que otra.
LE ó ‘<=’. LESS-THAT. Evalúa que una variable sea menor o igual que otra.
CO. CONTAINS-ONLY. <c1> CO <c2>. Evalúa si el carácter <c1> está contenido en <c2>.
CN. CONTAINS-NOT-ONLY. Negación a la condición anterior.
CA. CONTAINS-ANY. <c1> CA <c2>. Verifica si en <c1> existe algún carácter de <c2>.Si es
cierta, en SY-FDPOS estará la posición encontrada, sino, la longitud de <c1>.
NA. CONTAINS-NOT-ANY. Negación a la condición anterior.
CS. CONTAINS-STRING. <c1> CS <c2>. Si <c1> contiene a <c2>, en SY-FDPOS sabremos
donde comienza dicha cadena.
NS. CONTAINS-NOT-STRING. Negación del anterior.
BETWEEN. Para chequear rangos, verifica si una variable está contenida entre un rango de
otras dos variables, por ejemplo, si la fecha de hoy está contenida entre dos fechas dadas.
IS INITTIAL. Instrucción para evaluar si una variable no contiene datos; si se trata de una
variable numérica, la condición es válida si la variable tiene como valor cero; si se trata de
una tabla interna o una estructura, verifica que no contenga datos.
Si tenemos que validar una serie de condicionales, existe una instrucción que podemos utilizar en
lugar de anidar varios IF-ELSE-ENDIF. Esta sentencia se llama CASE.
Entorno de Programación – RichardRey.com - 12
CASE <campo>.
WHEN <valor1>.
WHEN <valor2>.
WHEN OTHERS.
ENDCASE.
Un ejemplo para entenderlo:
En vez de escribir esto:
IF <var1> EQ ‘2’.
#imprimirA.
ELSEIF <var1> EQ ‘4’.
#imprimirB.
ELSE.
#imprimirC.
ENDIF.
Podría reescribirse de la siguiente manera:
CASE <var1>.
WHEN ‘2’. #imprimirA.
WHEN ‘4’. #imprimirB.
WHEN OTHERS. #imprimirC.
ENDCASE.
Entorno de Programación – RichardRey.com - 13
Bucles o Ciclos.
Tenemos dos instrucciones para procesos repetitivos. Estas son DO y WHILE.
La instrucción DO permite ejecutar un bloque de instrucciones tantas veces como se especifique.
DO <n> TIMES.
....
ENDDO.
En la variable del sistema SY-INDEX tendremos un contador del número de repeticiones.
La instrucción WHILE permite ejecutar un bloque de instrucciones mientras se cumpla una
condición.
WHILE <cond>.
....
ENDWHILE.
Sentencias de corte de Bucles.
Si requerimos cortar un bucle en un momento dado sin necesidad de que se complete todo el
ciclo, tenemos las siguientes instrucciones a nuestra disposición.
•
•
•
•
CHECK <cond>. Si no se cumple la condición, si esta dentro del ciclo, se saltará el resto del
ciclo, si esta fuera, saltará hasta el final del evento actual.
EXIT. Igual que CHECK, pero sin condición, realizará siempre esos pasos.
STOP. Se finaliza el programa en ejecución, pasando primero por el evento END-OFSELECTION.
LEAVE. Igual que STOP, pero sin ejecutar el evento END-OF-SELECTION.
Entorno de Programación – RichardRey.com - 14
Declaración de Parámetros de Entrada.
Para permitir la introducción por pantalla de parámetros de entrada por parte del usuario,
disponemos de dos alternativas:
•
•
PARAMETERS: Ingresar un único parámetro.
SELECT-OPTIONS: Ingresar un rango de parámetros.
PARAMETERS
La instrucción PARAMETERS nos permite crear un campo de entrada en una pantalla de selección;
el usuario podrá ingresar uno y solo un valor en dicho campo, el cual podremos determinar qué
tipo de dato contendrá.
Funciona de manera similar a la declaración de variables, esto es, el parámetro le asignaremos un
nombre de variable, que es con el que se le conocerá dentro del programa, y la instrucción LYKE
nos permitirá asignarle un tipo de dato, que puede ser referenciado de un campo del Diccionario,
o bien asignarle directamente un tipo de dato elemental.
Ejemplos de declaración de parámetros:
PARAMETERS <var1> LIKE <tabla-campo>.
PARAMETERS <var2> LIKE i.
También pueden declararse de la siguiente manera:
PARAMETERS: <var1> LIKE <tipo_de_dato>,
<var2> LIKE <tipo_de_dato>.
Entorno de Programación – RichardRey.com - 15
Dentro del programa, podremos utilizar estas variables por el nombre que le asignamos al
momento de su declaración, <var1> y <var2>.
RADIOBUTTONS
También podemos declarar un conjunto de opciones de selección simple, es decir, una serie de
botones en los cuales el usuario solo pueda seleccionar uno de ellos a la vez. Esto en SAP se le
conoce como RADIOBUTTONS, y los declaramos de la siguiente manera:
PARAMETERS: <var1> RADIOBUTTON GROUP r1,
<var2> RADIOBUTTON GROUP r1,
<var3> RADIOBUTTON GROUP r1.
Como puedes observar, para que solo se permita seleccionar una de las variables, las mismas
deben pertenecer a un mismo grupo, esto lo controlamos en su declaración al asignarles el grupo
R1; si deseamos construir otro conjunto de variables, de manera que el usuario seleccione una
variable adicional a la seleccionada en este grupo R1, simplemente lo que tenemos que hacer es
declarar las nuevas variables pertenecientes a otro grupo, por ejemplo, R2.
Dentro del programa, estas variables serán de un caracter, y controlaremos su selección
preguntando si dichas variables tienen como valor ‘X’ o se encuentran sin valor (vacías).
IF var1 EQ ‘X’ or IF var2 IS INITIAL.
Entorno de Programación – RichardRey.com - 16
CHECKBOX
Ahora bien, si lo que deseamos es que el usuario disponga de una serie de casillas para que pueda
marcar una o varias de ellas, esto lo controlamos con un tipo de parámetro llamado CHECKBOX.
PARAMETERS: <var1> AS CHECKBOX,
<var2> AS CHECKBOX,
<var3> AS CHECKBOX.
En vez de ser botones agrupados de selección simple, tenemos casillas de selección múltiple, pero
dentro del programa, el tratamiento es similar a los RADIOBUTTONS, ya que se tratan de variables
de un caracter, y preguntaremos si su valor es ‘X’ o vacío.
SELECTION-SCREEN
Si queremos darle un poco de estética a nuestra pantalla de selección, agrupando los parámetros
en “cajas” según su tipo, esto lo logramos con la sentencia
SELECTION-SCREEN BEGIN/END OF BLOCK <b1>.
Estamos agrupando los parámetros creados en bloques de presentación; a estos bloques le
podremos dar un nombre si completamos la sentencia con WITH FRAME TITTLE <texto>.
Entorno de Programación – RichardRey.com - 17
La ventana de arriba la logramos con el siguiente código:
selection-screen
parameters: var1
var2
var3
selection-screen
begin of block b2
radiobutton group
radiobutton group
radiobutton group
end of block b2.
with frame title text-002.
r1,
r1,
r1.
Podemos lograr darle un título descriptivo a la caja que acabamos de crear, para ello, hacemos
doble clic a la sentencia “text-002”, y aceptamos crear un nuevo elemento de texto.
Agregamos el texto descriptivo en el área que se encuentra al lado del número asignado:
Entorno de Programación – RichardRey.com - 18
Activamos y ya lo tenemos.
Ahora, si observamos las pestañas que nos muestran, hay una llamada “textos de selección”, al
entrar en ella, veremos todos los parámetros de entrada que tenemos declarados en nuestro
programa.
Si le damos un nombre a cada variable, también se lo cambiaremos en la pantalla de selección,
ejemplo:
Entorno de Programación – RichardRey.com - 19
Nos deja como resultado, la siguiente pantalla:
SELECT-OPTIONS
La sentencia PARAMETERS nos permite solicitar por pantalla un único valor para cada variable de
entrada declarada, pero en muchos casos nos interesa poder recibir por parámetro un rango de
valores, por ejemplo, un conjunto de clientes o un rango de fechas; esto lo logramos con la
sentencia SELECT-OPTIONS.
Esta sentencia responde con un tipo de datos que previamente debió haber sido creado, por lo
que antes de declarar un parámetro de entrada con ella, debemos declarar el tipo de datos a
utilizar; por ejemplo, si deseamos solicitar un rango de fechas, se haría de la siguiente manera:
Entorno de Programación – RichardRey.com - 20
Nos genera el siguiente resultado:
En donde podremos seleccionar un rango de fechas (en este caso), simplemente indicando los
extremos de dicho rango en ambas cajas de campos que tenemos disponibles.
Si le damos clic al botón de la derecha, podremos ser más específicos en nuestro rango de
selección, ya que nos abre una caja en donde podremos indicar expresamente una serie de fechas
a tratar.
Entorno de Programación – RichardRey.com - 21
Podremos también con el cuadro de la izquierda (columna P), indicar filtros del tipo IGUAL QUE,
MAYOR QUE, MAYOR IGUAL, etc.
De la misma manera que las pestañas superiores nos permiten un mayor control de los
parámetros introducidos.
Sin duda que este tipo de parámetro nos permite una mayor cantidad de opciones para
seleccionar.
Estas variables dentro del programa requieren un tratamiento especial.
Entorno de Programación – RichardRey.com - 22
Para empezar, la variable <var1> creada es una tabla interna que guarda información del rango de
valores indicado, así como el operador de comparación:
La tabla interna tiene 4 campos:
•
•
•
•
SING: I de In (dentro del rango); O de Out (fuera del rango); para indicar que representa el
rango indicado con respecto a los valores buscados.
OPTION: Representa el criterio de selección indicado, en este caso, BT significa BEETWEN,
que indica que se estarán utilizando valores comprendidos entre las dos fechas indicadas.
LOW: Contiene el valor mínimo del rango seleccionado.
HIGH: Contiene el valor máximo del rango seleccionado.
En este caso, la combinación total I – BT – 20120101 – 20120118 lo que indica es que se va a tratar
un conjunto de datos en el que tomaremos lo valores que se encuentren dentro (I) del rango
comprendido (BT) entre las fechas 01.01.2012 y 18.01.2012.
Podemos tratar directamente con los extremos del rango, simplemente indicando cual campo de
la tabla interna requerimos, es decir, podemos utilizar <var1>-LOW para hacer referencia al valor
inferior, y <var1>-HIGH para referirnos al valor superior.
Si utilizamos el rango de valores dentro de una consulta SQL, en vez de filtrar de la forma
tradicional:
WHERE kunnr = <var1>.
Sustituiremos el “=” por el signo “IN”; para hacer referencia a que buscaremos los valores bajo el
criterio comprendido dentro (IN) del rango indicado.
WHERE kunnr IN <var1>.
Entorno de Programación – RichardRey.com - 23
Si la variable <var1> se encuentra vacía en el primer caso (PARAMETERS), el resultado de la
consulta SQL será que no encuentra nada, a menos que exista un registro cuyo campo KUNNR este
vacío, ya que eso es exactamente lo que se está filtrando en la consulta.
Por el contrario, en el segundo caso (SELECT-OPTIONS), si <var1> no tiene valores, al tratarse de
una sentencia de inclusión grupal (IN), el SQL devolverá TODOS los registros de la tabla consultada
(a menos que existan otros filtros diferentes a <var1>).
Para cerrar con este tema; lo haremos de una forma gráfica, la siguiente ventana de selección se
logra con las siguientes líneas de código.
Entorno de Programación – RichardRey.com - 24
Te saluda,
Richard Rey
http://aprendeabap.com
Entorno de Programación – RichardRey.com - 25