You are on page 1of 174

UNIDAD 1: INTRODUCCIÓN A ABAP Y A SAP

Lección 1: Introducción a ABAP y a SAP

Centro de Capacitación Profesional E-SAP

Estimado Alumno, bienvenido a E-SAP Centro de Capacitación Profesional SAP &


ABAP.

Proceso de Estudios

El contenido de esta carrera se encuentra dividido en Unidades.


Cada unidad ha sido desarrollada para estudiar el contenido de sus lecciones en el
transcurso de 1 semana. Todos los lunes de cada semana se te asignarán nuevas
unidades para estudiar.

El centro de capacitación ESAP desea que obtengas el máximo provecho de tu


capacitación, para ello te recomendamos:

Se constante en el estudio de tus lecciones, toma apuntes online y no dudes de


consultar al instructor de cuanto tema no te quede claro.

No te aceleres ni dejes el estudio de las lecciones para último momento. Las


lecciones de cada unidad están diagramadas para estudiarse, repasarse y asimilarse
con comodidad en el transcurso de una semana.

Obtendrás el máximo de asimilación, si escuchas las locuciones, miras los videos,


lees y repasas los textos tomando apuntes a medida que tus estudios progresan.

Respeta tu cronograma de estudios. Semanalmente se te asignaran nuevos


contenidos. Cada semana se dará por sentado que realizaste, comprendiste y
asimilaste los contenidos de la semana anterior.

Por ello te recomendamos, que realices el estudio de las lecciones de manera


paulatina, no estudiando todas las lecciones al mismo tiempo, para que puedas
analizar, asimilar, repasar y tomar apuntes de cada tema tratado.

Si bien los contenidos multimedia que presentan las lecciones varían de unas a otras,
en parámetros generales, obtendrás el máximo provecho respecto a la asimilación de
contenidos, si aplicas la siguiente metodología en el estudio de las lecciones:

1º : Escuchar el Audio de la lección, siguiendo los puntos gráficos indicados por la


locución.

2º : Realizar una lectura analítica completa del texto de la lección, análisis de


gráficas, imágenes y videos.

3º : Tomar Apuntes Online y realizar los ejercicios propuestos.

4º : Si al finalizar este proceso de estudio de la lección, algún concepto no


te ha quedado claro, no dudes en contactar al instructor para evacuar tus

39
dudas.

Datos Personales

Es MUY importante que completes tus datos personales e incluyas tu fotografía. Te


recomendamos que antes de iniciar tus estudios accedas al panel "Datos Personales"
de tu menú y completes tu perfil.

Con tus datos personales completos podemos brindarte un mejor servicio de tutorías,
debido a que el instructor conociendo tu perfil, sabrá como encarar tu pregunta de la
mejor manera.

Además obtendrás muchos más beneficios sobre tu certificación digital y participación


en la comunidad cuanto más completos tus datos personales estén.

Por último te informamos que llegada la fecha de examen, no podrás realizar


el mismo si tu perfil de alumno está incompleto.

Aclaraciones importantes

Si necesitas una diagramación o prorroga en alguna unidad a medida que


realices tus estudios contacta a tu instructor.

Visita el siguiente vínculo para conocer las limitaciones sobre las garantías
del servicio: Garantías del Servicio.

Las consultas a realizar a tu instructor deben ser sobre los temas tratados en
el curso estudiado, caso contrario el instructor no tiene responsabilidad de
responderlas.

Ahora sí!! Eres Bienvenido al centro de capacitación E-SAP.


Esperamos que encuentres muy placentera y gratificante tu experiencia de estudios.

Estamos en contacto cuando tú lo desees.


Te deseamos éxito y aplicación en tus estudios.

E-SAP Centro de Capacitación Profesional SAP & ABAP


http://esap.cvosoft.com

Lección 2: Presentación instructor

Lección 3: Instalación de SAPNetWeaver

1| Qué es SAPNetWeaver?

SAPNetWeaver es una versión reducida de SAP que es perfecta para empezar a


aprender la programación en ABAP, entre otros temas. La licencia inicial de

39
SAPNetWeaver es por 30 días pero puede extenderse. Esto lo explicaremos más
adelante en el curso.

2| Donde descargarlo?

Vamos a descargar el SAPNetWeaver de la SDN, pero previamente a la descarga debemos


registrarnos como usuarios. Para ello, hacemos doble click en el siguiente link:

DESCARGAS

Registrarnos en la SDN

Una vez registrados, se nos enviará a nuestro correo personal un mail con el usuario
y password. La password podemos cambiarla una vez logueados a la SDN.

Ahora sí, estamos listos para descargar el SAPNetweaver y lo haremos desde el link que
mostramos a continuación. Aquí descargaremos dos archivos de más de 3GB de tamaño
entre los dos, que deberemos descargar en una misma carpeta en nuestro disco rígido.

Es importante saber que en la SDN existen varias versiones


disponibles para instalar. Nosotros explicaremos el
procedimiento de instalación de la versión SAP NetWeaver
7.01 SR1 SP3 ABAP Trial Version.

Si bien la instalación de las otras versiones es casi idéntica,


pueden variar algunas pantallas del proceso de instalación.

DESCARGA SDN

Descargar SAPNetweaver

39
DESCARGA ALTERNATIVA

Debido a que en ciertas ocasiones no funcionan los links de


descarga de la SDN, existe esta variante para que descarguen
los ejecutables.

Descargar SAPNetweaver

Será necesario instalar la JRE en caso de no estar instalada en la máquina. Para esto,
accederemos al sitio oficial de Sun Microsystems, seleccionaremos la plataforma que en nuestro
caso será Windows y el lenguaje que será Multilenguaje. Finalmente, descargaremos el programa
en nuestra maquina y luego lo ejecutamos. Pero debemos tener en cuenta que solo debe
instalarse la versión 1.4.2.x que podemos descargar en el siguiente link:

DESCARGAS

Descargar JRE

Para descomprimir los archivos de instalación de SAPNetWeaver necesitaremos del programa


Winrar. Si todavía no lo tenemos instalado en nuestra máquina, podremos descargarlo de la
siguiente dirección:

DESCARGAS

Descargar WinRar

3| Requerimientos del sistema

Los requerimientos de la PC para realizar la instalación de SAPNetweaver son:

Tener instalada la JRE 1.4.2.x

Windows XP Profesional Service Pack 2, Windows Server 2003 o Windows Vista.

En caso de utilizar Windows 7 u otro sistema operativo


distinto a los anteriormente mencionados les recomendamos
la instalación de una máquina virtual.

Este procedimiento lo explicamos en la sección de descargas


de esta lección.

El Hostname no debe tener más de 13 caracteres

39
El Filesystem debe ser NTFS

En caso de no tener un sistema NTFS será necesario convertirlo utilizando el


procedimiento que se puede descargar del área de descargas de la lección.

Internet Explorer 5.5 o superior o Firefox 1.0 o superior

Mínimo 2GB de memoria RAM

Mínimo Procesador Intel Pentium III 1.1 GHz o superior (o procesador


compatible)

Mínimo 30 GB de espacio libre en el disco rígido (24GB permanentes libres)

Resolución del monitor (1024*768 o superior a 256 colores)

Estar seguro que no existan otros sistemas SAP instalados en la máquina

Si ya realizamos la instalación y falló, debemos des-


instalarlo tal como se explica en la sección de descargas.

El sistema SAP requiere de muchos puertos para servicios de comunicación.


Por lo tanto, previamente a la instalación chequear que el archivo
Windows/System32/drivers/etc/services no tenga entradas para los puertos 3200,
3600 y 8000. Si existen deben comentarse colocando un # delante de la línea.

39
Para instalar y utilizar el sistema, hay que estar logueado como
administrador

Si se utiliza un servidor DHCP para asignar dinámicamente la dirección IP


de la máquina, no será necesario instalar ningún agregado. Caso contrario, o
si la máquina no se conecta a internet, se deberá instalar el Ms LoopBack
Adapter. El procedimiento de instalación del Ms LoopBack Adapter está documentado
dentro de la documentación de la instalación y lo comentamos en los siguientes
puntos de la lección.

4| Recomendaciones

Desactivar el firewall de windows y el antivirus que tengamos instalado

Es recomendable desactivar el firewall de windows y des-instalar el antivirus que


tenemos instalado.

Servicio “Servidor” de nombre lanmanserver funcionando

Asegurarse que este servicio está activo y funcionando ya que sino la instalación falla.
Debe estar fijado en modo de inicio automático.

Aumentar el tamaño de la memoria virtual del equipo

Para ello utilizar el Procedimiento para aumentar la memoria virtual del equipo que
está disponible en la sección de descargas de la lección.

Usuario del sistema como Administrador y con password

El usuario con el que accedemos a Windows debe tener permisos de administrador y


contraseña. Es importante ya que la consola de SAP trabajará con este usuario y con
su contraseña. Si no la fijamos la consola fallará.

Generar un punto de restauración en Windows previo a la realización de la


instalación para realizar la vuelva atrás en caso de error.

Este procedimiento lo explicamos en la sección de descargas de la lección.

39
5| Observación preliminar

Antes de comenzar con el procedimiento formal de la instalación del sistema


consultaremos la documentación oficial que viene con los archivos que previamente
descargamos en nuestra máquina.

Lo primero que haremos será ejecutar el primero de los dos archivos de instalación, y
dentro de los archivos que se descomprimen, haremos doble click en el archivo
START.htm.

Luego de unos minutos, veremos la siguiente pantalla de bienvenida:

39
Presionamos Next y vemos la siguiente pantalla What to expect:

Presionamos Next y vemos la pantalla de requisitos para que el sistema funcione. En


el último punto de esta pantalla figura el paso a paso para la instalación del MS
LoopBack Adapter solo en caso de tener configurada una IP fija en la computadora.

Presionamos Next y vemos la siguiente pantalla donde figura la dirección web para
renovar la licencia.

39
Presionamos Next y veremos la pantalla con la explicación del procedimiento de
instalación.

6| Pasos de la instalación

La instalación del SAPNetWeaver consiste en la instalación del servidor de aplicaciones y del


SAP GUI que es la interfase gráfica que nos va a permitir acceder al sistema SAP.

La instalación de ambas aplicaciones puede tardar más


de cuatro horas dependiendo del funcionamiento de la
computadora.

Los pasos para la instalación son los siguientes:

39
Debemos colocar, si no lo hemos hecho antes, los dos archivos ejecutables dentro
de una misma carpeta.

Instalación del servidor de aplicación

Ejecutaremos el archivo
SAP_Netweaver701SR1_2008_Installation_Master/IM_WINDOWS_I386/sapinst.exe.

Veremos la siguiente pantalla donde seleccionaremos la opción SAP Netweaver 7.0


SR1 including Enhacement Package 1/SAP Application Server ABAP/MaxDB/Central
System/Central System y presionamos Next.

39
Luego leemos y aceptamos la licencia del producto.

39
En caso de no tener instalada la JRE veremos la siguiente pantalla. Aquí tendremos que utilizar el
browser para colocar la ruta donde se encuentra la carpeta de la JRE.

En caso de tener instalada correctamente la JRE versión


1.4.2.X no veremos esta pantalla.

39
Luego debo elegir un nombre para el SAPSID y presiono Next.

39
En la siguiente pantalla, simplemente presionamos el botón Next sin ingresar datos.

39
Ahora ingresamos la password master para todos los usuarios. Si presionamos F1
sobre el campo veremos las condiciones que debe cumplir la password.

39
En la siguiente pantalla, el programa de instalación evaluará si la configuración de
nuestra computadora cumple con los pre-requisitos para la instalación. Seguramente
habrá alguno o más puntos que no cumplamos. Igual así, seguiremos adelante con la
instalación presionando el botón Cancel.

39
Luego veremos la siguiente pantalla para la instalación del SAP CRYPTOGRAPHIC
SOFTWARE. Simplemente presionamos el botón Next.

39
En la siguiente pantalla vemos un resumen de las configuraciones previamente
seteadas. Presionamos Next.

39
Ahora sí, la instalación del servidor de aplicaciones ha comenzado.

39
Luego de cuatro horas aproximadamente, dependiendo del equipo, si la instalación
finalizó correctamente, veremos la siguiente ventana.

Luego de finalizada la instalación del servidor de aplicación, veremos en nuestro


escritorio el ícono del SAP Management Console.

Instalación del SAP GUI

Ahora vamos a instalar el SAP GUI. Para esto, tendremos que ejecutar el archivo
SAPGUI710C3/SAP_GUI_7.10_C3_Trial_2009217_1034.exe y veremos la siguiente
pantalla.

Luego, en la siguiente pantalla, tildaremos a la izquierda del texto SAP GUI 7.10 C3
Trial y presionamos el botón Next.

39
Finalizada la instalación del SAP GUI, veremos en el escritorio de nuestra PC dos
íconos nuevos, uno es el TWEAK SAP GUI el cual nos permitirá configurar ciertos
aspectos no obligatorios de visualización de la pantalla y el otro es el SAP Logon el
cual nos permitirá loguearnos al sistema SAP.

Llegado a este punto de la instalación, deberemos reiniciar


la computadora.

7| Configurando el SAP Logon

Antes de poder tener acceso al sistema SAP, se tiene configurar una nueva entrada
en el SAPLogon. Para esto, hacemos doble click en el SAP Logon y veremos la
siguiente pantalla.

39
Presionamos el botón Nueva entrada y luego continuar y en la siguiente pantalla
completamos los campos con los siguientes datos y después presionamos el botón
Terminar.

39
8| Iniciando el sistema SAP

Una vez que hayamos terminado la instalación del servidor de aplicaciones y el SAPGUI
reiniciaremos nuestro equipo y al iniciarse veremos dos usuarios: uno es el del administrador que
comúnmente utilizamos y el otro es el NSPADMIN que crea la instalación.

Para utilizar el sistema SAPNetWeaver, utilizaremos el


usuario administrador con el que venimos trabajando, no
se debe utilizar el usuario NSPADMIN.

Para poder trabajar con el sistema SAP, cada vez que encendamos nuestra PC,
debemos levantar el servidor de aplicaciones. Para ello, hacemos doble click en el
ícono SAP Management Console. Una vez abierta la aplicación, abrimos el menú
NSP/Todas las tareas y presionamos Start.

Luego en la siguiente pantalla, se nos pedirá que ingresemos la password del usuario
Administrador de Windows con el que instalamos la aplicación.

39
Finalmente, si todo resulto bien, al cabo de un minuto o menos veremos en verde los
procesos.

9| Recomendaciones Post instalación

Es importante tener en cuenta las siguientes recomendaciones luego de realizada


correctamente la instalación:

No debemos actualizar la versión de la JRE a pesar de las recomendaciones de


Windows.

Lección 4: Qué es SAP?


39
1| Qué es SAP?

SAP es un sistema ERP, que sirve para la administración integral de una empresa. El
sistema SAP está compuesto por una serie de áreas funcionales o módulos que
responden de forma completa y en tiempo real a los procesos operativos de las
compañías. Aunque pueden ser agrupados en cuatro grandes áreas (financiera,
logística, recursos humanos y funciones multiaplicaciones), funcionan de un modo
integrado, dado que existen conexiones naturales entre los distintos procesos.

2| Arquitectura SAP
SAP se configura como una arquitectura cliente-servidor de tres capas, con un reparto
claro de las funciones. Las bases de datos están instaladas en un servidor y
componen la capa de datos, el sistema es instalado en otro servidor y compone la
capa de aplicación y la capa de presentación está formada por el SAP GUI que es la
interfase gráfica del usuario de SAP.

39
3| Qué Módulos Funcionales componen al sistema SAP?

Existen varias versiones del sistema, siendo la más utilizada la R/3 estándar. Los
principales módulos de esta solución son:

SD (Comercial)

MM (Gestión de Materiales)

PP (Planificación de Producto)

QM (Gestión de Calidad)

PM (Mantenimiento)

HR (Gestión de Recursos Humanos)

FI (Gestión Financiera)

CO (Controlling)

TR (Tesoreria)

PS (Sistema de Proyectos)

WF (Workflow)

39
IS (Soluciones Sectoriales)

Aparte de la solución R/3 estándar, existen otras soluciones del sistema,


especialmente diseñadas según los requerimientos de la industria a la que está
destinada. Así existe la solución ISU-Utilities para empresas de servicios o la solución
Banking para bancos.

Lección 5: Qué es ABAP?

1| Qué es Abap?

ABAP es un lenguaje de cuarta generación, propiedad de SAP, que se utiliza para


programar la mayoría de sus productos ( R/3, etc.).

Mediante ABAP se desarrollan nuevas aplicaciones como complemento a las ya


existentes, en la versión de SAP instalada o como apoyo a la configuración del
sistema, lo que es llamado en SAP como Z y permite a los usuarios cumplimentar los
requerimientos no satisfechos por la versión estándar del sistema.

2| Fortalezas del ABAP

Las principales fortalezas del lenguaje son:

Utiliza sentencias de OPEN SQL para conectarse con prácticamente cualquier base
de datos.

Es un lenguaje estructurado que puede ser también programado orientado a


objetos.

Cuenta con miles de funciones para el manejo de archivos, bases de datos, fechas,
etc.

Permite conexiones RFC para conectar a los sistemas SAP con cualquier otro
sistema o lenguaje de programación.

Permite la creación de aplicaciones multiidioma.

Posee una ayuda muy potente sobre la sintaxis y la semántica del lenguaje.

Permite la realización de reportes en forma rápida y sencilla.

ABAP. Es un lenguaje de programación orientado a eventos


donde la secuencia de instrucciones depende del
cumplimiento de una condición o evento.

39
3| Secuencia de Eventos

La estructura de un programa ABAP no es la clásica estructura TOP-DOWN, típica de


los lenguajes estructurados. En el siguiente gráfico vemos la secuencia de eventos
que puede cumplir un programa.

Lección 6: Ambientes, Mandantes y Clases de desarrollo o Paquetes

1| Ambientes y Mandantes

Como en todos los ámbitos de desarrollo de software, se configuran en SAP tres


ambientes, uno de desarrollo, uno de pruebas y otro de producción, que es donde se
utilizan las aplicaciones desarrolladas y probadas satisfactoriamente.

A su vez, en cada ambiente, existen distintos mandantes, siendo independientes los


datos que se visualizan en cada mandante dentro del mismo ambiente. Por ejemplo,
puede existir el mandante 100, que se utiliza para la configuración del sistema, el
mandante 200 que se utiliza para el desarrollo de las aplicaciones y el mandante 300,
que se utiliza para las pruebas unitarias dentro del ambiente de desarrollo.

Por último, existen dentro de cada mandante, dos tipos de objetos, los que son
independientes de mandante y los que son dependientes de mandante. Por ejemplo, un
programa es independiente de mandante ya que si lo creamos en el mandante 200, el
programa también va a existir en los mandantes 100 y 300. Los datos de una tabla son
dependientes del mandante ya que si a esta tabla le ingresamos registros en el
mandante 200, estos registros no van a existir en los restantes mandantes dentro del
mismo ambiente.

En el gráfico que vemos a continuación, tenemos una posible distribución de los


mandantes y los ambientes dentro de una instalación SAP.

39
Los datos de las bases de datos y los formularios (concepto
que veremos más adelante) son dependientes del mandante
en el que fueron creados.

2| Clase de desarrollo o Paquete

La Clase de Desarrollo o también llamada Paquete es una forma de organizar todos los
nuevos objetos que se crean en SAP, clasificándolos generalmente por módulos.
Poniendo un ejemplo, un objeto sería un archivo y la clase de desarrollo sería la carpeta
donde guardamos el archivo.

Existe la Clase de Desarrollo $TMP, que se utiliza para los objetos temporales que no se
van a transportar entre ambientes, osea para pruebas.

Al momento de crear un nuevo objeto en el sistema, SAP nos proporcionará la


pantalla que vemos a continuación para que le asignemos el Paquete al
que pertenece. En este caso, el paquete es Z_WEB_SERVICE.

Lección 7: Login al sistema SAP y Ayuda en ABAP

1| Login al sistema SAP

39
Como dijimos anteriormente, la arquitectura que utiliza SAP es Cliente-servidor de tres
capas, donde el sistema y las bases de datos están instaladas en el servidor y los
usuarios se conectan a éste a través del SAP Logon.

Es importante recordar, que para poder conectarnos a SAP en nuestra


PC debemos levantar el servidor de aplicaciones tal como lo explicamos en la lección
de Instalación de SAPNetWeaver. Luego, hacemos doble click en el SAP Logon
y introducimos el mandante que es 001, el usuario que es BCUSER y la password que
es minisap.

Una vez introducidos los datos, visualizamos el modo SAP con el menú
correspondiente al usuario logueado.

39
Desde este sector, podemos acceder a todas las transacciones permitidas para el
usuario logueado. Otra forma de hacer lo mismo es escribir la transacción a la que
deseamos ir en el campo de comandos. Por ejemplo, más adelante veremos que la
transacción SE38 nos lleva al Editor ABAP.

2| Ayuda en ABAP

Existen cuatro sistemas de ayuda para aprender y desarrollar en ABAP. Es muy


importante tenerlos en cuenta para resolver rápido cualquier inquietud que nos surja.
Ellos son:

Desde el entorno de trabajo, presionando F1 sobre cualquier sentencia, el sistema


nos proporcionará ayuda con ejemplos que generalmente son muy útiles.

39
Usando la ayuda extendida de SAP. En todas las pantallas de SAP tenemos la opción
Help desde la que podemos buscar información.

SDN. Donde vamos a encontrar una enorme cantidad de información y ayuda sobre
cualquier tema dentro del mundo SAP.

39
Internet en general. Aparte de la SDN, existen muchas otras páginas, foros y blogs
donde encontraremos información muy útil.

Lección 8: Video - La navegación en el entorno de desarrollo ABAP

Lección 9: Mi primer programa ABAP

1| Mi primer programa ABAP

Vamos a crear nuestro primer programa en ABAP. Para esto nos logueamos a SAP
como lo vimos en la lección anterior, escribimos en el campo de comandos la
transacción SE38 y presionamos enter. Visualizaremos el Editor ABAP, allí escribiremos
el nombre del programa que vamos a crear, el cual debe empezar con Z y
presionaremos el botón .

39
Luego aparecerá una ventana que nos va a pedir:

Título: Debe ser lo más descriptivo posible. En este caso será "Mi primer programa
Abap".

Tipo: Se refiere al tipo de objeto que estamos creando. Generalmente será


"Programa ejecutable".

Luego presionamos grabar y el sistema en una nueva ventana nos solicitara que
ingresemos el paquete o clase de desarrollo, a lo que presionaremos el botón "Objeto
local" que es lo mismo que escribir $TMP y presionar grabar.

En el editor escribiremos el siguiente código y luego presionaremos el botón


"Activate" que compilará y activará nuestro programa.

39
Todas las sentencias en ABAP terminan con un punto.

ABAP no distingue entre minúsculas y mayúsculas.

Una sentencia ABAP puede ocupar más de una linea.

Las cadenas de texto se escriben entre comillas simples.

Una vez compilado sin errores, lo ejecutaremos con el botón ejecutar o


presionando la tecla F8.

La pantalla de salida que visualizaremos será la siguiente:

Felicitaciones! acabas de crear tu primer programa ABAP.

PRETTY PRINTER. Se utiliza para unificar los criterios de


mayúsculas y minúsculas en los programas ABAP. Para
configurarlo acceder a UTILITIES->SETTINGS->ABAP
EDITOR->PRETTY PRINTER

39
2| Ordenes de Transporte

En el ejemplo anterior, creamos un objeto que como es de prueba, lo asignamos a la


clase de desarrollo $TMP. Pero si quisiéramos transportarlo a otro ambiente tenemos que
asignarlo a una clase de desarrollo o paquete que no sea de prueba. Luego de realizar la
asignación, el sistema nos solicitará que asociemos el objeto creado a una orden de
transporte que es un número único en SAP que sirve para agrupar objetos que van a
ser transportados entre ambientes.

Una orden de transporte puede ser de dos tipos:

Customizing: cuando se utiliza para la configuración del sistema.

Workbench: cuando se utiliza para el desarrollo de programas.

Para la administración de las ordenes de transporte se utilizan las transacciones SE10,


SE01 y SE09.

Una orden de transporte puede tener dos estados:

Modificable: cuando la orden puede ser modificada, osea se le pueden agregar o


quitar objetos.

Liberada: cuando la orden no puede ser modificada, está lista para ser
transportada a otro ambiente.
Para liberar una orden, basta con presionar el botón para transportar sobre la
tarea que compone la orden y también sobre orden misma.

39
UNIDAD 2: DECLARACION Y PROCESAMIENTO DE DATOS

39
Lección 1: Características de los programas ABAP

1| Aplicaciones ABAP

Dentro del mundo ABAP se pueden crear distintos tipos de objetos. Los más comunes
de ellos son:

Reporte, Reporte interactivo y Reporte ALV

Programa de Dialogo

Formularios

Batch Input

User exists

Field exits

Funciones y RFC

A medida que avanza el curso vamos a ir viendo en detalle cada uno de ellos. Ahora nos vamos a ocupar de los llamados
Reportes Clásicos o simplemente Reportes.

REPORTE. Es un programa que consiste en una serie


de instrucciones y palabras clave cuyo objetivo es
procesar datos de entrada o datos que se obtienen
de las tablas del sistema y mostrar los resultados
del procesamiento por pantalla.

Existen cuatro tipos de palabras claves:

Declarativas: se utilizan para declarar datos que vamos a usar dentro del
programa. Ej.: DATA, TABLES y CONSTANT.

Eventos: que ocurren en el programa. Ej.: START-OF-SELECTION, TOP-OF-PAGE,


etc.

Control: sentencias de control de flujo de programa. Ej.: IF, WHILE, DO, etc.

Operativas: realizan funciones según la palabra clave. Ej.: WRITE, MOVE, etc.

Generalmente la estructura de un reporte va a ser de la siguiente manera:

39
Existen dos formas de utilizar los comentarios en un programa ABAP:

Con un asterisco en la primera columna de la fila.

Con comillas dobles en cualquier posición de la línea.

2| Eventos de un programa ABAP

Como dijimos anteriormente, la programación ABAP es orientada a eventos. Los


principales eventos que pueden ocurrir dentro de un programa son:

INITIALIZATION

Es el primer evento que se ejecuta. Nos permite inicializar los campos de la pantalla de
selección de un programa o cualquier otra variable.

AT SELECTION-SCREEN

Permite formatear la pantalla de selección según nuestras necesidades.

START-OF SELECTION

Si no es precedido por otro evento, el sistema inserta este evento antes de la primera
línea de código ejecutable.

END-OF-SELECTION

Contiene las últimas sentencias que se ejecutarán en el programa.

AT LINE-SELECTION

Permite al usuario seleccionar una línea de un listado y realizar alguna acción. Se


utiliza en los reportes interactivos.

AT USER-COMMAND

Se ejecuta cuando el usuario presiona un botón del menú en un reporte.

39
TOP-OF-PAGE

Ejecuta las instrucciones al inicio de la página (encabezados).

END-OF-PAGE

Ejecuta la instrucciones al final de la página (Pie de Página).

Veamos un ejemplo de como usaríamos los eventos en un programa ABAP. Para ello
nos logueamos a SAP, ingresamos a la transacción SE38 y creamos el programa
Z_PRUEBA_EVENTOS que lo grabamos como programa ejecutable y como objeto
local con el siguiente código:

Si ejecutamos este programa produciríamos la siguiente salida:

No importa el orden en el que se escriban


los eventos dentro de un programa.

39
3| Utilizando el debugger

Es muy importante saber utilizar el debugger ya que en programación las cosas solo
funcionan si y solo si son perfectas osea sin errores. Algunos errores se detectan a
simple vista pero para resolver otros vamos a necesitar ejecutar nuestro programa y
saber exactamente cuales son los valores que van tomando las variables internas del
mismo. Para esto existe el debugger.

Veamos como debaguear el programa Z_PRUEBA_EVENTOS que acabamos de


crear. Para ello, visualizamos el programa a través de la transacción SE38 y
colocamos un breakpoint luego de la declaración de las variables presionando el
botón para breakpoints de sesión que durarán mientras la sesión este abierta o
para breakpoints externos.

Luego ejecutaremos el programa y veremos en debugger en acción.

39
Presionando el botón Single step o la tecla F5, ejecutaremos paso a paso osea
sentencia a sentencia.

Presionando el botón Execute o la tecla F6, ejecutaremos subrutina a subrutina sin


entrar en el contenido de cada una. Más adelante veremos el concepto de subrutina
en detalle.

Presionando el botón Return o la tecla F7, retornaremos a la rutina de nivel


superior de la rutina actual en ejecución.

Presionando el botón Run o la tecla F8, continuaremos la ejecución hasta el final


del programa.

39
En la parte inferior de la pantalla del debugger podemos ingresar el nombre de
cualquiera de las variables del programa para saber cual es su contenido en cualquier
momento del mismo. También podemos modificar el contenido de una variable para
saber cual sería el resultado del programa con esta modificación.

Lección 2: Video - Los eventos y el debugger

LECCION_2_1_ABAP_INICIAL_V4_2.swf

Lección 3: Declaración de datos

1| Tipos de datos ABAP

Los principales tipos de datos que se utilizan en ABAP son:

También existen los Tipos STRING que se utiliza para cadenas de longitud variable y
XSTRING que se utiliza como un string hexadecimal para cadenas de caracteres muy
grandes.

Para declarar una variable utilizaremos la palabras clave DATA y TYPE tal como vemos
en el siguiente ejemplo.

Con el agregado de VALUE, inicializamos con un valor determinado a una variable.


39
Cuando declaramos variables de tipo
caracter (TYPE c) debemos especificar la
longitud de la cadena. De lo contrario el
sistema asumirá que su longitud es 1
caracter.

También podemos declarar variables que sean de igual tipo que otras ya creadas en
el sistema. Para esto utilizamos la sentencia LIKE. En el siguiente caso, creamos la
variable V_CLIENTE que es del mismo tipo que el campo KUNNR de la tabla Maestro
de Clientes.

2| Estructuras de datos

Una estructura es un conjunto de campos relacionados. Los componentes pueden ser


simples campos, otras estructuras o inclusive tablas.

Existen tres formas de definir una estructura:

La primera es utilizando la palabra clave DATA. En el siguiente ejemplo creamos una


estructura de clientes que tendrá los mismos campos que la tabla de clientes KNA1.

En la segunda forma también utilizamos la palabra clave DATA pero vamos a crear
una estructura de clientes solo con ciertos campos.

La tercera forma es utilizando TIPOS, que son formatos de estructuras que pueden
ser utilizados por cualquier otra estructura sin necesidad de reescribir el código. Para
esto se utiliza la palabra reservada TYPES.

39
3| Constantes

Una constante es una variable que se declara dentro de un programa cuyo valor
permanecerá tal como lo indica su nombre constante a la largo del programa. Para su
declaración se utiliza la palabra reservada CONSTANTS.

La utilización de constantes ayuda a que


el mantenimiento de las aplicaciones
ABAP sea más sencillo.

4| Include de datos

Un include es un objeto ABAP que se utiliza entre otras cosa para modularizar la
declaración de los datos de manera que el programa ABAP resulte más legible
y mantenible. Para su creación se utiliza la palabra clave INCLUDE seguida del nombre
del include.

La utilización de INCLUDES es
considerada una buena práctica de
programación.

5| Variables del sistema

A parte de las variables que define el programador, existen otras que han sido
definidas por el sistema y que son de gran utilidad dentro de los programas ABAP. Se
encuentran en la tabla SYST y contienen información que va desde la hora del
sistema a saber si se ejecuto correctamente una sentencia ABAP o una actualización a
una base de datos. Su contenido no puede ser modificado en los programas sino que
cambia simplemente con la ejecución de los mismos.

Las más comúnmente usadas son:

SY-SUBRC: código de retorno posterior a la ejecución de una sentencia ABAP. Si la


ejecución fue correcta, entonces es 0, sino es distinto de cero

SY-DATUM: contiene la fecha del sistema.

SY-UZEIT: contiene la hora del sistema.

SY-INDEX: contiene la cantidad de repeticiones de los bucles.

39
Leccion 4: Video - Gestión de versiones

LECCION_2_3_ABAP_INICIAL_V4.swf

Lección 5: Procesamiento de los datos

1| Asignación de valores

Existen dos formas básicas para asignar un valor a una variable. La primera consiste
en la asignación simple.

La segunda forma es mediante la sentencia MOVE.

2| Inicialización de variables

Para la inicialización de las variables utilizamos la sentencia CLEAR.

Si inicializamos las variables que declaramos a continuación:

El contenido de los campos sería el siguiente:

39
Una sentencia muy importante a la hora de consultar el contenido de las variables
que declaramos en nuestros programas es IS INITIAL. En la siguiente imagen
vemos un ejemplo de su utilización.

La sentencia IS INITIAL es muy útil cuando se trabaja con tablas internas


(concepto que veremos más adelante en el curso). Para más ayuda presionar F1
sobre la sentencia.

3| Operaciones con caracteres

Existen algunas funciones que se utilizan para tratar caracteres que son muy
útiles en el trabajo diario de un programador ABAP. Ellas son:

CONCATENATE: se utiliza para concatenar varios campos alfanuméricos en uno solo.

Esta sentencia concatena los campos V_CAMPO1, V_CAMPO2 y V_CAMPO3 en


la variable V_CAMPO. Todos estos campos son de tipo caracter. Con la cláusula
SEPARATED BY se puede especificar un campo alfanumérico que se utilizará como
separador entre los campos V_CAMPO1, V_CAMPO2 y V_CAMPO3.

La sentencia CONCATENATE es muy útil cuando se trabaja con fechas ya que las
fechas en SAP son del formato AAAAMMDD y cuando se muestran en un listado
se deben convertir a DD.MM.AAAA. Para más ayuda presionar F1 sobre la
sentencia.

TRANSLATE: se utiliza para convertir caracteres de mayúscula a minúscula o


viceversa, o para realizar sustituciones de caracteres a través de ciertas reglas.

39
La sentencia anterior convierte a mayúsculas el contenido
de la variable V_TEXTO, siendo V_TEXTO de tipo caracter.
La sentencia TRANSLATE es muy útil para la conversión de texto a mayúscula o
minúscula. Para más ayuda presionar F1 sobre la sentencia.

REPLACE: reemplaza cierta parte de una cadena de caracteres por otra cadena de
caracteres o caracter.

La sentencia anterior reemplaza el contenido de la variable


V_TEXTO que es 'Hola' por el texto 'Casa'.
La sentencia REPLACE es muy útil cuando se trabaja con importes. Para más
ayuda presionar F1 sobre la sentencia.

SPLIT: divide a un campo alfanumérico en varios campos por un separador.

La sentencia anterior utiliza el separador ',' para dividir el contenido del campo
V_TEXTO_LARGO en las variables V_CAMPO1, V_CAMPO2, V_CAMPO3 y V_CAMPO4
que son de tipo caracter (TYPE c). Si todos los campos destino son lo suficientemente
grandes para almacenar las partes del campo V_TEXTO_LARGO, SY-SUBRC valdrá
0, caso contrario valdrá 4.

La sentencia SPLIT es muy útil cuando se trabaja con textos largos y es


necesario separarlos por algún caracter especial. Para más ayuda presionar F1
sobre la sentencia.

SHIFT: se utiliza para desplazar el contenido de un campo alfanumérico. Realiza el


desplazamiento del contenido de un campo hasta un string dado.

La sentencia anterior realiza el desplazamiento del campo


V_ALFABETO hasta la quinta posición, quedando el resto
de los caracteres que componen a V_ALFABETO en la
variable y eliminando los dos primeros.

39
La sentencia SHIFT es muy útil cuando se trabaja con números de documentos
o cualquier otro número. que haya sido grabado en tablas SAP con ceros a la
izquierda. Para más ayuda presionar F1 sobre la sentencia.

SEARCH: se utiliza para buscar una cadena de caracteres dentro de un campo


alfanumérico.

La sentencia anterior busca en el campo V_ALFABETO la secuencia de caracteres


'ABC'. Como la secuencia existe, devolverá SY-SUBRC igual a 0. Caso contrario, si no
existiera, sería distinto igual a 4.

La sentencia SEARCH es muy útil cuando se trabaja con tablas internas y


se busca la ocurrencia de una determinada cadena en un campo de la
tabla. Para más ayuda presionar F1 sobre la sentencia.

CONDENSE: se utiliza para borrar espacios en blanco en campos alfanuméricos.


Borra cualquier secuencia de espacios en blanco, dejando solo uno que exista entre
palabras existentes en el campo. Los espacios en blanco por la izquierda también
desaparecen.

La salida en pantalla de la sentencia anterior sería 'Dr. Rafael Castro'. Con el


agregado de la cláusula NO-GAPS al final de la sentencia, se eliminarán todos los
espacios en blanco osea que también se eliminan los espacios existentes entre las
palabras.

La sentencia CONDENSE es muy útil en los reportes, cuando se quiere formatear


la salida en pantalla de un campo determinado. Para más ayuda presionar F1
sobre la sentencia.

4| Operaciones Aritméticas

En ABAP las cuatro operaciones básicas ( +, -, * , / ) se pueden implementar de dos


maneras obteniendo el mismo resultado.

39
Siendo el resultado el mismo de ambas formas. También se utilizan las siguientes
sentencias para operar aritméticamente con datos:

Lección 6: Control del Flujo de Datos

1| Condiciones

Las condiciones en ABAP se pueden representar de dos formas. Una es utilizando la


palabra clave IF-ENDIF.

Si ninguna de las condiciones es valida, el sistema ejecutará las declaraciones que


estén debajo del ELSE. La otra forma es mediante CASE-ENDCASE.

Si ninguna de las condiciones es valida, el sistema ejecutará las declaraciones que


estén debajo del WHEN OTHERS. En ambas formas se utilizan los siguientes
operadores lógicos.

39
Si en cada condición, se chequea que la variable sea igual a determinado valor,
y la cantidad de condiciones es alta, sería aconsejable utilizar CASE-ENDCASE.

2| Bucles

Los bucles en ABAP se puede pueden representar de tres formas. La primera es


mediante la palabra clave LOOP-ENDLOOP.

En el ejemplo anterior, Tabla es una tabla interna (Concepto


que veremos en detalle más adelante). Con el agregado de
la cláusula WHERE se puede restringir el número de líneas
a leer ya que se producirá la iteración siempre y cuando se
cumpla la condición. Para más información presionar F1
sobre la sentencia.
La utilización de la cláusula WHERE siempre y cuando sea posible es una buena
práctica de programación.

Otra forma es mediante la palabra clave DO-ENDDO.

La iteración se ejecutará solo si la condición es verdadera.

3| Sentencias de Control

Las sentencias de control se utilizan para terminar el procesamiento de un bucle, de


un proceso o de un programa. Ellas son:

39
CHECK <CONDICION>: verifica si la condición es verdadera. Si la condición es
falsa, y la sentencia está dentro de un bucle, se saltearán todas las sentencias
siguientes que estén dentro del bucle y se continuará con la siguiente iteración. Fuera
de un bucle se saltearán todas las sentencias hasta el final del evento o del programa
en proceso.

EXIT: dentro de un bucle saldrá del bucle, dentro de una subrutina saldrá de
la misma y fuera de un bucle saldrá del programa.

CONTINUE: se utiliza solo dentro de bucle. Luego de la ejecución de la sentencia


el sistema continua con la siguiente iteración.

STOP: se finaliza el programa en ejecución pero antes se ejecuta el evento END-


OF-SELECTION.

LEAVE: se finaliza el programa en ejecución pero no se ejecutará el evento END-


OF-SELECTION.

Lección 7: Formateando un Listado

1| Formato de salida de los datos

ABAP ofrece una serie de instrucciones especialmente diseñadas para generar


reportes de manera sencilla. Una de ellas es la sentencia WRITE.

39
Donde offset indica la columna donde empezará la impresión y long indica la
longitud de los valores a visualizar. Veamos un ejemplo:

Y la salida por pantalla es:

Existen muchos comandos adicionales a WRITE que se


utilizan para producir una salida por pantalla determinada.
Algunos de ellos son:
Left-justified Salida justificada a izquierda
Centered Salida Centrada
Right-justified Salida justificada a derecha
no-zero Si el campo contiene ceros, estos serán cambiados por blancos
no-gap El blanco despues del campo que se desea imprimir es omitido
no-sign El signo no aparece en la salida
decimals n n define el número de digitos decimales
round n Redondea el campo de salida para los tipos p
dd/mm/yyyy Fecha con separadores

Para dejar una línea en blanco se utiliza la sentencia SKIP y para escribir una línea
horizontal se utiliza la sentencia ULINE.

2| Formatos de Página
39
Existen instrucciones especialmente destinadas a darle formato a la salida de un
reporte ya sea por pantalla o por impresora.

El evento TOP-OF-PAGE se utiliza para cambiar la cabecera de una página. Este


evento ocurre tan pronto como el sistema empieza a procesar una nueva página. Por
ejemplo, si queremos escribir un título particular al comienzo de cada página
pondremos:

El evento END-OF-SELECTION se utiliza para cambiar el pie de página. Este evento se


ejecuta luego del evento START-OF-SELECTION.

El evento END-OF-SELECTION se utiliza generalmente para hacer la impresión


de los datos de modo que se separe esto del procesamiento de los mismos.

Para modificar la cantidad de líneas o columnas que se visualizan en la pantalla se


utiliza la sentencia NO STANDARD PAGE HEADING.

Lección 8: Pantalla de selección

1| Parámetros de selección

Si queremos introducir algunas delimitaciones a nuestro programa de modo que


nuestro reporte solo se ejecute para ciertos datos que el usuario deberá introducir en
la pantalla entonces deberemos crear una pantalla de selección.

PANTALLA DE SELECCIÓN. Es un área dentro de los reportes en donde se


especifican los parámetros de selección por los cuales se va a ejecutar el
programa. Sirve para restringir el procesamiento y la salida de los datos. Por lo
general se coloca después de la declaración de datos.

Dentro de una pantalla de selección se pueden declarar dos tipos de objetos:


PARAMETER en los cuales el usuario podrá ingresar valores individuales y SELECT-
OPTIONS en donde el usuario podrá ingresar rangos de valores. En el siguiente
ejemplo declaramos los parámetros P_FECHA y P_NOMBRE.

39
La longitud máxima que puede tener el nombre de un parámetro es de 8
posiciones.

El agregado de la cláusula OBLIGATORY hace que el parámetro sea obligatorio. El


agregado de la cláusula DEFAULT asigna un valor por defecto al parámetro. Si
ejecutamos nuestro reporte veremos lo siguiente:

Lo que vemos es que al ejecutar nuestro reporte nos aparece la pantalla de selección que
acabamos de crear. Vemos que a la derecha de la fecha nos aparece el icono . Si
presionamos sobre el ícono o presionamos F4 dentro del campo fecha, se abrirá la
siguiente ventana:

Aquí estamos viendo la ayuda de búsqueda asociada al campo SY-DATUM el cual es el


tipo de nuestro parámetro. El tema de las ayudas de búsqueda lo veremos en detalle
en la próxima unidad.

Ahora vamos a cambiar las descripciones de los parámetros que aparecen en


pantalla. Para esto vamos a ir a:

39
Y ingresamos las descripciones que mejor se adapten a nuestro propósito.

También se pueden crear parámetros tipo Checkbox en donde el usuario puede tildar
las opciones que prefiera o tipo Radiobutton donde el usuario selecciona una de las
opciones entre todas las existentes. Veamos un ejemplo de estos dos tipos de
parámetros:

Los cuales se visualizarán de la siguiente manera en pantalla:

Los SELECT-OPTIONS son iguales a los PARAMETER salvo que en ellos se puede
ingresar rangos de valores a parte de valores individuales. En el siguiente ejemplo,
declaramos el SELECT-OPTIONS S_CLAVEP.

39
De nuevo, si ejecutamos el reporte, a la derecha del campo Clave de país nos
aparece el icono , si lo presionamos vemos la ayuda de búsqueda correspondiente al
tipo LAND1_GP que es un tipo de la tabla KNA1.

2| Clases de Mensajes

Una vez que ingresamos todos los parámetros de nuestro reporte y ejecutamos el
programa, lo que vamos a querer es que dependiendo de los parámetros introducidos
se produzcan determinadas acciones.

Para analizar el contenido de los parámetros existe el evento AT SELECTION-SCREEN.


En este evento es donde se validan los valores ingresados en la pantalla de selección.

Supongamos que queremos que la fecha ingresada por pantalla sea mayor o igual a
la fecha actual y que si no es así se emita un mensaje en la pantalla advirtiendo que
el valor introducido es incorrecto. Para esto vamos a tener que crear una Clase de
mensajes a través de la transacción SE91 tal como vemos a continuación:

Le asignamos una descripción y grabamos.

39
Y creamos nuestro primer mensaje.

Luego en nuestro programa, pondremos el código correspondiente en el evento AT


SELECTION-SCREEN para hacer cumplir con esta validación.

Por último ejecutamos nuestro reporte con una fecha de la pantalla de selección anterior
a la fecha actual y vemos el siguiente mensaje en el extremo inferior izquierdo de la
pantalla.

39
El mensaje que mostramos es un mensaje de error. Esto
está determinado por la letra e que se antecede al número
del mensaje y la clase de mensajes entre paréntesis. Los
tipos de mensajes existentes son:
Significado del El mensaje
Tipo Comportamiento
mensaje aparece en
El programa continua sin la línea de
S Status
interrupción status
El programa continua una ventana
I Información
después de la interrupción de dialogo
Depende del contexto del Barra de
W Warning
mensaje status
Depende del contexto del Barra de
E Error
mensaje status
El programa termina después una ventana
A Terminación
de un cuadro de dialogo de dialogo
Error en tiempo de ejecución
X Dump un dump
tipo X

Lección 9: Video - El evento AT SELECTION-SCREEN y los tipos de


mensajes

LECCION_2_6_ABAP_INICIAL_V4.swf

39
UNIDAD 3: DICCIONARIO DE DATOS

Lección 1: Extensión de la licencia de SAPNetWeaver

1| Pasos para extender la licencia de SAPNetWeaver

Vamos a explicar los pasos a seguir para extender la licencia de SAPNetWeaver.


Recordemos que la licencia inicial de la instalación es de 30 días por lo tanto antes de
cumplirse este plazo deberemos realizar este procedimiento. El plazo de la nueva
licencia será por 3 meses y podrá ser renovada indefinidamente.

Lo primero que debemos hacer es solicitarle a SAP una nueva licencia para nuestro producto. Esto lo
haremos desde la siguiente dirección web.

DESCARGAS

Solicitar nueva licencia de SAPNetWeaver

Allí veremos la siguiente pantalla donde se especifican todas las versiones gratuitas
disponibles de los productos SAP. La correspondiente a nuestra instalación es la NSP
- SAPNetWeaver 7.0.

39
Al fondo de la pantalla completamos la información pedida con nuestros datos. El SDN
User ID es el nombre de usuario que creamos en la primera unidad para la instalación
de SAPNetWeaver.Tildamos la conformidad de la licencia. El System ID es NSP -
SAPNetWeaver 7.0/2004s.

Para obtener el Hardware key vamos a loguearnos en SAP e ir a la transacción


SLICENSE. El Hardware key es el número que aparece a la derecha del texto Active
Hardware key.

39
Una vez que obtenemos el Hardware key, volvemos a la pantalla de la licencia,
copiamos el número, presionamos el botón Submit y veremos la siguiente ventana.

Si todo andubo bien, veremos el mensaje: "Your request has been succesfully
submited. You will receive an email with your license key information".

Luego, recibiremos un mail en nuestro correo, que tendrá adjunto el archivo NSP.txt
con la información de nuestra nueva licencia. Descargaremos el archivo adjunto en
nuestro escritorio.

Luego verificamos que el Active Hardware Key que figura en la transacción


SLICENSE del sistema coincida con el mismo código que figura al final del archivo.

En caso de no coincidir ambos, debemos copiar el Active Hardware Key de la


transacción SLICENSE encima del mismo código que se encuentra al final del archivo.

Luego en la transacción SLICENSE, presionamos el botón New licenses, luego el


botón Install y por último seleccionamos el archivo NSP.txt con la información de la
licencia del escritorio.

Luego veremos la siguiente ventana indicándonos que la nueva licencia se instaló


correctamente.

39
Por último, vemos que la nueva fecha de expiración es tres meses posterior a la fecha
actual.

Lección 2: Tablas internas.

1| Qué son las Tablas internas?

Si queremos guardar una colección de registros de datos de la misma estructura en


memoria, sin necesidad de acceder continuamente a las bases de datos y poder
realizar diversas operaciones con este conjunto de información, entonces utilizaremos
tablas internas.

TABLA INTERNA. Es un objeto de datos que permite


guardar en memoria grandes cantidades de registros
de datos con la misma estructura. La cantidad de
registros máxima esta relacionada con los límites
especificados en la instalación del sistema.

El uso típico que se le da a una tabla interna es:

Para almacenar temporalmente los datos de las bases de datos para un


procesamiento futuro.

Para estructurar y formatear datos que se mostrarán como salida del programa.

Para formatear datos para ser utilizados por otros servicios.


39
2| Cómo se declara una Tabla interna?

La sintaxis para su declaración es la siguiente:

De esta manera definiremos una tabla interna con n líneas en memoria más una línea de cabecera o area
de trabajo. La cantidad de líneas que se especifican en OCCURS no limitan el tamaño de la tabla sino la
cantidad de registros que se guardarán en memoria simultáneamente.

Por lo general, en el parámetro OCCURS se especifica


la cantidad 0 lo que permite trabajar con tablas de
gran cantidad de registros.

En el próximo ejemplo declaramos la tabla interna TI_PROVEEDORES.

Otra forma de declarar la misma tabla sería:

3| Llenado de una tabla interna

Para llenar con datos una tabla interna utilizamos:

APPEND <estructura> TO <tabla>: se añade un registro a la tabla interna en la


última posición con los valores que tengamos en el área de trabajo. Veamos un
ejemplo:

39
Llenamos la tabla interna con el contenido de una base de datos. Esto lo haremos
con la sentencia SELECT que veremos en detalle en la próxima lección.

4| Ordenamiento de una tabla interna

Para ordenar una tabla interna utilizamos la sentencia SORT.

En el ejemplo anterior ordenamos la tabla TI_PROVEEDORES de forma descendente


por DNI lo cual invertirá el orden en el que fueron cargados originalmente los
registros. Para ordenar de menor a mayor hay que utilizar la cláusula ASCENDING.

5| Procesamiento de una tabla interna

Para recorrer una tabla interna y procesar registro a registro utilizaremos la sentencia
LOOP-ENDLOOP.

Si no existe ningún registro que cumpla la condición especificada en la cláusula


WHERE, el SY-SUBRC será distinto de cero.

6| Lectura de una tabla interna

Para leer un registro concreto de una tabla interna sin necesidad de recorrerla
utilizamos la sentencia READ TABLE.

Si se encuentra el registro buscado, el SY-SUBRC será cero, caso contrario, será


distinto de cero. Si se desea leer los datos que se encuentran en una posición

39
particular de la tabla se utilizará la cláusula INDEX tal como vemos en el siguiente
ejemplo.

El agregado de la Cláusula BINARY SEARCH en la


sentencia READ TABLE hace que la búsqueda sea
ampliamente más eficiente. Para más información
sobre la sentencia presionar F1.

7| Modificando una tabla interna

Para modificar el contenido de un registro de una tabla interna utilizamos la sentencia


MODIFY. En el siguiente ejemplo modificamos el campo DNI correspondiente al primer
registro de la tabla interna.

Si el registro que se intenta modificar con MODIFY


no existe, se creará un nuevo registro en la tabla.

Para insertar un registro en una posición determinada de una tabla interna utilizamos la
sentencia INSERT. En el siguiente ejemplo insertamos un registro en la posición 2.

Para borrar el contenido de un registro de una tabla interna utilizamos la sentencia


DELETE. En el siguiente ejemplo borramos el registro de la tabla interna de
proveedores con DNI igual a 20857492.

Para borrar todo el contenido de una tabla interna utilizamos la sentencia REFRESH. En
el siguiente ejemplo inicializamos la tabla interna TI_PROVEEDORES.

Para saber cuantos registros tiene una tabla interna utilizamos la sentencia DESCRIBE
TABLE. En el siguiente ejemplo declaramos V_LINEAS que es la variable que va a
contener la cantidad de filas de la tabla interna TI_PROVEEDORES luego de ejecutar la
sentencia DESCRIBE TABLE.

39
Lección 3: Video - Cortes de control utilizando tablas internas en
reportes.

LECCION_3_1_ABAP_INICIAL_V4_2.swf

Lección 4: Bases de datos, elementos de datos y dominios

1| Los datos en el sistema SAP

Podemos clasificar los datos del sistema SAP en tres tipos: datos maestros, datos de
movimientos y datos del sistema o de control.

Datos maestros: son datos que no se modifican muy a menudo. Por ejemplo:
datos de materiales, cuentas, bancos, clientes, etc.

Datos de movimientos: son datos muy volátiles y con gran volumen de


generación. Por ejemplo: datos de facturas, pedidos, etc.

Datos del sistema o de control: son datos que tienen que ver con la
configuración del sistema.

2| Qué es el diccionario de datos?

El diccionario de datos permite la administración de todas las definiciones de datos


usadas en el sistema R/3. Se accede a él a través de la transacción SE11 tal como
vemos a continuación:

39
Aquí, podemos crear, modificar y visualizar tablas base de datos, Vistas, Estructuras,
Elementos de datos, Grupos de tipos, Dominios, Ayudas para búsqueda y Objetos de
bloqueo.

3| Cómo crear una tabla base de datos, un elemento de datos y


un dominio?

Vamos a crear la tabla ZTABLA_USUARIOS. Para esto ingresamos el nombre de la


nueva tabla a la derecha del texto "Database table" y presionamos el botón
. Aquí, veremos la siguiente pantalla:

Completamos la Short Description "Descripción breve" de la nueva tabla con el texto


"Tabla de usuarios". En la solapa Delivery and Maintenance "Entrega y
actualización" completamos la Delivery Class "Clase de entrega" con "A" que significa
que la tabla es de aplicación y que tiene datos maestros y de movimientos. Existen

39
otras opciones que podremos ver si presionamos el botón que aparece al
posicionar el cursor en el cuadro de texto. En Data Browser/Table
View Mant. elegiremos la opción "Display/Maintenance Allowed" esto significa
que se podrá actualizar el contenido de la tabla mediante la transacción SM30.

En la solapa "Campos" vamos a ingresar los campos que va a tener nuestra tabla.
Estos van a ser: DNI, NOMBRE_APE, ESTADO_USU y el MANDANTE que no debe faltar
en ninguna tabla.

Todas las tablas base de datos que creemos deben


tener el mandante como primer campo de la tabla.
Este debe ser parte de la clave.

A cada campo de la tabla se le puede asignar un tipo instalado seleccionando la línea


del campo y presionando el botón , como podría ser CHAR de 30
posiciones o crear un elemento de datos para cada campo. En nuestra tabla, crearemos
los elementos de datos Z_DNI, Z_NOMBRE_APE y Z_ESTADO_USU. También es
posible utilizar elementos de datos que ya existen en el sistema, como es el caso del
MANDT.

Para crear el elemento de datos Z_DNI haremos doble click sobre el elemento, el
sistema nos ofrecerá guardar la tabla, diremos que sí y le asignaremos como paquete
objeto local. Luego nos aparecerá la siguiente ventana de dialogo:

39
Presionaremos la opción "Yes" y nos aparecerá la siguiente pantalla:

En la Descripción breve completaremos una descripción del contenido del campo.


Luego podemos elegir entre crear un dominio para este campo, utilizar un tipo instalado
o predefined type ya existente en el sistema o utilizar un tipo referencia o Reference
type. En este caso utilizaremos un tipo instalado y le asignaremos el tipo de datos
NUMC de 8 posiciones.

Luego iremos a la solapa Field Label o Denom.campo y actualizaremos los


denominadores de campo que son los títulos con los que se verá el campo cuando se
visualice en una transacción o reporte.

39
En este caso los denominadores de campo son todos iguales pero la idea es dar una
descripción más detallada del breve a la cabecera. Por último activaremos el elemento
de datos mediante el botón y nos aparecerá una nueva ventana de diálogo donde
confirmaremos la activación seleccionando el elemento a activar y presionando el
botón .

Para el campo NOMBRE_APE crearemos el elemento de datos Z_NOMBRE_APE tal como


hicimos con Z_DNI.

Para el campo ESTADO_USU, crearemos el elemento de datos Z_ESTADO_USU tal como


hicimos con Z_DNI y también crearemos el dominio ZZ_ESTADO_USU para asociarle el
ámbito de valores: A=Activo, I=Inactivo y N=Anulado.

El objetivo de crear un dominio es asociarle un


ámbito de valores, sino es preferible utilizar un tipo
instalado.

Si hacemos doble click sobre ZZ_ESTADO_USU el sistema nos preguntará en una


ventana de diálogo si deseamos crear el dominio. Contestaremos que sí y veremos la
siguiente pantalla:

39
Completamos la Descripción breve del dominio con "Estado del usuario". El tipo de
datos será CHAR de 1 posición. Luego en la solapa Value Range o Ámbito de valores
completaremos el ámbito de los valores del dominio.

Por último activamos el dominio ZZ_ESTADO_USU, luego activamos el elemento de


datos Z_ESTADO_USU y finalmente lo que nos queda antes de activar la tabla
ZTABLA_USUARIOS es configurar las opciones técnicas de la tabla presionando el
botón .

Aquí completaremos la Clase de datos con "APPL0" que es la correspondiente a


"Datos maestros, tablas transparentes" y la Categ.tamaño con "3" que es el valor
correspondiente a una tabla de 110.000 a 460.000 registros de datos.

39
Finalmente activamos la tabla ZTABLA_USUARIOS y felicitaciones acabamos de crear
nuestra primera tabla Z.

Lección 5: Video - Vistas de tablas bases de datos

LECCION_3_2_ABAP_INICIAL_V4_9.swf

Lección 6: Actualización y visualización de registros, Estructuras y


Ayudas de búsqueda.

1| Creación de una superficie de actualización para una tabla

Una vez que creamos la tabla ZTABLA_USUARIOS vamos a crearle una superficie de
actualización para poder ingresarle registros. Para esto vamos a ingresar a la
transacción SE11 con el nombre de la tabla y vamos a ir a la siguiente opción del
menú:

39
Aquí veremos la siguiente pantalla en donde completaremos los campos:

Authorization group: con &NC& que significa que no estamos asociando la


superficie a ningún grupo en particular.

Function group: aquí pondremos el mismo nombre de la tabla. Este tema lo


veremos en detalle en la unidad Funciones y Subrutinas.

Maintenance type: seleccionaremos un nivel osea one step.

39
Luego presionaremos el botón y el sistema nos ofrecerá números de
imágenes.

Presionaremos el botón y se completará con números, el campo de la pantalla


"Overview screen". Finalmente presionamos el botón y guardamos los cambios
como "Objeto local".

Ahora vamos a probar de ingresar registros en la tabla ZTABLA_USUARIOS, para ello


vamos a ir a la transacción SM30, escribiendo el nombre de nuestra tabla y
presionamos el botón .

39
Aquí presionamos el botón y comenzamos a cargar registros en nuestra
tabla.

Al finalizar la carga presionamos el botón .

2| Visualización de los registros de una tabla

Para visualizar los datos que acabamos de crear vamos a utilizar la transacción SE16.
Allí vamos a escribir el nombre de nuestra tabla y presionamos enter.

Inmediatamente después, veremos la siguiente pantalla en donde podremos filtrar los


datos a mostrar por cualquiera de los campos que componen nuestra tabla. También
podremos saber la cantidad de registros de nuestra tabla con el botón .

39
Aquí presionamos F8 y visualizaremos el contenido de la tabla ZTABLA_USUARIOS tal
como vemos:

3| Creación de una estructura

Vamos a crear una estructura, para ello accedemos a la transacción SE11, en Tipo de
datos colocamos el nombre de nuestra estructura que será ZUSUARIOS y
presionamos el botón Create.

Luego aparecerá en la pantalla la siguiente ventana de diálogo, seleccionamos la


opción Structure y presionamos el botón continuar de la tilde verde.

Luego ingresamos la Descripción breve que será "Estructura de usuarios" y los


campos que tendrá la estructura, que en este caso serán los mismos de la tabla
ZTABLA_USUARIOS como vemos a continuación:

39
Finalmente activamos.

4| Creación de una ayuda de búsqueda para parámetros

Una ayuda de búsqueda es un objeto ABAP que sirve para definir posibles valores de
selección.

Supongamos que tenemos un reporte ABAP con la siguiente pantalla de selección:

Y queremos que al presionar F4 sobre el campo de entrada de la pantalla se muestren


los nombre y apellidos de los usuarios.

Para esto, tenemos que crear la ayuda de búsqueda Z_AYUDA_USUARIOS en la


transacción SE11. Ingresamos el nombre Z_AYUDA_USUARIOS o la derecha del texto
Search help, presionamos el botón Create y veremos la siguiente ventana de diálogo:

Aquí seleccionaremos la opción "Elementary search help" y completamos la


pantalla con los siguientes datos:

39
El método de selección será el nombre de la tabla de donde se obtienen los datos. Los
campos NOMBRE_APE, DNI y ESTADO_USU son los que se mostrarán por pantalla al
utilizar la ayuda y el campo NOMBRE_APE en particular será el que se exporte a la
pantalla del reporte por eso tiene tildada la columna EXP. Para finalizar activamos la
ayuda.

Luego, modificaremos la declaración del parámetro de la pantalla de selección de


nuestro reporte con la sentencia MATCHCODE OBJECT seguida del nombre de la ayuda
de búsqueda que acabamos de crear.

Vemos que al ejecutar el reporte aparece el icono a la derecha del campo Usuario.
Finalmente, si lo presionamos veremos el siguiente listado de opciones de selección:

39
Antes de crear una nueva ayuda de búsqueda es
conveniente chequear en el diccionario de datos si no
existe una que cumpla con mis requisitos.

Lección 7: Instrucciones SQL: La sentencia SELECT

1| La sentencia SELECT

Existen en ABAP un conjunto de sentencias que se utilizan para acceder a las bases
de datos. La principal sentencia es SELECT, cuya sintaxis es la siguiente:

Si quisiéramos obtener todos los registros de la tabla ZTABLA_USUARIOS usaríamos


el siguiente código:

Donde TI_USUARIOS es una tabla interna del mismo tipo de la tabla ZTABLA_USUARIOS. El
asterisco indica que se obtendrán todos los campos de la tabla. La cláusula INTO TABLE se
utiliza cuando el resultado de la consulta se guarda en una tabla interna.

Evitar el uso del * cuando solo se requiera obtener algunos


campos de la tabla origen.

En la sentencia anterior, en caso de existir registros en la tabla ZTABLA_USUARIOS,


estos pisarán el contenido de la tabla interna TI_USUARIOS. Podría ocurrir que
queramos conservar el contenido de la tabla interna TI_USUARIOS luego de reiteradas
selecciones. En este caso tendríamos que usar la cláusula APPENDING TABLE en lugar
de INTO TABLE.

Es recomendable hacer CLEAR y REFRESH de la tabla


interna antes de realizar la selección.

Si quisiéramos obtener de todos los campos de la tabla ZTABLA_USUARIOS el campo


DNI deberíamos crear una tabla auxiliar solo con el campo DNI para alojar el
resultado de la consulta.

39
Siempre después de un SELECT se debe preguntar por el
SY-SUBRC para saber como proseguir.

Si quisiéramos obtener la primera ocurrencia de la tabla ZTABLA_USUARIOS donde se


cumpla determinada condición debemos usar la cláusula SINGLE como vemos a
continuación:

El resultado de esta consulta será guardado en la estructura WA_USUARIOS que es


del mismo tipo que la tabla ZTABLA_USUARIOS.

Si quisiéramos hacer la misma consulta anterior pero necesitamos obtener solo el


campo DNI entonces ya no sería necesaria la estructura WA_USUARIOS sino que
guardaríamos el resultado en la variable V_DNI tal como vemos en el siguiente
ejemplo:

Si quisiéramos obtener de una tabla los registros que cumplan una condición pero
queremos guardarlos en una tabla interna que no tiene la misma estructura que la
tabla, entonces tenemos que usar la cláusula INTO CORRESPONDING FIELDS OF
TABLE.

En el ejemplo anterior, la tabla interna TI_USUARIOS2 está compuesta por los campos
NOMBRE_APE y ESTADO_USU.

Supongamos que tenemos un reporte que tiene la pantalla de selección:

39
Donde Nombre y Apellido es el parameter P_NOMAPE y Estado Usuario es el select-
options S_ESTADO. Si quisiéramos hacer una selección a la tabla ZTABLA_USUARIOS
en base a lo que los usuarios ingresan por pantalla haríamos lo siguiente:

La cláusula IN se utiliza para los select-options en las condiciones de un select.

Ahora, si quisiéramos obtener el usuario activo con DNI más alto tendríamos que
usar la cláusula MAX de la siguiente forma:

Si quisiéramos saber la cantidad de usuarios con estado = "activo", debemos usar la


cláusula COUNT de la siguiente manera:

Si quisiéramos obtener de una tabla todos los registros que existan en una tabla
interna cargada con datos, entonces debemos utilizar la sentencia FOR ALL ENTRIES
IN que nos permite especificar condiciones en tiempo de ejecución. Veamos un
ejemplo:

Si quisiéramos obtener todos los registros que cumplan con un patrón de texto
en alguno de sus campos, debemos utilizar la sentencia LIKE como vemos en el
siguiente ejemplo:

39
Lección 8: INSERT, UPDATE, MODIFY, DELETE y actualización y
recuperación de la BD.

1| La sentencia INSERT

La sentencia INSERT permite introducir nuevos registros a una base de datos. Por
ejemplo, si quisiéramos introducir un nuevo registro en la tabla
ZTABLA_USUARIOS haríamos lo siguiente:

Siempre después de un INSERT se debe preguntar por el


SY-SUBRC. Si es cero, el registro se inserto correctamente,
caso contrario, se produjo un error y el registro no se
inserto.

Si quisiéramos introducir todos los registros de una tabla interna haríamos lo siguiente:

Si existe algún registro en la base de datos con igual clave que un registro en la tabla
interna se producirá un error de ejecución en el programa.

2| La sentencia UPDATE

La sentencia UPDATE permite actualizar el contenido de uno o varios registros de


una tabla base de datos. Por ejemplo, si quisiéramos actualizar un registro de una
tabla base de datos haríamos lo siguiente:

39
Siempre después de un UPDATE se debe preguntar por el
SY-SUBRC. Si es cero, el registro se actualizo
correctamente, caso contrario, se produjo un error y el
registro no se actualizo.

Si quisiéramos actualizar los registros de la tabla ZTABLA_USUARIOS que cumplan


determinada condición, haríamos lo siguiente:

Si quisiéramos actualizar todos los registros de la tabla ZTABLA_USUARIOS a partir


del contenido de una tabla interna haríamos lo siguiente:

3| La sentencia MODIFY

La sentencia MODIFY permite modificar el contenido de uno o varios registros de


una tabla base de datos. Por ejemplo, si quisiéramos modificar un registro de una
tabla base de datos haríamos lo siguiente:

Siempre después de un MODIFY se debe preguntar por el


SY-SUBRC. Si es cero, el registro se modifico
correctamente, caso contrario, se produjo un error y el
registro no se modifico.

Si quisiéramos modificar todos los registros de la tabla ZTABLA_USUARIOS a partir


del contenido de una tabla interna haríamos lo siguiente:

39
Si el registro que se intenta modificar, no existe en la tabla,
este se crea.

4| La sentencia DELETE

La sentencia DELETE permite borrar el contenido de uno o varios registros de


una tabla base de datos. Por ejemplo, si quisiéramos borrar un registro de una tabla
base de datos haríamos lo siguiente:

Siempre después de un DELETE se debe preguntar por el


SY-SUBRC. Si es cero, el registro se borro correctamente,
caso contrario, se produjo un error y el registro no se borro.

La cantidad de registros borrados se guarda en SY-DBCNT.

Si quisiéramos borrar los registros de la tabla ZTABLA_USUARIOS que cumplan


determinada condición, haríamos lo siguiente:

Si quisiéramos borrar todos los registros de la tabla ZTABLA_USUARIOS a partir del


contenido de una tabla interna haríamos lo siguiente:

5| Actualización y recuperación de una base de datos

Para finalizar una unidad de procesamiento lógico LUW de base de datos se utiliza un
COMMIT WORK, que realiza un update físico en la base de datos, haciendo irrevocable
cualquier modificación en la base de datos.

Si deseamos deshacer todas las operaciones realizadas sobre la base de datos desde
el último COMMIT WORK, realizaremos un ROLLBACK WORK. Veamos un ejemplo al
insertar registros en la base de datos ZTABLA_USUARIOS:

39
Es conveniente, después de un INSERT, MODIFY, UPDATE o
DELETE realizar un COMMIT WORK y ROLLBACK WORK.

Lección 9: Video - Actualización y Recuperación de una Base de


datos

LECCION_3_6_ABAP_INICIAL_V4_2.swf

39
UNIDAD 4: SUBRUTINAS, FUNCIONES Y BATCH

Lección 1: Subrutina

1| Qué son las subrutinas?

Las subrutinas son secciones de código que pueden ser utilizadas más de una vez. La
idea de pasar el código de los programas a subrutinas, es para que los programas
sean más fáciles de leer y de mantener.

MODULARIZAR. Se llama así a la acción de pasar el código de un programa a


subrutinas, para mejorar la lectura y mantenimiento del mismo. Lo ideal es que
una subrutina no tenga más de 50 líneas de código.

La modularización ayuda a encontrar más fácilmente los errores en los


programas. Esto se debe a que al debaguear un programa solo me preocupo por que
el resultado de una subrutina sea el esperado sin entrar en detalle de como se llega a
ese resultado.

Una subrutina se declara con la palabra reservada PERFORM seguida del nombre de la
subrutina. Veamos un ejemplo:

Aquí creamos una subrutina para modularizar la selección de los datos. Si hacemos
doble click en el nombre de la subrutina, el sistema nos propondrá crear la subrutina en
la siguiente ventana de diálogo:

Contestaremos que sí y el sistema nos preguntará donde queremos guardar la


subrutina, las opciones son: crear un nuevo include de datos o crearlas en el mismo
programa de control. En este caso, las crearemos en el programa de control.

39
Luego el sistema generará el siguiente bloque de código en nuestro programa para
que lo completemos con el código que corresponda:

Es importante que el nombre que se le asigne a una subrutina sea lo más


representativo posible del resultado que produce la subrutina. La longitud del
nombre no puede exceder los 30 caracteres

2| Tipos de subrutinas

Existen dos tipos de subrutinas:

Internas: cuando la subrutina está dentro del mismo programa que la llama.

Externas: cuando la subrutina está en un programa distinto al que las llama. Como
puede ser el caso de un include de subrutinas o otro programa.

3| Subrutinas internas

Como vimos en el ejemplo del punto 1, para crear una subrutina interna usamos la
palabra clave PERFORM seguida del nombre de la subrutina. Esto crea un bloque FORM-
ENDFORM donde colocamos nuestro código.

Se pueden pasar datos entre los programas principales y una subrutina a través de
parámetros. A los parámetros definidos en el programa principal, a la derecha de la
palabra PERFORM se los llama parámetros actuales. A los parámetros definidos en la
subrutina, a la derecha de la palabra FORM, se los llama parámetros formales.

Los parámetros pueden ser de tres tipos:

De entrada: cuando se utilizan para pasar datos del programa principal a la


subrutina.

De salida: cuando se utilizan para pasar datos de la subrutina al programa principal.

De entrada y salida: cuando se utilizan para pasar datos de la subrutina al


programa principal y también viceversa.

39
4| Paso de parámetros a subrutinas

Para pasar los parámetros utilizaremos tres opciones: USING, CHANGING y TABLES.
Estas opciones se deben escribir en el orden que mostramos a continuación en el
siguiente gráfico:

En el bloque FORM-ENDFORM debemos especificar el tipo de los parámetros formales.


De esta forma nos aseguramos que solo se pasen parámetros del tipo que
corresponde a la subrutina. Veamos un ejemplo donde pasamos una tabla interna, una
estructura y una variable de tipo carácter.

Cuando una subrutina es llamada, los parámetros deben ser pasados en el mismo
orden en el que fueron declarados, por lo tanto, se debe respetar esta misma
secuencia en el bloque FORM-ENDFORM.

Existen tres formas de pasar parámetros:

Paso por valor: durante la llamada a la subrutina, los parámetros formales son
creados como copias de los parámetros actuales. Los cambios en los parámetros formales
no afectan a los parámetros actuales. Veamos un ejemplo:

39
Y la salida será B.

Paso por referencia: durante la llamada a la subrutina, solo la dirección de los


parámetros actuales se transfieren a los parámetros formales. Dentro de la subrutina, se
trabaja con el campo del programa que hace la llamada. Si cambiamos los parámetros
formales, el contenido del campo del programa que hace la llamada también cambia.

Y la salida será A B y A X.

Paso por valor y resultado: durante la llamada a la subrutina, los parámetros


formales son creados como copias de los parámetros actuales. Los cambios en los
parámetros formales son copiados a los parámetros actuales al final de la subrutina.

39
Y la salida será H1 es: B.

5| Subrutinas externas

Si quisiéramos llamar a una subrutina que está en un programa distinto al que


estamos procesando, debemos utilizar la siguiente sintaxis

También podemos agregar includes de subrutinas a nuestro programa de la siguiente


manera:

Lección 2: Módulos de función

1| Qué son los Módulos de función?

Los módulos de función son funciones que han sido creadas y almacenadas en SAP y
que pueden ser utilizadas por cualquier programa ABAP. Para acceder a estas
funciones, utilizaremos la transacción SE37 como vemos a continuación:

39
Tienen una interfaz definida, ya que su diseño facilita el paso de parámetros tanto de
entrada como de salida.

Veamos un ejemplo de como utilizar un módulo de función ya


existente. Vamos a crear un nuevo programa ABAP, donde vamos a
ejecutar la función POPUP_TO_CONFIRM que se utiliza para pedir
confirmación al usuario antes de tomar una acción determinada.
En el menú del editor ABAP existe el botón Pattern que nos permite crear dentro
de un programa el esqueleto de cualquier función creada a través de la
transacción SE37, simplemente ingresando el nombre de la función que
necesitemos.

La ejecución de este programa dará como resultado la siguiente salida:

2| Cómo crear un Módulo de función?

Para crear un módulo de función accedemos a la transacción SE37. Allí escribiremos el


nombre de nuestra función que será Z_TEST_CLIENTES y presionaremos el botón
Create, como vemos a continuación:
39
Inmediatemente después veremos la siguiente ventana de diálogo en donde debemos
escribir el nombre del grupo de funciones al que pertenece la función y una
descripción breve de la función que queremos crear.

GRUPO DE FUNCIONES. Es un repositorio que agrupa funciones y que se utiliza


principalmente para compartir subrutinas y declaraciones de variables entre las
distintas funciones pertenecientes al grupo.

Para crear un grupo de funciones, debemos seleccionar en el menú de la transacción


SE37 la ruta Goto/Functions Groups/Create Group tal como vemos a continuación:

Aquí ingresaremos el nombre de nuestro grupo de función y presionamos el botón


Save como vemos a continuación:

39
Luego, si quisiéramos definir variables que se puedan utilizar en todas las funciones
pertenecientes a nuestro grupo de funciones iríamos en el menú de la SE37 a
Goto/GlobalData y veríamos la siguiente pantalla donde definiremos las variables
globales.

Si quisiéramos declarar subrutinas que puedan ser utilizadas por todas las funciones
del grupo, debemos en el menú de la transacción SE37, ir a Goto/MainProgram. Allí
descomentamos el primero de los include que está especificado para Subprogramas, le
cambiamos el nombre para que comience con Z, lo creamos haciendo doble click
sobre él y luego colocamos las subrutinas en él.

39
Finalmente, volvemos a la transacción SE37 con nuestro grupo de funciones creado,
presionamos Create, ingresamos el grupo de función y la descripción de la
función, grabamos y veremos la función Z_TEST_CLIENTES creada tal como muestra
el siguiente gráfico:

Veamos la utilidad de cada una de las solapas que se visualizan:

Attributes: aquí especificamos la descripción de la función y el tipo de función que


puede ser Normal, RFC o Update module.

Import: aquí especificamos los parámetros de salida de la función.

Export: aquí especificamos los parámetros de entrada de la función.

Changing: aquí especificamos los parámetros de salida que cambiarán de valor con
la ejecución de la función.

39
Tables: aquí especificamos las tablas que se utilizan en la función.

Exceptions: aquí especificamos las excepciones de la función. Una excepción es un


error que se produce al ejecutar la función y que ha sido catalogado cuando se creo el
módulo de función de modo de poder identificar rápidamente el motivo del error.

Source Code: aquí pondremos el código ABAP de la función.

Ahora, volviendo a nuestra función Z_TEST_CLIENTES, vamos a agregarle como


parámetro de entrada el DNI y como parámetro de salida la estructura de usuarios
de la tabla que creamos en la unidad 2 Z_TABLA_USUARIOS.

Luego pondremos código en la solapa SOURCE CODE para recuperar de la tabla


ZTABLA_USUARIOS, los datos del usuario al que pertenezca el DNI de entrada.
Finalmente activamos y luego podremos probar nuestra función ejecutándola.

Lección 3: Video - Las Funciones POPUP

LECCION_4_2_ABAP_INICIAL_V4.swf

39
Lección 4: Módulos de función RFC

1| Qué es un módulo de función RFC?

Un módulo de función RFC consiste en una llamada a una función que existe en
un sistema distinto al del programa que la llama. El objetivo principal de las RFC es
acceder a otros ambientes para obtener datos.

La comunicación puede darse entre sistemas SAP o entre un sistema SAP y otro
sistema que no sea SAP.

Para llamar a una función RFC se debe agregar la cláusula DESTINATION al momento
de declarar la función, como vemos en el siguiente ejemplo.

La RFC llamada no existe en el sistema origen pero si debe existir en el sistema


destino.

Veamos un ejemplo simple de cuando utilizaríamos una RFC:

Si quisiéramos leer un registro de un cliente del sistema DCR, a través de un


programa ABAP existente en el ambiente DTR, crearíamos una RFC en DCR que
devuelva los registros de los clientes. Luego llamaríamos a esta función en DTR,
utilizando un destino que previamente hemos creado a través de la transacción SM59
como veremos más adelante.

Si se produciéra un error en la ejecución de una RFC, los mensajes de error son


devueltos por el sistema remoto y alojados en las variables del sistema SY-
MSGID, SY-MSGTY, SY-MSGNO, SY-MSGV1, SY-MSGV2, SY-MSGV3 y SY-MSGV4.

39
2| Cómo crear una RFC?

Una función RFC se crea de la misma manera que se crea un función. Se accede a la
transacción SE37 y se completan los mismos parámetros que completamos para crear
una función a excepción de que se debe seleccionar en la solapa de Atributos la
opción Remote Enabled Module.

Los parámetros que se crean en una función RFC no se pueden pasar por
Referencia, deben pasarse por valor. Esto se logra tildando el check Pass value
para cada parámetro en las solapas IMPORT, EXPORT y CHANGING.

A su vez , las funciones creadas como RFC, pueden ser utilizadas como módulos de
función Normales. Esto se logra de dos maneras diferentes:

Utilizando la declaración CALL FUNCTION <nombre_funcion> DESTINATION


'NONE' .

Utilizando la declaración de un módulo de función normal, sin el agregado de la


cláusula DESTINATION.

3| Tipos de RFC

Existen tres tipos de RFC:

Sincrónicas: ambos sistemas deben estar disponibles al momento de


la llamada de la función. Estas RFC están basadas en una comunicación
sincrónica.
Generalmente, utilizaremos el tipo de RFC sincrónico para la mayoría de nuestros
desarrollos.

39
Transaccionales: los sistemas no necesitan estar disponibles al momento de la
llamada a la función. Un único ID de transacción es generado y los programas llamados
son almacenados en el sistema junto con los datos. Para crear una RFC transaccional
debo utilizar el sufijo IN BACKGROUND TASK como mostramos en el siguiente gráfico:

En las RFC transaccionales, el sistema deja un log con el pedido de la llamada remota
en las tablas estándar de SAP ARFCSSTATE y ARFCSDATA con todos los valores de los
parámetros pasados en la ejecución. Para visualizar este log, utilizaremos la
transacción SM58.

Cuando el programa que ejecuta la RFC ejecuta la sentencia COMMIT


WORK, entonces es cuando la llamada remota es enviada al sistema
remoto para su ejecución.
Utilizaremos el tipo de RFC transaccional para ciertos casos específicos de
actualizaciones donde no se requiera que dichas actualizaciones se realicen en
forma inmediata sino recién cuando el programa llamador ejecuta un COMMIT
WORK.

Asincrónicas: el programa llamador, llama a la función RFC y inmediatamente


después termina su procesamiento. Luego la función RFC se ejecuta
independientemente del programa llamador. Para crear una RFC asincrónica debo
utilizar el sufijo STARTING NEW TASK como mostramos en el siguiente gráfico:

39
Lección 5: Destinos RFC

1| Qué es un destino RFC?


DESTINO RFC. Es una puerta de enlace que permite comunicar un sistema SAP
con otro sistema SAP o no SAP.

Los destinos de las RFC son creados en la tabla estándar SAP RFCDES a través de la
transacción SM59.

2| Tipos de destinos RFC

Los Tipos de destinos RFC que se pueden crear en SAP son los siguientes:

Conexiones ABAP

Conexiones HTTP a servidor externo

Conexiones internas

Conexiones SNA o CPI-C

Conexiones TCP/IP

Conexiones vía ABAP driver

39
Para comunicar RFC entre distintos ambientes de sistemas SAP R/3 utilizaremos
Conexiones ABAP.

3| Cómo crear, visualizar, actualizar y testear destinos?

En la transacción SM59 se pueden crear, visualizar, actualizar y testear destinos RFC.

Creación de un destino

Para crear un nuevo destino RFC basta con presionar el botón Create y luego
ingresar ciertos parámetros que dependerán del tipo de conexión a crear.

Ciertos parámetros que están en blanco en esta pantalla, como es el Target Host
son necesarios para la creación del destino. En un ambiente real de trabajo
deberán ser solicitados a los administradores SAP.

Visualización/Modificación de un destino

Para Visualizar o modificar un destino RFC basta con presionar el botón de


visualización o modificación dependiendo de la acción deseada.

39
Testeo de un destino

Podemos chequear si un destino funciona correctamente. Para ello, hacemos doble


click sobre el destino y en la pantalla que nos aparece presionamos el botón
Conection Test. Si la conexión funciona correctamente, veremos la siguiente
pantalla:

Siempre es conveniente testear un destino RFC para comprobar que la


conexión funciona correctamente.

Lección 6: Video - Los Chequeos de autorización

LECCION_4_4_ABAP_INICIAL_V4.swf

Lección 7: Batch

1| Ejecución de Fondo

Existen dos formas de ejecutar un programa en ABAP: Online y Batch. En la ejecución


Online el programa se ejecuta al momento de presionar F8 y los resultados de la
ejecución se producen de manera inmediata. Esta forma de ejecución es conveniente
para los programas donde se requiere interacción con el usuario o cuando el tiempo
de ejecución es muy poco.

Pero en ciertos otros casos, especialmente hablando en un ambiente real de trabajo,


el tiempo de procesamiento de un programa podría ser muy alto. Esto se puede deber
a que el programa tiene muchos accesos a base de datos, que tienen millones de
registros, a la ejecución de múltiples transacciones o a otras varias razones.

Para estos casos que acabamos de mencionar, va a ser conveniente la ejecución Batch
o de fondo. Veamos un ejemplo paso a paso de como ejecutar un programa de fondo.

Supongamos que tenemos el programa ABAP ZPRUEBA_FONDO_B que obtiene los


registros de la tabla ZTABLA_USUARIOS y los imprime por pantalla.

39
Ahora vamos a crear el nuevo programa ABAP ZPRUEBA_FONDO el cual cumplirá el
rol de programa padre del programa ZPRUEBA_FONDO_B. Lo primero que debemos
hacer es crear un Job. Para esto le asignamos un nombre a la variable V_JOBNAME y
luego ejecutamos la función JOB_OPEN. Para modularizar vamos a crear la subrutina
ABRIR_JOB que tendrá el siguiente código.

Luego, le asignamos un nombre a la variable V_JOBNAME, que tendrá el nombre del


Job. Luego de la ejecución de la función JOB_OPEN, se completa la variable
V_JOBNUM con el número del Job.

39
Lo que sigue es lanzar el Job. Para esto vamos a crear la subrutina
LANZAR_JOB, que ejecutará la sentencia SUBMIT, la cual sirve para
ejecutar un programa dentro de otro programa y con el agregado de la
cláusula VIA JOB <nombre_job> NUMBER <numero_job> la ejecución
del programa se realizará de fondo.
Mediante la sentencia SUBMIT se pueden pasar parámetros al programa llamado,
los cuales deben existir en la pantalla de selección de éste. Para más información
sobre la sentencia, presionar F1.

Con el agregado de la cláusula AND RETURN el programa llamador permanece en


espera mientras se ejecuta el programa llamado. Cuando el programa llamado
termina, se devuelve el control al programa llamador.

Por último, debemos cerrar el Job mediante la función JOB_CLOSE. Para esto vamos
a crear la subrutina CERRAR_JOB como vemos a continuación.

39
Por último, después de cerrar el Job, imprimimos por pantalla el mensaje "Se lanzo
el Job, para visualizarlo ir a la Trx SM37".

Ahora vamos a ejecutar Online el programa ZPRUEBA_FONDO presionando


F8. Veremos en la pantalla el mensaje "Se lanzo el Job, para visualizarlo ir a la Trx
SM37", por lo tanto vamos a ir a buscar el resultado a la transacción SM37.
Allí presionamos F8.

39
Identificamos nuestro proceso, lo tildamos y presionamos el botón Spool.

Ahora vemos el pedido del Job correspondiente a nuestro programa.

Finalmente, presionamos el botón de visualización y vemos el resultado del


procesamiento.

39
Lección 8: Video - El Spool

LECCION_4_3_ABAP_INICIAL_V4.swf

Lección 9: Uso de la memoria en ABAP

1| La memoria en ABAP

En ciertas oportunidades, podría pasar que mientras ejecutamos un programa o


objeto ABAP, necesitemos de datos que se obtengan en otro programa ABAP que se
ejecuto previamente. Existen varias formas de solucionar esto, una de ellas es
pasando parámetros de un programa a otro, si es que ambos objetos son programas.
Otra opción es utilizar la memoria para pasar los datos.

En ABAP existen sentencias que nos permiten manipular fácilmente los datos que
subimos y bajamos de memoria. Para subir datos a memoria vamos a utilizar la
sentencia EXPORT tal como mostramos a continuación.

El ID que se utiliza debe ser único. Veamos un ejemplo de como levantar datos a
memoria.

Para bajar los datos de memoria utilizamos la sentencia IMPORT tal como mostramos
a continuación.

Veamos un ejemplo de como bajar datos de memoria.

Se pueden exportar-importar tanto variables, como estructuras o tablas internas


a memoria.

39
Luego de bajar los datos de memoria, es conveniente liberar el área de memoria
utilizada. Esto lo hacemos con la sentencia FREE MEMORY tal como vemos a
continuación.

Para que la exportación-importación de datos funcione correctamente se debe


utilizar la misma sesión de memoria o ejecución.

Utilizaremos la sentencia SUBMIT para poder llamar a un programa dentro de la


ejecución de otro programa. Veamos un ejemplo de un programa que exporta datos:

Luego en el programa que importa los datos haremos lo siguiente:

39
UNIDAD 5: REPORTES

Lección 1: Conceptos importantes de reportes

1| Creación de una variante de ejecución

Supongamos que tenemos un reporte que tiene una pantalla de selección con 20
parámetros. Si cada vez que queremos ejecutar nuestro reporte, tenemos que
introducir en la pantalla el contenido de los 20 parámetros perderíamos mucho
tiempo. Para solucionar este inconveniente, SAP creo el concepto de variante, que es
aplicable tanto a reportes como a cualquier objeto que se pueda ejecutar y que
permite guardar los parámetros ingresados por pantalla para no tener que volver a
cargarlos.

Para probar este nuevo concepto, vamos a crear el reporte ZPRUEBA_USUARIOS y


le vamos a ingresar los siguientes datos en la pantalla de selección que vemos a
continuación.

Para crear el marco que vemos en la pantalla anterior, utilizamos la sentencia


SELECTION SCREEN. Para más información sobre la sentencia presionar F1.

Luego, presionamos en el menú el botón guardar y veremos la siguiente pantalla


donde asignaremos un nombre y una descripción a la variante y finalmente
presionamos guardar de nuevo y quedará guardada la variante ZPRUEBA.

39
Si ejecutamos otra vez el reporte, veremos en el menú, el botón obtener variante. Si
lo clickeamos, podremos ver las variantes disponibles para el reporte.

2| Creación de transacciones asociadas a reportes

Para que los usuarios finales puedan utilizar los programas que nosotros
desarrollamos, debemos crear transacciones asociadas a los programas, ya que ellos
no tienen acceso a la transacción SE38, ni a ninguna otra transacción de desarrollo.

Mediante la transacción estándar SE93, podemos crear transacciones asociadas a


reportes. Veamos un ejemplo. Vamos a ejecutar la transacción SE93, completamos el
nuevo nombre de la transacción, que será ZTRX_USUARIOS y clickeamos el botón
Create.

Luego veremos una ventana de diálogo donde completamos la descripción breve y


seleccionamos el tipo de transacción, que en nuestro caso será transacción de reporte y
clickeamos continuar.

39
En la siguiente pantalla, ingresamos el nombre del programa, la pantalla de selección
inicial, que por default es la 1000, podemos agregar una variante para que se ejecute
con la transacción y finalmente grabamos.

Luego para ejecutar nuestra transacción la escribimos en el campo de comandos y


presionamos enter como con cualquier otra transacción estándar de SAP.

3| El navegador de objetos

Mediante la transacción SE80 podemos crear, modificar y visualizar todo tipo de


objetos. Algunos de ellos son: Paquetes, Programas, Módulos de función,
Clases, Aplicaciones WebDynpro, etc.

Al momento de crear un programa de cierta complejidad, esta transacción resulta


mucho más útil que la SE38, ya que permite crear directamente desde aquí, todos los
objetos componentes de dicho programa.

39
4| Utilización de colores en reportes

Se pueden utilizar colores a la hora de hacer impresiones por pantalla, tanto en un


reporte interactivo como en un reporte clásico. Para esto, vamos a ejecutar la sentencia
FORMAT COLOR antes de hacer un WRITE tal como mostramos a continuación.

Y la salida de esta sentencia en un reporte será:

Existen muchas variantes de ejecución de la sentencia FORMAT COLOR. Para


obtener más información, presionar F1 sobre la sentencia.

Lección 2: Video - Los Text Symbols.

LECCION_5_2_ABAP_INICIAL_V4.swf

39
Lección 3: Status GUI y Títulos

1| Creación de un Status GUI

Un Status GUI es un componente independiente de un programa ABAP, que sirve


para proporcionarle al usuario un amplio rango de funciones en la pantalla de los
programas. Esta compuesto por barras de menú, barras de herramientas estándar,
barras de herramientas de aplicaciones y la configuración de teclas de función. En el
siguiente gráfico, identificamos cada uno de los componentes en la pantalla de salida
de un reporte ABAP.

Vamos a crear un Status GUI para el reporte ZPRUEBA_EST_USUARIOS, que


mostrará los usuarios activos y los inactivos dependiendo de que botón de la barra de
herramientas de la aplicación ha sido presionado. Para esto, accedemos a la
transacción SE80, ingresamos el nombre del programa, presionamos enter y lo
creamos tal como lo hacíamos a través de la transacción SE38. Luego, vamos a
crearle un Status GUI, para ello sobre el nombre del programa, hacemos botón
derecho/Create/GUI Status tal como vemos en la siguiente imagen.

En la siguiente ventana, ingresamos el nombre del Status GUI, que será 0100, una
descripción que podría ser "Status del reporte de usuarios" y presionamos

39
continuar. Luego veremos a la derecha de la pantalla, los componentes del Status GUI
como vemos a continuación.

Luego, desplegamos la lista que está en la Apllication Toolbar y en el primer ítem en


blanco, escribimos el código de función correspondiente a la ejecución del botón de
usuarios activos, que será USU_ACTI y presionamos enter. Aquí veremos una ventana
de diálogo que nos indicará que no existe texto asignado a esa función y
presionaremos continuar. Luego, veremos otra ventana donde completamos los datos
referentes al nuevo botón.

Function Text: se utiliza para darle un nombre al botón.

Icon name: será el ícono que se visualice por pantalla dentro del botón. Este se
puede elegir dentro de un gran variedad de íconos que se visualizan presionando F4.

Info. text: es el nombre de ayuda del botón. Este se visualizará cuando dejemos
quieto unos segundos el puntero del mouse sobre el botón.

Luego, presionamos continuar y en la siguiente ventana de diálogo, asignaremos una


tecla de función al botón, que tendrá el mismo efecto que cuando clickeamos con el
puntero del mouse el botón.

39
Finalmente con el botón creado veremos el primer ítem de la siguiente manera.

Aquí presionamos enter sobre el código USU_ACTI y completamos en la siguiente


ventana, el campo Icon text. que será el texto que se visualice dentro del botón en la
pantalla de salida.

39
Luego haremos lo mismo con el botón de usuarios inactivos, cuyo código será
USU_INACTI y finalmente grabamos los cambios realizados y activamos.

Ahora vamos a introducir código en el reporte para poder utilizar el nuevo Status GUI.
Lo primero que debemos hacer es declarar la utilización del status. Esto lo haremos
mediante la sentencia SET PF-STATUS, tal como vemos a continuación.

Luego para capturar cual botón clickeó el usuario, utilizaremos el evento AT USER-
COMMAND junto con la variable del sistema SY-UCOMM que contendrá el código de
función corresponiente al botón presionado. Las subrutinas USUARIOS_ACTIVOS y
USUARIOS_INACTIVOS realizan la selección e impresión de los correspondientes
registros de la tabla ZTABLA_USUARIOS.

Finalmente activamos y al ejecutar el reporte veremos:

Si presionamos el botón "Reporte de usuarios activos" vemos un listado de los


usuarios activos. Si no existen registros de usuarios activos, visualizaremos un
mensaje de error. Lo mismo sucederá con los usuarios inactivos.

39
Mediante la transacción standard SE41 se pueden copiar Status GUI de un programa ABAP a
otro.

2| Creación de Títulos

Vamos a crear títulos para nuestro ((reporte)). Para ello, en la transacción SE80, sobre
el nombre del programa, hacemos botón derecho/Create/GUI Titles, tal como vemos
en la imagen siguiente.

En la siguiente ventana asignaremos un nombre al título y su descripción, que será la


que se visualice en pantalla.

39
Luego crearemos el título 0200 para los usuarios inactivos y el título 0300 para la
primer pantalla del reporte. Finalmente, presionamos el botón "All title" y veremos en
pantalla los tres títulos creados. Lo último que nos queda es activarlos.

Para declarar la utilización de los títulos en el reporte, usamos la sentencia SET TITLE
tal como vemos en el siguiente gráfico.

Finalmente al ejecutar el reporte, visualizaremos los títulos, según los botones


clickeados de la pantalla.

39
Lección 4: Reportes Interactivos.

1| Qué es un Reporte interactivo?


REPORTE INTERACTIVO. Es un tipo de reporte Abap, donde se muestra un primer
listado por pantalla, con cierta información y luego clickeando una línea
determinada del primer listado, se accede a otros datos relativos a esa línea y así
sucesivamente por cuantos niveles tenga el listado.

A diferencia del Reporte clásico, que puede ser ejecutado tanto Online
como Batch, el reporte interactivo es ejecutado solo en forma Online, ya
que requiere de la interacción con el usuario.
La principal ventaja de los reportes interactivos es que con pocas líneas de código
se puede crear un reporte con interacción con el usuario, a diferencia de los
programas de diálogo, que requieren de mucho más tiempo de construcción.

Veamos un ejemplo para el cual nos convendría crear un reporte interactivo:

Supongamos que tenemos un primer listado que muestra los usuarios con sus
nombres y luego cuando hacemos doble click sobre un usuario en particular, vemos
datos detallados del usuario, como pueden ser el país, código postal, región, etc. En
este caso, bastaría con crear un reporte interactivo para cumplir con este requerimiento.

2| Eventos y variables de un reporte interactivo

Cuando clickeamos en alguna posición de la lista principal que se muestra por


pantalla, se ejecutará el evento AT LINE-SELECTION. Este evento debemos
ubicarlo luego del evento START-OF-SELECTION. En este momento, ciertas variables
del sistema se completan con información muy útil. Ellas son:

SY-LSIND: contiene el índice de la lista de detalle.

SY-LISEL: tiene el contenido de la línea seleccionada.

SY-LILLI: contiene la línea seleccionada de la lista.

SY-CUROW: contiene la posición del cursor vertical.

Utilizaremos el evento TOP-OF-PAGE DURING LINE-SELECTION para


imprimir por pantalla los textos de las cabeceras de las listas de detalle.
Existen algunos programas de prueba estándar ABAP que nos pueden servir para
practicar. Ellos son: DEMO_LIST_INTERACTIVE_1, DEMO_LIST_INTERACTIVE_2,
DEMO_LIST_INTERACTIVE_3, DEMO_LIST_INTERACTIVE_4.

39
3| Mi primer reporte interactivo

Vamos a crear el reporte interactivo del ejemplo que dimos en el punto 1. Para esto,
vamos a agregar en nuestra tabla de usuarios ZTABLA_USUARIOS los campos:
DIRECCION que será CHAR de 30 posiciones, CODIGO_POSTAL que será CHAR de 4
posiciones, F_NACIMIENTO que será DATS de 8 posiciones y ESTADO_CIVIL que
tendrá un dominio, que será CHAR de 1 posición y admitirá los valores S(Soltero) y
C(Casado).

Debido a que realizamos cambios en la estructura de la tabla, tendremos que


adaptar la tabla base de datos, utilizando la opción del menú UTILITIES/DATABASE
OBJECT/DATABASE UTILITY/ACTIVATE AND ADJUST DATABASE. Después
debemos volver a generar la superficie de actualización, que creamos en la unidad 3 y
finalmente ingresamos datos en la tabla a través de la transacción SM30.

Luego creamos el programa ABAP ZREPORTE_INT_USUARIOS. Dentro del evento


START-OF-SELECTION realizamos la selección del DNI y Nombre y Apellido de los
usuarios. Después imprimimos por pantalla el resultado de la selección realizada.

La salida por pantalla de nuestro programa se verá de la siguiente manera:

Ahora vamos a agregar el evento AT LINE-SELECTION. El código que este dentro de


este evento se ejecutará cuando hagamos doble click en algún lugar de la pantalla,
donde se visualiza el primer listado. Utilizaremos la variable del sistema SY-LISEL para
obtener el DNI correspondiente a la línea de la pantalla que ha sido clickeada.

Luego crearemos la subrutina GENERAR_REPORTE_NIVEL2, la cual seleccionará de la


tabla ZTABLA_USUARIOS los datos de detalle correspondientes al usuario, cuyo DNI
fue capturado anteriormente y los imprimirá por pantalla.

39
Utilizaremos el evento TOP-OF-PAGE DURING LINE-SELECTION para imprimir por
pantalla la cabecera de cada nivel de listados de detalle.

Finalmente ejecutamos el reporte, clickeamos la línea correspondiente al DNI


23547312 y veremos el siguiente detalle.

Otra posibilidad, es mostrar la pantalla del nivel de detalle como una ventana de dialogo
o subscreen. Para esto usamos la sentencia WINDOWS STARTING AT tal como
mostramos a continuación.

Y se visualizará la ventana de la siguiente manera:

39
Se pueden crear tantos niveles de listados como se requiera. El nivel del listado
donde estamos lo tenemos en la variable SY-LSIND.

Lección 5: Reportes ALV: grillas y listas

1| Qué es un ALV?
ALV. Es una herramienta exclusiva de ABAP, que sirve para crear reportes de
manera eficaz, rápida y estandarizada.

Las principales ventajas de los reportes ALV son:

Simplifican el desarrollo de reportes, por lo tanto se reducen los tiempos de


programación

Proporcionan a nuestros reportes un montón de funcionalidad estándar

Proporcionan una salida por pantalla estandarizada e uniforme

La creación de un Reporte ALV, se basa en la utilización de funciones. Los tipos de ALV


más comúnmente usados son tres: Grillas, Listas y Jerárquico. Las Grillas y las Listas
pueden utilizarse en cualquier reporte, pero el Jerárquico se utiliza sólo en los casos
donde se muestran datos de cabecera y de detalle, como por ejemplo números de
factura y detalles o Aerolíneas y vuelos.

A cada tipo de ALV le corresponde una función diferente. Ellas son:

Grillas -> REUSE_ALV_GRID_DISPLAY

Listas -> REUSE_ALV_LIST_DISPLAY

Jerárquico -> REUSE_ALV_HIERSEQ_LIST_DISPLAY

39
2| Mi primer reporte ALV

Vamos a crear nuestro primer reporte ALV. Para esto seguiremos los siguientes pasos:

PASO 1ero. : Declaraciones de tipos, estructuras y tablas propias del ALV

Dentro de este paso, declaramos el tipo SLIS, que es necesario para la utilización de
reportes ALV.

También declaramos una tabla y una estructura para el catalogo del ALV que son del
tipo SLIS_T_FIELDCAT_ALV y SLIS_FIELDCAT_ALV, otra estructura para la configuración
de la salida que es del tipo SLIS_LAYOUT_ALV y una variable del tipo SY-REPID, para
almacenar el nombre del programa.

PASO 2do. : Declaración de la tabla de salida del ALV

Vamos a declarar la tabla de salida TI_USUARIOS que se mostrará en el ALV.

PASO 3ero. : Selección de los datos que se mostrarán en el ALV

Ahora seleccionamos los datos de la tabla ZTABLA_USUARIOS, que mostraremos en


el listado de salida y los guardamos en la tabla interna TI_USUARIOS.

PASO 4to. : Armado del catálogo del ALV

Armamos el catálogo del ALV con los campos que serán las columnas de nuestro
reporte. Para ello, completaremos para cada columna del listado, los siguientes
campos pertenecientes a la tabla del catálogo.

39
Existen muchisimas más propiedades del catálogo que se pueden configurar
según lo que necesitemos mostrar en el listado. Para más información, hacer
doble click en el tipo SLIS_T_FIELDCAT_ALV.

PASO 5to. : Configuración de la salida del ALV

Vamos a cargar con valores la estructura ST_LAYOUT para configurar ciertos aspectos
de la salida del ALV.

Existen muchismas más opciones a configurar en el layout de un reporte ALV.


Para más información, hacer doble click en el tipo SLIS_LAYOUT_ALV.

PASO 6to. : Ejecución de la función del ALV

Por último, lo que nos queda es la ejecución de la función del ALV. Si queremos un
reporte tipo grilla, ejecutaremos la función REUSE_ALV_GRID_DISPLAY. Si queremos un
reporte tipo lista, ejecutaremos la función REUSE_ALV_LIST_DISPLAY. Ambas funciones
se completan de la misma manera. Como dijimos anteriormente, los ALV jerárquicos
se utilizan para cuando tenemos que mostrar datos de cabecera y detalle, por lo tanto
no es aplicable para este ejemplo.

Si es grilla:

Si es lista:

39
Finalmente si ejecutamos el reporte veremos, si usamos la función para grillas:

Y si usamos la función para listas:

Lección 6: Video - Funcionalidades estándar del ALV

LECCION_5_1_ABAP_INICIAL_V4.swf

Lección 7: Catálogo ALV automático, logos, encabezados y status

1| Creación del catálogo en forma automática

Existen dos formas de crear el catálogo del ALV, la primera es en forma manual,
ingresando campo por campo, tal como hicimos en el ejemplo de la lección anterior.
La segunda, es crear el catálogo en forma automática con la función

39
REUSE_ALV_FIELDCATALOG_MERGE. Si tomamos el ejemplo de la lección anterior, el
código para la creación automática sería el siguiente:

Pero para poder hacer esto vamos a tener que modificar dos puntos del programa. El
primero es la forma como se declara la tabla interna del ALV. Si creamos el catálogo en
forma automática debemos declarar la tabla interna utilizando LIKE y haciendo
referencia a campos de una tabla base de datos existente.

Lo otro que debemos hacer es configurar el editor, para que se restrinja la cantidad
de caracteres de ancho de la pantalla a 72. Esto lo hacemos desde la opción de menú
Utilities/Settings/ABAP Editor/Editor/Downwars-Comp.Line Lenght(72).

2| Utilización de Logos y encabezados

En los ALV Grilla podemos agregar logos y encabezados en los listados. Para ello,
debemos declarar una tabla del tipo SLIS_T_LISTHEADER y una estructura del tipo
SLIS_LISTHEADER.

Antes de completar el catálogo, vamos a llenar la tabla TI_HEADER con el


encabezado del Reporte, el tipo de reporte y la fecha del sistema.

39
Luego, agregamos en la llamada a la función del ALV, el parámetro exporting
I_CALL_TOP_PAGE con el literal 'TOP_OF_PAGE', que será el nombre de la
subrutina que cargue el contenido del encabezado y el logo.

Ahora creamos la subrutina TOP_OF_PAGE, con la llamada a la función


REUSE_ALV_COMMENTARY_WRITE, que carga el encabezado que definimos en la tabla
interna TI_HEADER, junto con el logo 'ENJOYSAP_LOGO'.

Para ver los logos disponibles en el sistema o cargar nuevos debemos utilizar la
transacción SE78.

Finalmente ejecutamos el programa y vemos:

39
3| Utilización de Status GUIs

Para poder utilizar un Status GUI en un reporte ALV, vamos a agregar en la llamada a la
función del ALV el parámetro exporting I_CALLBACK_PF_STATUS_SET con el literal
'PF_STATUS', que será el nombre de la subrutina que declare la utilización del Status
GUI y el parámetro exporting I_CALLBACK_USER_COMMAND con el literal
'USER_COMMAND', que será el nombre de la subrutina que se ejecute para capturar
la acción realizada por el usuario.

Ahora definimos la subrutina PF_STATUS que setea el status.

Vamos a crear en el status, un botón con la descripción "Usuarios activos" y el código


USU_ACTI. También en las Function Keys del status, agregamos los códigos para
poder navegar para atrás, volver a la pantalla principal o salir del programa. Cuando
creamos estos botones, debemos acordarnos de setearlos con Function Type ''E'',
sino no funcionarán como esperamos.

39
Por último agregamos la subrutina que capturará las acciones realizadas por el
usuario.

Finalmente si ejecutamos el reporte, veremos en el Status GUI, el botón de usuarios


activos y si lo ejecutamos, se procesará el código existente en la subrutina
USER_COMMAND.

Lección 8: ALV Jerárquico y Agrupamiento

1| Agrupamiento en un ALV

Podemos agrupar los registros que mostramos en un ALV. Para ello, declaramos una
tabla del tipo SLIS_T_SORTINFO_ALV y una estructura del tipo SLIS_SORTINFO_ALV.

Luego antes de llamar a la función del ALV, vamos a cargar la tabla TI_SORT con
los registros en el orden en el que deseamos agrupar.

Ahora debemos completar el parámetro exporting IT_SORT con nuestra tabla interna
TI_SORT.

39
Finalmente, si ejecutamos el reporte, veremos la agrupación por Estado Civil.

2| ALV Jerárquico

Como dijimos anteriormente, los ALV Jerárquicos se utilizan cuando tenemos que
mostrar en un reporte, datos de cabecera y de posición. En las declaraciones de las
tablas internas de cabecera y posiciones, debe haber como mínimo un campo en
común. En el caso que mostramos a continuación, el campo común es el CARRID,
que es la compañía aérea.

Debemos declarar una estructura del tipo SLIS_KEYINFO_ALV, que será ST_KEYINFO
y contendrá el campo clave que une a las dos tablas internas.

Ahora vamos a cargar las tablas internas de cabecera y detalle con un juego de datos
para la compañía aérea ARG. En el programa de ejemplo de la lección, también
cargamos un juego de datos para la compañía aérea LAN.

39
Luego crearemos el catálogo del ALV para ambas tablas internas, sumando los campos
de ambas tablas en la tabla del catálogo TI_CATALOGO.

Ahora tenemos que completar la estructura ST_KEYINFO. En los campos HEADER01


y ITEM01 va a ir el campo de la tabla de cabecera que hace de vínculo con la tabla de
detalles.

39
Por último, ejecutamos la función REUSE_ALV_HIERSEQ_LIST_DISPLAY.

Y veremos el siguiente reporte ALV:

Lección 9: Video - Las Bases de Datos Lógicas

LECCION_5_3_ABAP_INICIAL_V4.swf

UNIDAD 6: TRATAMIENTO DE ARCHIVOS


39
Lección 1: Archivos Locales: Upload de datos

1| Tratamiento de archivos locales

ABAP nos proporciona una serie de métodos muy útiles para el tratamiento de
archivos locales ubicados en nuestra PC mediante la clase
CL_GUI_FRONTEND_SERVICES. Los conceptos de clases y métodos los veremos en
detalle en el "Curso Programador ABAP Nivel Avanzado". Por ahora, nos basta con
entender que los métodos se ejecutan como si fueran funciones.

Para visualizar todos los métodos disponibles en la clase, editamos un programa ABAP
y presionamos el botón Pattern o Patrones. Aquí marcamos la opción "ABAP Object
Patterns" y presionamos continuar. En la siguiente pantalla escribimos lo siguiente:

Y luego presionamos F4 en Method y veremos la siguiente pantalla con todos los


métodos de la clase:

39
Veremos en detalle los siguientes métodos:

FILE_OPEN_DIALOG: para mostrar la pantalla de navegación que permita al


usuario poder seleccionar el archivo del directorio de su PC.

GUI_DOWNLOAD: para descargar datos de los programas a archivos en la PC.

GUI_UPLOAD: para bajar datos de los archivos de la PC a nuestros programas.

Otra forma de visualizar el contenido de la


clase CL_GUI_FRONTEND_SERVICES es
ingresando al Class Builder que es la
transacción SE24.

2| Búsqueda de archivos en la PC

Para buscar archivos locales en el directorio de nuestra PC, utilizaremos el método


CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG. Veamos un ejemplo de su
utilización:

39
Analicemos los parámetros más importantes del método:

WINDOW_TITLE: asigna un título a la ventana de búsqueda.

DEFAULT_FILENAME: contiene el nombre del archivo que buscamos en nuestra


PC. Si colocamos el literal asterísco podremos ver todos los archivos que se
encuentren en los directorios.

FILE_TABLE: contiene la ruta y nombre del archivo seleccionado.

Al igual que las funciones, el método


CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG tiene definidas excepciones.
Cada excepción tiene asociada una descripción que contempla cada uno de los errores
posibles que pueden ocurrir al ejecutar dicho método.

Si ejecutamos el código anterior veremos la siguiente ventana de diálogo:

39
Es recomendable la utilización del método
FILE_OPEN_DIALOG, en los programas ABAP
que trabajan con archivos locales, ya que
facilita ampliamente la interacción entre el
usuario y el programa y evita errores de tipeo
de datos.

3| Lectura de datos de los archivos locales

Para leer datos de los archivos locales en las tablas internas de nuestros programas,
utilizaremos el método CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD.

39
Analicemos los parámetros más importantes del método:

FILENAME: contiene el directorio y nombre del archivo local con el que estamos
trabajando.

FILETYPE: contiene el tipo o extensión del archivo local.

Los tipos admitidos son:

BIN: para archivos binarios.

ASC: para archivos ASCII.

DAT: para archivos excel. Las columnas son separadas utilizando tabs. Las líneas
son separadas con saltos de línea.

WK1: para archivos excel y de lotus.

HAS_FIELD_SEPARATOR: indica que el archivo local tiene separadores.

DATA_TAB: es la tabla interna donde almacenaremos los datos del archivo local.

39
En este método están definidas excepciones con descripciones que contemplan cada
uno de los errores que se pueden producir al ejecutar el método.

En algunos programas ABAP, podemos ver que


se utilizan las funciones WS_UPLOAD y
UPLOAD. No es recomendable la utilización de
estas funciones debido a que actualmente son
considerados objetos obsoletos por SAP.

Lección 2: Archivos Locales: Download de datos

1| Grabación de datos en archivos locales

Para grabar datos existentes en las tablas internas de nuestros programas a archivos
ubicados en la PC, utilizaremos el método
CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD. Veamos un ejemplo de su
utilización:

Analicemos algunos de los parámetros del método:

39
FILENAME: contiene el directorio y nombre del archivo a descargar a la PC.

FILETYPE: contiene el tipo o extensión del archivo que descargamos a la PC.

Los tipos o extensiones admitidas son:

BIN: para archivos binarios. Se debe especificar la longitud del archivo en el


parámetro BIN_FILESIZE. La tabla interna que se utiliza debe tener un solo campo
del tipo X.

ASC: para archivos ASCII.

DAT: para archivos excel. Las columnas son separadas utilizando tabs. Las líneas
son separadas con saltos de línea.

WK1: para archivos excel y de lotus.

WRITE_FIELD_SEPARATOR: indica si se generará un separador de archivo o no y


cual será.

DATA_TAB: aquí se almacena el contenido del archivo. Esta tabla debe tener la
misma estructura del archivo.

En este método también están definidas excepciones con descripciones que


contemplan cada uno de los errores que se pueden producir al ejecutar el método.

Luego si ejecutamos el código veremos el mensaje que dice que la transferencia de


datos se realizó correctamente y se especifica la cantidad de bytes transferida.

En algunos programas ABAP, podemos ver que


se utilizan las funciones DOWNLOAD y
WS_DOWNLOAD. No es recomendable la
utilización de estas funciones debido a que
actualmente son consideradas objetos
obsoletos por SAP.

Lección 3: Video - Las Rutinas de conversión de datos

LECCION_6_2_ABAP_INICIAL_V4_2.swf

39
Lección 4: Archivos en Servidor: las sentencias OPEN y READ

1| Tratamiento de archivos en el servidor

En un ambiente real de trabajo, es común la utilización de un servidor de


aplicaciones, para trabajar con archivos.

ABAP dispone de una serie de sentencias para el tratamiento de archivos ubicados en


el servidor de aplicaciones.

Las principales sentencias para el manejo de archivos en el servidor de aplicaciones


son:

OPEN DATASET: para la apertura de archivos del servidor.

READ DATASET: para la lectura de archivos del servidor.

TRANSFER: para transferir datos de archivos al servidor.

DELETE: para borrar archivos del servidor.

CLOSE: para cerrar archivos del servidor.

A continuación veremos en detalle cada una de estas sentencias.

2| Apertura de archivos en el servidor

Utilizaremos la sentencia OPEN DATASET para la apertura de archivos. La sintaxis de


la sentencia es la siguiente:

Si la apertura del archivo se realizó


correctamente, entonces el SY-SUBRC será 0.
Caso contrario, será 8.

El nombre del archivo junto con el directorio en donde se encuentra, pueden


ingresarse como un literal entre comillas o en una variable. Si no ingresamos el
directorio y solo ingresamos el nombre, entonces el sistema intentará abrir el archivo
en el directorio en el que corre el servidor de aplicaciones.

Si queremos abrir un archivo para lectura, debemos utilizar la cláusula FOR INPUT, tal
como vemos a continuación:

El archivo que se intenta abrir debe existir. Caso contrario, el SY-SUBRC será 8.
Si el archivo existe y está abierto, el sistema se posicionará al comienzo del
archivo.

39
Veamos un ejemplo:

En el ejemplo anterior, p_path es una parámetro de la pantalla de selección en donde el usuario ingresa el directorio y
nombre del archivo.

Es recomendable cerrar todos los archivos que ya


están abiertos antes de realizar una re - apertura
con la sentencia OPEN DATASET.

Si queremos abrir un archivo para escritura, debemos utilizar la cláusula FOR


OUTPUT, tal como vemos a continuación:

Si el archivo no existe, se creará automáticamente.

Si existe pero está cerrado el contenido será sobrescrito.

Si existe y está abierto, el sistema se posicionará al comienzo del archivo.

Si la apertura se realiza correctamente, entonces el SY-SUBRC será 0. Caso


contrario, será 8.

Veamos un ejemplo:

Si queremos abrir un archivo para agregar información, debemos utilizar la


cláusula FOR APPENDING, tal como vemos a continuación.

39
Si el archivo no existe, se creará automáticamente.

Si existe pero está cerrado, el sistema lo abrirá y se posicionará al final del


mismo.

Si existe y está abierto, el sistema se posicionará al final del archivo.

Siempre el SY-SUBRC será 0.

Veamos un ejemplo:

Existen dos modos de apertura de archivos:

MODO TEXTO

Para abrir un archivo en modo texto, debemos utilizar la cláusula IN TEXT MODE, tal
como vemos a continuación:

Si leemos o escribimos en un archivo que ha sido abierto en modo texto, la


información es transferida línea a línea.
Si utilizamos el modo texto debemos agregar la palabra reservada
ENCODING DEFAULT

Veamos un ejemplo:

MODO BINARIO

Para abrir un archivo en modo binario, debemos utilizar la cláusula IN BINARY MODE,
tal como vemos a continuación:

39
Si leemos o escribimos en un archivo que ha sido abierto en modo binario, la
información es transferida byte a byte.

Veamos un ejemplo:

3| Lectura de archivos del servidor

Utilizaremos la sentencia READ DATASET para la lectura de archivos del servidor. La


sintaxis de la sentencia es la siguiente:

Para determinar en que variable debemos almacenar los datos que leeremos del
archivo, debemos conocer la estructura del archivo que leeremos.
Si la lectura se realizó correctamente, entonces el SY-SUBRC será 0. Caso
contrario, será 8.

Veamos un ejemplo:

Nota: debido a que no disponemos de un servidor Unix para realizar las pruebas de esta lección, no habrán
ejercicios de práctica.

Lección 5: Archivos en Servidor: las sentencias Transfer, Delete y


Close

1| Transferencia de archivos al servidor


39
Utilizaremos la sentencia TRANSFER para transferir datos desde nuestros programas
ABAP a los archivos ubicados en el servidor de aplicaciones. La sintaxis de la
sentencia es la siguiente:

El modo en que se realiza la transferencia de información se corresponde con el


modo de apertura del archivo.
Si el archivo no está abierto para escritura, el sistema intentará abrirlo en
BINARY MODE o utilizando la última ejecución de la sentencia OPEN DATASET.

Veamos un ejemplo:

2| Borrado de archivos del servidor

Utilizaremos la sentencia DELETE DATASET para borrar archivos del servidor de


aplicaciones. La sintaxis de la sentencia es la siguiente:

Para borrar un archivo, previamente debemos abrirlo.


Si el borrado se realiza correctamente, entonces el SY-SUBRC será 0. Caso
contrario, será 4.

Veamos un ejemplo:

39
3| Cierre de archivos del servidor

Utilizaremos la sentencia CLOSE DATASET para cerrar archivos del servidor de


aplicaciones. La sintaxis de la sentencia es la siguiente:

Es ampliamente recomendable realizar siempre el cierre de los archivos.

Veamos un ejemplo:

4| Búsqueda de archivos en el servidor

Utilizando la función /SAPDMC/LSM_F4_SERVER_FILE podemos crear una


ventana de navegación en el servidor de aplicaciones para poder seleccionar el
archivo que deseamos. Veamos un ejemplo de su utilización:

Si ejecutamos el código anterior veremos el siguiente mensaje ya que no disponemos


de un servidor de aplicaciones para probar.

39
Si lo tuviéramos, visualizaríamos una ventana de diálogo donde podremos buscar los
archivos en el servidor.

Nota: debido a que no disponemos de un servidor Unix para realizar las pruebas de esta lección, no habrán
ejercicios de práctica.

Lección 6: Video - Administración de archivos de imágenes en SAP

LECCION_6_5_ABAP_INICIAL_V4_3.swf

Lección 7: Field-Symbols

1| Qué son los Field Symbol?

FIELD SYMBOL. Es un tipo de sentencia ABAP que nos permite trabajar con los
datos de los programas en forma dinámica en tiempo de ejecución.

Al contrario de lo que sucede con el acceso estático de los datos, donde necesitamos
especificar el nombre de un objeto para poder hacer algo con el, los Field Symbol nos
permiten acceder y pasar datos cuyos nombres y atributos no conocemos hasta el
momento de la ejecución.

Se puede considerar a los Field Symbol como nombres simbólicos de los datos, ya que
cuando se utilizan, el sistema trabaja con el contenido de los datos asignados y no
con el contenido del field symbol.

Los Field Symbol nos proveen de gran flexibilidad debido a que:

Si queremos procesar partes de campos, nos permiten especificar el offset y el


desplazamiento de un campo en forma dinámica.

Se puede forzar a un Field Symbol para que tome diferentes atributos técnicos que
los del campo asignado a él.

39
La mayoría de los errores que cometamos en la utilización de Field Symbols los
detectaremos recién en tiempo de ejecución. Esto hace que sean bastante más
difíciles de detectar. Por lo tanto solo debemos utilizar Field Symbol si no podemos
llegar al mismo resultado con las sentencias ABAP convencionales.

2| Declaración de un Field Symbol

Para declarar un Field Symbol vamos a utilizar la siguiente sintaxis:

Si no especificamos un tipo a un Field Symbol, este puede contener cualquier dato.


Cuando asignamos un dato al Field Symbol, este hereda los atributos técnicos del
dato.

Los tipos de datos genéricos posibles para un Field Symbol son:

Tipo de
Objeto de datos
especificación
Todos los tipos de objetos de datos
TYPE ANY o sin
son aceptados. El field symbol adopta los
especificación
atributos del dato.
Solo los tipos de datos C, N, P y X son
TYPE C, N, P o X aceptados. El field symbol adopta la
longitud y decimales del dato.
El sistema chequea si la tabla es
TYPE TABLE
estándar.
El sistema chequea si el campo es una
TYPE ANY TABLE tabla interna. El field symbol hereda
todos los atributos de la tabla.
El sistema chequea si el campo es
TYPE INDEX TABLE una tabla indexada. El field symbol
hereda todos los atributos de la tabla.
El sistema chequea si el campo es
TYPE STANDARD
una tabla estándar. El field symbol
TABLE
hereda todos los atributos de la tabla.
El sistema chequea si el campo es
TYPE SORTED
una tabla sorted. El field symbol hereda
TABLE
todos los atributos de la tabla.
El sistema chequea si el campo es
TYPE HASHED
una tabla hashed. El field symbol hereda
TABLE
todos los atributos de la tabla.

Veamos un ejemplo de la utilización de un Field-symbol:

39
3| Asignación de datos a un Field Symbol

Para asignar datos a un Field Symbol utilizamos la sentencia ASSIGN.

La asignación que utilizamos es estática ya que sabemos el nombre del campo que
queremos asignar al Field Symbol.

La sintaxis utilizada sería la siguiente:

Veamos un ejemplo:

UNIDAD 7: BATCH INPUT Y BAPIS

39
Lección 1: El concepto de Batch Input

1| Qué es un Batch Input?

Cuando se instala una aplicación en un ambiente de producción, es necesario dar de


alta toda la información que es indispensable para que pueda funcionar. A este
proceso lo llamamos carga inicial de datos.

Supongamos que necesitamos hacer la carga inicial de datos en SAP de 10000 clientes.
Para hacer esto, tendríamos que ingresar 10000 veces a la transacción maestro de
clientes, lo que cual sería una tarea demasiado tediosa y sumamente costosa en
tiempo.

Algo similar ocurriría si necesitamos ingresar 10000 registros en una tabla base de
datos, ya que si bien, en este caso, podríamos crear un programa que mediante
instrucciones Open SQL carguen los registros, no estaríamos utilizando todas las
validaciones estándar que tienen las transacciones SAP, por lo que necesitaríamos
dedicar mucho tiempo para cubrir ese bache.

Para solucionar estos inconvenientes, SAP introduce la técnica de Batch Input,


mediante la cual, podremos dar de alta, modificar o borrar grandes cantidades de
datos en el sistema, de forma automática y utilizando las mismas transacciones, con
sus respectivas validaciones, tal como si lo hiciéramos manualmente de a 1 dato por
vez.

Generalmente, la carga inicial de datos se realizará levantando los datos de un archivo,


tal como vimos en la unidad anterior.

2| Técnicas de Batch Input

Existen dos técnicas para realizar un Batch Input, una se realiza de forma Online y la
otra en forma Batch. Ellas son:

CALL TRANSACTION: se realiza de forma Online, por lo que ejecuta las


actualizaciones en el momento en que se ejecuta el programa del Batch Input. Se
utiliza la sentencia estándar CALL TRANSACTION.

JUEGO DE DATOS: se realiza de forma Batch y queda almacenado en SAP para su


posterior ejecución mediante la transacción SM37. Consiste en la ejecución de una
serie de funciones estándar para la apertura, ejecución y cierre del juego de datos.

39
3| Pasos para la creación de un Batch Input

Los pasos para la generación de un Batch Input dependen de la técnica


utilizada. Veamos cuales son los pasos a seguir para cada técnica:

CALL TRANSACTION

Paso 1ero: Declaración de datos propios del Batch Input

Paso 2do: Lectura de datos de archivo de entrada

Paso 3ero: Carga de la tabla BDCDATA

Paso 4to: Ejecución de la sentencia CALL TRANSACTION

JUEGO DE DATOS

Paso 1ero: Declaración de las datos propios del Batch Input

Paso 2do: Lectura de datos de archivo de entrada

Paso 3ero: Apertura de la sesión del Juego de Datos

Paso 4to: Carga de la tabla BDCDATA

Paso 5to: Inserción del Juego de Datos

Paso 6to: Cierre de la sesión del Juego de Datos

Paso 7mo: Ejecución del Juego de Datos a través de la transacción SM37 o a través de
la creación de un job y la ejecución del programa estándar RSBDCBTC

4| Carga de la tabla BDCDATA

El paso más importante en la ejecución de un Batch Input es la carga de la tabla


BDCDATA. Tal como hacemos referencia, la tabla BDCDATA será una tabla interna que
tendrá los mismos campos que la estructura BDCDATA. Los campos que forman parte
de esta estructura son:

39
Veamos un ejemplo sencillo de como cargaríamos la tabla BDCDATA. Supongamos
que queremos hacer un Batch Input, para cargar con un registro a nuestra tabla
de usuarios ZTABLA_USUARIOS.

Si ejecutamos esta acción en forma manual, deberíamos hacer lo siguiente:

Ingresar a la transacción SM30, introducir el nombre de la tabla, presionar el botón


de modificación o maintain, presionar el botón de nuevas entradas o new entries,
introducir el contenido del registro con todos sus campos, presionar el botón grabar y
salir de la transacción.

Si representamos en código el procedimiento anteriormente descrito, escribiríamos:

Para ingresar a la primer pantalla y presionar el botón de mantenimiento.

Por cada vez que se ingrese en la tabla


BDCDATA, una nueva pantalla, debe
ingresarse un BDC_OKCODE.

Luego, presionamos el botón de nuevas entradas.

Los números de las dynpros siempre deben tener 4 dígitos.

39
Después ingreso el registro del usuario. En la imagen que vemos a continuación no
figuran todos los campos de la tabla de usuarios.

El código anterior está diseñado para dar de alta un solo registro en la tabla de
usuarios. Si quisiéramos ingresar más de un registro, vamos a tener que manejar
un indice. Esto lo veremos en detalle en las próximas lecciones.

Por último, grabamos y salimos de ambas pantallas.

39
En la próxima lección veremos como hacer para obtener los datos para completar la
tabla BDCDATA.

Lección 2: Video - Los datos propios en el sistema SAP

LECCION_7_4_ABAP_INICIAL_V4.swf

Lección 3: Subrutinas y Grabación de datos de un BI

1| Utilización de subrutinas en un Batch Input

Para hacer más simple la creación de un batch input, vamos a utilizar la subrutina
BDC_FIELD, que nos van a permitir modularizar los programas.

39
Si cambiamos el código de la lección anterior, utilizando la subrutina BDC_FIELD, el
mismo quedaría de la siguiente manera:

En el ejemplo anterior, podemos ver lo importante que es la modularización en


los programas batch input.

39
2| Cómo obtener los datos necesarios para la carga de la tabla
BDCDATA?

Vamos a explicar como obtener los valores que cargamos en la tabla interna BDCDATA.
Para ello, tomamos el ejemplo de la carga de la tabla BDCDATA, que vimos en la
lección anterior.

Vamos a entrar a la transacción SM30, y recuperar los datos correspondientes a la


primer pantalla. Existen varias formas de obtener información de una pantalla. Ellas
son:

Parándonos sobre un campo de entrada de datos, presionamos F1 y luego el botón


de Información técnica y veremos una ventana de diálogo con información relevante
para el armado de la tabla BDCDATA, como es el nombre del programa, el nombre de
la dynpro y el nombre del campo.

Parándonos sobre un botón de la pantalla, presionamos F1 y veremos una ventana de


diálogo con el nombre del programa y el código de función correspondiente al botón.

39
En todas las pantallas de SAP, podemos visualizar en el extremo inferior derecho de
las mismas, diferentes datos de la pantalla como ser el nombre del programa en
ejecución, la transacción, etc.

3| Grabación de un Batch Input

Otra forma más eficiente de obtener los datos para la carga de la tabla
BDCDATA, consiste en realizar una grabación de los pasos que hacemos en la
ejecución de las transacciones, mediante la transacción SM35.

Para realizar la grabación, presionamos el botón Recording, luego el botón New


Recording y veremos la siguiente ventana de diálogo.

39
Recording: aquí asignamos un nombre a la grabación.

Transaction code: aquí ingresamos el nombre de la transacción.

El resto de las opciones, las dejamos como están y presionamos el botón Start
Recording. Luego seguiremos la secuencia de pantallas hasta generar un registro en
la tabla ZTABLA_USUARIOS, que finaliza presionando el botón grabar y saliendo de la
transacción. Después de esto, veremos la siguiente pantalla con la grabación.

39
Cuando estamos haciendo una grabación en la transacción SM35 y queremos
ver el resultado de la misma, debemos presionar el botón grabar o el botón exit
de la pantalla.

Si nos fijamos, la tabla con las columnas que visualizamos en la grabación tiene la
misma estructura que la tabla BDCDATA. Luego si presionamos el botón grabar, la
grabación quedará almacenada en el sistema para consultarla mientras hacemos el
Batch Input. También es posible exportarla a un archivo o importar de un archivo una
grabación.

Por último, si volvemos para atrás, presionando el botón back de la pantalla, veremos
la grabación que acabamos de crear con cierta información de la misma.

39
Podremos ejecutar la grabación cuantas veces queramos, presionando el botón
procesar y seleccionando la grabación de la pantalla. También es posible modificar
una grabación creada para volver a ejecutarla.

Lección 4: Batch Input utilizando Call transaction

1| Mi primer Batch Input utilizando CALL TRANSACTION

Vamos a crear nuestro primer Batch Input utilizando la técnica de CALL TRANSACTION.
El objetivo del Batch Input será la carga inicial de datos de la tabla ZTABLA_USUARIOS.
Para ello, vamos a crear un archivo de texto con registros que cumplan con la
estructura de la tabla ZTABLA_USUARIOS, sin tener en cuenta al campo mandante.
Como lo que vamos a hacer será la carga inicial de la tabla de usuarios, borraremos
su contenido previamente a la ejecución de este ejemplo.

Ahora, seguiremos los pasos que establecimos en la primer lección de la unidad.

Paso 1ero. : Declaración de datos propios del batch input

Declaramos una tabla interna y una estructura, ambas del tipo BDCDATA, otra tabla
interna del tipo BDCMSGCOLL con su estructura, que servirán para almacenar los
mensajes que se produzcan cuando ejecutemos el CALL TRANSACTION, la tabla interna
de usuarios, que contendrá los datos que levantemos del archivo de entrada y una
tabla para mostrar por pantalla los errores entre otras declaraciones.

39
Paso 2do. : Lectura de datos de archivo de entrada

Ejecutamos el método CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD para levantar el


archivo de entrada con la información para generar el Batch Input.

39
Paso 3ero. : Carga de la tabla BDCDATA

Para cargar la tabla BDCDATA utilizamos la subrutina BDC_FIELD, que vimos en la


lección anterior. Antes debemos inicializar la tabla interna del Batch Input y la de los
mensajes.

Como vamos a ingresar más de un registro, tendremos que manejar índices para
saber en que fila de la pantalla estamos cargando los datos. Esto lo solucionamos
fácilmente, concatenando al nombre del campo el número de fila que le corresponde
en la pantalla entre paréntesis.

39
Paso 4to. : Ejecución de la sentencia Call Transaction

Ahora vamos a ejecutar la sentencia CALL TRANSACTION. La sintaxis de la sentencia


es la siguiente:

Veamos en detalle cada una de las opciones.

USING: aquí especificamos la tabla BDCDATA que se utilizará.

MODE: determina el modo de procesamiento que utilizará el Batch Input. Los modos
posibles de procesamiento son:

39
Modo Efecto
Procesamiento con la visualización de todas
A
las pantallas. Es el valor por default.
Procesamiento donde se muestran las
pantallas solo si ocurre un error.
Si se alcanza un breakpoint, se termina el
procesamiento con SY-SUBRC igual a 1001.
E El campo SY-MSGTY contendrá "S", SY-
MSGID contendrá "00", SY-MSGNO
contrendrá "344", SY-MSGV1 contendrá
"SAPMSSY3" y SY-MSGV2 contrendrá el
"0131".
Procesamiento donde no se muestran las
N
pantallas.
Procesamiento donde no se muestran las
pantallas.
P
Si se alcanza un breakpoint, se pasa el
control al debugger.

Es conveniente utilizar una variable para asignar el modo de procesamiento a un


Batch Input. De esta forma podremos modificar su valor dinámicamente, durante la
ejecución del programa.

UPDATE: determina el modo de actualización de los cambios que producirá el Batch Input. Los modos posibles
son:

Update Efecto
Actualización Asincrónica.

La actualización se produce de igual forma a la que


A sucede si no utilizamos la sentencia COMMIT
WORK AND WAIT.

Valor por defecto.


Actualización Sincrónica.
La actualización se produce de igual forma a la que
S
sucede si utilizamos la sentencia COMMIT WORK
AND WAIT.
L Actualización Local.

MESSAGES INTO: con el uso de esta opción, todos los mensajes generados
durante el procesamiento del Batch Input son almacenados en una tabla interna de tipo
BDCMSGCOLL. Para armar los mensajes, vamos a utilizar la función
MESSAGE_PREPARE tal como vemos a continuación:

39
Ahora que ya terminamos con todos los pasos del Batch Input, vamos a ejecutarlo con
modo de procesamiento "A" que nos permite ver el paso a paso de las
actualizaciones.

Lo primero que hacemos es ingresar a la transacción SM30 con el nombre de la tabla y


presionamos el botón Maintain.

Presionamos el botón New Entries.

39
Ingresamos todos los datos para un usuario y presionamos grabar.

Finalmente salimos de la transacción y repetiremos esta secuencia de pasos por


cuantos registros de usuario ingresemos en la tabla.

La sentencia CALL TRANSACTION también es muy utilizada en reportes, para


acceder a una transacción determinada, a partir de los datos clickeados en
pantalla, con el agregado de la cláusula AND SKIP FIRST SCREEN. Para más
información, presionar F1 sobre la sentencia.

39
Lección 5: Video - Paso a paso en la ejecución de un BI por Call
Transaction

LECCION_7_5_ABAP_INICIAL_V4.swf

Lección 6: Batch Input utilizando Juego de Datos

1| Mi primer Batch Input utilizando Juego de Datos

Vamos a crear nuestro primer Batch Input utilizando la técnica de Juego de datos. El
objetivo del Batch Input será la carga inicial de datos de la tabla
ZTABLA_USUARIOS. Para ello, vamos a crear un archivo de texto con registros que
cumplan con la estructura de la tabla ZTABLA_USUARIOS, sin tener en cuenta el
campo mandante. Como lo que vamos a hacer será la carga inicial de la tabla de
usuarios, borraremos su contenido previamente a la ejecución de este ejemplo.

Ahora, seguiremos los pasos que establecimos en la primer lección de la unidad.

Paso 1ero. : Declaración de los datos propios del Batch Input

Declaramos una tabla interna y una estructura, ambas del tipo BDCDATA y otra tabla
interna de usuarios que contendrá los registros que levantemos del archivo de
entrada.

39
Paso 2do. : Lectura de datos de archivo de entrada

Ejecutamos el método CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD para levantar el


archivo de entrada con la información para generar el batch input.

Paso 3ero. : Apertura de la sesión del Juego de Datos

Para realizar la apertura de la sesión del Juego de Datos, vamos a utilizar la función
BDC_OPEN_GROUP, especificando el mandante, el grupo y el usuario.

39
Paso 4to. : Carga de la tabla BDCDATA

Para cargar la tabla BDCDATA utilizaremos la subrutina BDC_FIELD, que vimos en la


lección dos. Antes debemos inicializar la tabla interna del Batch Input.

Paso 5to. : Inserción del Juego de Datos

Para realizar la inserción del Juego de Datos vamos a utilizar la función BDC_INSERT,
tal como vemos a continuación.

39
Paso 6to. : Cierre de la sesión del Juego de Datos

Para cerrar el Juego de Datos vamos a utilizar la función BDC_CLOSE_GROUP, tal como
vemos a continuación.

Paso 7mo. : Ejecución del Juego de Datos

Para realizar la ejecución del Juego de Datos vamos a entrar a la transacción SM35.
Vamos a seleccionar el Juego de Datos y lo ejecutamos presionando el botón Process.

En la siguiente ventana de díalogo marcamos la opción Background y presionamos


process.

Finalmente la sesión cambiará de status dependiendo del resultado de la ejecución y


los datos se actualizarán en la tabla ZTABLA_USUARIOS.

39
2| Utilización del programa RSBDCBTC para la ejecución del juego
de datos

Podemos ejecutar el Juego de Datos en forma Online mediante la ejecución del


programa estándar RSBDCBTC. Para ello vamos a tener que crear un job, submitir la
ejecución del programa RSBDCBTC y cerrar el job, tal como vemos a continuación.

Luego si vamos a la transacción SM35, vemos que el juego de datos se procesó sin la
necesidad de hacerlo manualmente.

Lección 7: BAPIS

1| Qué es una BAPI?

BAPIS. Son métodos estandarizados que nos permiten realizar acciones sobre los
objetos de negocios de SAP, como pueden ser, crear un pedido, crear un equipo,
hacer un movimiento de mercancías. Todas cosas que hasta ahora hacíamos
mediante batch input.

Ventajas de las BAPIS por sobre los Batch Inputs

Debido a que las BAPIS son generalmente estándar de SAP, utilizando BAPIS, nos aseguramos que los programas
que desarrollemos, serán compatibles con las versiones futuras de SAP. Esto no ocurre con los batch input, ya que
entre las distintas versiones de SAP, es común que se modifiquen las pantallas de las transacciones, por lo tanto la
ejecución del Batch Input fallará.

Decimos que las Bapis son generalmente estándar ya que si bien se pueden crear
mediante la transacción SE37 como funciones RFC, en rara ocasión tendremos que
crear una nueva.

39
Se pueden utilizar BAPIS desde cualquier plataforma de desarrollo que soporte el
uso de funciones RFC.

Desventajas de las Bapis

La mayor dificultad en la utilización de BAPIS, está en la carga correcta de los


valores de las tablas de entrada. Para superar esta dificultad, podemos utilizar la
SDN.

2| Bapis estándar

Existen ciertas BAPIS que son estándares y pueden ser implementadas para la
mayoría de los objetos de negocios. Estas BAPIS tienen funciones especificas, como
puede ser listar las instancias existentes de un objeto de negocio SAP. Ellas son:

Bapis estándar para lectura de datos

GetList(): con esta Bapi se pueden seleccionar un rango de objetos como pueden
ser sociedades o numeros de materiales.

GetDetail(): se utiliza para recuperar los datos de una instancia de un objeto de


negocio.

GetStatus(): se utiliza para obtener el status de un objeto de negocio.

ExistenceCheck(): chequea si existe una entrada determinada de un objeto de


negocio.

Bapis estándar para crear o modificar datos

Create() o CreateFromData(): se utilizan para crear instancias de objetos de


negocios.

Change(): se utiliza para modificar una instancia de un objeto de negocio.

Delete() y Undelete(): se utilizan para borrar y para cancelar el borrado de una


instancia de un objeto de negocio.

Bapis estándar para procesamiento masivo

Las BAPIS para crear o modificar datos pueden ser utilizadas para procesamiento
masivo, o sea para procesar grandes cantidades de datos. Para ello será necesario
agregar el sufijo Multiple al nombre de los métodos. Por ejemplo ChangeMultiple(),
CreateMultiple() or DeleteMultiple().

Bapis estándar para replicar instancias de objetos

39
Las Bapis Replicate() y SaveReplicate() son utilizadas para copiar instancias de
objetos de un sistema a otro.

3| La transacción BAPI

Para visualizar las Bapis existentes en el sistema, podemos utilizar la transacción


estándar BAPI.

Veamos por ejemplo la Bapi BAPI_USER_GET_DETAILS, que se utiliza para obtener los
datos personales de los usuarios de SAP. Para buscarla, clickeamos en el menú la
opción Edit/Find, ingresamos el nombre del objeto que es USER,
presionamos continuar y dentro del menú que vemos a la izquierda de la pantalla
vamos a User y allí clickeamos GetDetail.

39
Si ejecutamos la Bapi desde la transacción SE37, previamente ingresando el nombre de
usuario, que en nuestro caso será BCUSER, podremos acceder a los datos personales
del usuario.

39
DYNPROS

39

You might also like