Está en la página 1de 114

www.aprendeabap.

com – AprendeABAP en 7 días

!1

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

!2

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Material de regalo disponible en


www.aprendeabap.com/regalo

Copyright 2018 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 richard@aprendeabap.com

http://www.aprendeabap.com

Facebook: /AprendeAbap

Twitter: @AprendeABAP

Youtube: /AprendeABAP


!3

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!4

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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 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

!5

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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 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.

!6

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

• 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).

!7

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!8

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!9

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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:

!10

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!11

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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>.

Ejemplos:

MOVE var1 TO var2.




var2 = var1.

!12

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!13

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.
• 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.

!14

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.


!15

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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).

!16

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!17

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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: var TYPE char10.

Las dos instrucciones escritas arriba obtienen exactamente el mismo resultado, la


variable <var> será un tipo CHAR de 10 posiciones.

!18

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!19

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!20

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!21

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!22

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.
• 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 dDiccionario.

• 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.

!23

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

  

ENDSELECT. 

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>...

!24

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.  

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.

!25

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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:

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.

!26

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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>).

DELETE FROM <tab> FROM TABLE <itab>. P a r a b o r r a r e n l a Ta b l a


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.

!27

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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:

!28

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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).

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’.

!29

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!30

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!31

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!32

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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>.

!33

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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 work area 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>)

!34

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

DELETE: Elimina el registro indicado de la Tabla Interna.

Ejemplos:

DELETE <itab>. (con cabecera).

DELETE <itab> FROM <line> (sin cabecera).

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)

!35

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

LOOP AT <itab> INTO <line> (WHERE <cond>)

. . .

ENDLOOP. (sin cabecera)

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>)

...

ENDAT.

Dentro de la cláusula AT .. ENDAT irán las instrucciones que queremos programar


para ese registro en particular.

!36

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!37

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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).

Teclear el código, pulsar ENTER o el botón verde, y nos llevará a dicha


transacción.

!38

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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:

•! - 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).

!39

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

• ! - 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:

!40

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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:

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:

!41

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Este es el editor ABAP en el cual podrás escribir el código de tus Programas.

!42

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

SE80

Al ingresar a la Transacción SE80, nos lleva a la siguiente ventana:

Desde esta Transacción, tendremos el control de todos los objetos del Repositorio
de Objetos del sistema.

Por ahora, nos interesa de las pestañas superiores, seleccionar “Browser de


Repository”.

!43

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

¿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.

Podemos combinar sentencias consecutivas en una misma instrucción


cerrando las líneas con coma en vez de punto.

!44

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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>.

O también: DATA: <campo1>, <campo2>, <campo3>.

!45

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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).

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:

!46

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

TABLES: KNA1.
(declaración de una Tabla Interna con la misma Estructura que la Tabla del
Diccionario KNA1).

WRITE: KNA1-KUNNR, KNA1-NAME1.


(utilizar como variables, los campos de la tabla KNA1.)

NOTA: Estos no son los campos de la Tabla propiamente dicho, son variables con
su misma Estructura, tampoco se trata de una Tabla, sino de su línea de
cabecera, no contienen los registros de la Tabla a menos que los obtengamos en
una sentencia SQL.

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>.

!47

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

. . B. .
ENDIF.

!48

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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 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:

!49

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

En vez de escribir esto:

IF <var1> EQ ‘2’.
#imprimirA.
ELSEIF <var1> EQ ‘4’.
#imprimirB.
ELSE.
#imprimirC.
ENDIF.
Podría reescribirse de la siguiente manera:

CASE <var1>.
WHEN ‘2’. #imprimirA.
WHEN ‘4’. #imprimirB.
WHEN OTHERS. #imprimirC.
ENDCASE.

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.

!50

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

WHILE <cond>.

....

ENDWHILE.

Sentencias de corte de Bucles.

Si requerimos cortar un bucle en un momento dado sin necesidad de que se


complete todo el ciclo, tenemos las siguientes instrucciones a nuestra disposición.

CHECK <cond>. 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.

!51

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

PARAMETERS

La instrucción PARAMETERS nos permite crear un campo de entrada en una


pantalla de selección; el usuario podrá ingresar uno y solo un valor en dicho
campo, el cual podremos determinar qué tipo de dato contendrá.

Funciona de manera similar a la declaración de variables, esto es, el parámetro


le asignaremos un nombre de variable, que es con el que se le conocerá dentro
del Programa, y la instrucción LYKE nos permitirá asignarle un tipo de dato, que
puede ser referenciado de un campo del Diccionario, o bien asignarle
directamente un tipo de dato elemental.

Ejemplos de declaración de parámetros:

PARAMETERS <var1> LIKE <tabla-campo>.


PARAMETERS <var2> LIKE i.

También pueden declararse de la siguiente manera:

PARAMETERS: <var1> LIKE <tipo_de_dato>,


<var2> LIKE <tipo_de_dato>.

Dentro del Programa, podremos utilizar estas variables por el nombre que
le asignamos al momento de su declaración, <var1> y <var2>.

!52

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

RADIOBUTTONS

También podemos declarar un conjunto de opciones de selección simple, es


decir, una serie de botones en los cuales el usuario solo pueda seleccionar uno
de ellos a la vez. Esto en SAP se le conoce como RADIOBUTTONS, y los
declaramos de la siguiente manera:

PARAMETERS: <var1> RADIOBUTTON GROUP r1,

<var2> RADIOBUTTON GROUP r1,

<var3> RADIOBUTTON GROUP r1.

Como puedes observar, para que solo se permita seleccionar una de las
variables, las mismas deben pertenecer a un mismo grupo, esto lo controlamos
en su declaración al asignarles el grupo R1; si deseamos construir otro conjunto
de variables, de manera que el usuario seleccione una variable adicional a la
seleccionada en este grupo R1, simplemente lo que tenemos que hacer es
declarar las nuevas variables pertenecientes a otro grupo, por ejemplo, R2.

Dentro del Programa, estas variables serán de un caracter, y controlaremos su


selección preguntando si dichas variables tienen como valor ‘X’ o se encuentran
sin valor (vacías).

IF var1 EQ ‘X’ or IF var2 IS INITIAL.

!53

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

CHECKBOX

Ahora bien, si lo que deseamos es que el usuario disponga de una serie de


casillas para que pueda marcar una o varias de ellas, esto lo controlamos con un
tipo de parámetro llamado CHECKBOX.

PARAMETERS: <var1> AS CHECKBOX,

<var2> AS CHECKBOX,

<var3> AS CHECKBOX.

En vez de ser botones agrupados de selección simple, tenemos casillas de


selección múltiple.

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>.

!54

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

!
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.

Agregamos el texto descriptivo en el área que se encuentra al lado del número


asignado:

!55

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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:

!56

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Nos deja como resultado, la siguiente pantalla:

SELECT-OPTIONS

La sentencia PARAMETERS nos permite solicitar por pantalla un único valor para
cada variable de entrada declarada, pero en muchos casos nos interesa poder
recibir por parámetro un rango de valores, por ejemplo, un conjunto de
clientes o un rango de fechas.

Esto lo logramos con la sentencia SELECT-OPTIONS.

Esta sentencia responde con un Tipo de Datos que previamente debió haber sido
creado, por lo que antes de declarar un parámetro de entrada con ella, debemos
declarar el Tipo de Datos a utilizar; por ejemplo, si deseamos solicitar un rango
de fechas, se haría de la siguiente manera:

!57

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

Podremos también con el cuadro de la izquierda (columna P), indicar filtros del
tipo IGUAL QUE,MAYOR QUE, MAYOR IGUAL, etc.

!58

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

De la misma manera que las pestañas superiores nos permiten un mayor


control de los parámetros introducidos.

Sin duda que este tipo de parámetro nos permite una mayor cantidad de
opciones para seleccionar.

Estas variables dentro del programa requieren un tratamiento especial.

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:

!59

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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 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>.

!60

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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:

Se utilizaron las siguientes líneas de código:

!61

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

!62

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

(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).

!63

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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í.

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.

!64

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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'.

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).

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

!65

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!66

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Tanto las variables definidas al inicio del Programa como 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.

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.

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 <var1>...


....
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

!67

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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…

• 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.

!68

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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>

...

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.

!69

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!70

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!71

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!72

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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).

• 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.

!73

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!74

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!75

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!76

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

Veamos cómo queda el ejemplo:

!77

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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:

!78

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Primero probaremos la suma entre los valores 17.25 y 14.50.

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:

!79

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Ahora vamos a probar una división por cero, para evaluar si la Función captura la
excepción de manera correcta:

Y obtenemos el siguiente resultado:

!80

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

Vamos a crear un Programa llamado ZCALCULADORA.

!81

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Indicamos el tipo de Programa, y una descripción.

Indicamos que el Programa será un objeto local.

!82

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Y listo, ya podemos escribir nuestro código.

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.

!83

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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í:

Podemos asignarles nombres legibles y títulos a los bloques o cajas, ingresando


a Pasar a > Elementos de Texto > Textos de selección.

!84

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

En textos de selección, le asignaremos descripciones a las variables de entrada


definidas:

En Símbolos de texto definiremos los títulos descriptivos a los bloques o cajas


diseñadas.

!85

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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 asignaremos el valor
correspondiente que debemos pasar como parámetro a la Función (S, R, M o D).

!86

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!87

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Se nos presenta en el código, lo siguiente:

Procedemos a completar el código necesario para un correcto llamado a la


Función.

!88

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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:

!89

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

Y obtendremos el reporte con el resultado correcto de la operación:

!90

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Ahora vamos a probar una división por cero, para evaluar si la Función captura la
excepción de manera correcta:

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.

!91

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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

!92

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!93

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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;

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:

!94

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

Para visualizar un mensaje dentro del código utilizamos la sentencia MESSAGE


Tnnn.

!95

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

!96

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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 matnr BETWEEN '000000000080003050' and '000000000080003060'.

END-OF-SELECTION.

SORT it_flights BY matnr ersda.

* Data output

PERFORM data_output.

TOP-OF-PAGE.

NEW-LINE.

WRITE: / sy-uline.

!97

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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) 'Grupo Artículos', AT (1) sy-vline,

AT (30) 'Número Antiguo', AT (1) sy-vline.

FORMAT COLOR OFF .

WRITE: / sy-uline.

FORM data_output.

LOOP AT it_flights INTO 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,

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

********************************************************************************

!98

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Reportes ALV

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.

!99

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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 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.

Cada uno de ellos tiene su propio Módulo de Funciones con sus respectivas
Estructuras, veamos un poco como se construyen cada uno.

!100

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

NOTA: Se mostrarán solo algunos de los parámetros de mayor uso de


las Funciones ALV, las mismas 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.

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.

!101

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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

!102

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!103

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

Veamos que se obtiene con este tipo de ALV.

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'

!104

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

is_variant = gs_variant

it_events = gt_event

i_tabname_header = 'IT_HEADER'

i_tabname_item = 'ITAB'

is_keyinfo = gs_keyinfo

is_print = gs_print

TABLES

t_outtab_header = IT_HEADER

t_outtab_item = ITAB

EXCEPTIONS

program_error = 1

OTHERS = 2.

I_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.

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').

!105

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!106

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

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.

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.

!107

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

RECURSOS
RECOMENDADOS 


!108

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

AprendeABAP. –¿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.

Te invito a que lo descubras por ti mismo en el siguiente enlace:

http://aprendeabap.com/club


!109

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

AprendeABAP. - 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/club/curso/aprende-programar/

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 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/club/clubabap/

Como puedes ver, todas las etapas del bloque de APRENDIZAJE están
estratégicamente cubiertas en AprendeABAP; 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 AprendeABAP encontrarás justo lo que se adapta al
momento en que te encuentres.

!110

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

AprendeABAP. - 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 AprendeABAP.

Dentro de esta categoría contaremos con el Club de Membresía “Club de Éxito”,


Programa avanzado de Aprende ABAP en el que se desarrollan  las habilidades
necesarias para proyectar tu Imagen de Autoridad y catapultar sus carreras hacia el
É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.

La novedades con respecto a este Club la puedes encontrar en el siguiente enlace:

http://aprendeabap.com/club/

!111

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

AprendeABAP. - ABAP Store

¿ Recuerdas los distintos programas detallados que cubren las dos grandes etapas ?

AprendeABAP cuenta con la AbapStore, 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/club/courses/

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/club/categoria-producto/servicios/

!112

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

!113

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com


www.aprendeabap.com – AprendeABAP en 7 días

!114

Transaction: HP19315831663925 e-mail: jorge_escorcia@hotmail.com

También podría gustarte