Material de regalo disponible en · 2019-02-04 · ABAP. Las siglas ABAP significan: Advanced...
Transcript of Material de regalo disponible en · 2019-02-04 · ABAP. Las siglas ABAP significan: Advanced...
Material de regalo disponible en
www.aprendeabap.com/regalo
www.aprendeabap.com – AprendeABAP en 7 días
1
Copyright 2017 AprendeABAP.com.
Todos los Derechos Reservados.
Impreso por CreateSpace.
Prohibida la reproducción total o parcial de este libro. Prohibida la
exhibición de este libro en cualquier plataforma física o digital sin
autorización expresa del autor. Esto incluye pero no se limita a
reimpresiones, extractos, fotocopias, grabación, o cualquier otro medio
de comunicación. Para mayor información por favor contactar con el
autor vía correo electrónico en [email protected]
http://www.aprendeabap.com
Facebook: /AprendeAbap
Twitter: @AprendeABAP
Youtube: /AprendeABAP
www.aprendeabap.com – AprendeABAP en 7 días
2
Agradecimientos.
A mi familia, por ser acompañantes silenciosos en esta
aventura.
A todos los compañeros de trabajo que he tenido a lo
largo de estos años, por todo lo que he podido aprender
de ellos.
A ti, que me has dado tu confianza en tu proceso de
aprendizaje.
www.aprendeabap.com – AprendeABAP en 7 días
3
Tabla de Contenidos.
Introducción. ...................................................................................... 5
Día 0: Características del Lenguaje ABAP........................................ 7
Día 1: Tipos de Datos en ABAP. ....................................................... 9
Día 2: Diccionario de Datos............................................................. 19
Día 3: Tablas Internas. ..................................................................... 35
Día 4: Entorno de Programación. .................................................... 43
Día 5: Sub Rutinas. .......................................................................... 71
Día 6: Módulo de Funciones. ........................................................... 81
Día 7: Reportes o Informes. ........................................................... 107
RECURSOS RECOMENDADOS ................................................ 129
AprendeABAP. –¿Qué hay aquí para ti? ....................................... 131
AprendeABAP. - Desarrollo de Contenidos Etapa APRENDIZAJE ....................................................................................................... 133
AprendeABAP. - Contenidos Etapa POSICIONAMIENTO ........ 135
AprendeABAP. - ABAP Store....................................................... 137
www.aprendeabap.com – AprendeABAP en 7 días
5
Introducción.
Más que darte las gracias por haber confiado tus datos, permíteme
felicitarte ya que no todas las personas, a pesar de la necesidad, son
capaces de tomar las oportunidades que se le presentan en el camino.
Si echas una mirada al mundo, notarás que no estamos pasando por
momentos felices a nivel laboral, quizá tú estés aquí por que fuiste
afectado de alguna manera, o quizá quieras evitar que “llegue la ola” y te
lleve.
A pesar de la situación actual, en la que en muchos países hay serios
problemas de desempleo, los profesionales en SAP siempre son
requeridos en muchas partes del mundo; en ocasiones podrás ganar buen
dinero, en otras no tanto, pero trabajo, a un consultor de cualquier
módulo de SAP, no le va a faltar.
Este es el comienzo de lo que espero sea un largo camino, hoy comienzas
con el objetivo de aprender ABAP, el lenguaje de programación de SAP.
Con este libro darás tus primeros pasos en ABAP, pasarás de no saber
nada a estar en la capacidad de atender los requerimientos más comunes
que hay en pocos días.
Vendrán más proyectos en el futuro en el cual no estarás solo/a, en donde
intensificarás tu aprendizaje con temas avanzados, con teoría y práctica,
te enseñaré donde puedes conseguir acceso estable al sistema mediante
suscripción – porque SAP no es gratis – , algo que recomiendo que hagas
para que puedas poner en práctica lo que vayas aprendiendo día a día.
Esta es una carrera de fondo, en la cual debes ir superando etapas, solo
así podrás labrarte una carrera exitosa dentro de la Consultoría SAP.
Como agradecimiento por haber adquirido este libro, te quiero obsequiar
www.aprendeabap.com – AprendeABAP en 7 días
6
un mini curso, en el cual aprenderás cuales son los 7 Pasos que hay que
cubrir para convertirte en un Consultor de Éxito.
Puedes acceder al obsequio dejando tus datos en el siguiente enlace:
http://aprendeabap.com/regalo
www.aprendeabap.com – AprendeABAP en 7 días
7
Día 0: Características del Lenguaje
ABAP.
Las siglas ABAP significan: Advanced Business Application Programming.
Al lenguaje se le conoce como ABAP/4 por tratarse de un lenguaje de 4ta
generación; esto es, se trata de un lenguaje estructurado orientado a
eventos, es decir, no responde a una secuencia lineal tradicional, sino
“salta” su ejecución a diferentes bloques de código dependiendo del
cumplimiento de una serie de condiciones o eventos asociadas a dicho
bloque.
El núcleo (kernel) de SAP está escrito en lenguaje C, incluido el propio
ABAP; todas las capas superiores, es decir, los diferentes módulos del
sistema, si están escritos en lenguaje ABAP.
SAP trabaja mediante transacciones de diálogos; ventanas gráficas que
requieren interacciones con el usuario, cuyos datos son procesados y
tratados en las bases de datos del sistema.
En ABAP se maneja el concepto de Objetos, es decir, un Programa, una
Tabla, un Campo de una Tabla, una Transacción, un Elemento de Datos,
una Estructura de Datos, cada uno es un objeto en sí. Y si, ABAP también
permite la programación Orientada a Objetos, pero la misma no está
contemplada en este libro.
Entre las distintas aplicaciones que se pueden desarrollar en ABAP
tendremos:
• Reportes: Ampliamente solicitados, consiste de manera general
en capturar información relevante introducida en pantalla por el
www.aprendeabap.com – AprendeABAP en 7 días
8
usuario, que servirá de criterios de búsqueda en las tablas de la
Base de Datos, recopilar los datos obtenidos, y presentárselos al
usuario en alguno de los diferentes formatos de reportes
existentes.
• Transacciones: Es el nombre que se le da en SAP a los programas
de diálogo, que requieren interacción con el usuario, para solicitar
y mostrar datos e información; SAP está estructurado en una serie
de transacciones Standard (previstas por el sistema), para los
diferentes módulos, que cubren el universo de escenarios
posibles de un negocio o industria; pero en ABAP podemos crear
nuevas transacciones de diálogo (en adelante solo transacciones),
adaptadas a las necesidades específicas de cada cliente. Cada
transacción está conectada con un programa ABAP, de manera de
que al llamar al código de una transacción, se ejecute el programa
asociado.
• Adaptaciones: En ocasiones, en un proyecto de implantación SAP,
un cliente requiere que una transacción Standard realice una
acción no contemplada en el paquete inicial de SAP, por lo que se
requiere de programación ABAP para realizar estos ajustes en
determinadas funciones de código, que permiten modificar o
hacer ajustes a los objetos Standard.
• Utilidades: Objetos existentes para mejoras al sistema (BADI’s,
BAPI’s), funciones, interfaces, así como utilidades para carga
masiva de datos (Bath Input).
www.aprendeabap.com – AprendeABAP en 7 días
9
Día 1: Tipos de Datos en ABAP.
En el capítulo anterior hablamos sobre los Fundamentos de la
Programación Lógica. Ahora vamos a iniciarnos finalmente en el lenguaje
ABAP, y vamos a comenzar entendiendo los diferentes Tipos de Datos que
el sistema permite.
En ABAP existen los siguientes tipos de datos:
Declaración de Campos
Para declarar variables en un programa ABAP, debemos utilizar la
sentencia DATA.
Ejemplo: DATA var.
www.aprendeabap.com – AprendeABAP en 7 días
10
Esta sentencia, (ejemplo de arriba), crea una variable llamada <var> del
tipo C tamaño 1, que es la definición por defecto.
NOTA: Todas las líneas de instrucciones que escribimos en ABAP deben
estar terminadas en un punto ‘.’; de lo contrario, el programa producirá
errores de sintaxis.
Si queremos que la variable sea de tamaño 4, debemos escribirlo de la
siguiente manera: DATA var(4).
Ahora, si lo que queremos es declarar una variable que no sea tipo C, por
ejemplo, queremos declarar una variable tipo entero, utilizaremos la
sentencia TYPE para indicar el tipo de dato que queremos: DATA var TYPE i.
Con el parámetro LIKE podemos declarar una variable con los mismos
atributos de longitud y tipo que una variable de base de datos: DATA var LIKE mara-matnr.
MARA-MATNR hace referencia al campo MATNR de la tabla MARA; y la
instrucción esta declarando una variable del mismo tipo de datos de dicho
campo. (Luego veremos todo lo relacionado con las tablas y campos de la
Base de Datos).
La instrucción de arriba también puede escribirse como: DATA var TYPE mara-matnr.
Con el parámetro VALUE podemos inicializar la variable con un valor
distinto al que tiene por defecto: DATA var TYPE i VALUE 1.
Esta instrucción declara una variable tipo entero con valor inicial de 1.
www.aprendeabap.com – AprendeABAP en 7 días
11
Si queremos declarar dos o más variables a la vez, lo podemos hacer de
dos formas, la primera es escribiendo una línea debajo de otra de la
manera como lo hemos venido viendo hasta ahora:
DATA var1 TYPE i VALUE 1.
DATA var2 TYPE mara-matnr.
DATA var3 LIKE mara-matnr.
La segunda opción es escribiendo la sentencia DATA una sola vez seguida
de dos puntos (: ) y terminando cada línea con coma ( , ) en vez de punto,
colocando el punto al final de la última línea de declaración; veamos el
ejemplo anterior escrito bajo esta forma: DATA: var1 TYPE i VALUE 1,
var2 TYPE mara-matnr,
var3 LIKE mara-matnr.
También podemos crear una Estructura de Datos, esto es, un conjunto de
datos relacionados lógicamente en una estructura. Luego de la sentencia
DATA; utilizamos las sentencias BEGIN OF y END OF para determinar el
inicio y final de la estructura. Ejemplo: DATA: BEGIN OF nombre_estructura,
var1 TYPE i,
var2 TYPE i,
END OF nombre_estructura.
Posteriormente, el acceso a los campos de la estructura será con la
instrucción:
<nombre_estructura> - <campo_estructura>.
Ejemplos: nombre_estructura-var1.
nombre_estructura-var2.
www.aprendeabap.com – AprendeABAP en 7 días
12
Tablas Internas.
El tema de las Tablas Internas se tocará a fondo en un capítulo posterior,
por ahora quédate con que, en ABAP existe una variante de las Tablas
Tradicionales de Bases de Datos (BD), que son llamadas las “Tablas
Internas”; éstas, a diferencia de las Tablas de BD, se guardarán en
memoria y solo serán accesibles desde el Programa que las creó, y no son
Tablas guardadas en la BD general consumiendo recursos del sistema.
En SAP, las Tablas “normales” se les conoce como Tablas Transparentes,
mientras que a estas secciones de memoria que permiten almacenar una
serie de registros dentro de un programa, con una estructura de datos
determinada, se les conoce como Tablas Internas.
Quédate con esto por ahora y si no se entendió muy bien, no te
preocupes que le dedicaremos un capítulo entero a esto más adelante.
Las Tablas en SAP, tanto las internas como las transparentes, están
formadas por Estructuras de Datos, por lo que hay dos maneras de
declarar una Tabla Interna en un programa ABAP:
a) Declarando la Estructura de Datos y la Tabla en una misma
sentencia, utilizando OCCURS.
DATA: BEGIN OF itab OCCURS 100,
nombre LIKE LFA1-NAME1,
ciudad LIKE LFA1-ORT1,
ventas LIKE LFC3-SOLLL,
END OF itab.
b) Declarando por un lado la Estructura de Datos, y luego declarando
la Tabla Interna indicando la sentencia TYPE TABLE OF.
www.aprendeabap.com – AprendeABAP en 7 días
13
DATA: BEGIN OF ed,
nombre LIKE LFA1-NAME1,
ciudad LIKE LFA1-ORT1,
ventas LIKE LFC3-SOLLL,
END OF ed.
DATA: itab TYPE TABLE OF ed.
Las dos sentencias crean una Tabla Interna llamada ITAB, con 3 campos
(nombre, ciudad y ventas), la diferencia es que la primera Tabla tiene un
espacio reservado de 100 líneas en memoria principal.
Esto no significa que el tamaño máximo de la Tabla sea el indicado, ya que
si este se desborda los datos se guardan en un fichero de paginación,
bajando lógicamente el tiempo de proceso de las Tablas Internas, pero
evitando que el área global de almacenamiento destinado por SAP para
tablas internas se agote.
Las Tablas Internas se declaran, inicializan y referencian como una
Estructura de Datos.
También podemos utilizar la misma Estructura que una Tabla de Base de
Datos. Para ello utilizaremos la instrucción INCLUDE STRUCTURE.
DATA BEGIN OF sociedad OCCURS 10.
INCLUDE STRUCTURE T001.
DATA END OF sociedad.
T001 es una Estructura del Diccionario de Datos de SAP, esto lo veremos
en el siguiente capítulo.
www.aprendeabap.com – AprendeABAP en 7 días
14
Variables del sistema
El sistema SAP tiene algunas variables internas que se van actualizando
automáticamente y que pueden ser utilizadas en los programas.
Todas ellas empiezan por el prefijo SY- y entre las más utilizadas tenemos
<SY-SUBRC>; que nos da el código de retorno de una instrucción, o <SY-
TABIX>; que contiene la línea de proceso de una tabla interna.
Todas las variables del sistema se encuentran en la Estructura de Datos
llamada SYS.
En el siguiente artículo enumero las variables del sistema más utilizadas
en el entorno de programación ABAP:
Artículo Variables del Sistema
Asignando valores
Existen diversas formas de asignar valores a una variable en ABAP/4.
Una asignación directa, como resultado de una operación aritmética o
como resultado de una conversión automática entre campos con valores
de diferente tipo de datos.
La instrucción MOVE realiza un transporte del contenido del <var1>al
campo <var2>.
MOVE<var1>TO<var2>.
Esta última instrucción también se puede escribir de la siguiente manera:
<var2> = <var1>.
www.aprendeabap.com – AprendeABAP en 7 días
15
Ejemplos: MOVE var1 TO var2.
var2 = var1.
Si deseamos, por algún motivo, inicializar las variables que estamos
utilizando, (borrarles el valor que tienen y dejarlas en blanco),
aplicaríamos la sentencia CLEAR como se muestra en el ejemplo: CLEAR var.
CLEAR inicializa al valor que tiene asignado como valor inicial (ver Tabla 1)
sin tener en cuenta las cláusulas VALUE que existan para esa variable.
La asignación e inicialización de las Estructuras de Datos funciona de la
misma forma que en las variables normales. Un CLEAR inicializa todos los
campos del registro.
Con respecto a las Tablas Internas, hay una diferencia, la instrucción
CLEAR solo inicializa la línea de cabecera (más adelante se verá que es
esto); para inicializar una Tabla Interna completa requerimos la sentencia
REFRESH.
REFRESH itab.
Existen otras consideraciones para las Tablas Internas, pero las
abordaremos más adelante.
Podremos conseguir una asignación más potente con MOVE-
CORRESPONDING.
MOVE-CORRESPONDING <var1>TO<var2>.
Esta instrucción mueve de <var1>a <var2> aquellos campos que tengan
idéntico nombre.
www.aprendeabap.com – AprendeABAP en 7 días
16
Operaciones Aritméticas en ABAP/4
En ABAP/4 las operaciones aritméticas básicas se pueden implementar de
dos formas:
Con la instrucción COMPUTE y los símbolos +, -, /, *.
COMPUTE var1 = <Expresión Aritmética>.
Donde la sentencia COMPUTE es opcional; es decir, se puede omitir de la
sentencia, veamos un ejemplo:
COMPUTE var1 = var2 + var3.
var1 = var2 + var3.
Ambas instrucciones suma las variables <var2> con <var3> y guarda el
resultado en <var1>.
Si se trata de una operación compleja donde necesitemos paréntesis,
dejaremos un espacio en blanco precediendo y siguiendo al paréntesis.
Ejemplo:
var1 = var1 + ( var2 + var3 ).
También existe una serie de instrucciones para realizar operaciones
matemáticas, como las siguientes:
• ADD TO. - Sumar.
• SUBSTRACT FROM. - Restar.
• MULTIPLY BY. - Multiplicar.
• DIVIDE BY. - Dividir.
• EXP. - Exponencial.
• LOG. - Logaritmo.
• SIN. - Seno.
www.aprendeabap.com – AprendeABAP en 7 días
17
• COS. - Coseno.
• SQRT. - Raíz cuadrada.
• DIV. - División exacta. (7 div 2 = 3)
• MOD. - Residuo. (7 mod 2 = 1)
• STRLEN. - Longitud de una variable.
Procesando campos de tipo texto
El lenguaje ABAP ofrece una cantidad de instrucciones para el
procesamiento de cadenas de texto, veamos algunas de ellas:
SHIFT<campo>. Realiza un desplazamiento de un caracter hacia la
izquierda.
SHIFT<campo>BY<n>PLACES (RIGHT) .Realiza un desplazamiento de
N caracteres hacia la Izquierda o si se especifica hacia la derecha,
introduciendo blancos por el lado opuesto.
SHIFT<campo>BY 2 PLACES CIRCULAR (RIGHT).Realiza un
desplazamiento cíclico hacia la izquierda o si se especifica hacia la
derecha.
REPLACE<cadena1>WITH<cadena2>INTO<campo>. Reemplaza
<cadena1> por <cadena2> dentro de la variable campo. Si la variable del
sistema SY-SUBRC es diferente de 0; es que <cadena1> no existe dentro
de la variable <campo>.
Existe otra instrucción de sustitución, TRANSLATE.
TRANSLATE<campo>TO UPPER CASE .Pasa el contenido de <campo> a
Mayúsculas.
TO LOWER CASE. Como la anterior, pero pasando el contenido a
minúsculas.
www.aprendeabap.com – AprendeABAP en 7 días
18
La instrucción SEARCH busca una cadena dentro de un campo o una tabla.
SEARCH<campo>/<tabla>FOR<cadena>. Si el Resultado es positivo,
SY-SUBRC es igual a 0. En caso de que sea una tabla, SY-TABIX contiene la
línea de la tabla donde se ha encontrado.
Para borrar los blancos de una cadena utilizaremos CONDENSE.
CONDENSE<campo>(NO-GAPS).
Esta instrucción borra todos los blancos que se encuentren comenzando
la cadena por la izquierda y en caso de encontrar series de blancos
intermedios dejará únicamente uno por serie.
La cláusula NO-GAPS borra todos los blancos estén donde estén.
www.aprendeabap.com – AprendeABAP en 7 días
19
Día 2: Diccionario de Datos.
En este capítulo estudiaremos lo que considero que es la base de todo el
sistema SAP; su repositorio de Datos, conocido como “Diccionario de
Datos”; en él encontraremos toda la información del sistema estructurada
en Tablas estándar, Estructuras de Datos, Vistas de Tablas, Elementos de
Datos y Dominios.
Para acceder al Diccionario de Datos se ingresa a través de la Transacción
SE11; si no recuerdas como ingresar un código de Transacción, lo puedes
hacer en la barra de pulsadores en la parte superior de la pantalla.
El Diccionario de Datos es la “fuente” de información centralizada de todo
el sistema SAP, allí se encuentra (y almacena) todos los datos que se
procesan en el sistema; es, digamos, el corazón de SAP.
En el Diccionario de Datos (de ahora en adelante el Diccionario),
encontramos la siguiente estructura de objetos, ordenados desde su capa
más inferior:
• Dominio.
• Elemento de Datos.
• Campo.
• Estructura de Datos.
• Tablas.
El DOMINIO describe el campo de valores posibles, es de un carácter
técnico, es el nivel más bajo que existe para determinar el tipo de dato de
un objeto.
Ejemplo; un dominio denominado <S_PLANE> tiene un tipo de dato CHAR
de tamaño 10 (una cadena de caracteres de 10 posiciones).
www.aprendeabap.com – AprendeABAP en 7 días
20
El ELEMENTO DE DATOS describe el significado de un campo
independientemente de las Tablas donde se utilice. Tiene un carácter
semántico. Un Elemento de Datos está asociado a un Dominio, y puede
ser utilizado en múltiples Tablas, incluso ser referenciado directamente
desde un Programa al momento de declarar una nueva variable.
Siguiendo el ejemplo anterior, tenemos un Elemento de Datos llamado
<S_PLANETYE>, que hace referencia al tipo de avión, y está formado por
el Dominio <S_PLANE>, mostrado antes.
www.aprendeabap.com – AprendeABAP en 7 días
21
NOTA: Desde el editor de un programa ABAP, podemos declarar una
variable que haga referencia a un Elemento de Datos; de esta forma, la
variable tomará el tipo de datos del dominio asociado a dicho Elemento
de Datos. Siguiendo con el ejemplo:
DATA: var TYPE S_PLANETYE.
En este caso, la variable denominada <var> será una cadena de caracteres
de 10 posiciones, o dicho de otra manera, un campo tipo texto de 10
posiciones; porque le indicamos que tome las propiedades del Elemento
de Datos <S_PLANETYPE>, y ese Elemento de Datos tiene como Dominio
el objeto <S_PLANE>, que como vimos arriba, se trata de un tipo CHAR de
10 posiciones.
Si te confunde un poco, lo siguiente lo esclarecerá.
DATA: var TYPE S_PLANETYE.
DATA: varTYPE char10.
Las dos instrucciones escritas arriba obtienen exactamente el mismo
resultado, la variable <var> será un tipo CHAR de 10 posiciones.
www.aprendeabap.com – AprendeABAP en 7 días
22
La ventaja de esta forma de estructurar el Diccionario es que si cuentas
con una serie de Tablas, con campos del mismo tipo, por ejemplo
CHAR10, si bien se permite asignarle a cada campo directamente el tipo
de datos CHAR de 10 posiciones; hacerlo de esta manera implica que, al
momento de ser solicitado un cambio del tipo de datos, (digamos que
piden cambiarlo a un CHAR de 12 posiciones), te corresponde modificar
Tabla por Tabla para ajustar todos los campos afectados.
Si en su lugar, se crea un Elemento de Datos cuyo Dominio sea un objeto
de tipo CHAR10, pongámosle por nombre <ED>; y le asignamos el ED a los
campos de cada Tabla; al momento de requerir el ajuste a CHAR12,
bastará con cambiar el Dominio del Elemento de Datos <ED> para que el
cambio se replique en TODAS las Tablas que lo contengan; es decir,
haríamos el cambio una sola vez, y éste se replica en todas las Tablas que
hacen referencia al Elemento de Datos.
EL CAMPO, como su nombre lo indica, es el renglón o columna de una
Estructura de Datos. Si recuerdas del capítulo anterior el momento en que
mencionábamos la creación de una Estructura de Datos, cuya sentencia
sería la siguiente:
DATA: BEGIN OF nombre_estructura,
var1 TYPE i,
var2 TYPE i,
END OF nombre_estructura.
Las variables <var1> y <var2> serán campos de la Estructura de Datos
creada.
Lo mismo ocurre en el Diccionario de Datos, el campo es el espacio o
columna única de cada Tabla o Estructura de Datos; y a cada campo se le
asigna un Elemento de Datos existente, absorbiendo el campo las
propiedades del Elemento de Datos.
www.aprendeabap.com – AprendeABAP en 7 días
23
Como vemos en la gráfica, un campo llamado <PLANETYPE>
perteneciente a la Tabla SFLIGHT y está formado por el Elemento de
Datos <S_PLANETYE > que vimos anteriormente.
La ESTRUCTURA DE DATOS la vimos un poco en el capítulo anterior (Tipos
de Datos en ABAP), se trata de un conjunto de campos relacionados
lógicamente entre sí en un único objeto, que recibe por nombre
Estructura de Datos.
Lo que en ABAP se conoce como Estructura de Datos, en otros lenguajes
de programación podrían conocerse como Arreglos o Registros, sería de
manera general una analogía válida.
En el capítulo de los Tipos de Datos, pudimos ver cómo se pueden crear
Estructuras de Datos directamente desde el editor ABAP.
a) Declarando las variables (campos) en el mismo editor.
www.aprendeabap.com – AprendeABAP en 7 días
24
DATA: BEGIN OF nombre_estructura,
var1 TYPE i,
var2 TYPE i,
END OF nombre_estructura.
b) Tomando como referencia una Estructura de Datos ya creada en el
Diccionario.
DATA BEGIN OF sociedad.
INCLUDE STRUCTURE SYST.
DATA END OF sociedad.
También, las Estructuras de Datos pueden crearse en el Diccionario, como
la Estructura <SYST> usada en el ejemplo anterior, que contiene las
variables del sistema.
Una Estructura de Datos contiene un único registro o línea; si deseamos
guardar múltiples registros con la misma Estructura, tendremos que pasar
a crear una Tabla basada en dicha Estructura de Datos.
www.aprendeabap.com – AprendeABAP en 7 días
25
Las TABLAS son objetos, basados en estructuras de datos, capaces de
almacenar gran cantidad de información en múltiples líneas de registros.
Un ejemplo de tablas en el Diccionario de Datos lo vimos en la imagen que
reflejaba la tabla SFLIGHT; y si en un programa quisiéramos crear una
tabla cuya forma sea similar a la estructura de datos <SYST>; lo podríamos
hacer de la siguiente manera:
DATA: itab TYPE TABLE OF SYST.
Tipos de tablas.
Existen diversos tipos de tablas:
• Tablas TRANSP (transparentes): Tablas normales relacionales
(SQL).
• Tablas POOL: Tablas SAP que se guardan junto a otras tablas SAP
en una única tabla física de Base de Datos. Mejorando el acceso a
los registros.
• Tablas CLUSTER: Varias tablas que se guardan en un cluster de
Base de Datos. Se guardan registros de varias tablas SAP con la
misma clave cluster, en el mismo cluster físico de la base de
datos.
Las que usaremos cada día serán las Tablas Transparentes, que es el
nombre que le da SAP a las Tablas de Base de Datos relacionales. De
hecho, los dos términos más comunes utilizados en el día a día de un
Consultor ABAP son “Tablas Transparentes” y “Tablas Internas”; ya
comprendimos que las primeras son las Tablas del Diccionario de Datos, y
las segundas son espacios de memoria que se utilizan dentro de un
Programa, cuya existencia es únicamente en tiempo de ejecución del
Programa en cuestión.
www.aprendeabap.com – AprendeABAP en 7 días
26
Los datos en SAP.
Los datos en SAP se pueden clasificar de la siguiente manera:
• Datos maestros: Son datos que no se modifican muy a menudo.
Ejemplo: Materiales, Cuentas, Bancos, Clientes. Se almacenarán
en Tablas transparentes.
• Datos de movimientos: Datos muy volátiles y con gran volumen de
generación. Ejemplo: Facturas, Pedidos. Se suelen guardar en
Tablas tipo CLUSTER todos ellos con formato parecido
(documentos).
• Datos del sistema o de control: Muchas Tablas con pocos datos. Se
suelen guardar en Tablas de tipo POOL.
Instrucciones SQL de ABAP.
El lenguaje ABAP tiene un conjunto de sentencias SQL para su aplicación
sobre tablas de la Base de Datos SAP.
Algo muy interesante de este Entorno de Programación, es que, a
diferencia de otros lenguajes, no se requiere realizar ningún tipo de
protocolo de conexión con la Base de Datos; escribimos directamente las
sentencias SQL y el sistema se encarga de comunicarse con el Diccionario
de Datos de manera implícita para nosotros.
Las siguientes son las instrucciones SQL permitidas:
• SELECT - Lectura.
• INSERT - Insertar.
• UPDATE - Actualizar.
• MODIFY - Modificar.
• DELETE - Eliminar.
www.aprendeabap.com – AprendeABAP en 7 días
27
• COMMIT WORK - Asentar cambios.
• ROLLBACK WORK - Revertir cambios.
Adicionalmente, contamos con las siguientes variables del sistema:
• SY-SUBRC: Código de retorno de una operación. El valor 0 indica
que la instrucción fue satisfactoria y se cumplió el objetivo, bien
sea obtener datos de una Tabla, o insertar/modificarlos; un
retorno con valor 4 indica que la consulta no arrojó datos, o bien
no se pudo insertar/modificar en un Tabla del d Diccionario.
• SY-DBCNT: Cantidad de registros afectados por la operación
procesada si se trata de una modificación/inserción, o bien la
cantidad de registros encontrados en una consulta.
SELECT: Instrucción fundamental para leer información de la Base de
Datos.
Lectura de un único registro:
SELECT SINGLE * FROM <tab> WHERE <cond>.
Si SY-SUBRC = 0. Registro encontrado. Resultado en <tab>.
Si SY-SUBRC = 4. No existe el registro buscado.
Lectura Iterativa: Selección de un grupo de registros.
SELECT * FROM <tab> (WHERE <cond>). ENDSELECT.
Selecciona cada uno de los registros que cumplan la condición de la
cláusula WHERE, (o todos en caso de no utilizarla). El resultado lo
tendremos en el área de trabajo <tab>. En cada iteración del ciclo SELECT
- ENDSELECT se procesa un único registro encontrado, y el ciclo se
repetirá tantas veces como registros se consigan. Es útil si se desea
realizar algún tratamiento a cada registro encontrado de una vez.
www.aprendeabap.com – AprendeABAP en 7 días
28
Si SY-SUBRC = 0. Algún registro encontrado.
Si SY-SUBRC = 4. No existe ningún registro que cumpla la
condición del WHERE.
Ejemplo:
SELECT *
FROM mara
WHERE matnr = itab-matnr.
WRITE: mara-matnr.
END SELECT.
Por cada registro encontrado, se imprime en pantalla el valor de dicho
registro y se sigue leyendo en la tabla en búsqueda de más registros.
Otras posibilidades del WHERE:
SELECT * FROM <tab> WHERE <campo>... BETWEEN <var1> AND
<var2>.
Si <campo> está entre los valores <var1> y <var2>.
LIKE <literal condición>. Si <campo> cumple la condición.
También se pueden utilizar:
• ‘_’ como caracter cualquiera.
• ‘%’ como una cadena de caracteres.
• IN (<var1>, <var2>...). Si <campo>está en el conjunto de valores
<var1>, <var2>...
www.aprendeabap.com – AprendeABAP en 7 días
29
Otras lecturas:
Podemos leer una Tabla de Base de Datos y simultáneamente llenar una
Tabla Interna con el resultado de la lectura.
SELECT * FROM <tab> INTO TABLE <intab> (WHERE <cond>).
Esta instrucción lee la Base de Datos, obtiene todos los registros que
cumplan con la condición, y los almacena en una Tabla Interna llamada
<itab>.
A diferencia del ciclo SELECT – ENDSELECT, en el que por cada acierto se
procede a leer en la Base de Datos; aquí se realiza un único acceso a las
Tablas para extraer todos los registros que cumplan con la condición.
Si bien ambas opciones cumplen con el mismo resultado, por temas de
rendimiento recomiendo utilizar esta última ya que se consumen menos
recursos con un único acceso a BD, para obtener todas las coincidencias
en una Tabla Interna, y luego procesar esos resultados desde la Tabla
Interna, que como ya sabemos, es un objeto propio del Programa en
ejecución.
Veamos cómo queda el mismo ejemplo del caso anterior:
SELECT *
INTO TABLE itab
FROM mara
WHERE matnr = itab-matnr.
LOOP AT itab.
WRITE: itab-matnr.
ENDLOOP.
www.aprendeabap.com – AprendeABAP en 7 días
30
NOTA: En un capítulo posterior veremos que es un LOOP.
Podemos indicar un orden en el proceso de selección de registros.
SELECT *...ORDER BY <campo1><campo2>.
No requiere mayor explicación salvo que el criterio de ordenamiento
siempre es prevaleciendo el campo de la izquierda.
INSERT: Permite introducir registros sencillos o el contenido de una Tabla
Interna en una Tabla Transparente del Diccionario de Datos SAP.
INSERT <tab>.
Grabará en la BD el contenido de la Estructura <tab>.
Si SY-SUBRC = 0.Registro insertado.
Si SY-SUBRC > 0.La clave del registro que queríamos insertar ya
existía en la tabla.
También es posible introducir datos desde una Tabla Interna.
INSERT <tab> FROM TABLE <itab>.
Si SY-SUBRC = 0.Registros insertados.
Si existe algún registro en la BD (Base de Datos) con clave igual a algún
registro de la Tabla Interna, se producirá un error de ejecución del
programa. (Por registro duplicado).
UPDATE: Permite modificar el contenido de uno o varios registros.
UPDATE <tab>.
Modifica el registro de la Tabla del Diccionario de Datos que está
especificado en la estructura <tab>.
Si queremos modificar el contenido de más de un registro a la vez:
www.aprendeabap.com – AprendeABAP en 7 días
31
UPDATE <tab> SET <campo>=<valor> WHERE <cond>.
Con este UPDATE, todos los registros que cumplan <cond> modificarán el
contenido del <campo> por <valor>.
Es posible modificar registros desde una Tabla Interna:
UPDATE <tab> FROM TABLE <intab>.
Si el sistema no puede actualizar un registro, el proceso no finalizará sino
que continuará con el siguiente registro.
Si SY-SUBRC = 0. Todos los registros modificados.
Si SY-SUBRC = 4. No todos los registros han sido modificados.
En SY-DBCNT Tendremos la cantidad de registros modificados.
MODIFY: Se utiliza cuando no se sepa con certeza si un registro existe o
no, para modificarlo o añadirlo.
MODIFY <tab>.
MODIFY <tab> FROM TABLE <intab>.
NOTA: En caso de conocerse la existencia o no de un registro, se
recomienda utilizar INSERT o UPDATE.
DELETE: Se utiliza para realizar borrados de datos en una BD del
Diccionario.
DELETE <tab>. Borrará el registro que especifiquemos en el área
de trabajo.
DELETE FROM <tab> WHERE <cond>. Para borrar más de un
registro (todos los que cumplan la condición <cond>).
www.aprendeabap.com – AprendeABAP en 7 días
32
DELETE FROM <tab> FROM TABLE <itab>. Para borrar en la Tabla
Transparente <tab>, todos los registros contenidos en la Tabla
Interna <itab>.
Si SY-SUBRC = 0. Todos los registros han sido borrados.
Si SY-SUBRC = 4. No todos los registros han sido borrados.
En SY-DBCNT tendremos la cantidad de registros borrados.
Otros aspectos del Diccionario de Datos.
El control de mandante (ese numerito que representa el sistema al que
estamos conectados), es automático. Siempre se procesará el mandante
en uso; en caso de requerir procesar datos de otro cliente/mandante
diferente al que estamos conectados, utilizaremos la instrucción CLIENT
SPECIFIED en nuestras consultas al Diccionario.
Debemos evitar el uso de las instrucciones INSERT, DELETE, MODIFY y
UPDATE sobre las Tablas de Datos Maestros del Diccionario; si requerimos
hacer un cambio a nivel de datos, éstos se harán vía Transacciones
estándar, Módulos de Funciones (BAPI) o Bath Input; ya que los datos que
se guardan en una transacción suelen estar replicados en diferentes
Tablas (Modelo de BD Relacional), y si modificamos el contenido de una
Tabla en particular, podríamos generar inconsistencias importantes en el
sistema.
Actualización de la Base de Datos.
Si deseamos forzar un cambio que afecta alguna tabla de la Base de
Datos, debemos ejecutar la sentencia COMMIT WORK en nuestros
Programas, esta sentencia realiza un UPDATE físico en la BD, haciendo
irrevocable cualquier modificación.
www.aprendeabap.com – AprendeABAP en 7 días
33
Si deseamos deshacer los cambios hechos luego del último COMMIT
WORK, utilizaremos la sentencia ROLLBACK WORK, esta sentencia nos
reversa los cambios hasta el estado en que se encontraban tras el último
COMMIT WORK ejecutado.
Chequeo de autorizaciones.
Todas las consultas SQL en SAP no realizan verificación alguna sobre
autorizaciones de usuarios, siendo esto algo que debemos controlar para
evitar que todos los usuarios puedan acceder a determinado tipo de
información.
Este control es responsabilidad del consultor ABAP, determinar si un
usuario tiene o no autorización a nuestros desarrollos.
Para determinar la autorización de los usuarios en nuestros desarrollos se
utilizará el siguiente trozo de código:
AUTHORITY-CHECK.
AUTHORITY-CHECK OBJECT <objeto_de_autorización>
ID <Campo1> FIELD <f1>
ID <Campo2> FIELD <f2>
ID <Campo3> DUMMY.
...
Esto se conoce como OBJETO DE AUTORIZACIÓN o AUTHORITY-CHECK, en
el uso diario solemos escucharlo de ambas maneras, veamos los campos
que contiene:
<CampoX> son los campos de autorización del objeto. (se le indica sobre
que campos del sistema se va a evaluar la autorización).
<fX> son los valores posibles de autorización de dichos campos. (leer,
modificar, ambos, ninguno).
www.aprendeabap.com – AprendeABAP en 7 días
34
DUMMY es un parámetro que indica que no es necesario verificar este
campo.
Si al procesar el objeto, el campo del sistema SY-SUBRC es igual a 0, es
que el usuario está autorizado a ver/procesar la información, de lo
contrario, indica que no tiene los permisos para ello.
Lo común es que en nuestros desarrollos, indiquemos este Objeto al
comienzo del mismo, y luego verifiquemos el SY-SUBRC, permitiendo
continuar con la ejecución solo si el valor del campo es 0.
Veamos un ejemplo de cómo se llenan los campos para el Objeto de
Autorización:
Vamos a verificar el Authority Check “Acreedor: Autorizaciones para
Sociedades” para saber si un usuario puede visualizar Proveedores en la
Sociedad 0001.
Este Objeto de Autorización estándar se llama ‘F_LFA1_BUK’.
La operación Visualizar responde al código ‘01’ y el campo sobre el cual
queremos evaluar la propiedad de visualización se llama ‘ACTVT’. El
campo Sociedad, por su parte, se llama ‘BUKRS’.
Así quedaría el Authority Check:
AUTHORITY CHECK OBJECT ‘F_LFA1_BUK’
ID ‘ACTVT’ FIELD ‘01’
ID ‘BUKRS’ FIELD ‘0001’.
Con esto cubrimos el apartado del Diccionario de Datos, el siguiente tema
a estudiar serán las Tablas Internas.
www.aprendeabap.com – AprendeABAP en 7 días
35
Día 3: Tablas Internas.
En este capítulo veremos una herramienta muy útil que tendremos a
disposición en nuestros Programas y desarrollos; éstas son las
denominadas “Tablas Internas”.
Son Tablas construidas a partir de Estructuras de Datos definidas, que nos
permitirán gestionar datos masivos internamente en nuestros desarrollos.
Estas Tablas Internas se crean dentro de cada Programa, por lo tanto, su
vida útil se limita al tiempo de ejecución de nuestros Programas, sus datos
se pierden cuando abandonamos dicho Programa/Transacción.
Las Estructuras de Datos que sirven de base para la construcción de las
Tablas Internas, bien pueden ser creadas internamente en el programa
(Transacción SE38 o SE80), o formar parte del Diccionario de Datos del
sistema; la ventaja de que las Estructuras de Datos se creen en el
Diccionario (SE11), es que la misma Estructura nos podría ser útil en varios
Programas diferentes.
¿Qué son?
Cuando desde un Programa realizamos una consulta en Base de Datos a
través de sentencias SQL, solemos requerir que los resultados se guarden
en alguna Estructura de nuestro Programa, para su posterior tratamiento.
Estas son las Tablas Internas.
Las Tablas Internas son, como su nombre lo indica, Tablas; pero se
diferencian de las Tablas del Diccionario de Datos en que éstas solo están
disponibles DENTRO de un Programa.
www.aprendeabap.com – AprendeABAP en 7 días
36
Son Objetos cuya función es el tratamiento de varios registros
exclusivamente durante la ejecución de un Programa.
Las Tablas Internas tienen dos formas de declararse:
DATA: BEGIN OF <itab> OCCURS <n>
<campo> TYPE <tipo_campo>,
<campo> TYPE <tipo_campo>,
END OF <itab>.
<itab> es el nombre que le daremos a la Tabla Interna.
OCCURS <n> es el número de registros que se guardaran en memoria
simultáneamente. Las Tablas pueden ser de mayor cantidad, esta
sentencia solo determina la cantidad de memoria reservada para su
tratamiento (cantidad de registros a atender por vez).
<campo> es el nombre del campo (columna) de la Tabla Interna, y este
campo será de tipo <tipo_campo> (entero, string, igual a algún campo del
Diccionario; etc. - ver Día 2-).
La otra forma de declarar una Tabla Interna es como sigue:
TYPES: BEGIN OF <estructura>,
<campo> TYPE <tipo_campo>,
<campo> TYPE <tipo_campo>,
END OF <estructura>.
DATA: <itab> TYPE TABLE OF <estructura> .
<estructura> es una Estructura de Datos del Programa que será el
“esqueleto” de la Tabla Interna (ver día 2); luego se declara la Tabla
Interna <itab> del tipo Tabla cuya Estructura será <estructura> .
Yo suelo usar más esta segunda opción.
www.aprendeabap.com – AprendeABAP en 7 días
37
Líneas de Cabecera y Work Areas.
Una Tabla Interna se compone de un cuerpo y una cabecera opcional; el
cuerpo es que el almacena los registros de la Tabla Interna, normalmente
cuando se habla de Tabla Interna, nos referimos al cuerpo.
La cabecera es un único registro que se utiliza para añadir y recoger datos
del cuerpo de la Tabla Interna.
La asignación de campos de las Tablas Internas siempre se refiere a la
cabecera, por lo que debemos tener esto presente a la hora de hacerle
tratamiento a dicha Tabla.
Debemos declarar una línea de cabecera, para leer cada registro de la
Tabla, o bien declarar la Tabla misma con línea de cabecera.
Con cabecera:
DATA: <itab> TYPE TABLE OF <estructura> WITH HEADER LINE.
Sin cabecera:
DATA: <itab> TYPE TABLE OF <estructura>.
DATA: <line> LIKE LINE OF <itab>.
Con la primera instrucción, la cabecera también se llamará <itab>, por lo
que tendremos la sensación de que leemos la Tabla Interna directamente.
Ejemplo:
LOOP AT <itab>.
WRITE: <itab>-<campo1>.
ENDLOOP.
www.aprendeabap.com – AprendeABAP en 7 días
38
Con la segunda instrucción, cada registro que se lea de <itab>deberá
tratarse desde <line>, que es la línea de cabecera de la Tabla Interna.
Ejemplo:
LOOP AT <itab> INTO <line>.
WRITE: <line>-<campo1>.
ENDLOOP.
En el primer LOOP; la línea de cabecera no es que desaparece, de hecho
existe, solo que lleva el mismo nombre que la Tabla Interna por lo que se
omite la sentencia INTO y se trata directamente con <itab>.
Work Area
Si queremos disponer de una variable que nos sirva para manipular los
datos de una <itab>, con su misma Estructura, están los que se conocen
como “work area” o “área de trabajo”.
Son Estructuras con la misma forma que un registro de una Tabla Interna,
similar a sus líneas de cabecera, y se declaran de la siguiente manera:
DATA: <wa> TYPE <itab>.
Esto nos creará un work area llamado <wa> del mismo tipo que la línea de
cabecera <itab>.
Llenar una Tabla Interna
Para ingresar datos a una Tabla Interna, tenemos las siguientes
sentencias:
APPEND: Añade un registro a una Tabla Interna con los valores que
tengamos en dicho registro.
www.aprendeabap.com – AprendeABAP en 7 días
39
Ejemplos:
APPEND <itab>. (con cabecera).
APPEND <itab> FROM <line>. (sin cabecera).
READ: Lee un registro de la Tabla Interna y lo guarda en su línea de
cabecera, el registro que leerá lo determinará la condición que le
indiquemos.
Ejemplos:
READ TABLE <itab> WITH KEY <condicion> (con cabecera).
READ TABLE <itab> INTO <line> WITH KEY <condicion> (sin
cabecera).
READ TABLE <itab> INDEX <n>. (Esta instrucción lee el registro
ubicado en la línea <n>).
INSERT: Inserta un registro contenido en un workarea en una Tabla
Interna.
Ejemplos:
INSERT <itab>. (con cabecera).
INSERT <wa> INTO <itab>. (sin cabecera).
MODIFY: Modifica el registro indicado en la Tabla Interna.
Ejemplos:
MODIFY <itab>. (con cabecera).
MODIFY <itab> FROM <line> (sin cabecera).
MODIFY <itab> INDEX <n> (modifica el registro de la posición <n>)
DELETE: Elimina el registro indicado de la Tabla Interna.
Ejemplos:
DELETE <itab>. (con cabecera).
DELETE <itab> FROM <line> (sin cabecera).
www.aprendeabap.com – AprendeABAP en 7 días
40
DELETE <itab> INDEX <n> (elimina el registro de la posición <n>)
COLLECT: Añade o suma la línea de cabecera. Sumará los campos tipo P, F,
I (ver día 2), si existe una línea en la Tabla con campos idénticos (tipo C) a
los del work area.
Pero cuidado con su uso, ya que se trata de una instrucción que consume
mucho en memoria.
Ordenar una tabla interna
Para ordenar los registros de una Tabla Interna, utilizamos la instrucción
SORT (ordenar en Inglés), y le indicamos por cuales campos debe ordenar,
(si se le indican varios campos, el lenguaje le da prioridad de izquierda a
derecha), luego podremos indicarle si queremos que se ordenen de
manera ascendente o descendente. (Por defecto siempre será
ascendente).
Ejemplo:
SORT <itab> BY <campo1> ….
<campoN><ASCENDING/DESCENDING>.
Procesamiento de una Tabla Interna.
Para recorrer los registros de una Tabla Interna, utilizaremos la
instrucción LOOP.
LOOP AT <itab> (WHERE <cond>)
. . .
ENDLOOP. (con cabecera)
LOOP AT <itab> INTO <line> (WHERE <cond>)
. . .
ENDLOOP. (sin cabecera)
www.aprendeabap.com – AprendeABAP en 7 días
41
En cada iteración, la instrucción coloca la línea de la Tabla que se está
procesando en la línea de cabecera.
Con la cláusula WHERE podemos filtrar los registros que leeremos en el
LOOP, tal cual como lo haríamos en una consulta SQL.
Si no existe ningún registro que cumpla con la condición de la cláusula
WHERE, la variable SY-SUBRC será diferente de 0 y no habrán iteraciones
en el LOOP.
Mientras haya iteraciones dentro de un LOOP, con la variable del sistema
SY-TABIX podremos saber cuál es el índice del registro que se procesa en
un momento dado.
Tratamiento de niveles de ruptura.
Existen algunas sentencias para registros puntuales de una Tabla Interna
dentro del LOOP.
• AT FIRST: Instrucciones específicas para el primer registro de
la Tabla.
• AT LAST: Instrucciones específicas para el último registro de la
Tabla.
• AT NEW <campo>: Instrucciones para cada inicio de nivel de
ruptura o valor diferente.
• AT END OF <campo>: Instrucciones para cada final de nivel de
ruptura.
Todas estas instrucciones tienen la siguiente forma:
AT _____ (FIRST, LAST, NEW <campo>, END OF <campo>)
. . .
END AT.
www.aprendeabap.com – AprendeABAP en 7 días
42
Dentro de la cláusula AT .. ENDAT irán las instrucciones que queremos
programar para ese registro en particular.
Otras instrucciones para manejo de Tablas Internas.
• CLEAR <itab> o CLEAR <line>. Limpiar la cabecera de la Tabla
Interna.
• REFRESH <itab>. Borra el contenido de la Tabla Interna.
• FREE <itab>. Libera espacio ocupado en memoria por la Tabla
Interna.
• DESCRIBE TABLE <itab> LINES <wa>. Obtiene información de
la Tabla Interna, como la cantidad de líneas o registros que
contiene.
www.aprendeabap.com – AprendeABAP en 7 días
43
Día 4: Entorno de Programación.
Si has seguido las recomendaciones hasta ahora, ya estarás en la
capacidad de hacer lo siguiente:
• Manejar el Diccionario de Datos a través de la transacción SE11.
• Revisar y escribir sencillos trozos de código en un programa creado en
la transacción SE38. (al menos crear Tablas Internas, variables y
Estructuras correctamente).
Ahora vamos a adentrarnos más en el Entorno de Programación, con
seguridad este será el capítulo más importante en este libro, por lo que te
pido por favor que prestes mucha atención al material a continuación.
¿Cómo se crea un Programa ABAP?
Para crear un Programa ABAP, se puede hacer desde dos
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).
www.aprendeabap.com – AprendeABAP en 7 días
44
Teclear el código, pulsar ENTER o el botón verde, y nos llevará a dicha
transacción.
SE38
Al ingresar a la Transacción SE38, nos lleva a la siguiente ventana:
Para efectos de este libro, 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:
www.aprendeabap.com – AprendeABAP en 7 días
45
• - Verificar la sintaxis del Programa. (Ver si contiene errores).
• - Activar un Programa. (Lo hará si no contiene errores).
• - Procesar/ejecutar un Programa. (También funciona con la tecla
F8).
• - Borrar un Programa. (Te pedirá que confirmes que quieres
eliminarlo).
• - Copiar un Programa. (Te pedirá el nombre del nuevo).
• - Renombrar un Programa. (Indicándole 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 nos pedirá 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:
www.aprendeabap.com – AprendeABAP en 7 días
46
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”.
Luego nos aparecerá la siguiente ventana:
www.aprendeabap.com – AprendeABAP en 7 días
47
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 (Estamos 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, pasamos a la siguiente pantalla:
www.aprendeabap.com – AprendeABAP en 7 días
48
Este es el editor ABAP en el cual podrás escribir el código de tus
Programas.
SE80
Al ingresar a la Transacción SE80, nos lleva a la siguiente ventana:
www.aprendeabap.com – AprendeABAP en 7 días
49
Desde esta Transacción, tendremos el control de todos los objetos del
Repositorio de Objetos del sistema.
Por ahora, nos interesa de las pestañas superiores, seleccionar “Browser
de Repository”.
www.aprendeabap.com – AprendeABAP en 7 días
50
¿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 los siguientes:
• 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.
www.aprendeabap.com – AprendeABAP en 7 días
51
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>.
El código de arriba puede ser escrito en una única instrucción de la
siguiente manera, (añadiendo los dos puntos al final):
WRITE: <campo1>, <campo2>, <campo3>.
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 reescribirse de la siguiente forma:
DATA:<campo1>,
<campo2>,
<campo3>.
www.aprendeabap.com – AprendeABAP en 7 días
52
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
Objetos de Datos
En ABAP, existen tres tipos de objetos de datos que podemos
utilizar en nuestros programas:
Literales.
Campos del Diccionario
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).
www.aprendeabap.com – AprendeABAP en 7 días
53
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 mismaEstructura, tampoco se trata de una Tabla, sino
de su línea de cabecera, no contienen los registrosde la Tabla a menos
que los obtengamos en una sentencia SQL.
Ejemplo:
Podemos llenar los valores de la Tabla KNA1 en la Estructura creada con la
sentencia TABLES 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 mismo; las Tablas Internas están incluidas aquí.
Ejemplo:
DATA: ventas TYPE p,
Cliente TYPE KNA1-KUNNR,
Itab TYPE TABLE OF<estructura>.
www.aprendeabap.com – AprendeABAP en 7 días
54
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, bastante útil en reportes).
<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>. (Instrucciones 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 estos 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.
IF<cond>.
. . A. .
ELSE.
www.aprendeabap.com – AprendeABAP en 7 días
55
. . 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 variable es menor que otra.
GE ó ‘>=’. GREAT-EQUAL. Evalúa que una variable sea mayor o igual
que otra.
LE ó ‘<=’. LESS-EQUAL. 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
www.aprendeabap.com – AprendeABAP en 7 días
56
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.
CASE<campo>.
WHEN<valor1>.
WHEN<valor2>.
ENDCASE.
Un ejemplo para entenderlo:
En vez de escribir esto:
IF<var1>EQ ‘2’.
#imprimirA.
ELSEIF<var1>EQ ‘4’.
www.aprendeabap.com – AprendeABAP en 7 días
57
#imprimirB.
ELSE.
#imprimirC.
ENDIF.
Podría reescribirse de la siguiente manera:
CASE<var1>.
WHEN ‘2’. #imprimirA.
WHEN ‘4’. #imprimirB.
WHENOTHERS. #imprimirC.
ENDCASE.
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.
www.aprendeabap.com – AprendeABAP en 7 días
58
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>. Cuando no se cumpla la condición, la sentencia responderá
de dos posibles formas. Si la sentencia está dentro de un ciclo,
interrumpirá el resto del ciclo, saliendo inmediatamente del mismo. Si la
sentencia está fuera de un ciclo, saltará hasta el final del Evento actual.
EXIT. Realizará los mismos pasos que CHECK, pero sin ningún
condicionante.
STOP. Se finaliza el Programa en ejecución, pasando primero por el
Evento END-OF- SELECTION.
LEAVE. Igual que STOP, pero sin ejecutar el evento END-OF-SELECTION.
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á.
www.aprendeabap.com – AprendeABAP en 7 días
59
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>LIKEi.
También pueden declararse de la siguiente manera:
PARAMETERS: <var1>LIKE<tipo_de_dato>,
<var2>LIKE<tipo_de_dato>.
Dentro del Programa, podremos utilizar estas variables por el
nombre que le asignamos al momento de su declaración, <var1> y
<var2>.
RADIO BUTTONS
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
RADIO BUTTONS, y los declaramos de la siguiente manera:
www.aprendeabap.com – AprendeABAP en 7 días
60
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.
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.
www.aprendeabap.com – AprendeABAP en 7 días
61
En vez de ser botones agrupados de selección simple, tenemos casillas
de selección múltiple.
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 siguiente 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>.
www.aprendeabap.com – AprendeABAP en 7 días
62
La ventana de arriba la logramos con el siguiente código:
selection-screen begin of block b2 with frame title
text-002. parameters: var1 radiobutton group r1,
var2 radiobutton group r1,
var3 radiobutton group r1.
selection-screen end of block b2.
Podemos 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.
www.aprendeabap.com – AprendeABAP en 7 días
63
Agregamos el texto descriptivo en el área que se encuentra al lado del
número asignado:
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, por ejemplo:
www.aprendeabap.com – AprendeABAP en 7 días
64
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.
www.aprendeabap.com – AprendeABAP en 7 días
65
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:
Nos generará 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.
www.aprendeabap.com – AprendeABAP en 7 días
66
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.
www.aprendeabap.com – AprendeABAP en 7 días
67
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.
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. Puede contener las
condiciones que hemos visto anteriormente (EQ, GT, GE, LT, etc.)
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
www.aprendeabap.com – AprendeABAP en 7 días
68
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>.
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, para
obtener la siguiente Pantalla de Selección:
www.aprendeabap.com – AprendeABAP en 7 días
69
Se utilizaron las siguientes líneas de código:
www.aprendeabap.com – AprendeABAP en 7 días
71
Día 5: Sub Rutinas.
En ocasiones, cuando estamos programando, debemos elaborar cierta
porción de código que cumpla alguna función, (por ejemplo, sumar dos
variables), que sabemos que utilizaremos en otras secciones de nuestro
Programa.
Para evitar tener que escribir el código varias veces en estos casos, existen
los Módulos y Sub Rutinas, trozos de código que cumplen alguna función,
que se ejecutan en un lugar apartado de nuestra secuencia de
instrucciones principal, en la que solo tenemos que invocarlas, y recibir su
resultado.
De eso trata este nuevo capítulo.
¿Qué son las Sub Rutinas?
Las Sub Rutinas forman parte de la Programación Modular, esto es,
ejecutar cierta porción de código en un lugar externo con respecto al flujo
de sentencias principal.
Es de utilidad si se requiere una misma funcionalidad para varios reportes
o partes de un mismo Programa. También permite una mayor limpieza en
el código escrito para su mejor entendimiento.
Usemos una calculadora como ejemplo práctico, en la cual diseñaremos
las siguientes funciones matemáticas: suma, resta, multiplicación,
división, potenciación y raíz cuadrada.
Estructuraremos el código con el condicional CASE-ENDCASE que vimos
anteriormente, para controlar las diferentes funciones.
www.aprendeabap.com – AprendeABAP en 7 días
72
(El usuario selecciona una función y la capturamos en la variable
<función>).
Podemos escribir el código de forma directa.
CASE<función>.
WHEN 'SUMA'. (Código necesario para realizar la suma).
WHEN 'RESTA'. (Código necesario para realizar la resta).
WHEN 'MULTIPLICACION'. (Código necesario para realizar la
multiplicación).
WHEN 'DIVISION'. (Código necesario para realizar la
división).
WHEN 'RAIZ'. (Código necesario para realizar la raíz).
WHEN 'POTENCIACION'. (Código necesario para realizar la
potenciación).
ENDCASE.
Operaciones como la 'RAIZ', requiere repetir las mismas instrucciones que
la 'DIVISION'; mientras que la 'POTENCIACION' utiliza instrucciones
aplicadas a la 'MULTIPLICACION'; por lo que, si escribimos el código de
forma lineal, estaríamos repitiendo código, haciendo menos legible el
código que creamos.
Para ello existe la Modularización, que nos permite estructurar el flujo del
Programa en Rutinas Externas para un mejor performance y
entendimiento.
Si escribimos el Programa de la calculadora de manera modularizada,
quedaría así.
www.aprendeabap.com – AprendeABAP en 7 días
73
CASE<función>.
WHEN 'SUMA'. (Llamado a rutina SUMA).
WHEN 'RESTA'. (Llamado a rutina RESTA).
WHEN 'MULTIPLICACION'. (Llamado a rutina MULTIPLICACION).
WHEN ‘DIVISION'. (Llamado a rutina DIVISION).
WHEN 'RAIZ'. (Llamado a rutina RAIZ).
WHEN 'POTENCIACION'. (Llamado a rutina POTENCIACION).
ENDCASE.
Luego, en otro lugar del programa, se creará el contenido de cada rutina.
RUTINA 'SUMA'.
...
FINRUTINA.
RUTINA 'MULTIPLICACION'.
....
FINRUTINA.
RUTINA 'DIVISION'.
...
FINRUTINA.
Cuando creemos la rutina 'RAIZ', en su interior podemos hacer el llamado
a la rutina 'DIVISION', de la misma manera que se hizo en el CASE-
ENDCASE para el WHEN 'DIVISION'.
www.aprendeabap.com – AprendeABAP en 7 días
74
RUTINA 'RAIZ'.
...
Llamado a rutina 'DIVISION'.
...
FINRUTINA.
Para el caso de la 'POTENCIACION', aplica lo mismo.
RUTINA 'POTENCIACION'.
...
Llamado a rutina 'MULTIPLICACION'.
...
FINRUTINA.
Tipos de Sub Rutinas
Existen 3 tipos de Sub Rutinas o Sub Programas.
• Internas: El código de la Sub Rutina está dentro del Programa que
la llama.
• Externas: La Sub Rutina está en un Programa distinto al que llama.
• Biblioteca de Funciones (Módulos de Función): Funciones
externas al Programa con interface de llamada claramente
definido. (De este tipo se hablará en el siguiente capítulo).
www.aprendeabap.com – AprendeABAP en 7 días
75
Sub Rutinas internas
Las Sub Rutinas se codifican al final del Programa principal, tras todos los
eventos.
No se pueden anidar. Se puede salir de una Sub Rutina con un EXIT (salida
incondicional) o un CHECK (salida condicional), si estas sentencias no
están dentro de un bucle.
Sólo dentro de una Sub Rutina se puede usarse la sentencia
LOCAL<campo>, para declarar variables locales a la Sub Rutina (sólo
visibles dentro de ella). Deja oculto el valor de ese campo que tuviera
antes de entrar a la Sub Rutina, y lo restaura al salir de ésta.
Las instrucciones para llamados y declaración de Sub Rutinas son las
siguientes:
PERFORM<modulo>. Llamada a un procedimiento o sub
programa.
FORM<modulo>
.... __Subprograma.
ENDFORM.
El Programa principal y el procedimiento se podrán comunicar mediante
parámetros.
PERFORM<modulo>USING var1 var2...
FORM<modulo>USING var1 var2...
...
ENDFORM.
www.aprendeabap.com – AprendeABAP en 7 días
76
Los parámetros pueden ser pasados por valor o por referencia. Por
defecto serán por referencia.
• Valor: El campo se pasa a modo de lectura únicamente, es decir,
no podrá ser modificado dentro del módulo.
• Referencia: El campo se pasa al módulo de manera editable,
permitiendo su modificación dentro del mismo.
Si queremos utilizar parámetros por valor, la cabecera del módulo será:
FORM<modulo>USING VALUE (var1).
...
ENDFORM.
Si queremos utilizar parámetros que puedan ser modificados dentro de la
Sub Rutina, se escribirían así:
PERFORM<modulo>CHANGING var1 var2.
FORM<modulo>CHANGING var1 var2.
...
ENDFORM.
Con la instrucción CHANGING, estamos permitiendo que los campos
pasados como parámetros puedan haber cambiado su valor al regresar de
la Sub Rutina.
Tanto las variables definidas al inicio del Programacomo las Tablas son
globales a todas las Sub Rutinas y por tanto accesibles en cualquier
momento, por lo que dichas variables declaradas al comienzo no
requieren ser pasadas explícitamente en los llamados a Módulos o Sub
Rutinas.
www.aprendeabap.com – AprendeABAP en 7 días
77
Si encontramos alguna instrucción del tipo CHECK o EXIT que signifique
salir de un cierto FORM, previamente ejecutará el ENDFORM y por tanto
se pasarán los parámetros que tenga el procedimiento.
También es posible pasar como parámetro Tablas Internas.
PERFORM<modulo>TABLES<itab>...USING<var1><var2>...
FORM<modulo>TABLES<itab>USING<var1>...
...
ENDFORM.
Especificaremos las Tablas siempre antes que el resto de parámetros.
En este caso sólo se pueden hacer operaciones con filas enteras, pero no
nos podremos referenciar sobre campos concretos de la Tabla o hacer
COLLECTS (totalizaciones), ya que no se conocerá la Estructura de la
Tabla.
Podemos pasar como parámetros registros de datos o áreas de trabajo
con:
PERFORM<modulo>USING<reg>.
FORM<modulo>USING<reg>STRUCTURE<estructura>.
...
ENDFORM.
www.aprendeabap.com – AprendeABAP en 7 días
78
Es decir, con la cláusula STRUCTURE podemos pasar la Estructura de una
Tabla, entonces podemos acceder a campos de una Tabla pasada como
parámetro con:
PERFORM<modulo>TABLES<itab>USING<var1>...
FORM<modulo>TABLES<itab>STRUCTURE<estructura>USING<var
1>...
....
ENDFORM.
Dentro de cada Sub Rutina es posible declarar datos con la sentencia
DATA, que sólo serán visibles dentro del Módulo donde esté declarado.
ABAP/4 creará un espacio para esas variables que será liberado al salir del
Módulo. Por tanto se podrán utilizar variables con el mismo nombre que
variables globales, aunque el valor que tengan será siempre el local en el
Módulo o Sub Rutina.
NOTA: Las Tablas de Base de Datos son globales a todo el Programa, si se
quiere utilizar una Tabla localmente en una Sub Rutina, se debe declarar
con LOCAL, al inicio de la misma, en vez de con TABLES.
LOCAL<tabla>.
Sub Rutinas Externas.
En un Reporte o Programa, podemos llamar a Sub Rutinas que no se
encuentren dentro de nuestro código. Para ello disponemos de la
modalidad de llamada a Sub Rutina pasándole el Programa, el uso de
INCLUDES, y las llamadas a Módulos de Función.
• Si queremos llamar a una Sub Rutina que está en un Programa
distinto utilizamos: PERFORM<sub> (<programa>) USING…
www.aprendeabap.com – AprendeABAP en 7 días
79
• También existe la posibilidad de añadir porciones de código del
tipo INCLUDE con la instrucción: INCLUDE<reporte>.
En el código del INCLUDE no utilizaremos la sentencia REPORT (con la que
se empieza cualquier Programa).
Módulos de Funciones.
Esta es la vía para el manejo de Sub Rutinas en un Programa ABAP; como
vimos al comienzo de este capítulo, existe una tercera vía para la
comunicación modular de parámetros, llamados "Módulos de Funciones",
de ellos hablaremos en el siguiente capítulo.
www.aprendeabap.com – AprendeABAP en 7 días
81
Día 6: Módulo de Funciones.
En el capítulo anterior estudiamos las Sub Rutinas, que son funciones
propias de un Programa o Include, pero no son objetos creados en el
Diccionario de Datos.
Pero en el Diccionario de Datos podemos crear Módulos de Funciones,
que cumplen unos objetivos más amplios, y permiten mayores opciones,
que las Sub Rutinas.
Prepara tu cuenta en el sistema, porque en este capítulo no solo
aprenderás de manera teórica como se crea un Módulo de Función, sino
tendrás un ejemplo práctico 100% funcional.
¿Qué son los Módulos de Funciones?
Los Módulos de Función son Módulos especiales guardados en una
librería central, y agrupados por la Función que realizan. Principalmente
se caracterizan por una interface definida y porque realizan tratamiento
de excepciones.
Se caracterizan por una interface definida ya que su diseño facilita el paso
de parámetros tanto de entrada como de salida.
CALL FUNCTION <función>.
EXPORTING<parámetros_entrada> = <valor_entrada>
...
IMPORTING<parámetros_salida>=<valor_salida>
...
TABLES<tablas_entrada>=<tablas_internas>
www.aprendeabap.com – AprendeABAP en 7 días
82
...
EXCEPTIONS<excepciones>=<valor>
...
Donde en el EXPORTING especificamos los parámetros de entrada
para la Función, en el IMPORTING (opcional) el resultado o retorno de
la Función y en TABLES (opcional) las tablas que se utilizan como
parámetros.
Veamos en detalle las "partes" de una Función.
EXPORTING: Parámetros que van hacia el Módulo de Funciones, de
entrada (la Función por tanto no los modifica). Los valores estarán
declarados como IMPORT en la función.
IMPORTING: Parámetros de salida, son los valores resultantes de la
ejecución de la Función. (En la Función estarán declarados como
EXPORT).
CHANGING: Parámetros de entrada / salida (son modificables).
TABLES: Se usa para pasar Tablas Internas como parámetros.
EXCEPTIONS: Se usa para gestionar excepciones y errores. Cuando
se activa una excepción, en el campo de retorno SY-SUBRC se tendrá el
valor correspondiente asignado a dicha excepción en la parametrización
del Módulo de Función. Así se puede saber qué ocurrió al ejecutar la
misma.
Con la instrucción OTHERS se da tratamiento a errores no contemplados.
ERROR-MESSAGE. Se usa para tratar errores generando un mensaje. Se
tendrá el valor asignado para el error en el campo SY-SUBRC.
www.aprendeabap.com – AprendeABAP en 7 días
83
Ver punto siguiente para su explicación.
Gestión de Excepciones
Los Módulos de Función también se caracterizan por realizar un
tratamiento de excepciones. En la interface de los Módulos de Función se
indican los valores de excepciones para el retorno del Módulo, que
posteriormente con el campo-variable SY-SUBRC se pueden comprobar.
El código de la Función puede activar excepciones mediante las
instrucciones:
MESSAGE...RAISING<excepción>.
ó
RAISE<excepción>.
La única manera de gestionar errores dentro de un Módulo de Función es
elevar excepciones, ya que NO se pueden usar mensajes en ellas. La
primera sentencia activa un mensaje, pero no lo muestra.
Para poder visualizarlo hay que acceder a los campos del sistema de la
Tabla SYST, donde se almacena el texto del mensaje, número,... pero
desde el Programa principal.
Esto responde al apartado ERROR-MESSAGE del punto anterior. Se
podrá mandar el mensaje desde el Programa que llama a la Función,
accediendo a los campos del sistema: SY-MSGID (nombre del
mensaje), SY-MSGNR (número del mensaje), SY-MSGTY (tipo del
mensaje), SY-MSGV1 ... SY- MSGV4 (4 textos para los 4 posibles
parámetros & del mensaje).
Creando una Función para simular una Calculadora.
www.aprendeabap.com – AprendeABAP en 7 días
84
Recordemos el ejemplo del capítulo anterior (Sub Rutinas); vamos a crear
un Módulo de Función que cumpla con las 4 operaciones principales de
la aritmética, (suma, resta, multiplicación y división).
Para ello, vamos a definir en primera instancia que parámetros de
entrada recibiremos en la fFunción:
• OPER1: Variable con el valor del primer campo.
• OPER2: Variable con el valor del segundo campo.
• TIPO: Tipo de operación aritmética a ejecutar, la cual contiene un
código único por cada operación contemplada.
Como parámetros de salida, tendremos:
• RESUL: Variable que contendrá el resultado de la operación.
Como control de excepción, contemplaremos la división por cero:
Declararemos una excepción llamada BY_CERO, al cual le asignaremos el
valor de 1 cuando se produzca un intento de división por cero.
Luego de definido los parámetros que utilizaremos, ingresamos a nuestra
cuenta en SAP; y nos dirigimos a la Transacción SE37, que es la que
gestiona todo lo referente a Módulos de Funciones.
www.aprendeabap.com – AprendeABAP en 7 días
85
Vamos a asignar un nombre a la función que empiece por Z
(recuerda que todos nuestros desarrollos deben empezar con Z o con Y).
La llamaremos ZCAL, y le damos al botón CREAR.
Nos pedirá que la asignemos a un Grupo de Funciones existente, e
indiquemos una breve descripción.
www.aprendeabap.com – AprendeABAP en 7 días
86
Vamos a llegar a la siguiente ventana:
Veamos antes de continuar una breve descripción de cada objeto aquí
encontrado:
Atributos y parámetros: Una Función tiene los siguientes parámetros:
• EXPORTING (Entrada a la Función cuando se hace el llamado
desde un Programa, estos datos irán en la pestaña IMPORT en su
declaración).
www.aprendeabap.com – AprendeABAP en 7 días
87
• IMPORTING (Salida. Resultado de la Función. Salida al momento
de invocar a la Función, en su declaración, la información irá en la
pestaña EXPORT).
• CHANGING (Entrada / Salida, pestaña MODIF).
• TABLES (Tablas Internas de Entrada / Salida, pestaña TABLAS).
• EXCEPTIONS (excepciones producidas por la Función. Se usa para
el manejo de errores, se declaran en la pestaña EXCEP).
Texto fuente: Código ABAP de la Función, se escribe en la pestaña
COD.FTE.
Documentación: Asociada a la Función, dependiente del idioma.
Datos globales: Código ABAP con las sentencias declarativas del Grupo de
Función.
Programa principal: Programa que llama a la Función. Cada Módulo de
Función tiene su correspondiente INCLUDE (CALL FUNCTION) en el
Programa.
www.aprendeabap.com – AprendeABAP en 7 días
88
Primer Paso: Pestaña ATRIBUTOS
Pocas cosas debemos modificar aquí, salvo la forma en que se ejecutará
dicha Función, lo normal es dejarlo todo como está, es decir, con los
checks tildados de "Módulo de Funciones normal" y de "Inicio inmediato".
Interesante saber aquí, que si lo que nos piden es diseñar una Función
que haga las veces de interfaz entre un sistema externo y SAP, el check
que debemos tildar es el que dice "Módulo de acceso remoto", con
esto será suficiente para que desde fuera puedan comunicarse con
nuestra función.
Para nuestro ejemplo, lo dejamos como esta y pasamos a la pestaña
IMPORT.
www.aprendeabap.com – AprendeABAP en 7 días
89
Segundo Paso: Pestaña IMPORT
En esta pestaña vamos a declarar los parámetros de entrada que
definimos anteriormente:
• OPER1: Variable con el valor del primer campo.
• OPER2: Variable con el valor del segundo campo.
• TIPO: Tipo de operación aritmética a ejecutar, la cual contiene un
código único por cada operación contemplada.
Asignaremos a los operadores, un Elemento de Datos que haga referencia
a cantidades, (BSEG- DMBTR) mientras que para el campo TIPO, cuya
función será simplemente indicar que tipo de operación se va a realizar, le
asignaremos un tipo de datos CHAR1, es decir, un texto de un solo
caracter.
Tercer Paso: Pestaña EXPORT
Habíamos definido que el único campo de salida sería el siguiente:
• RESUL: Variable que contendrá el resultado de la operación.
Le asignaremos el mismo elemento de datos de las variables de entrada
OPER1 y OPER2.
www.aprendeabap.com – AprendeABAP en 7 días
90
Cuarto Paso: Pestaña EXCEP
Nos falta declarar la excepción que manejará nuestra Función, habíamos
definido lo siguiente: Declararemos una excepción llamada BY_CERO, al
cual le asignaremos el valor de 1 cuando se produzca un intento de
división por cero.
Quinto Paso: Pestaña CÓDIGO FUENTE
Procedemos ahora, a crear el código correspondiente para simular una
calculadora, lo haremos en la pestaña del código fuente, que como
veremos, nos presenta ya la información que acabamos de parametrizar
en las pestañas.
www.aprendeabap.com – AprendeABAP en 7 días
91
La siguiente será nuestra estrategia de programación:
1. Declararemos una variable local llamada VAR que contendrá el
resultado parcial de las operaciones a realizar.
2. Construiremos un CASE-ENDCASE basado en el campo de entrada TIPO,
el cual contendrá como valores lo siguiente:
• 'S' para identificar la operación SUMA.
• 'R' para identificar la operación RESTA.
• 'M' para identificar la operación MULTIPLICACIÓN.
• 'D' para identificar la operación DIVISIÓN.
3. Dentro de cada condición del CASE, se realizará la operación aritmética
correspondiente con los campos OPER1 y OPER2, guardando el resultado
en la variable local VAR.
4. En el caso de la DIVISIÓN, previamente se validará que el campo OPER2
sea diferente de CERO, en caso contrario, se le asigna el valor de 1 a la
variable de excepción BY_CERO y no se realiza la división.
5. Al término del CASE, se le asigna al campo de salida RESUL, el resultado
almacenado previamente en VAR.
www.aprendeabap.com – AprendeABAP en 7 días
92
Veamos cómo queda el ejemplo:
Recuerda que la instrucción RAISE activa la excepción, esto hará que si se
produce un intento de división por cero, la función devolverá, en lugar de
resultado de la operación en el campo RESUL, un código SY-SUBRC
diferente de cero en el campo de excepción BY_CERO. Este valor
retornable se puede definir en el llamado a la función, ahora veremos
cómo.
Primero vamos a probar nuestra Función directamente desde la SE37.
www.aprendeabap.com – AprendeABAP en 7 días
93
Luego de activar nuestra Función en el botón ,
procedemos a ejecutarla en el siguiente botón:
Se nos presenta la siguiente ventana, en la cual nos pedirá los parámetros
de entrada:
Primero probaremos la suma entre los valores 17.25 y 14.50.
www.aprendeabap.com – AprendeABAP en 7 días
94
Damos clic en el botón ejecutar:
Obtendremos el resultado de la Función, el cual nos indica que la suma
dio como resultado 31.75:
Ahora vamos a probar una división por cero, para evaluar si la Función
captura la excepción de manera correcta:
www.aprendeabap.com – AprendeABAP en 7 días
95
Y obtenemos el siguiente resultado:
Vemos que el campo RESUL no tiene valor, y en la parte posterior, el test
nos indica que se produjo la excepción BY_CERO, garantizándonos así
que la Función procesa la información de forma correcta.
Programa de Control
Ahora vamos a crear un pequeño Programa Z, en la SE38, en la que
capturemos por pantalla los 2 valores a operar, el tipo de operación, con
los que internamente vamos a llamar a esta Función,, y ofrezcamos el
resultado en una salida por pantalla, y de esta manera practicamos un
poco la creación de Programas Z.
www.aprendeabap.com – AprendeABAP en 7 días
96
Vamos a crear un Programa llamado ZCALCULADORA.
Indicamos el tipo de Programa, y una descripción.
www.aprendeabap.com – AprendeABAP en 7 días
97
Indicamos que el Programa será un objeto local.
Y listo, ya podemos escribir nuestro código.
www.aprendeabap.com – AprendeABAP en 7 días
98
El primer paso es declarar un bloque de datos de selección, en el que
pediremos los dos importes que corresponderán a los parámetros OPER1
y OPER2 de la Función, les asignaremos el mismo nombre y tipo de datos.
Posteriormente, crearemos otro bloque de datos, en el que
tendremos una selección de 4 opciones, para determinar el tipo de
operación a realizar.
Si ejecutamos el Programa ahora mismo, la pantalla de selección quedaría
así:
www.aprendeabap.com – AprendeABAP en 7 días
99
Podemos asignarles nombres legibles y títulos a los bloques o cajas,
ingresando a Pasar a > Elementos de Texto > Textos de selección.
En textos de selección, le asignaremos descripciones a las variables de
entrada definidas:
www.aprendeabap.com – AprendeABAP en 7 días
100
En Símbolos de texto definiremos los títulos descriptivos a los bloques o
cajas diseñadas.
Una vez activados todos los objetos, tendremos el siguiente aspecto
en nuestra pantalla de selección:
Ahora continuamos con la programación, en las variables OPER1 y OPER2
tenemos ya los importes a tratar, vamos a definir a través de sentencias
IF-ENDIF cual pulsador (tipo de operación) fue seleccionada, y le
www.aprendeabap.com – AprendeABAP en 7 días
101
asignaremos el valor correspondiente que debemos pasar como
parámetro a la Función (S, R, M o D).
Pasamos ahora a construir la llamada a la Función, la mejor práctica para
hacer esto es utilizando el ícono "Modelo" en la barra de pulsadores.
Indicamos el nombre de la Función que queremos invocar, y damos OK.
www.aprendeabap.com – AprendeABAP en 7 días
102
Se nos presenta en el código, lo siguiente:
www.aprendeabap.com – AprendeABAP en 7 días
103
Procedemos a completar el código necesario para un correcto llamado a
la Función.
Ahora configuraremos la salida del resultado por pantalla, para ello nos
adelantaremos un poco en materia y crearemos un sencillo informe con la
instrucción WRITE, (esto lo veremos en detalle en el siguiente capítulo).
Además controlaremos la excepción BY_CERO configurada en la función.
Quedándonos el código estructurado de la siguiente manera:
www.aprendeabap.com – AprendeABAP en 7 días
104
Listo!
Ya tenemos todo el trabajo hecho, ahora vamos a probar nuestro
programa con las mismas dos pruebas que utilizamos directamente en la
Función.
Primero probaremos la suma entre los valores 17.25 y 14.50.
www.aprendeabap.com – AprendeABAP en 7 días
105
Y obtendremos el reporte con el resultado correcto de la operación:
Ahora vamos a probar una división por cero, para evaluar si la Función
captura la excepción de manera correcta:
www.aprendeabap.com – AprendeABAP en 7 días
106
Espero te haya sido útil esta sección práctica, ahora te invito a que
practiques tú mismo para que poco a poco vayas familiarizándote con el
sistema.
www.aprendeabap.com – AprendeABAP en 7 días
107
Día 7: Reportes o Informes.
En la mayoría de los casos, recibirás requerimientos en los que te pidan
crear algún tipo de Reporte o Informe, en el que se muestren ciertos
datos.
Muchas veces el formato final del Reporte lo podrás decidir tu, y en otras,
tendrás que adaptarte a lo requerido.
Existen dos tipos de Reportes que podemos construir en SAP.
• Reportes de texto hechos “a mano”, denominados tipo LIST o
WRITE.
• Reportes basado en funciones estándar, denominados Reportes
ALV.
Reportes tipo LIST o WRITE
Para este tipo de Reportes, existen una serie de sentencias que nos
permitirán construir nuestro Reporte "a mano", es decir, paso por paso,
línea por línea.
Todo empieza por la sentencia WRITE, con ella podremos visualizar una
variable por pantalla, su estructura es la siguiente:
WRITE / (<offset>) (<long>) <datos a visualizar>.
Con la barra (/) indicaremos si deseamos un salto de línea o no antes de
imprimir, esta barra es opcional.
Con el (<offset>) indicaremos si queremos en que columna de la pantalla
empezará la impresión.
www.aprendeabap.com – AprendeABAP en 7 días
108
Con el (<long>) indicaremos la longitud de los valores a utilizar.
Todos estos campos son opcionales.
Ejemplo:
WRITE / (15) <variable>.
Con la sentencia ULINE, podremos imprimir una línea horizontal, ideal
para la construcción de tablas en un Reporte; esta sentencia cuenta con
las mismas propiedades de la sentencia WRITE explicada arriba; en el caso
de pintar líneas verticales, utilizamos la sentencia VLINE.
Para saltar una o varias líneas en la impresión, contamos con la sentencia
SKIP, que por defecto, responde al salto de una única línea, a menos que
se le indique explícitamente cuantas líneas de salto se quieren con la
siguiente instrucción:
SKIP <n> (n = número de líneas).
Ahora bien, si deseamos saltar a una línea específica de la pantalla,
utilizaríamos la sentencia SKIP TO LINE <n> (n = número de la línea
destino).
Si el salto que queremos dar, es hacia la siguiente página, la instrucción
que nos sería de utilidad sería NEW-PAGE.
Al utilizar la sentencia WRITE, en ocasiones imprimiremos cantidades
en monedas, para una correcta impresión, completaremos con las
siguientes sentencias:
WRITE<campo>CURRENCY<moneda> o WRITE<campo>CURRENCY
LOCAL.
www.aprendeabap.com – AprendeABAP en 7 días
109
Si vamos a imprimir, por ejemplo, el código de un material, y no
deseamos que aparezcan los ceros a la izquierda del código, utilizamos la
siguiente instrucción:
WRITE<variable>NO-ZERO.
Para imprimir fechas estableciendo su formato de salida, contamos con:
WRITE<fecha>DD/MM/YY.
WRITE<fecha>MM/DD/YY.
WRITE<fecha>DD/MM/YYYY.
WRITE<fecha>MM/DD/YYYY.
Atributos de Pantalla y Formatos de Páginas
Dejamos atrás el WRITE para entrar en otros aspectos, como añadirle
colores o estilos a ciertas variables para diferenciarlas de otras, como por
ejemplo, la cabecera de una tabla.
FORMAT NTENSIFIED ON/OFF.
FORMAT INVERSE ON/OFF.
FORMAT INPUT ON/OFF.
FORMAT COLOR <n>.
FORMAT RESET.
Con estas instrucciones, podemos jugar con el look y el diseño de nuestro
Reporte.
También hay un grupo de instrucciones destinadas a dar formato de salida
a nuestro Reporte. Podemos controlar ambos extremos de una página con
los eventos TOP-OF-PAGE y END-OF-PAGE;
www.aprendeabap.com – AprendeABAP en 7 días
110
Debes saber que éste último no se ejecutará si el salto de página se
produce con un NEWPAGE.
Si no queremos que la cabecera del Reporte sea la estándar de SAP, sino
controlarla nosotros mismos a través del evento TOP-OF-PAGE, lo que
haremos es que la primera instrucción de nuestro programa sea la
siguiente:
REPORT<Zxxx>NO STANDARD PAGE HEADING.
El formato de la página del Reporte se define también desde la instrucción
REPORT.
REPORT<Zxxx>LINE-SIZE<n>. (ancho de la línea).
REPORT<Zxxx>LINE-COUNT<n(m)>. (n = líneas por páginas; m = líneas
reservadas para pie de página).
REPORT<Zxxx>PAGE-COUNT <n>. (n = número máximo de páginas).
Con la instrucción RESERVE, podemos impedir que un bloque de
líneas que presentan una coherencia juntas, se corten y se pierda la
misma, para esto podemos reservar un número determinado de líneas
con la instrucción:
RESERVE <n> LINES.
Esta instrucción se debe colocar justo antes del WRITE sobre el que se
quiere "reservar" ese bloque de líneas; de no haber espacio suficiente
para imprimir estas líneas, éstas se imprimirán en la siguiente página.
www.aprendeabap.com – AprendeABAP en 7 días
111
Elementos de Texto.
En el entorno de desarrollo ABAP se nos permite manejar Elementos de
Texto sin necesidad de escribir el código en el Programa.
Estos Elementos de Texto pueden ser títulos de Reportes, cabeceras,
textos de selección, entre otros.
Para acceder a la pantalla de edición de estos textos, desde el editor
ABAP, ubicamos el menú Pasar a -> Elementos de Texto.
Títulos y Cabeceras: para tratar el título y cabeceras del Reporte y las
cabeceras de columna que saldrán por pantalla e impresora.
Textos de Selección: para tratar las descripciones que acompañan a los
parámetros de entrada del tipo PARAMETERS o SELECT-OPTIONS.
Textos Numerados: para tratar constantes de tipo texto sin necesidad de
declararlas dentro del Programa. Los nombres de estas constantes serán
TEXT-nnn donde <nnn> es un número de 3 dígitos. Además podemos
mantener los textos numerados en varios idiomas.
Mensajes de Diálogo.
Son aquellos mensajes que aparecen en la línea de mensajes y que son
manejables desde un Programa. Estos mensajes están agrupados en
áreas de mensajes. Para indicar que área vamos a usar en un Reporte,
utilizamos MESSAGE-ID en la instrucción REPORT.
REPORT <reporte> MESSAGE-ID <area>.
Para el tratamiento de las áreas de mensajes, encontramos su editor en el
menú Pasar a -> Mensajes.
www.aprendeabap.com – AprendeABAP en 7 días
112
Para visualizar un mensaje dentro del código utilizamos la sentencia
MESSAGE Tnnn.
Donde "nnn" es el número del mensaje dentro de su respectiva área y "T"
es el tipo de mensaje.
Los diferentes tipos de mensajes que permite el sistema son los
siguientes:
• A = Cancelación del proceso.
• E = Error. es necesaria una corrección de los datos.
• I = Información. Mensaje meramente informativo. El proceso
continuará con un ENTER.
• S = Confirmación; información en la pantalla siguiente.
• W = Warning. Nos da un aviso, podemos cambiar los datos o
pulsar ENTER para continuar.
Solo los mensajes tipo A y E interrumpirán la ejecución del Programa,
obligando su finalización antes de tiempo, el resto de mensajes, permitirá
continuar con la ejecución hasta el final.
Podemos acompañar los mensajes con variables como parámetros:
MESSAGE Tnnn WITH <var1><var2>.
En su definición veremos símbolos &, éstos símbolos se podrán sustituir
por variables en el código del Programa; dependiendo del tipo de
mensaje permite más símbolos que otros, hasta un máximo de 4
variables.
www.aprendeabap.com – AprendeABAP en 7 días
113
Ejemplo de un reporte con WRITE.
A continuación te dejo un ejemplo funcional de cómo construir un
Reporte tipo WRITE o LIST.
************************************************************
********************
REPORT zrr.
DATA: it_flights LIKE TABLE OF mara, wa_flights LIKE LINE OF it_flights.
START-OF-SELECTION.
SELECT *
FROM mara
INTO TABLE it_flights
WHERE matnrBETWEEN '000000000080003050' and
'000000000080003060'.
END-OF-SELECTION.
SORT it_flightsBY matnrersda.
* Data output
PERFORM data_output.
TOP-OF-PAGE.
NEW-LINE.
www.aprendeabap.com – AprendeABAP en 7 días
114
WRITE: / sy-uline.
FORMAT COLOR COL_HEADING .
WRITE: sy-vline,
AT (3) ' ',
AT (10) 'Material', AT (1) sy-vline,
AT (15) 'Fecha',
AT (1) sy-vline,
AT (25) 'GrupoArtículos', AT (1) sy-vline,
AT (30) 'NúmeroAntiguo', AT (1) sy-vline.
FORMAT COLOR OFF .
WRITE: / sy-uline.
FORM data_output.
LOOP AT it_flightsINTO wa_flights.
NEW-LINE.
WRITE: sy-vline.
WRITE: AT (3) ' ' ,
AT (10) wa_flights-matnr COLOR COL_KEY, AT (1) sy-vline,
AT (15) wa_flights-ersda COLOR COL_NORMAL , AT (1) sy-vline,
www.aprendeabap.com – AprendeABAP en 7 días
115
AT (25) wa_flights-mtart COLOR COL_NORMAL,AT (1) sy-vline,
AT (30) wa_flights-bismt COLOR COL_NORMAL , AT (1) sy-vline.
AT END OF matnr.
ULINE.
ENDAT.
ENDLOOP.
ENDFORM. "DATA_OUTPUT
************************************************************
********************
Reportes ALV
www.aprendeabap.com – AprendeABAP en 7 días
116
Desde la versión 4.6C; existen funcionalidades avanzadas para el
desarrollo de Reportes, mucho más sencillos de construir que los
Reportes WRITE, y mucho más elegantes y prácticos que estos, ya que
permiten cierto dinamismo, como agrupar, totalizar columnas numéricas,
añadir y quitar columnas, guardar los cambios realizados, exportar a Excel
y otros formatos, etc.
Cuando se crea un Reporte utilizando funciones ALV es necesario:
Incluir en el Programa la librería SLIS, que tiene definidas todas las
Estructuras de los parámetros de entrada y de salida de esta Función.
Esta librería se importa con la instrucción TYPE-SPOOLS: slis.
Definir correctamente el catálogo de campos.
Definir en el Programa todas las sub rutinas que implementarán el
comportamiento de éste ante la ejecución de determinados eventos o
ante la interacción del usuario.
Pasarle los datos que deben ser mostrados en el reporte a la Función
utilizando Tablas Internas.
Utilizando las Funciones ALV, ninguna sentencia WRITE aparecerá en el
Programa.
Se informa a la correspondiente Función de los datos que van a ser
mostrados, la definición y características de cada uno de éstos datos y de
la apariencia y todo es implementado por la Función.
En el momento que llamamos a una de las Funciones ALV para que
imprima el Reporte, perdemos el control del Programa. Esto es, cualquier
Evento del Programa como ‘Nueva página’, ‘Top of page’, ‘End of page’,
etc. será controlado e implementado por la Función, a no ser que le
www.aprendeabap.com – AprendeABAP en 7 días
117
indiquemos qué Eventos queremos que sean implementadas en el
Programa.
Se llamará a la Función, informándole obligatoriamente los siguientes
parámetros:
• I_CALLBACK_PROGRAM: Se informa a la Función con el nombre
del Programa que la está llamando.
• IT_FIELDCAT: Este parámetro será una Tabla Interna que
contiene la definición de los campos que aparecerán en el
listado.
• T_OUTTAB: Nombre de la Tabla Interna que contiene toda la
información recogida por el Programa y la cual debe ser impresa
en el Reporte.
Cada tipo de ALV cuenta con diferentes parámetros de entrada
opcionales, pero estos 3 son obligatorios en todos los casos.
Existen 3 tipos principales de Reportes ALV, el uso de cada uno dependerá
de lo se requiera en un momento dado.
• ALV List: permite simular el trazado de un reporte WRITE, pero
con las funcionalidades y bondades de un ALV.
• ALV Grid: Permite generar una Tabla gráfica, totalmente editable
desde su presentación (añadir y quitar columnas, agrupar y
ordenar, totalizar valores, entre otras).
• ALV Jerárquico: Es un tipo de reporte que consta de 2 cabeceras,
y permite enlazar la información de ambas partes de una manera
gráficamente legible.
www.aprendeabap.com – AprendeABAP en 7 días
118
Cada uno de ellos tiene su propio Módulo de Funciones con sus
respectivas Estructuras, veamos un poco como se construyen cada uno.
NOTA: Se mostrarán solo algunos de los parámetros de mayor uso
de las Funciones ALV, lasmismas cuentan con otros parámetros que
aquí no se muestran por razones de espacio.
ALV LIST
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING
i_callback_program = g_repid
i_structure_name = gc_structure
it_fieldcat = gt_fieldcat_list
i_save = gc_save
is_layout = gs_layout
is_variant = gs_variant
is_print = gs_print
TABLES
t_outtab = gt_output_value
EXCEPTIONS
program_error = 1
OTHERS = 2.
www.aprendeabap.com – AprendeABAP en 7 días
119
I_CALLBACK_PROGRAM: Recibe el nombre del Programa que invoca a la
Función.
I_STRUCTURE_NAME: Indica la Estructura de Datos del Diccionario que se
tomará como base en la construcción del Reporte.
IT_FIELDCAT: Contiene lo que en ALV se conoce como el "Catálogo de
Objetos"; esto es, la lista de campos (o columnas) que se van a listar en el
Reporte.
I_SAVE: En este parámetro se indicará que tipos de "layouts" se podrán
"pre cargar", (deben existir en el sistema); se le puede indicar a la función
ALV tres posibles opciones; que muestre aquellos layouts grabados como
estándares ('X'); los layouts específicos de usuarios ('U'), o todos los
layouts disponibles ('A').
IS_LAYOUT: Se le puede indicar a la Función que el diseño del Reporte
aparezca con una serie de ajustes; (con cabecera o sin ella, con colores en
las filas o columnas, entre otras).
IS_VARIANT: Este parámetro contendrá la variante de visualización
(layout) que el usuario haya seleccionado, de la lista de opciones para
dicho Reporte.
IS_PRINT: Esta Tabla Interna controla parametrizaciones de impresión,
como no mostrar la cabecera, asignar impresora, saltarse la ventana de
diálogo que solicita la impresora, entre otras.
T_OUTTAB: Esta será la Tabla Interna que contendrá la información
que se requiere desplegar en un Reporte ALV.
La siguiente imagen es una muestra de los resultados que obtendremos
para este tipo de ALV
www.aprendeabap.com – AprendeABAP en 7 días
120
ALV GRID
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING
i_callback_program = v_repid
I_BACKGROUND_ID = 'ALV_BACKGROUND'
i_callback_top_of_page = l_form_cabecera
i_save = 'A'
it_fieldcat = gt_fieldcat
is_variant = variante
TABLES
t_outtab = p_output.
I_CALLBACK_PROGRAM: Recibe el nombre del Programa que invoca a la
Función.
I_BACKGROUND_ID: Permitirá asignarle una imagen de fondo al Reporte.
www.aprendeabap.com – AprendeABAP en 7 días
121
I_CALLBACK_TOP_OF_PAGE: Permite indicarle a la Función que
controlaremos la cabecera del Reporte desde nuestro Programa.
I_SAVE: En este parámetro se indicará que tipos de "layouts" se podrán
"pre cargar", (deben existir en el sistema); se le puede indicar a la Función
ALV tres posibles opciones; que muestre aquellos layouts grabados como
estándares ('X'); los layouts específicos de usuarios ('U'), o todos los
layouts disponibles ('A').
IT_FIELDCAT: Contiene lo que en ALV se conoce como el "Catálogo de
Objetos"; esto es, la lista de campos (o columnas) que se van a listar en el
Reporte.
IS_VARIANT: Este parámetro contendrá la variante de visualización
(layout) que el usuario haya seleccionado, de la lista de opciones para
dicho Reporte.
T_OUTTAB: Esta será la Tabla Interna que contendrá la información
que se requiere desplegar en un Reporte ALV.
Veamos que se obtiene con este tipo de ALV.
www.aprendeabap.com – AprendeABAP en 7 días
122
www.aprendeabap.com – AprendeABAP en 7 días
123
ALV JERÁRQUICO
Este tipo de ALV consiste en anidar dos tablas (una con la estructura de
cabecera y otra con la estructura del detalle), que permite enlazar la
información de ambas tablas.
Es muy útil cuando se quiere un reporte que contenga doble cabecera; la
función necesitará recibir la información en dos Tablas Internas
separadas.
CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY' EXPORTING
i_callback_program = gv_repid
i_callback_pf_status_set = slis_ev_pf_status_set
i_callback_user_command = slis_ev_user_command
is_layout = gs_layout
it_fieldcat = gt_fieldcat
it_sort = gt_sortinfo
i_save = 'A'
is_variant = gs_variant
it_events = gt_event
i_tabname_header = 'IT_HEADER'
i_tabname_item = 'ITAB'
is_keyinfo = gs_keyinfo
www.aprendeabap.com – AprendeABAP en 7 días
124
is_print = gs_print
TABLES
t_outtab_header = IT_HEADER
t_outtab_item = ITAB
EXCEPTIONS
program_error 1
OTHERS 2
_CALLBACK_PROGRAM: Recibe el nombre del Programa que invoca a la
Función.
I_CALLBACK_PF_STATUS_SET: Permite indicarle a la Función cual será el
Status GUI (barra de pulsadores) que queremos desplegar con el Reporte.
I_CALLBACK_USER_COMMAND: Permitirá controlar los Eventos que
puedan ocurrir en el Reporte (pulsar un campo del listado y saltar a otra
Transacción, pulsar un botón añadido en la barra de pulsadores, entre
otros).
IS_LAYOUT: Se le puede indicar a la Función que el diseño del Reporte
aparezca con una serie de ajustes; (con cabecera o sin ella, con colores en
las filas o columnas, entre otras).
IT_FIELDCAT: Contiene lo que en ALV se conoce como el "Catálogo de
Objetos"; esto es, la lista de campos (o columnas) que se van a listar en el
Reporte.
www.aprendeabap.com – AprendeABAP en 7 días
125
IT_SORT: Con esta Tabla se le indicará a la Función cual será el criterio de
ordenamiento con el cual se desplegará la información.
I_SAVE: En este parámetro se indicará que tipos de "layouts" se podrán
"pre cargar", (deben existir en el sistema); se le puede indicar a la Función
ALV tres posibles opciones; que muestre aquellos layouts grabados como
estándares ('X'); los layouts específicos de usuarios ('U'), o todos los
layouts disponibles ('A').
IS_VARIANT: Este parámetro contendrá la variante de visualización
(layout) que el usuario haya seleccionado, de la lista de opciones para
dicho Reporte.
IT_EVENTS: Se le indicará a la Función cuales serán los Eventos del
sistema que controlará.
I_TABNAME_HEADER: Contendrá el nombre de la Tabla de cabecera.
I_TABNAME_ITEM: Contendrá el nombre de la Tabla del detalle de
posiciones.
IS_KEYINFO: Esta Tabla contendrá las conexiones de enlaces entre las dos
Tablas, como se puede deducir, ambas Tablas deberán contener el mismo
campo con el mismo nombre, para poder servir de enlace entre ambas.
IS_PRINT: Esta Tabla Interna controla parametrizaciones de impresión,
como no mostrar la cabecera, asignar impresora, saltarse la ventana de
diálogo que solicita la impresora, entre otras.
T_OUTTAB_HEADER: Esta será la Tabla Interna que contendrá la
información de cabecera del Reporte, será la primera línea de desglose en
la doble cabecera.
www.aprendeabap.com – AprendeABAP en 7 días
126
T_OUTTAB_ITEM: Esta Tabla contendrá los datos a mostrarse, relativos al
detalle, o lo que es lo mismo, la información de la segunda Tabla, con las
posiciones del Reporte.
Veamos qué tipo de Reportes logramos obtener con esta Función.
La Tabla T_OUTTAB_HEADER contiene las líneas de color naranja,
mientras que la Tabla T_OUTTAB_ITEM contendrá el desglose de líneas
en fondo blanco, que corresponden a la cabecera de color azul.
Si observamos bien, el desglose es el detalle de la línea naranja
respectiva; dentro de la jerarquía indicada.
Por eso se les conoce como Reportes Jerárquicos.
Ejemplo de ALV
Si quieres ver un ejemplo práctico y funcional sobre la construcción de un
Reporte ALV, revisa el siguiente enlace, en donde encontrarás más
información de los tipos de ALV con sus respectivos ejemplos.
www.aprendeabap.com – AprendeABAP en 7 días
127
Plantilla para Construir un ALV
Con esto ya tienes diversas vías para construir Reportes en un Programa Z,
hemos llegado al final, espero que puedas poner en práctica lo aprendido,
y te invito a formar parte de nuestra comunidad AprendeABAP.
En las siguientes páginas encontrarás toda la información que necesitas
para no perderte nada.
SALV: Una vía rápida para generar un ALV Orientado a Objetos
Existe una versión Orientada a Objetos para generar reportes ALV, que al
igual que el modelo basado en Funciones, nos permite una gran cantidad
de opciones disponibles para controlar los eventos y escenarios de un
reporte.
Veamos un ejemplo sencillo de las instrucciones requeridas para generar
rápidamente un reporte ALV base.
Con el siguientesencillo programa se desarrolla un ALV mediante Objetos
de forma rápida usando tablas internas para mostrarlos.
Para empezar, contamos con una Tabla Interna llamada TI_SALIDA que
cuenta con los siguientes 3 campos:
• Sociedad: BUKRS.
• Nº Documento: BELNR.
• Ejercicio: GJAHR.
Una vez llenada la tabla con datos, se seguirá el siguiente procedimiento:
1) Se aginauna Estructura de Datos abierta con la instrucción TYPE
ANY TABLE, pudiendo meter cualquier dato o tabla (interna o no)
dentro de la variable correspondiente.
www.aprendeabap.com – AprendeABAP en 7 días
128
FIELD-SYMBOLS <tabla> TYPE ANY TABLE .
2) Declaramos una variable llamada GR_TABLE, asignándole como
Tipo de Datos por referencia la Clase CL_SALV_TABLE.
DATA: gr_table TYPE REF TO cl_salv_table.
3) Asignamos los datos de la Tabla Interna TI_SALIDA al Field Symbol
declarado anteriormente.
ASSIGN ti_salida[] TO <tabla>[].
4) Invocamos al Método FACTORYpara crear todo lo relacionado con
el ALV (tabla, ventana, cabecera, etc).
5) Invocamos al Método DISPLAY para generar el reporte ALV y
desplegarlo por pantalla.
gr_table->display( ).
Como se mencionó anteriormente, este modelo de ALV cuenta con una
serie de funcionalidades para capturar eventos, controlar botones, editar
el catálogo de campos, entre otros, que se pueden definir luego del
llamado al Método FACTORY.
Podemos encontrar más información detallada del mundo de los reportes
ALV en nuestra sección del Blog:
Reportes ALV
www.aprendeabap.com – AprendeABAP en 7 días
129
RECURSOS
RECOMENDADOS
www.aprendeabap.com – AprendeABAP en 7 días
131
Aprende ABAP. –¿Qué hay aquí para ti?
La estrategia de contenidos en AprendeABAP busca cubrir los dos grandes
bloques en que se dividen la carrera de un Consultor ABAP, entiéndase
tanto el período de APRENDIZAJE como el de POSICIONAMIENTO.
Pensando en estos dos grandes bloques, con las respectivas etapas que
conforman cada uno, contamos con una estrategia de contenidos
dinámica, en la ofrecemos contenidos gratuitos como contenidos
Premium.
Dentro del bloque de APRENDIZAJE, hemos clasificado la información de
acuerdo a su temática:
• Diccionario de Datos.
• Entorno de Programación.
• Reportes.
• Formularios.
• Módulos de Funciones.
• Ampliaciones.
• Module-Pool.
Clasificación que puede ir variando en el tiempo a medida que se
considere oportuno. En cada sección encontrarás contenido relevante,
principalmente bajo el enfoque ¨HOW-TO¨, sobre como realizar
determinadas tareas dentro del sistema.
Estas secciones son de libre acceso, y el objetivo es ir añadiendo nuevos
contenidos periódicamente, tanto en texto escrito, como apoyados en
videos tutoriales.
www.aprendeabap.com – AprendeABAP en 7 días
132
Dentro del bloque de POSICIONAMIENTO, destaca la categoría “Crea tu
Marca”, dentro de la cual iremos desglosando todo el contenido de libre
acceso correspondiente a este bloque, cuyo objetivo no es aprender
temas del sistema sino en cómo posicionarte como un experto en el
sector.
Te invito a que lo descubras por ti mismo en el siguiente enlace:
http://aprendeabap.com
www.aprendeabap.com – AprendeABAP en 7 días
133
Aprende ABAP. - Desarrollo de Contenidos Etapa APRENDIZAJE
A lo largo del tiempo, me he encontrado mucha gente que quiere iniciarse
en el Mundo SAP, pero no tiene formación en informática, siendo esta la
base para poder triunfar dentro de este mundo. Incluso conozco muchos
Consultores SAP funcionales a quienes les gustaría aprender a debugar,
pero no disponen de esta base de programación necesaria para
comprender los procesos, pensando entonces, en aquellos que necesitan
empezar de cero, aprendiendo las nociones de lógica y de programación
para ver cumplidos sus objetivos, hemos diseñado el curso ¨Aprende a
Programar¨.
http://aprendeabap.com/abap-store/aprende-programar
Para aquellos que completan esta formación o para aquellos estudiantes
de informática que ya la dominan, pero quieren entrar al mundo SAP de la
mano de ABAP, hemos desarrollado un programa en dos formatos, uno de
ellos es un libro introductorio llamado ¨AprendeABAP en 10 lecciones¨ en
la cual vivirán su primera interacción con el sistema.
http://aprendeabap.com/abap-store/libro-aprende-abap
Si ya cuentas con cierta experiencia dentro del sector, y buscas seguir
creciendo para cubrir el resto de las etapas del bloque de Aprendizaje,
también contamos con el ¨ClubABAP¨, el cual es un club privado en
donde mensualmente nos reuniremos para abordar temas concretos que
nos permitan ir avanzando en las diferentes etapas de tu carrera.
Adicionalmente, dentro del ClubABAP desarrollamos un curso 100%
práctico para aquellos que inician desde cero, un curso que complementa
www.aprendeabap.com – AprendeABAP en 7 días
134
al libro, diseñado para aquellos que no conocen el sistema y están
buscando opciones alternativas a los tantos cursos de formación que
existen en el mercado.
Toda la información del Club en el siguiente enlace:
http://aprendeabap.com/clubabap/
Como puedes ver, todas las etapas del bloque de APRENDIZAJE están
estratégicamente cubiertas en Aprende ABAP; por lo que no importa en
que momento de tu carrera hayas encontrado este sitio, bien seas
estudiante de Informática, un Consultor ABAP en sus primeros 4 años de
carrera, o una persona que busca reinventarse, en Aprende ABAP
encontrarás justo lo que se adapta al momento en que te encuentres.
www.aprendeabap.com – AprendeABAP en 7 días
135
Aprende ABAP. - Contenidos Etapa POSICIONAMIENTO
Si ya eres un Consultor ABAP Senior, con la suficiente experiencia para
considerar que ya has superado el bloque de APRENDIZAJE, pero aun no
logras sacarle el rendimiento económico adecuado a tu nivel, te invito a
que conozcas el bloque de POSICIONAMIENTO y los contenidos que
hemos diseñado en Aprende ABAP.
Dentro de esta categoría contamos con el Club de Membresía “Consultor
de Éxito”, en el que mensualmente abordaremos temas que nos permitan
ir acercándonos a nuestro objetivo de posicionarnos como expertos, tales
como:
• La importancia de escribir un libro y como convertirlo en nuestra
tarjeta de presentación.
• Como escribirlo y publicarlo, tanto en físico como en digital.
• La importancia de construir una Plataforma digital en la web para
darte a conocer.
• Los componentes que debes contar en dicha Plataforma.
(contenidos, testimonios, presentación personal y profesional,
etc.)
• Como empaquetar tus conocimientos para crear vías de ingresos
pasivos con el propósito de aumentar tus posibles fuentes de
ingresos.
• Como ofrecer servicios a través de tu plataforma y que tipos de
servicios puedes ofrecer, tanto a posibles empleadores como a
compañeros de profesión.
• Como afrontar entrevistas para conseguir que te contraten.
• Entre otros.
www.aprendeabap.com – AprendeABAP en 7 días
136
La información de este Club la puedes encontrar en el siguiente enlace:
http://aprendeabap.com/club-consultor-exito/
Para aquellos que no tienen claro la importancia de esta segunda etapa
en tu carrera hacia el éxito como Consultor, he creado un libro que cuenta
la historia de Eddie, un Consultor ABAP que empezó de la nada en el que,
mediante un relato de su vida, vemos cómo ha ido evolucionando hasta
convertirse en el exitoso Consultor que es hoy en día.
http://aprendeabap.com/abap-store/libro-eddie-consultor
www.aprendeabap.com – AprendeABAP en 7 días
137
Aprende ABAP. - ABAP Store
¿ Recuerdas los distintos programas detallados que cubren las dos
grandes etapas ?
Aprende ABAP cuenta con la Abap Store, su propia Tienda Virtual en
donde podrás encontrar en un solo lugar todos los programas que hemos
desarrollado para cubrir las 7 etapas de tu carrera profesional, puedes
visitarla en el siguiente enlace.
http://aprendeabap.com/abap-store/
Si buscas algo más personalizado, disponemos de nuestra sección de
productos y servicios, en donde podrás encontrar una gama que va desde
talleres prácticos para determinada herramienta (debugging, smartforms,
etc.) hasta servicios por horas o grupales, más información en el siguiente
enlace.
http://aprendeabap.com/abap-store/servicios