Capacitacion ABAP
Capacitacion ABAP
Capacitacion ABAP
Proceso de Estudios
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:
39
dudas.
Datos Personales
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.
Aclaraciones importantes
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.
1| Qué es SAPNetWeaver?
39
SAPNetWeaver es por 30 días pero puede extenderse. Esto lo explicaremos más
adelante en el curso.
2| Donde descargarlo?
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.
DESCARGA SDN
Descargar SAPNetweaver
39
DESCARGA ALTERNATIVA
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
DESCARGAS
Descargar WinRar
39
El Filesystem debe ser NTFS
39
Para instalar y utilizar el sistema, hay que estar logueado como
administrador
4| Recomendaciones
Asegurarse que este servicio está activo y funcionando ya que sino la instalación falla.
Debe estar fijado en modo de inicio automático.
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.
39
5| Observación preliminar
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.
39
Presionamos Next y vemos la siguiente pantalla What to expect:
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
39
Debemos colocar, si no lo hemos hecho antes, los dos archivos ejecutables dentro
de una misma carpeta.
Ejecutaremos el archivo
SAP_Netweaver701SR1_2008_Installation_Master/IM_WINDOWS_I386/sapinst.exe.
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.
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.
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.
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 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.
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)
FI (Gestión Financiera)
CO (Controlling)
TR (Tesoreria)
PS (Sistema de Proyectos)
WF (Workflow)
39
IS (Soluciones Sectoriales)
1| Qué es Abap?
Utiliza sentencias de OPEN SQL para conectarse con prácticamente cualquier base
de datos.
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.
Posee una ayuda muy potente sobre la sintaxis y la semántica del lenguaje.
39
3| Secuencia de Eventos
1| Ambientes y Mandantes
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.
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.
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.
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.
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
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.
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".
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.
39
Todas las sentencias en ABAP terminan con un punto.
39
2| Ordenes de Transporte
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:
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.
Declarativas: se utilizan para declarar datos que vamos a usar dentro del
programa. Ej.: DATA, TABLES y CONSTANT.
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.
39
Existen dos formas de utilizar los comentarios en un programa ABAP:
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
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
AT LINE-SELECTION
AT USER-COMMAND
39
TOP-OF-PAGE
END-OF-PAGE
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:
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.
39
Presionando el botón Single step o la tecla F5, ejecutaremos paso a paso osea
sentencia a sentencia.
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.
LECCION_2_1_ABAP_INICIAL_V4_2.swf
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.
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
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.
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.
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.
39
Leccion 4: Video - Gestión de versiones
LECCION_2_3_ABAP_INICIAL_V4.swf
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.
2| Inicialización de variables
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.
Existen algunas funciones que se utilizan para tratar caracteres que son muy
útiles en el trabajo diario de un programador ABAP. Ellas son:
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.
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 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.
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.
4| Operaciones Aritméticas
39
Siendo el resultado el mismo de ambas formas. También se utilizan las siguientes
sentencias para operar aritméticamente con datos:
1| Condiciones
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
3| Sentencias de Control
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.
39
Donde offset indica la columna donde empezará la impresión y long indica la
longitud de los valores a visualizar. Veamos un ejemplo:
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.
1| Parámetros de selección
39
La longitud máxima que puede tener el nombre de un parámetro es de 8
posiciones.
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:
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 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.
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:
39
Y creamos nuestro primer mensaje.
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
LECCION_2_6_ABAP_INICIAL_V4.swf
39
UNIDAD 3: DICCIONARIO DE DATOS
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
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.
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.
39
Por último, vemos que la nueva fecha de expiración es tres meses posterior a la fecha
actual.
Para estructurar y formatear datos que se mostrarán como salida del programa.
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.
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.
Para recorrer una tabla interna y procesar registro a registro utilizaremos la sentencia
LOOP-ENDLOOP.
Para leer un registro concreto de una tabla interna sin necesidad de recorrerla
utilizamos la sentencia READ TABLE.
39
particular de la tabla se utilizará la cláusula INDEX tal como vemos en el siguiente
ejemplo.
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 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
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 del sistema o de control: son datos que tienen que ver con la
configuración del sistema.
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.
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.
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:
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 .
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.
39
Finalmente activamos la tabla ZTABLA_USUARIOS y felicitaciones acabamos de crear
nuestra primera tabla Z.
LECCION_3_2_ABAP_INICIAL_V4_9.swf
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:
39
Luego presionaremos el botón y el sistema nos ofrecerá números de
imágenes.
39
Aquí presionamos el botón y comenzamos a cargar registros en nuestra
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.
39
Aquí presionamos F8 y visualizaremos el contenido de la tabla ZTABLA_USUARIOS tal
como vemos:
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.
39
Finalmente activamos.
Una ayuda de búsqueda es un objeto ABAP que sirve para definir posibles valores de
selección.
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.
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.
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:
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.
39
Siempre después de un SELECT se debe preguntar por el
SY-SUBRC para saber como proseguir.
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.
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:
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 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:
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
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.
3| La sentencia MODIFY
39
Si el registro que se intenta modificar, no existe en la tabla,
este se crea.
4| La sentencia DELETE
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.
LECCION_3_6_ABAP_INICIAL_V4_2.swf
39
UNIDAD 4: SUBRUTINAS, FUNCIONES Y BATCH
Lección 1: Subrutina
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.
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:
39
Luego el sistema generará el siguiente bloque de código en nuestro programa para
que lo completemos con el código que corresponda:
2| 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.
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:
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.
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.
Y la salida será A B y A X.
39
Y la salida será H1 es: B.
5| Subrutinas externas
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.
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:
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.
LECCION_4_2_ABAP_INICIAL_V4.swf
39
Lección 4: Módulos 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.
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:
3| Tipos de RFC
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.
39
Lección 5: Destinos RFC
Los destinos de las RFC son creados en la tabla estándar SAP RFCDES a través de la
transacción SM59.
Los Tipos de destinos RFC que se pueden crear en SAP son los siguientes:
Conexiones ABAP
Conexiones internas
Conexiones TCP/IP
39
Para comunicar RFC entre distintos ambientes de sistemas SAP R/3 utilizaremos
Conexiones ABAP.
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
39
Testeo de un destino
LECCION_4_4_ABAP_INICIAL_V4.swf
Lección 7: Batch
1| Ejecución de Fondo
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.
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.
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.
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".
39
Identificamos nuestro proceso, lo tildamos y presionamos el botón Spool.
39
Lección 8: Video - El Spool
LECCION_4_3_ABAP_INICIAL_V4.swf
1| La memoria en ABAP
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.
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.
39
UNIDAD 5: REPORTES
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.
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.
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.
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.
3| El navegador de objetos
39
4| Utilización de colores en reportes
LECCION_5_2_ABAP_INICIAL_V4.swf
39
Lección 3: Status GUI y Títulos
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.
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.
39
Finalmente con el botón creado veremos el primer ítem de la siguiente manera.
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.
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.
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.
39
Lección 4: Reportes Interactivos.
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.
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.
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).
39
Utilizaremos el evento TOP-OF-PAGE DURING LINE-SELECTION para imprimir por
pantalla la cabecera de cada nivel de listados de 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.
39
Se pueden crear tantos niveles de listados como se requiera. El nivel del listado
donde estamos lo tenemos en la variable SY-LSIND.
1| Qué es un ALV?
ALV. Es una herramienta exclusiva de ABAP, que sirve para crear reportes de
manera eficaz, rápida y estandarizada.
39
2| Mi primer reporte ALV
Vamos a crear nuestro primer reporte ALV. Para esto seguiremos los siguientes pasos:
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.
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.
Vamos a cargar con valores la estructura ST_LAYOUT para configurar ciertos aspectos
de la salida 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:
LECCION_5_1_ABAP_INICIAL_V4.swf
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).
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.
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.
Para ver los logos disponibles en el sistema o cargar nuevos debemos utilizar la
transacción SE78.
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.
39
Por último agregamos la subrutina que capturará las acciones realizadas por el
usuario.
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.
39
Por último, ejecutamos la función REUSE_ALV_HIERSEQ_LIST_DISPLAY.
LECCION_5_3_ABAP_INICIAL_V4.swf
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:
39
Veremos en detalle los siguientes métodos:
2| Búsqueda de archivos en la PC
39
Analicemos los parámetros más importantes del método:
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.
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.
DAT: para archivos excel. Las columnas son separadas utilizando tabs. Las líneas
son separadas con saltos de línea.
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.
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:
39
FILENAME: contiene el directorio y nombre del archivo a descargar a la PC.
DAT: para archivos excel. Las columnas son separadas utilizando tabs. Las líneas
son separadas con saltos de línea.
DATA_TAB: aquí se almacena el contenido del archivo. Esta tabla debe tener la
misma estructura del archivo.
LECCION_6_2_ABAP_INICIAL_V4_2.swf
39
Lección 4: Archivos en Servidor: las sentencias OPEN y READ
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.
Veamos un ejemplo:
39
Si el archivo no existe, se creará automáticamente.
Veamos un ejemplo:
MODO TEXTO
Para abrir un archivo en modo texto, debemos utilizar la cláusula IN TEXT MODE, tal
como vemos a continuación:
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:
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.
Veamos un ejemplo:
Veamos un ejemplo:
39
3| Cierre de archivos del servidor
Veamos un ejemplo:
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.
LECCION_6_5_ABAP_INICIAL_V4_3.swf
Lección 7: Field-Symbols
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.
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.
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.
39
3| Asignación de datos a un Field Symbol
La asignación que utilizamos es estática ya que sabemos el nombre del campo que
queremos asignar al Field Symbol.
Veamos un ejemplo:
39
Lección 1: El concepto de Batch Input
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.
Existen dos técnicas para realizar un Batch Input, una se realiza de forma Online y la
otra en forma Batch. Ellas son:
39
3| Pasos para la creación de un Batch Input
CALL TRANSACTION
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
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.
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.
39
En la próxima lección veremos como hacer para obtener los datos para completar la
tabla BDCDATA.
LECCION_7_4_ABAP_INICIAL_V4.swf
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:
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.
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.
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.
39
Recording: aquí asignamos un nombre a la grabació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.
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.
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
39
Paso 3ero. : Carga de la tabla BDCDATA
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
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.
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.
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.
39
Ingresamos todos los datos para un usuario y presionamos grabar.
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
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.
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
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 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.
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.
39
2| Utilización del programa RSBDCBTC para la ejecución del juego
de datos
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
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.
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.
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:
GetList(): con esta Bapi se pueden seleccionar un rango de objetos como pueden
ser sociedades o numeros de materiales.
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().
39
Las Bapis Replicate() y SaveReplicate() son utilizadas para copiar instancias de
objetos de un sistema a otro.
3| La transacción 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