Vous êtes sur la page 1sur 116

Resumen Manuales SAP

TAW 10 & 12

Idioma: Español

1
TAW 10 1/2.

• Capitulo 7 Abap Program Proces . pag.11


• Capitulo 8 pag.11
• Capitulo 9 Introduccion Abap Dictonary. pag.12
• Capitulo 10 Sentencias Basicas Abap pag.13
• Capitulo 11 Data Retriaval. pag.16
• Capitulo 12 Internal Program Modularization with subrutines. pag.18
• Capitulo 13 Abap Runtime System. pag.19
• Capitulo 14 User Dialog List. pag.19
• Capitulo 15 User Dialog Selection Screen pag.20
• Capitulo 16 User Dialog Screen. pag.21
• Capitulo 17 Global Modularization. pag.22
• Capitulo 18 Calling Program and Passing data. pag.23

TAW 10 2/2.

• Capitulo 2 Data Types and data object in detail. pag.26


• Capitulo 3 Using Internal Tables. pag.29
• Capitulo 5,6,7,8 Abap Objects. pag.32
• Capitulo 7 Inherating. pag.35
• Capitulo 8 Casting. pag.35
• Capitulo 9 Interfaces. pag.35
• Capitulo 10 Events. pag.37
• Capitulo 12 Special Techniques. pag.38
• Capitulo 13 Excepciones. pag.39
• Capitulo 14 Dinamic Programming. pag.41

TAW 12 1/3 ABAP workbench.

• Capitulo 2 Abap Dictionary pag.49


• Capitulo 3 Tables in Abap Dictionary. pag.50
• Capitulo 4 Performance during acces. pag.51
• Capitulo 5 Consistency through input checks. pag.52
• Capitulo 6 Dependencies if abap dictionary objects. pag.53
• Capitulo 7 Changes to databases tables. pag.53
• Capitulo 8 Views. pag.54
• Capitulo 9 Search Help. pag.55
• Capitulo 13 Reporting. pag.57
• Capitulo 14 Selection Screen. pag.58
• Capitulo 15 Logical databases. pag.60
• Capitulo 16 Data Retrieval. pag.61
• Capitulo 17 Data Formating and control level processing. pag.62
• Capitulo 18 Saving list and background processing. pag.65
• Capitulo 19 Interactive list. pag.65
• Capitulo 20 Sap Grid Control. pag.66

2
TAW 12 2/3 ABAP workbench.

• Capitulo 2 SAP Programming Model. pag.68


• Capitulo 3 Introduction to screen programming. pag.68
• Capitulo 4 The Program Interface. pag.71
• Capitulo 5 Screen elements for output. pag.72
• Capitulo 7 Screen elements and tabstrips. pag.76
• Capitulo 8 Table controls. pag.78
• Capitulo 9 Context Menu. pag.80
• Capitulo 10 List in screen processing. pag.81
• Capitulo 13 Programming database updates. pag.82
• Capitulo 15 LUW s and Clients/Server architecture. pag.85
• Capitulo 16 SAP Locking Concepts. pag.85
• Capitulo 17 Organizing database updates. pag.86
• Capitulo 18 Complex LUW Processing. pag.88
• Capitulo 19 Number Assigment. pag.89
• Capitulo 20 Change Documents. pag.91

TAW 12 3/3.

• Capitulo 3 Changing SAP Standar. pag.94


• Capitulo 4 Personalization. pag.96
• Capitulo 5 Table enhacement. pag.97
• Capitulo 6 Enhacement. pag.98
• Capitulo 7 Business Transaction Events. pag.99
• Capitulo 8 Business ADD-Ins. pag.101
• Capitulo 9 Modifications. pag.102

3
TAW10 1/2 ABAP workbench fundamentals
Manual de referencia

Transacción Descripción
SE80 Object navigator
SE38 Abap editor
SE11 Abap dictionary
SD11 Data modeler
SE91 Creación de mensajes
ST22 Abap dump análisis
SM21 Visor de logs del sistema (basis)
SU21 Autorización de objetos
SE51 Screen painter
SE41 Menú painter
SE37 Constructor de funciones
BAPI Repositorio de BAPI´S
SE16 Ver contenido de una tabla
SE54 Table views
SM30 Transacción para mantenimiento de tablas
SM12 Visor de locks
SE18 Visor de BADI’s
SE24 Class builder
SE91 Clases de mensajes
SE36 Bases de datos lógicas
ST05 SQL trace
SE30 Análisis de consumo de un programa abap
SM36 Crear JOB´s
SM37 Ver corridas de JOBs
SP01 Y SP02 Visor de spool
SE51 Screen painter
SM50 Visor de application server
SM13 Visor de requerimientos de UPDATE
SE93 Creación de transacción
SE14 Database Utilities
SCU3 Visor de log de tablas del sistema
SCDO Creación de change document

4
Variable de sistemas
SY-UNAME Nombre de usuario
SY-SUBRC Retorno de sentencias
SY-LSIND Contador de nivel de listado, arranca en 0
SY-TABIX Índice de una tabla interna
SY-TFILL Cantidad de registros traídos en un loop
SY-LENGHT Longitud de una línea de una tabla interna
SY-ULINE Ingresa una línea horizontal
SY-VLINE Imprime una línea vertical
SY-DNNR Información de la pantalla donde esta
SY-LILLI Numero de la línea donde el usuario realizo el clic en la fila del listado
SY-TITLE Contiene el titulo del programa
SY-DYNNR Numero de screen en la que me encuentro
SY-FDPOS Posición en de una cadena en otra usando la sentencia SEARCH
SY-LINCT Cantidad de líneas
SY-LINSZ Largo de la línea
SY-SROWS Cantidad de filas en pantalla
SY-SCOLS Cantidad de columnas en pantalla
SY-PAGNO Numero de pagina
SY-LINNO Numero de línea seleccionada
SY-COLNO Numero de columna seleccionada

5
• Creación de un programa ABAP

1. Ir a la transacción SE80 -> object navigator


2. Botón derecho sobre la clase de desarrollo
3. Create -> Program

4. ingresar el nombre del programa respetando el estándar de SAP

6
5. Completar los datos que pide para el programa

6. Asignarle una clase de desarrollo

7
.

7. Asignarle una orden de transporte en el caso de que la clase de desarrollo sea distinto de $TMP

• Crear una transacción asociada a un programa

1. Transacción SE80 -> object navigator


2. Botón derecho sobre la clase de desarrollo
3. create -> transaction

8
4. escribir el nombre de la transacción, la descripción de la misma y a que tipo de programa será asociada

9
5. ingresar el nombre del programa a asociar

10
6. Nos pedirá guardarla en una clase de desarrollo

7. y asignarle una orden de transporte

Capitulo 7
ABAP Program Process.

• El sistema R/3 es un sistema cliente-servidor. Esta compuesto por 3 capas.


Capa 1 -> Nivel de base de datos -> en este nivel se encuentra la base de datos. Es
una base de datos relacional donde aparte de los datos (tablas) también se guardan los
programas y meta datos del sistema.
Capa 2 ->Nivel se servidor de aplicación -> todos los programas corren en este nivel.
Los programas leen datos de la capa de base de datos, procesan esta información a
través de work process y son capaces de almacenar información temporaria.
Capa 3 -> Nivel de servidor de presentación -> En este nivel se encuentra la interfaz
del usuario. Este nivel permite al usuario ingresar datos y mostrar datos como
resultado del procesamiento de un WORK PROCESS.

Las 3 capas pueden ser instaladas juntas en una única maquina, por separado en 3 maquinas
distintas. Las 2 primeras capas pueden cada una ser instalada en mas de una maquina (tener
la DB en mas de una maquina o presentation server)

• Vistas de usuario -> Todas las pantallas de usuario se ejecutan en la capa del presentation server

DYMPRO (MODULE POOL)


11
SELECTION SCREEN (REPORT y MODULE POOL)
LIST (REPORT y MODULE POOL)

Cuando el usuario realiza una acción en la pantalla el control del programa se traspasa al
application server donde esta la lógica de este.

• Los programas ABAP no pueden tener nombres de más de 30 caracteres.

Capitulo 8

• La capa de base de datos esta dividido en dos grandes grupos


CROSS-CLIENT -> este grupo esta compuesto por el repositorio de datos
(programas y metadatos) y algunas tablas especiales
CLIENT-SPECIFIC -> este grupo esta compuesto solo por tablas

• El repositorio esta subdividido de acuerdo a los componentes de aplicación del sistema y cada
componente esta a su vez subdividido en clases de desarrollo.

• Todo desarrollo de una aplicación siempre es realizado en un entorno de desarrollo y


transportado al entorno de producción. El transporte de objetos de un sistema a otro se realiza a
través de ordenes de transporte (change request) de clase de desarrollo a clase de desarrollo,
cuando se crea una clase de desarrollo se debe asignar una orden de transporte.
Las órdenes de transporte están organizadas en grupos de transporte (generalmente para
proyectos grandes)

• Una orden de transporte contiene los siguientes atributos


Transportación layer -> Nos permite definir la distribución del desarrollo
Person responsible -> Usuario responsable del proyecto
Software component -> Describe a que componente pertenece el desarrollo
Application component -> Describe a que componente de aplicación pertenece el
desarrollo

• Sintaxis ABAP
Características -> Esta formado por sentencias
-> Cada sentencia termina en un punto
-> Cada palabra debe estar separado por un espacio
-> Una línea puede contener mas de una sentencia
-> ABAP no es case sensitive
-> Comentarios -> * - > comenta toda una línea
-> “ -> comenta a partir del símbolo
-> Toda sentencia ABAP retorna un código de respuesta en la variable de
sistema (SY-SUBRC), cuando la sentencia se realiza correctamente retorna 0,
en caso de error 4.

Capitulo 9

12
Introduction to ABAP dictionary

• Elementos del diccionario -> Tablas -> Transparentes -> estas tablas
tienen la estructuras en el diccionario que en la db.
Tiene campos clave en combinación con campos no
claves.
-> Pool o Cluster -> son tablas de
sistema.
-> Data Elements -> brindan información
semántica sobre un campo
-> Domains -> brinda la descripción técnica
de un campo

• Estructuras -> Las estructuras con definiciones de conjuntos de datos parecidos a las tablas
transparentes pero solo están definidos en el diccionario, no tiene campos claves.

• Si se usan elementos del diccionario para definir elementos en una pantalla de selección estos
elementos heredan todos los atributos de estos, no solo el tipos de datos que se admite, la
definición semántica del mismo así también como la ayuda (F1) y el machcode (F4)

• La sentencia TABLES en un programa define un data object con la estructura con la


particularidad de nombrarla con el mismo nombre del diccionario.

• El campo MANDT (tipo S_MANDT) nos indica que la tabla que estamos utilizando no es cross-
client (tabla dependiente de mandante)

• Transacción para el diccionario SE11, desde aquí se crean todos los elementos del diccionario.

• La transacción SE14 contiene utilitarios para las tablas, vistas, etc de la DB. Nos permite borrar
el contenido de una tabla.

Capitulo 10
Sentencias básicas de ABAP

• Data types globales -> son utilizados por todos los programas, se encuentran en el diccionario de
datos, son manejados centralizadamente.

• Data types Locales -> son creados por el usuario dentro de un programa con la sentencia
TYPES, con la particularidad de que los campos de ese type deben contener solo tipos de datos
predefinidos por abap y no los del diccionario.

TYPES:
type_name TYPE [VALUE n]


• Tipos de datos predefinidos por abap, valores por default
13
C Text (Character) 1 space
N Numeric text 1 '00...0'
D Date (YYYYMMDD) 8 '00000000'
T Time (HHMMSS) 6 '000000'
X Hexadecimal (HeX code) 1 X'00'
I Integer 4 0
P Packed number 8 0
F Floating point number 8 0
STRING Character sequence (string) variable-length empty string
XSTRING Byte sequence (X string)
variable-length empty hexadecimal string

• Diferencia entre LIKE y TYPE


LIKE - > copia la estuctura de un data object
TYPE - > copia la estructura de un data type

• Constantes - > data object constantes en mi programa. Su valor no puede ser modificado en
RUNTIME.

CONSTANTS cons_name TYPE type_name VALUE [LITERAL | IS INITIAL]

Literal -> valor inicial de la canstante


Is initial -> valor inicial por default de la constante

• La conversión de datos entre data object es posible, dependiendo del contenidos de estas, tener
en cuenta los puntos decimales.

• Loop at ... into … endloop -> se utiliza para tablas internas, nos permite recorrer una tabla
interna poniendo cada línea en una work area.

• Select... endselect -> se utiliza para iterar dentro de tablas de la base de datos. Lo que realiza
esta sentencia es una iteración y por cada vuelta realiza una consulta a la db para traernos el
siguiente registro

• Check <condición> -> corta un bloque de procesamiento si una condicion no se cumple

• Message -> mensajes por pantalla, aparece al pie de la pantalla

MESSAGE w007(e8) WITH 'sorry does not exist'.

Primero se coloca el mensaje (007) conel tipo de comportamiento que queremos (E) y entre
parentesis va la clase de mensaje a la cual el mensaje que queremos desplegar pertenece, los
parametros que siguen son posicionales, los mensajes pueden llevar parametros, no mas de 4. Para
ver el mensaje ver la transaccion SE91 ingresando la clase de mensajes.
Se puede en un programa declarar una librería por default y no tener que declararlo en cada
sentencia message

• Acceso al debugger de cualquier programa en el command field ‘/h + [enter]’ y luego ejecutar el
programa, se abrirá el debug de ese programa.
14
Al pie de la pantalla aparecerá la siguiente leyenda “debugger switch on” que nos indicara que esta
activado el debugger

• Se puede poner un break-point destinado solo a un usuario con la sentencia, este breakpoint solo
afectara al usuario que se le especifica

Break <usuario>
Break bc400-46

• Un watchpoint es útil para parar un programa por el contenido de un data object, se crea
declarando el campo y que contenido deseas que tenga para que pare. También es posible definir
la igualdad entre 2 campos o que se detenga cuando un campo cambie de valor en su contenido
cualquiera sea este cambio.

• Estructuras en abap :

Las estructuras son una estructura de data object, las estructuras se pueden anidar y un
componente puede ser hasta una tabla.
Se define igual a un tipo y se declara una work area del tipo de la estructura
La estructura es local y solo puede ser accedida por el progrograma.

TYPES : BEGIN OF struct_name,




END OF struct_name

• ST22 -> visor de dumps

La transaccion nos permite visualizar un dump de una aplicacion en el sistema. Permite ver el dump
que le dio al usuario y al resto de los usuarios en una fecha determinada.

• TABLAS INTERNAS

Son tablas dinamicas, a nivel de insercion y borrado de registros, se crea como data objects con una
estructura definida. Cada registro se lo conoce como lineas en la tabla interna. Las lineas pueden ser
de cualquier tipo de datos ABAP.

Atributos - > Los componentes claves


- > Tipo de accesos

Tipos de tablas - > index tables - > standard tables: busqueda secuencial
proceso secuencial
acceso por campos key
- > sorted tables: busqueda binaria
proceso secuencial
acceso por campos key
- > hashed tables: acceso solo por clave hash
no se puede acceser secuencialmente

15
Las tablas internas pueden ser creadas en forma local dentro del programa o en el dictionario de
datos y ser compartidas por todos los programas.
Las tablas internas no tienen representacion en la base de datos.
La definición de una tabla en un programa se reliza creando un data object del tipo TABLE OF una
estructura y definiendo el tipo de tabla y acceso. Esta creacion es dinamica y puede ser distinto en
distintos programas.

• Tablas trasparentes -> tienen representación física en la base de datos

Estructuras -> No tienen representación en la base de datos

Tablas pool -> Tienen representación en la base de datos pero no como se muestra en la
estructura, los datos estan diseminados en distintas tablas y logicamente tiene una
estructura única.

• Para definir una tabla interna en un programa a partir de una estructura se utiliza la siguiente
sentencia

DATA itab TYPE <table_kind> TABLE OF <struct> WITH <keydef> ( pag 264 L.1)

• Operaciones con tablas (un solo registro) ( pag 267 L.1)


Append -> Agrega un registro al final de la tabla, solo para tables standards.
Insert -> Inserta un registro acorde con el tipo de tabla que estamos utilizando.
Read -> Copia una línea de la tabla interna a una work area
Modify -> Permite modificar un registro en la tabla interna
Delete -> Permite borrar un registro de la tabla
Collect

• Operaciones con tablas (muchos registro)


Append -> Agrega un set de registros al final de la tabla, solo para tables standards.
Insert -> Inserta un set de registro acorde con el tipo de tabla que estamos utilizando.
Read -> Copia un ser de registros de la tabla interna a una work area
Modify -> Permite modificar un set de registro en la tabla interna
Delete -> Permite borrar un set de registros de la tabla

• Operaciones con tablas (toda la tabla)


Refresh -> Tabla con header line -> Borra el contenido de la tabla
y la wa
-> Tabla sin header line -> Borra el contenido de la tabla
Free -> Tabla con header line -> Borra el contenido de la tabla no
la wa
-> Tabla sin header line -> Borra el contenido de la tabla
Clear -> Tabla con header line -> Borra la wa
-> Tabla sin header line -> Borra el contenido de la tabla
Sort -> Ordena una tabla interna por los campo que queramos

Capitulo 11
Data retrieval

16
• Toda selección de datos a la DB de produce a travez de la intefaz de la base de datos,
fisicamente la tabla puede ser transparente o de tipo cluster.

• Para traer datos de la DB se usa la sentencia SELECT


SELECT…
FROM…
INTO…
WHERE…

• El addition SINGLE permite traer solo un registro de la DB correspondiente con la condición.


El addition INTO TABLE permite realizar una selección de registros e insertarlos en una tabla
interna, los datos de la tabla interna son reemplazados. Para agregar registros a una tabla que ya
contiene registros se usa el addition APPENDING TABLE.

• La variable sy-dbcnt -> contiene la cantidad de registros leidos.


sy-subrc -> contiene el código de retorno de la sentencia
ejecutada anteriormente.

• Cuando se realiza una selección en una tabla dependiente de mandante el entorno tranforma la
sentencia agregandole el campo mandante en el cual estamos logoneados, se puede evitar esto y
leer datos de otros mandante utilizando la sentencia CLIENT SPECIFIED y en la clausula
WHERE es necesario especificar el mandante que queremos.
La variable de sistema sy-mand nos iundica en que mandante estamos logoneados.

• Se puede establecer en la clausula WHERE que un campo este en un intervalo especificado


entre parentesis.

....
WHERE carrid IN (…, …, …)
….
• La sentencia SELECT SINGLE * … nos permite traer de la DB la primera ocurrencia según una
condición.

• El addition INTO CORRESPONDING FIELDS/INTO CORRESPONDING OF TABLE nos


permiten desligarnos de los nombres de los campos en donde queremos depositar. El/los
registro/s que seleccionemos se depositaran en los campos que correspondan en nombre de una
work area/tabla interna.

• La sentencia INTO TABLE nos permite seleccionar mas de un registro y almacenarlos


internamente en una tabla interna. La tabla interna se pisa con los datos nuevos. La sentencia
APPENDING TABLE agrega a una tabla interna los registros seleccionados.

• IMPORTANTE -> para que la DB mejore una búsqueda seleccionando un índice apropiado es
necesario en la cláusula WHERE escribir los parámetros de selección en el mismo orden que
están descriptos en el diccionario. Es necesario ver la estructura de la tabla en el diccionario y
verificar si tiene otros índices además del primario que se ajuste mejor a nuestra búsqueda.
No es necesario pasar por parámetros toda la clave, se puede pasar parte de la clave y también
beneficia a la búsqueda.

17
• Seguridad en accesos a la DB -> en la DB estan los perfiles de cada usuario para acceder a los
datos. El chequeo de autorizaciones se realza a traves de codigo con la sentencia AUTHORITY
CHECK con diferentes parametros para saber si cumple con los requisitos de autorizacion para
la accion que desea realizar, la respuesta del chequeo se devuelve en la variable de sistema sy-
subrc (= 0 autorizado, <> 0 no autorizado).
Los parámetros son objetos de autorizacion, estos objetos sueltos en el sistema, este objeto esta
compuesto por un objeto (parametro) al cual queremos tener acceso y un codigo de actividad
que nos indica que permisos tenemos. Estos objetos de autorizacion se guardan en clases de
autorizaciones (transaccion SU21 o SU20).

AUTHORITY-CHECK OBJECT 'S_CARRID'


ID 'CARRID' FIELD pa_carr
ID 'ACTVT' FIELD activ_auth.

IF sy-subrc NE 0.
MESSAGE e046(bc400) WITH pa_carr.
* No display authorization for airline carrier &1
ENDIF.

• Vistas -> es una tabla logica definida en el diccionario de datos, los datos estan almacenados en
la DB pero en tablas distintas, estas tablas estan logicamente relacionados por campos clave
pero para nuestro programa se maneja como una tabla unica.

• Selección en tablas múltiples -> Para relacionar 2 o mas tablas o no es obligatorio crear una
vista se puede realizar a travez de un solo qry la consulta, para esto es necesario crear la relacion
con el addition a la sentencia select JOIN.

Capitulo 12
Internal program modularization with subroutines

• subrutina -> es un modulo interno dentro de mi programa, permite separar funcionalidad, hace mas
lejible al programa, permite la reutilizacion de codigo. Se le puede pasar parametros y recibir
parametros de respuesta, se ejecuta con la sentencia PERFORM y la rutina se declara con

PERFORM <nombre_rutina> USING a1


CHANGING a2
a3

FORM <nombre_rutina> USING VALUE (a1) -> por valor


CHANGING a2 -> por referencia
VALUE (a3) -> por valor y resultado
ENDFORM.

Los parámetros pueden ser parados a la subrutina


-> Por valor -> realiza una copia local del parámetro
-> Por referencia -> Se pasa la dirección de memoria del
parámetros, todo cambio en el parámetros se realizara en la
variable original.
-> Por valor y resultado -> Se pasa el parámetro por valor y
este es devuelto como resultado de la subrutina.

18
Los parámetros fuera de la rutina se llaman “parametros actuales” y dentro de la rutina se llaman
“parametros formales”.

• Los parametros deben ser tipificados, esto quiere decir que se deben declarar el tipo de parametro
formal y actual ya que sino existiria la posibilidad de errores en runtime. Se deben declarar las
estructuras y tablas internas ( las tablas internas de deben pasar por referencia ya que sino por valor
duplicarian la tabla en memoria)

• Se pueden crear data object en forma local dentro de una subrutina, estos solo pueden ser accedidos
dentro de la misma. Los data object declarados fuera de las rutinas son data objects globales y
pueden ser utilizados y modificados dentro de las rutinas. La declaracion de data objects se realiza
igual que afuera. Los data object declarados dentro de la rutina se liberan cuando esta termina.

Capitulo 13
Abap runtime System

• Los bloques de procesamiento son la unidad mas pequeña de un programa, existen distintos tipos de
bloques

Events block -> Son eventos manejados por el runtime, y son disparados por este.
Subroutines -> son bloques que se ejecutan mediante una sentencia
Modules -> Son bloques manejados por procesos de pantalla

• Los bloques de procesamiento pueden ser escritos en cualquier orden, tienen cada bloque una
prioridad de ejecucion que siempre es la misma.

• Los bloques de procesamiento terminan cuando el runtime encuantra otro bloque acontinuacion de
la ultima linea ejecutable de este.

• Bloque de procesamiento LOAD-OF-PROGRAM es el primer bloque que se ejecuta, se utiliza para


inicializar los data object (existe para todos los tipos de programa). Para los programas ejecutables
esta la sentencia INITIALIZATION.

• Listados básicos -> Los listados basicos son listados que se muestran por pantalla con formato
basico, un listado basico puede tener hasta 20 niveles de listados ya que se puede hacer que la
selección de un dato en un listado nos lleve a otro.

• Los listados básicos son construidos en el bloque de procesamiento START-OF-SELECTION, se


usan las sentencias WRITE, SKIP, ULINE.

• Para ingresar titulos a un listado basico Activas el programa y ejecutarlo, tirar el listado e ir a la
barra de herramintas SYSTEM -> LIST -> LIST HEADING, guardar los cambios y para
modificarlos ir a GOTO -> TEXT ELEMENTS -> LIST HEADING.

19
Capitulo 14
User Dialog List

• Multilenguaje -> Al escribir literales en un programa no se traducira logoneado en otro idioma, para
esto esta los text symbols, ahí se podra definir las etiquetas, traducierlas y el sistema elefira el texto
que debe mostrar según el idioma

GOTO -> TEXT ELEMENTS -> TEXT SYMBOLS


Los nombre de los text elements (etiquetas) pueden tener hasta 3 caracteres y se enbocan en el
programa con TEXT-xxx donde xxx es el nombre del text element

Write ‘HELLO’ (001)

Si el text element (‘(001)’) no esta traducido en el idioma de logon se escribira en blanco, para
evitar esto se coloca por default un valor entre comillas simples como literal (‘HELLO’).

• Al seleccionar en una línea se ejecuta el bloque de procesamiento AT SELECTION-SCREEN.

• Usar la variable sy-lsind para saber en que listado estamos parados y saber cual fue la selección. No
puede sobrepasar en nivel de 20 listados (dumpea).

• HIDE área -> la hide area es un area de memoria donde se guardan datos de donde queremos
recuperar cuando se ejecuta un at line-selection. Cuando hacemos un write para listados basicos se
utiliza para recuperar datos del listado para utilizarlos en el armado de otro listado en base a esos
datos (selección del usuario).
NOTA: cuando terminados de utilizar la wa debemos limpiarla para evitar basura. (CLEAR wa).
Se puede guardar más de una estructura en el area de HIDE.

• Para saber en que columna se presiono en el listado esta la sentencia GET CURSOR.

• Variante -> es posible guardar lo datos ingresados en una pantalla para en otra oportunidad
recuperar la selección

Capitulo 15
User dialog selection screen

• Parameters -> Esta sentencia genera un data object en memoria y un campo de entrada en una
pantalla de selección con el mismo tipo.

PARAMETERS <pa_name> TYPE <pa_type>

• Select-options -> data object que contiene datos de una selección,


La declaración genera una tabla interna donde cada línea tiene los parámetros de
rangos ingresados por el usuario

Sign -> include (I) o Exclude (E)


20
Option -> opciones de inclusión
Low -> valor inferior de la selección
High -> valor superior de la selección

En la definición de un select-option solo puede tener de tipo (luego de for) un data object, para
declarar un dato primero hay que declarar un data object del dato que queremos y luego asignarlo al
select-option.

SELECT-OPTIONS <so_name> FOR <so_type>

Para utilizar el data object select-option donde tiene todos los parámetros de selección, se utiliza
dentro de un select común y se compara con el campo de la tabla con el cambio de que en vez de
igual va IN.

Select * from....
Into...
Where campo IN so_campo

Endselect.

El valor guardado en el select option es la selección compleja que realizo el usuario por pantalla no
realiza qrys a la base de datos, la selección se usa acompañado de sentencias OPEN SQL.

• At selection-screen - > evento entre carga de usuario y start-of-selection


Se utiliza generalmente para realizar validaciones de lo ingresado por
pantalla.

Capitulo 16
User dialog: screen

• Una screen es un programa que se crea y agrega a nuestro programa abap, las screen tiene atributos,
layout (formato), elementos y lógica de programación.

Para llamar una pantalla desde un programa se usa la sentencia

CALL SCREEN <scr_num>

Cada pantalla contiene las siguientes propiedades

Atributos -> Nombre de la pantalla


-> Descripción de la pantalla
-> Tipo de pantalla

Layout -> Son los objetos de la pantalla, disposición


y propiedades de estos

Element List -> Es la lista de elementos que


contiene la pantalla

Tiene 2 bloques de procesamiento PBO (process before output) y PAI (process after input)
21
• Para diseñar el layout (formato de la pantalla) se utiliza la herramienta Graphical Screen painter que
nos permite agregar botones, campos de entrada y salida, otros elementos de pantalla.

• Tiene la opcion de utilizar data object de mi programa abap y asi interfacear datos entre estos
(generalmente los campos en una screen son traidos de mi programa abap en una estructura y
cuando se completan los campos en la screen estos esta accesible en el programa cuando se sale de
la screen), la sentencia TABLES crea un data object que se suele usar ya que se declara una
estructura y es mas facil para transporta, pero se puede interfaciar tambien otros tipos de data
objects.
IMPORTANTE -> las estructuras en el programa abap y en la screen painter deben tener el mismo
nombre para que se relacionen.

• Antes de llamar a la screen para que muestre los datos se debe completar la wa que tiene la screen
relacionada.

• Para crear botones en una screen primero hay que declarar en el elemento list de la screen y debajo
de todo hay un campo en blanco con un atributo ok, ahí se coloca por standard el nombre ok_code
(este es el function code del boton).
Cuando se crea un botón en el campo ftcCode hay que poner el nombre del boton a seleccionar, este
nombre se transportara al data object ok_code
Hay que crear un data object data: ok_code type sy-ucomm.
Ahora hay que meterle logica de programacion a la screen, hay que crear un module en el PAI.

• La sentencia SET SCREEN nos permite cambiar dinámicamente el atributo NEXT SCREEN de la
pantalla, de esta manera podemos controlar el flujo de pantallas según una acción.

Capitulo 17
Global modularization

• Los módulos de funciones son funciones externas a los programas que son globales a todo el
sistema y no a un programa

• Estas funciones están organizadas en grupos de funciones, estos grupos contienen los mismos
componentes que un programa ejecutable (Data objects, subroutines, screens). Estos componentes
pueden ser accedidos por todas las funciones que están en el grupo. Desde fuera del grupo d
funciones estos componentes son inaccesibles

• Existen 3 tipos de módulos de funciones


1. Normal module
2. Remote-enables module -> tiene la particularidad de que el modulo puede ser
ejecutado desde nuestro sistema o desde un tercero conectado a este, se debe ser
una conexión a un sistema valido
3. Update function module -> incluye funciones especiales para manejar
actualizaciones en la DB

22
• Todas las funciones tienen una interfaz estricta para su utilización, la interfaz esta compuesta por
paramentos y estos pueden ser de 2 tipos.

1. Importing -> parámetros que recibe la función


2. exporting -> parámetros que devuelve la función
3. changing -> parámetros que recibe la función y retorna modificados

Por default todos los parámetros son pasados por referencia, pero se pueden pasar por valor.
Los parámetros de importing y changing pueden ser opcionales u obligatorios, los parámetros de
exporting siempre son opcionales.

• Las funciones se definen entre las sentencias


FUNCTION <func_name>.
ENDFUNCTION.

• Las funciones están preparadas para levantar excepciones, estas se declaran el la solapa de
excepciones, dentro del código de la función las excepciones se levantan con la sentencia

RAISE <exception>
o
MESSAGE <kind><num>(<id>) RAISING <exception>

• Las excepciones son tiradas hacia el programa que llamo la función, en este se deben atrapar y ser
salvadas, cuando se declaran las excepciones se le asignan un numero, cuando ocurren este numero
se devuelve en la variable se sistema SY-SUBRC.

• Los módulos de funciones tienen una nomenclatura especial

[Y|Z]<func_group>
[LY|LZ]<func_group><abrev><num>

• Para usar una funcion en un programa conviene utilizar el boton PATTERN que nos armara la
sintaxis de la funcion con sus parametros acorde como esta definida.

• Es conveniente generar una excepcion desconocida llamada OTHERS para excepciones no


contempladas y que la funcion no cancele por errores desconocidos.

• BAPI´s -> Son funciones Standard de SAP que manejan objetos de negocio, nos permite crear
objetos, cambiar y mostrar sus atributos.

• Las BAPI’s están implementados en módulos de funciones, se crean desde la transacción BAPI.
Estas funciones deben cumplir los siguientes requerimientos.
1. Nombre -> BAPI_<bussiness_obj_name>_<method_name>
2. Capacidad de ejecución remota
3. No debe tener pantallas, mensajes de dialogo
4. Los parámetros deben estas tipados en el diccionario
5. No se permiten parámetros de changing.
6. No se permiten excepciones.

Capitulo 18
23
Calling program and passing data

• Hay 2 maneras de arrancar un programa


1. Un programa que esta ejecución llama a otro, el programa llamador se detiene, se ejecuta
enteramente el segundo programa y cuando este termina se retorna el control al
programa llamador que continua normalmente

2. El programa llamador termina y el programa llamado empieza su ejecución.

• Para llamar a un programa ejecutable (report) se utiliza la sentencia

SUBMIT <pgm_name> -> llama al programa y termina el anterior

SUBMIT <pgm_name> AND RETURN -> llama al programa y cuando este termina se
retorna el control al programa original

SUBMIT <pgm_name> VIA SELECTION SCREEN


AND RETURN-> llama al programa y muestra la selection screen
que este tenga en el caso de que la tuviera, cuando termina se retorna
el control al programa anterior

• Para llamar a una transacción desde un programa se utiliza la sentencia

LEAVE TO TRANSACTION <transac_name> -> Termina el pgm actual


CALL TRANSACTION < transac_name> -> ejecuta la transacción y retorna el control al
pgm original

• Al conectarse a R/3 se abre una sesión externa, se puede crear desde system -> new sesion o a
través de o/<t_code>. En una maquina puede haber desde 2 sesiones externas y hasta 6 según el
sistema este configurado.

• Las sesiones externas están subdivididas en sesiones internas, cada programa que corre en una
sección ocupa una sesión interna. Una sesión externa puede tener hasta 9 sesiones internas
(guardadas en stack). Y los datos de un programa solo pueden ser visibles dentro de una sesión
interna.

• Diferencias entre PGM y Transaction.


PGM -> cuando se llama un programa se crea una sesión interna para este sin importar de la
manera en que se llama (si termina el programa anterior o no). El resto de la memoria queda
intacta.
Transaction -> Cuando se llama a una transacción, se reinicia la memoria de ABAP, se
borran todas las secciones internas

• Existen varias maneras de pasar datos entre programas entre sesiones internas
1. Interfaces entre programas
2. Memoria de Abap
3. Memoria de SAP

24
4. Tablas de la DB
5. Archivos locales en el presentation Server

• Interfaz entre programas -> Cuando se llama un programa que tiene pantallas se selección standard
se le pueden pasar datos. El pasaje de datos se puede realizar a través de una variante o
especificando los componentes de la pantalla de selección.

SUBMIT z_selection_screen and RETURN


with pa_dni [EQ|NE...] val
with pa_lname ...
with so_suldo between val1 and val2 sign [‘I’|’E’]

SUBMIT z_selection_screen AND RETURN VIA SELECTION-SCREEN


USING SELECTION-SET 'VARIANTE1'.

Con el addition VIA SELECTION-SCREEN nos muestra la pantalla de selección con los datos que
le pasamos

• Memoria de ABAP -> La sentencia EXPORT… TO MEMORY ID… nos permite copiar cualquier
tipo de data object a la memoria de Abap. Con el addition ID nos permite crear distintos grupos de
de memorias. Para traer los datos desde la memoria se utiliza la sentencia IMPORT … FROM
MEMORY ID …
Para liberar un grupo de la memoria se usa la sentencia FREE MEMORY ID…

• Para transferir datos entre en presentation server y el application server se usan las funciones
GUI_LOAD y GUI_DOWNLOAD.

• Memoria de SAP -> Para pasar datos usando la memoria de SAP se usan los parameters id, las
sentencias son

SET PARAMETER ID ‘<paran_id>’ FIELD <valor>


GET PARAMETER ID ‘<paran_id>’ FIELD <valor>

25
TAW10 2/2 ABAP workbench
Manual de referencia

Capitulo 2
Data types and data objects in detail

• Tipos de datos -> especificados -> Son tipos de datos que no se les
necesitan especificar el largo o la cantidad de decimales. d
(Date), t (Time), i (Integer), f (Float), string, xstring.
-> no especificados -> Son tipos de datos que se les
debe especificar el largo o la cantidad de decimales.
c, n , x -> Se les debe especificar largo ( 0..65535 )
p -> especificar largo y cantidad de decimales (máximo
16 bytes , default 8 bytes 0 decimales )

• Grupo de tipo -> definición a nivel de diccionario que agrupa definiciones de tipos que pueden
ser accedidos por todo el sistema.
El nombre de un type group no puede superar los 5 caracteres, por convención los tipos de datos
o constantes deben empezar con el nombre del type group.

TYPE-POOL zpool .

constants zpool_const1(2) type c value 'ok'.

TYPES: BEGIN OF zpool_struct1,


nombre(30) type c,
apellido(25) type c,
END OF zpool_struct1.ç

REPORT z_data_objects .
TYPE-POOLS: zpool.

DATA persona TYPE zpool_struct1.

• Definición de constantes

CONSTANTS <const_name> TYPE <type>

• Aritmética de enteros (integer) -> En la aritmética de enteros las operaciones con puntos
decimales son redondeadas al entero más cercano. Los cálculos utilizando aritmética de enteros
es mas rápido que los cálculos con punto fijo o flotante.

data int type i.

int = 4 / 10. => 0


int = 6 / 10. => 1
int = 20 / 15. => 1

• Aritmética en numero packed -> el largo de estos tipos de datos están representados en bytes.
Cada digito decimal esta representado por medio byte, el último byte se reserva para el signo. El
máximo número de lugares decimales es el largo menos 1.

• Aritmética de punto flotante -> Los tipos de datos de punto flotante es representado
internamente usando suma de fracciones binarias.
26
data: float type f, pack type p decimals 2.

float = 73050 * '0.0727'. => 5,3107349999999997E+03


pack = float. => 5.310,73

• Operaciones con tipos de datos distintos -> abap permite operaciones entre distintos tipos de
datos, en tiempo de ejecución se convierte el resultado de la operación a uno de los siguientes
tipos de dato ( i , p , f). Las operaciones aritméticas con string primero convierte el carácter en
numérico.

• Tipos iniciales de datos -> string -> Permite solo secuencia de


caracteres , valor inicial “ “.
-> d -> permite solo secuencia de dígitos,
Valor inicial “00000000”
-> t -> permite solo secuencia de dígitos,
Valor inicial “00000000”

• Operaciones con strings -> Abap permite operaciones con strings

Todas las operaciones menos SEARCH son case-sensitive

FIND -> busca un string dentro de otro


REPLACE -> reemplaza la primera ocurrencia de uno en otro
TRANSLATE -> reemplaza todas las ocurrencia de uno en otro
SHIFT -> mueve los caracteres dentro del string en forma ciclica
CONDENSE -> borra los caracteres blancos delante y detras
OVERLAY -> pisa caracteres de un string en otro
CONCATENATE -> concatena 2 strings
SPLIT -> divide un string por ocurrencias de un carácter
Con el addition INTO TABLE … <itab> permite parcear un string en una tabla
interna
STRLEN -> devuelve la cantidad de caracteres
SEARCH -> busca un string dentro de otro (binario o texto), la variable de sistema SY-
FDPOS guarda el offset donde encontro la cadena

• Estructuras -> Una estructura es un conjunto de elementos de datos. Se define de 2 maneras, con
la sentencia TYPES o DATA

TYPES:
BEGIN OF s_name_type,
prename(25) TYPE c,
surname(25) TYPE c,
title(5) TYPE c,
END OF s_name_type.

DATA: name TYPE s_name_type.

DATA:
BEGIN OF s_name,
prename(25) TYPE c,
surname(25) TYPE c,
title(5) TYPE c,

27
END OF s_name,.

• Es posible anidar estructuras para sectorizar la información, desde la estructura principal se irán
poniendo guiones “-“ para ir metiéndose en las subestructuras hasta llegar al elemento de datos
en particular.
Para incluir estructuras hay 2 maneras

TYPES:
BEGIN OF s_name_type,
prename(25) TYPE c,
surname(25) TYPE c,
title(5) TYPE c,
END OF s_name_type.

DATA: name TYPE s_name_type.

DATA:
BEGIN OF s_adress,
name TYPE s_name_type,
street(15) TYPE c,
city(25) TYPE c,
END OF s_adress.

DATA:
BEGIN OF s_name_type2,
prename(25) TYPE c,
surname(25) TYPE c,
title(5) TYPE c,
END OF s_name_type2.

Es posible agregar 2 estructuras del mismo tipo en otra., es necesario renombrar esta

DATA:
BEGIN OF s_adress2.
INCLUDE STRUCTURE s_name_type AS name.
INCLUDE STRUCTURE s_name_type AS name2.
DATA:
street(15) TYPE c,
city(25) TYPE c,
END OF s_adress2.

• Compatibilidad entre tipos de datos


-> tipos elementales -> son compatible cuando tiene
en mismo tipo y largo, y con mismo numero de
decimales
-> estructuras -> mismos componentes
-> tablas -> mismo tipo de fila, misma key y tipo de
tabla

• Datos UNICODE -> los datos del tipo unicode son formas de representar las información en
distintos tipos de idiomas y formatos.
Debido a unicode se cambio el tipo de representación interna de los datos, un carácter que
ocupaba internamente 1 byte ahora ocupa 2 byte. A raíz de este cambio es necesario activar el
flag de chequeo de unicode en los atributos de programa.

28
• FIELD-SYMBOLS -> toma el formato de un data element que se le asigna con la sentencia
ASSIGN. Se pueden hacer distintas asignaciones al mismo field-symbol y este tomara el
formato del dato que se le asigne.

• El move-corresponding es mas performante que el move ya que el primero realiza el chequeo de


unicode para todos los campos y luego mueve los campos acorde con el nombre entre las 2
estructuras, el otros realiza el chequeo y la copia de datos por cada campo.

Capitulo 3
Using Internal Tables

• Tablas Internas -> son data object que nos permiten almacenar conjuntos de datos en
estructuras fijas en memoria. Los datos son guardados linea por linea, y cada linea tiene la
misma estructura. Una tabla interna limita su tamaño a la memoria del application server.

• Atributos -> Line Type -> estructura de la tabla interna


-> Tipo de tabla -> Standard -> acceso por indice
-> Sorted -> acceso por clave
-> Hashed -> acceso por algoritmo
-> Clave -> Conjunto de columnas de una tabla interna
Composición de la clave -> Única
-> No única

• Definición -> Definición Local -> Se declara la estructura dentro


del programa y solo puede ser utilizada dentro de esta.
-> Definicion Global -> se define dentro del diccionario
y puede ser compartida por
todo el sistema.

Se define igual que una estructura y con la sentencia DATA definimos la tabla.

• Sintaxis

TYPES or DATA
Name [TYPE|LIKE] [standard|sorted|hashed] table
OF <structure>
WITH key_def
[INITIAL SIZE <tamaño inicial>]

DATA name TYPE TABLE OF <structure>

• Para definir una estructura tipo tabla el el diccionario se entra a crear un data element para
crear una table type y nos pide un line type que debe ser una estructura definida
previamente.

29
• Tipos de tablas
-> STANDARD -> Es opcional definir la clave al crearla, esta
puede ser única o no.
key_def -> [NON-UNIQUE] {KEY COL1… COLn}

-> Los campos de la clave debe ser


char-type
-> SORTED -> La clave puede ser única o no, las entradas
en la tabla están ordenadas, las inserciones
en la tabla también deben ser ordenadas

-> HASHED -> La clave debe ser única

• Tipo de claves

Standard -> [NON-UNIQUE] {KEY COL1… COLn/ DEFAULT


KEY}

Sorted -> {NON-UNIQUE| UNIQUE} KEY COL1… COLn

Hashed -> UNIQUE KEY COL1… COLn

• Operaciones -> Por tabla -> Clear


-> Move
-> Free
-> Sort
-> comparar tablas
-> meterle datos
-> Por lineas -> sentencias OPEN SQL
-> Por linea -> Loop

Operaciones con tablas

• READ TABLE -> Para leer datos de una tabla interna se utiliza la sentencia READ
TABLE… INTO… WITH KEY.
Esta sentencia actúa igual que la sentencia SELECT, retorna un solo registro a una work area
del mismo tipo

Addition:
COMPARING <comparing_options>
└ f1 f2 … fn
└ ALL FIELDS
TRANSPORTING <transport options>
└ f1 f2 ... fn
└ NO FIELDS

Le addition COMPARING nos permite seleccionar que campos de la work area queremos
comparar al hacer la lectura en la tabla interna.

30
El addition TRANSPORTING nos permite seleccionar que campos queremos que se copie a
la work area al realizar la lectura.
La variable de sistema SY-TFILL nos indica la cantidad de de líneas leídas.
La variable de sistema SY-SUBRC nos indica si encontró al menos un registro con la
condición indicada

• MODIFY TABLE… FROM… -> modifica una linea de una tabla interna, tiene additions
para acotar la modificacion por indice o por una condicion. Para que funcione la
modificación la tabla a modificar debe tener declarados campos claves, ya que en tiempo de
ejecución se selecciona el registro con los valores de la work area. No se pueden modificar
los campos claves cuando modificamos tablas internas SORT o HASHED
El addition TRANSPORTING nos permite solo modificar los campos de la tabla interna que
especifiquemos.
El addition INDEX nos permite a nosotros indicar el numero de registro que queremos
modificar, No es posible acceder por indice a tablas del tipo HASHED.

MODIFY TABLE itab_stdr FROM wa.

MODIFY itab_stdr FROM wa INDEX 1 TRANSPORTING apellido.

MODIFY itab_stdr FROM wa TRANSPORTING apellido


WHERE nombre = 'juan'.

En vez de modificar un registro con las sentencia MODIFY es posible asignar el registro a
un field symbol y modificar el registro directamente.

READ TABLE itab_sort WITH KEY nombre = 'juan'


ASSIGNING <fs>.
READ TABLE itab_sort index 2 ASSIGNING <fs>.

• DELETE TABLES -> borra un registro de una tabla por indice o por condición.
En tablas standard o sort se pueden borrar registros accediendo por la clave o por una
condición distinta a la clave.
DELETE TABLE itab_stdr WITH TABLE KEY nombre = 'pedro'.
DELETE itab_stdr WHERE domicilio = 'artigas'.

En tablas hashed solo se puede borrar por condición de la clave

DELETE itab_hash WHERE nombre = 'juan'.


DELETE TABLE itab_hash WITH TABLE KEY nombre = 'zeta'.
• LOOP… ENDLOOP -> Permite recorrer una tabla interna registro por registro o por una
condición.

LOOP AT itab_stdr INTO wa {WHERE domicilio = 'artigas'}.


...
ENDLOOP.

• INSERT… INTO TABLE…-> La sentencia insert nos permite insertar una o mas líneas en
una tabla interna, la inserción de las líneas son dependientes de la tabla con la que estamos
trabajando.
Standard -> inserta atrás
Sorted -> inserta ordenado
Hashed -> inserta según algoritmo hashed

31
INSERT wa INTO TABLE itab_stdr.
INSERT LINES OF itab_stdr INTO TABLE itab.

• Tablas con HEADER LINE -> el header line en una tabla interna es una WA que se declara
implicitamente con el mismo nombre y formato que la tabla interna y se maneja como una
WA normal y nos indica en que registro de la tabla nos encontramos. Para realizar
operaciones con la tabla esta se referenciara con el nomre mas doble corchete ( itab[] ) y la
WA solo con el nombre ( itab ).

• Field symbol -> un data element de este tipo es un puntero,


Declaración:
FIELD-SYMBLOS: <fs> TYPE <type>
Asignación
ASSIGN <type> TO <fs>
Desasignacion
UNASSIGN <fs>

• Tablas de rango -> se puede armar una tabla interna igual a la de un select opcion, se crea
una tabla del tipo rango y ahí se llenan los parametros de busqueda.

DATA: so_campo LIKE RANGE OF campo.

• Performance de lectura en tablas internas


Lectura con field symbols es más rápida que usar wa
Lectura de un solo registro (orden por eficiencia)
-> READ TABLE… WITH TABLE KEY…
-> Se debe especificar toda la clave
-> READ TABLE… WITH KEY
-> Se especifica parte de la clave, en el orden de la definición de la
tabla
-> LOOP -> iteración en la tabla, recorre toda la tabla

Capitulo 5, 6, 7, 8
Abap Objects

• TYPE REF TO -> Tipo de dato que referencia a un objeto.

• Atributos -> Clase -> atrubutos estáticos. Es compartido por todas


las instancias de esa clase, el valor no puede ser modificado por
ninguna de estas.

Declaración: CLASS-DATA: ....

-> Instancia -> atributos dinámicos. El atributo es


individual para cada instancia, cada una de estas puede tener un valor
particular, este atributo es administrado por cada instancia.

Los atributos dentro de una clase solo pueden ser declarados con la sentencia TYPE para
datos del diccionario, la sentencia LIKE es para copiar la declaración de elementos locales
de la clase.

32
El addition READ ONLY a la declaración de un atributo público nos permite que otras
clases vean el atributo pero no puedan modificarlos. Solo puede ser modificado por métodos
dentro de la clase.

• Un método es un procedimiento interno en una clase, este método tiene parámetros


(signature) que le permite recibir y devolver valores. Tiene parámetros de entrada, salida y
de excepciones. Estoy últimos se devuelven con la sentencia RAISING. A la interfaz de un
método se pueden definir parámetros opcionales o con valores por default.

Métodos -> Clase -> Solo puede utilizar atributos estáticos, estos
métodos pueden ser accedidos sin haber instanciado un objeto.

Declaración: CLASS-METHOD: ....

-> Instancia -> Puede utilizar atributos estáticos o


dinámicos, estos métodos deben ser accedidos desde una instancia de
una clase.

Declaración: METHOD: ....

• CREATE OBJECT -> Método de creación de objetos, crea un objeto de una clase
especificada por la declaracion de la variable de referencia al objeto

DATA: r_vehiculo TYPE REF TO lcl_vehiculo.


CREATE OBJECT r_vehiculo.

• Para almacenar objetos en colecciones se utilizan tablas internas con referencias a las clases.
.
DATA it_empleados TYPE TABLE OF REF TO empleado. .

En esta tabla interna se pueden guardar los objetos de la clase empleado y toda subclase de
esta, el casting se realiza automáticamente.
Para agregar un objeto a la tabla se utiliza la sentencia APPEND, la inserción de los objetos
es al final de la tabla y esta no se puede ordenar.
APPEND im_emp TO it_empleados.

Para recorrer esta tabla se utiliza la iteracion LOOP… ENDLOOP

LOOP AT it_empleados INTO empleado.


...
ENDLOOP.

• La declaración de un data object referenciando a un objeto casi siempre van de la mano con
una tabla de referencias para mantener los objetos en el sistema.

• Para llamar a metodos estaticos se usa solamente el nombre de la clase y el operador es ‘=>’.

• Constructor -> Es el metodo que se ejecuta caundo se realiza el create object. Se ejecuta una
sola vez cuando se crea el objecto y el evento es público. En ABAP object hay herencia de

33
constructores, cuando se llama al constructor de una subclase se ejecutan todos los
constructores hasta la clase padre.

PUBLIC SECTION.
METHODS constructor IMPORTING im_nombre TYPE string.

Puede tener parámetros de IMPORTING y EXCEPTIONS solamente. Cuando se levanta


una excepción el objeto no se crea.

• Importante -> la diferencia de la firma de un metodo en un programa y en la implemtacion


del metodo es que los parametros que son de IMPORTING son de EXPORTING y al reves.
• Si hay más de un tipo de parametros (IMPORTING, EXPORTING, CHANGING,
RETURNING o EXCEPTIONS) se debe poner explicitamente en la firma del metodo
cuando se lo llama. Los métodos que tienen parámetros de IMPORTING y uno solo de
RETURNING se llaman métodos funcionales, estos métodos pueden ser utilizados dentro de
operaciones.

• Para referenciar variables de un objeto dentro de un metodo teniendo en ambos el mismo


nombre, se antepone la palabra clave ‘ME-> ‘ que hara referencia al del objeto. Para
referenciar a un método de una superclase se usa la palabra clave ‘SUPER->’.

• Para declarar una clase con sus super clases se deben declarar en forma secuencial de la
superclase a la subclase, cuando se declaran en forma local. Al declararlo en el diccionario
no es necesario.

• Para redefinir un metodo en la subclase se define el metodo que queremos redefinir con el
addition REDEFINITION, asi el sistema sabe que no es un metodo nuevo sino un
redefinicion del metodo de la superclase. No es posible cambiar la firma de un método
redefinido. Se puede crear otro método con el mismo nombre pero con distinta firma y sin el
addition REDEFINITION.

METHODS: get_sueldo REDEFINITION.

• Constructor (instancia) -> El constructor de una clase es un método de instancia público con
el nombre CONSTRUCTOR. Cada clase tiene uno y este es llamado automáticamente
cuando se crea un objeto de esa clase. Este método se implementa en la sección pública, la
implementación de este método no es necesaria para una clase ya que existe un constructor
por default.

• Constructor (clase) -> El constructor de una clase es un método de clase público con el
nombre CLASS_CONSTRUCTOR. Cada clase tiene uno y este es llamado automáticamente
cuando se crea un objeto de esa clase, se accede a un atributo o método de clase, o cuando se
registra un evento para una clase.

• Herencia y redefinición del constructor -> Los constructores se heredan y se les pueden
pasar parámetros para setear atributos dentro de ellos. Los constructores de instancia de una
súper clase solo pueden ser llamados dentro del constructor de la sub clase. A diferencia del
constructor de instancia el constructor de clase se ejecuta automáticamente. Es este caso se
ejecuta siempre un constructor de clase antes del de instancia.

Capitulo 7
34
Inheritage

• La herencia es una relación entre clases, para implementar la relación clase se pone en la
definición el addition INHERITING FROM <super_class>, con esto la subclase hereda
todos los atributos y métodos creados PROTECTED o PUBLIC.

CLASS pasante DEFINITION INHERITING FROM empleado.


...
ENDCLASS.

• Cada clase puede heredar de una sola clase, no existe herencia múltiple. La herencia múltiple
se puede simular implementando interfaces.

Capitulo 8
Casting

• Casting de objetos
-> Narrow cast (= o MOVE … TO …) -> Baja la
especificación de un objeto.
Este tipo de casting es chequeado en forma estática por el compilador.
-> Wide cast (?= o MOVE … ?TO … ) -> Sube la
especificación un objeto.
Este tipo de casting no se chequea en forma estática, se produce en tiempo de
ejecución, para esto siempre se encierra esta sentencia dentro de las
sentencias TRY CHATH ENDTRY, para atrapar la excepción
CX_SY_MOVE_CAST_ERROR.
Deben estar en la misma rama de objetos y previamente se debe haber hecho
un narrow cast.

TRY.
p ?= empleado.
periodo_prueba = p->periodo_prueba.
CATCH cx_sy_move_cast_error.
e ?= empleado.
ENDTRY.

• Hay 2 tipos de referencias a variables


-> Estática -> cuando se declara una variable como TYPE REF TO <clase> y
esta referencia no cambia en momento de ejecución
-> Dinámica -> cuando la referencia a una variable cambia por razón de
realizar casting y en tiempo de ejecución se definirá que código se ejecutara
dependiendo del objeto apuntado.
Capitulo 9
Interfaces

• Una interfaz es declarada por el usuario, esta describe los servicios que un usuario puede
acceder desde afuera. El usuario no conoce la implementación ni quien la implementa, puede
ser una o más clases que implementen el mismo método. Existe polimorfismo en una
interfaz. La implementación de interfaces simula la herencia múltiple.
Una interfaz se declara entre las sentencias. Dentro se declara la interfaz para los métodos de
la interfaz.

INTERFACE if_persona.

35
METHODS if_mostrar_sueldo.
...
ENDINTERFACE. "if_persona

La implementación de la interfaz se realiza en las clases que la utilizan, así para cada clase
se puede comportar de manera diferente.

• En la sección DEFINITION de la clase que implementa esta interfaz se declara con la


palabra clave INTERFACES la interfaz a utilizar. Esta definición siempre debe ser en la
sección pública.

INTERFACES if_persona.

• En la sección de IMPLEMENTATION se codificara el funcionamiento de cada uno de los


métodos de esta.
Para indicar que el método que estamos implementando deriva de la interna es necesario
anteponer el nombre de esta acompañado por el carácter “~” (llamado interface resolution
operador)

METHOD if_persona~if_mostrar_sueldo.
...
ENDMETHOD. “if_persona~if_mostrar_sueldo
.

• Para utilizar los métodos de la interfaz la clase que los utiliza lo maneja como una clase
común, una “clase interfaz”. Tiene que declarar el objeto interfaz y utilizar el método. La
clase que utiliza esta interfaz solo tiene accedo al método de la interfaz. No puede acceder al
resto de los métodos y atributos.

DATA if_per TYPE REF TO if_persona.

if_per->if_mostrar_sueldo( ).

• Las interfaces son utilizadas utilizando referencias a interfaces. La asignación de un objeto a


una referencia a la interfaz se llama narrowing cast tal que solo los componentes de de la
interfaz son visibles. Desde la referencia a interfaz no se pueden ver los componentes del
objeto original.

• La clase que utiliza la interfaz por fuera de nuestro sistema tendrá solo referencias a objetos
interfaz. Estos objetos tendrán los métodos de la interfaz para utilizar, y los objetos de
nuestro sistema que implementan la interfaz tendrá que responder a las llamadas de estos
métodos.

• Un alias es una forma de llamar al método de la interfaz con otro nombre para no tener que
escribir interfaz~metodo. Solo esta permitido utilizarlo dentro de la sección definición de la
clase que la implementa.Cada clase puede tener un alias diferente pára el mismo método,
este es local para la clase.

ALIASES if_mostrar_sueldo FOR if_persona~if_mostrar_sueldo.

Desde fuera de la se accede al método por el alias como si fuera el nombre verdadero.

36
• Composición de interfaces -> una interfaz compuesta esta compuesta por la definición de
otras interfaces mas métodos propios. Puede usar más de una interfaz. La clase que
implemente la última de las interfaces en el árbol debe implementar todos los métodos de
todas las interfaces.

INTERFACE IF_inter.
...
ENDINTERFACE.

INTERFACE IF_inter2.
INTERFACES IF_inter1.
...
METHODS ...
ENDINTERFACE.

• Como cualquier método que se define sea de una superclase o de una interfaz este se puede
redefinir
En la sección DEFINITION del método que lo implementa se define el método con el
addition redefintion.

METHODS if_persona~if_mostrar_sueldo REDEFINITION.

• La implementación de una interfaz se hereda de una superclase a sus subclases.

Capitulo 10
Events .000
• Un evento se dispara cuando se realizan cambios en otros objetos, se usa para notificar o
realizar tareas automaticas tras una operación sobre un objeto.

• Tenemos 2 actores el actor que dispara el evento (Trigger) y el que recive el evento
(Handler). En el handler esta la definicion y la implemtentacion del metodo y del Trigger
solo estara la llamada al evento.

• Eventos -> Instancia -> EVENTS


-> Estático -> CLASS-EVENT

• La visibilidad del evento la define el lanzador del evento, la visibilidad del metodo que
atiende en metodo la define el manejador.

• Pasos para crear un evento :


-> Declarar el evento en la clase lanzador. Los parámetros de este método son solo
de EXPORTING

EVENTS empleado_creado .
EVENTS empleado_creado
EXPORTING value(ex_emp) TYPE REF TO empleado.

-> Disparar el evento en un método. Los parámetros de exporting son pasados por
valor

RAISE EVENT empleado_creado


RAISE EVENT empleado_creado EXPORTING ex_emp = me.

37
-> En el manejador declarar un metodo que responda al evento que queremos
registrar. Los parámetros de este método son solo de IMPORTING. El objeto sender
refiere al objeto que envía el evento, no es necesario pasarlo por parámetro.

METHODS: agregar_persona_e
FOR EVENT empleado_creado OF empleado
IMPORTING sender.
METHODS: agregar_persona_e
FOR EVENT empleado_creado OF empleado
IMPORTING sender ex_emp.

-> Para activar el evento creado para que este se acciona se setea el handler para el
objeto que atiende ese evento.
SET HANDLER contador->agregar_persona_e
FOR ALL INSTANCES.

Capitulo 12
Special Techniques

• Clases Abstractas -> No es posible instanciar objetos de un clase abstracta. Se usa para
delinear comportamiento de las subclases. En estas clases se definen métodos, los cuales no
son necesarios que sean implementados por esta y deben ser implementados por las
subclases. Una clase con al menos un método abstracto es una clase abstracta.

• Clases Finales -> Las clases finales no tienen subclases asociadas por lo tanto los métodos
no pueden ser redefinidos (los métodos son finales o abstractos, pero no al mismo tiempo).
Las clases que son abstractas y finales solo pueden tener componentes estáticos.

• Visibilidad del constructor -> indica quien puede crear un objeto de la clase.
El addition CREATE PUBLIC indica que desde un programa llamando a la sentencia create
object se instancia el objeto.
El addition CREATE PROTECTED indica que solo objetos de la clase o de la superclase
pueden instanciar objetos
El addition CREATE PRIVATE indica que solo objetos de la clase puede instanciar objetos

CLASS c1 DEFINITION CREATE PUBLIC|PROTECTED|PRIVATE.


...
ENDCLASS

• Para crear una única instancia una clase (singleton) se usa el addition CREATE PRIVATE
con el atributo FINAL.

• Friends -> el concepto de clases amigas (friends) no permite acceder a los atributos privados
o protegidos de una clase que nos provee de “amistad”. Esta “amistad” es unilateral, una
clase a la cual le brindo amigad puede acceder a mis atributos, pero yo no puedo acceder a
los de ella. Existe herencia de amistad solo para la clase que la recibe, la que brinda amistad
no pasa esta a sus subclases.

Class c1 definition create private friends <class>.


...
endclass.

38
• Clases persistentes -> Las clases de persistencia facilitan el manejo de objetos con bases de
dato relacionales. Para crear una clase persistente es necesario crearla desde el diccionario
del tipo PERSISTENT CLASS. Por cada clase de persistencia que se crea también se crean 2
clases que son las encargadas del servicio. La primera clase tiene el nombre de ACTOR o
AGENTE que es la encargada de manejar el objeto. La segunda es “amiga” de la primera y
tiene todos los métodos creados por el sistema para el servicio de persistencia (esta clase no
puede ser modificada). La clase actor tiene el atributo CREATE PRIVATE, por lo tanto
existe un solo actor por clase.

Capitulo 13
Excepciones

• Una excepción es una situación que se suscita dentro de un programa en ejecución. Las
excepciones pueden ser errores o situaciones que deben ser controladas antes de seguir con
el curso normal del programa. Estas excepciones pueden ser lanzadas por el runtime del
sistema o por el usuario con la sentencia RAISEN EXCEPTION.

• Las excepciones están organizadas en clases de excepciones y cada excepción es un objeto


con atributos los cuales nos permiten saber que error ocurrió.
Todas las excepciones derivan de las clases de excepciones CX_NO_CHECK,
CX_STATIC_CHECK o CX_DYNAMIC_CHECK. Todas estas dependen de la super-clase
CX_ROOT.

Aunque las excepciones respeten una jerarquía de excepciones no existe herencia, la


excepción que queremos atrapa debe ser declarada explícitamente.

• La sentencia para atrapar excepciones son, dentro del bloque TRY-ENDTRY se coloca el
codigo al cual queremos monitoriar, las sentencias CATCH contienen el codigo para salvar
la excepcion que ocurrio, se pueden poner tantas sentencias CATCH como excepciones
puedan ocurrir.
Aunque las excepciones responden a un árbol de excepciones no existe herencia entre ellas.
para trapear el error debe estar declarado explícitamente de lo contrario no se trapeara el
error y el programa hara un DUMP. En el caso de que el error se halla producido en una
función y el error no estuviera contemplado dentro de esta, el manejo de la excepción se
transporta un nivel para arriba, al llegar a nivel de programa si no se maneja producirá un
error de runtime.
El bloque CLEANUP se ejecutara siempre que se produzca una excepcion, cualquiera que
fuera esta (siempre y cuando este contemplada).

Sintaxis:

TRY.
...
CATCH <exception>.
...
CATCH <exception>.
...

CATCH <exception>.
...

ENDTRY.
39
• Todas las clases de excepciones heredan de la clase cx_root los mensajes

GET_TEXT -> nos trae el texto del error


GET_SOURCE_POSICION -> nos trae la posición en el programa donde ocurrió el
error

Para utilizar estos métodos es necesario instanciar un objeto de la clase cx_root.

DATA: r_exc type ref to cx_root,


resultado type string,
text type string.

Parameters: pa_int1 type i,


pa_int2 type i.

START-OF-SELECTION.

TRY.
resultado = pa_int1 / pa_int2.

CATCH cx_sy_zerodivide INTO r_exc.


text = r_exc->get_text( ).
MESSAGE text TYPE 'I'.
ENDTRY.

La sentencia MESSAGE <string> TYPE <type> nos permite mostrar cualquier cadena de
caracteres por pantalla como mensaje.

• Las excepciones del usuario se crean en el diccionario como una clase tipo EXCEPTION
CLASS, debe depender de alguna de las clases antes nombradas (no de cx_root).

Para utilizar una excepcion en un metodo es necesario declararlo en la firma del metodo con
la palabra clave RAISING <excepcion_name> para que este metodo puede tirar excepciones
para arriba. Es posible pasar parámetros a una excepción, se deben declarar el o los atributos
en la clase. Para que se puedan insertar en el texto explicativo del error el atributo debe esta
encerrado entre “&”. Es posible indicar mas de un texto explicativo y poder seleccionarlo en
tiempo de ejecución a través del atributo TEXTID, se le pasa el valor del respectivo texto en
el OTR (verlo en atributos del parámetro en la columna initial value).
RAISE EXCEPTION TYPE cx_sy_zerodivide.

RAISE EXCEPTION TYPE zcx_excepciones1


EXPORTING result = result
textid = 'C7F41423BAB4894592431FB66931E0C2'.

En la capa superior debera esta el codigo monitoriado por todos los exception que el metodo
puede tirar.

TRY.
PERFORM division.
CATCH zcx_excepciones1 INTO r_exc.
text = r_exc->get_text( ).
MESSAGE text TYPE 'I'.
CATCH cx_sy_zerodivide INTO r_exc.

40
text = r_exc->get_text( ).
MESSAGE text TYPE 'I'.
ENDTRY.

Las clases de excepciones nos proporcionan un texto explicativo del error y en que línea
ocurrió, La clase cx_root nos proveer de métodos para esto. Al cachear la excepción la
casteamos a un objeto de la clase cx_root y con le método get_text nos trae el texto de la
excepción.

DATA: r_exc TYPE REF TO cx_root.

TRY.
PERFORM division.
CATCH cx_sy_zerodivide INTO r_exc.
text = r_exc->get_text( ).
MESSAGE text TYPE 'I'.
ENDTRY.

Capitulo 14
Dynamic Programming

• Field-symbols -> Son una especie de punteros desreferenciados. Tienen la particularidad de


poder tomas cualquier tipo de dato (type ANY) o tomas un formato fijo.

Declaración
FIELD-SYMBOLS <fs> TYPE [<type>|ANY].
Asignación
ASSIGN <data> TO <fs>
Desasignación
UNASSIGN <fs>
Asignado?
<fs> IS ASSIGNED

Utilizando el addition CASTING es posible quitar las restricciones del objeto de datos
original.

… CASTING TYPE <type>

• ABAP nos permite ejecutar sentencias con parámetros ingresados dinámicamente, estos
parámetros deben ser cadenas de texto. En el caso de la sentencia SUBMIT este debe estar
entre paréntesis.

PARAMETERS: pa_txt(30) TYPE c OBLIGATORY.


CALL TRANSACTION pa_txt.
SUBMIT (pa_txt).
41
Es obligatorio que el parámetro debe estar en mayúscula.
Si el parámetro es una lista se puede pasar una tabla interna.

También es posible quitar dinámicamente funciones del PF-STATUS con el addition


EXCLUDING ‘FC1’… ‘FC2’. Sin tener que enumerar todas las function codes es posible
pasarle una tabla interna con estos códigos.

• Type-Pool -> grupo de types declarados a nivel diccionario

• Las llamadas a métodos también es posible realizarlas dinámicamente no solo el nombre del
método sino la tabla de parámetros y excepciones que este tiene.
Las estructuras abap_parmbind_tab y abap_excpbind_tab del type pool abap son utilizadas
para pasar estos datos

Type pool Abap.

DATA: ptab type abap_parmbind_ tab,


Etab type abap_excpbind_tab.

DATA: ref TYPE REF TO <class>,


Meth_name TYPE STRING.

Call method ref->(meth_name)


PARAMETER-TABLE ptab
EXCEPTION-TABLE etab.

Estructura abap_parmbind_tab
NAME -> nombre del parámetro formal
KIND -> tipo de parámetro (importing, exporting, changing, receiving)
VALUE -> valor de la referencia al data object que contiene el valor. Para
esto se utiliza la sentencia GET REFERENCE

Ejemplo como llenar la tabla de parámetros

ptab_line LIKE LINE OF ptab

ptab_line-name = 'P1'.
ptab_line-kind = CL_ABAP_OBJECTDESCR=>EXPORTING.
GET REFERENCE OF number INTO ptab_line-value.

Estructura abap_excpbind_tab
NAME -> nombre de la excepción
VALUE -> valor del sy-subrc ( type i)

CL_ABAP_OBJECTDESCR -> clase que contiene todos los tipos de datos de abap.

• Creación de objetos dinámicamente -> es posible crear dinámicamente un objeto pasándole


dinámicamente el tipo de clase al que pertenece. Debe estar en mayúscula.

clase = 'C1'.
CREATE OBJECT r TYPE (clase).

42
Excepcion CX_SY_CREATE_OBJECT_ERROR -> excepción cuando la clase no existe.

• Data reference -> Son variables que contienen referencias a variables, son punteros a datos.
Estos punteros pueden ser a datos elementales o estructuras específicos (TYPE REF TO
<type>) o a tipos de datos genérico (TYPE REF TO DATA).
El contenido de la variable de referencia contiene una dirección de memoria no como el
field-symbol que automáticamente se referencia al valor apuntado. Si se modifica el
contenido de la variable de referencia se modificara donde apunta esta (la dirección de
memoria).
Cuando se define una variable de referencia esta es inicializada con un puntero nulo.
Para asignarle una referencia a una variable de referencia primero es necesario crear el data
object y usar la sentencia GET REFERENCE OF <data_obj> INTO <data_ref>.

• CREATE DATA -> Crea una estructura o dato en forma dinámica, para esto es necesario
declarar un data object referencia al tipo de dato que queremos crear, en el caso de que no
queremos tipar la referencia se pone TYPE DATA.

DATA: dato1 TYPE REF TO data,


dato2 TYPE REF TO c.

Para crear el data object en tiempo de ejecución.

CREATE DATA dato1 TYPE i. (en el caso de que se


halla declarado la referencia como type data)
CREATE DATA dato2.

Para poder acceder al dato dentro de la variable de referencia se usa el operador “->*” que
significa “contenido” en el caso de que el contenido fuera una estructura se maneja igual que
una work area.

DATA: clase TYPE REF TO data,


clase2 TYPE REF TO data,
clase3 TYPE REF TO t_struc,

FIELD-SYMBOLS <fs> TYPE ANY.


FIELD-SYMBOLS <fs2> TYPE t_struc.

***** Caso de referencia tipada (estructura) *****


CREATE DATA clase3.
clase3->*-a = 5.
write clase3->*-a.

**** Caso de referencia y fs no tipada (no estrucutras)*****

CREATE DATA clase TYPE i.

GET REFERENCE OF wi INTO clase.


ASSIGN clase->* TO <fs>.
WRITE <fs>.
**** Caso de referencia no tipada y fs tipado (no estruc)*****

CREATE DATA clase2 TYPE t_struc.

ASSIGN clase2->* TO <FS2>.


43
O
get reference of clase2->* into <fs2>.

<FS2>-A = 45.
WRITE <FS2>-A.

Generalmente se utiliza un field-symbol tipados para poder acceder a las variables de


referencia no tipadas (estáticamente)

Un fields-symbol puede declararse sin referencia a un tipo de dato especifico.

Fields-symbol -> tipados -> Tablas


-> datos
-> Estructuras
-> No tipados -> ANY -> dato y estruc
-> ANY TABLE -> tabla

• La sentencia ASSIGN COMPONENT nos permite asignas componente por componente a


través de un índice a un field-symbol

ASSIGN COMPONENT idx OF STRUCTURE struc TO <fs>.

• DESCRIBE FIELDS DESCRIBE TABLE -> Se utiliza para saber la descripción de una
tabla interna o un campo.

DESCRIBE TABLE it_spfli


LINES no_lines -> cantidad de líneas
OCCURS initial_lines -> cantidad de líneas
cuando se creo la tabla
KIND table_kind. -> tipo de tabla
(TYPE-POOLS: SYDES.)
SYDES_KIND-STANDARD.
SYDES_KIND-SORTED.
SYDES_KIND-HASHED.

La sentencia IS INITIAL nos permite saber si la tabla esta vacía.

• El método describe_by_data de la clase cl_abap_structdescr nos permite ver la estructura de


una tabla.

DATA:
dsc_ref TYPE REF TO cl_abap_structdescr,
dsr_ref ?= cl_abap_structdescr=>
describe_by_data( wa ).

TAW12 1/3 ABAP workbench


Manual de referencia

Como crear una tabla

1. Entrar en la transacción Se11, poner el nombre de la tabla y presionar crear

44
2. completar el campo delivery class y el campo data browser.. y la descripcion de la tabla

3. En la solapa fields se ingresan los datos, los nombres de los campos y a que data element
pertenecen, es posible crear campos que no esten declarados en el diccionario, es mejor declararlos,
para esto en la columna data element del campo que queremos declarar escribimos el nombre del
data element y hacemos doble clik

45
4. nos llevara a la siguiente pantalla donde deberemos poner la descripcion y el dominio del data
element, para crear un dominio escribimos el nombre y hacemos doble clik sobre este

5. Nos llevara a la siguiente pantalla para crear un dominio completamos los campos técnicos y
guardamos los campos y activamos el dominio

46
6. guardamos el data element y lo activamos
7. guardamos la tabla
8. para activar la tabla es necesario setear el aspecto tecnico

Inclusión de estructuras en una tabla

1. abrir la tabla con la transacción se11

47
2. en la barra de herramientas EDIT -> INCLUDE -> INSERT
nos pedirá el nombre de la estructura

3. Se incluirá la estructura en la tabla, todo cambio en la estructura se actualizara


automáticamente la o las tablas.

Creación de índices
1. En la transacción se11
2. Ingresar a la tabla que queremos
3. Presionar el botón index
4. Lo llevara a la siguiente pantalla completar al pie los campos por los que quiero que la tabla
este indexada y completo la técnica de indexación.

48
5. Guardamos la tabla y la activamos para crear el índice.

Capitulo 2
Abap Dictionary

• El diccionario maneja todos los datos de SAP

• Type elements -> Domains -> Descripción técnica del elemento, consta
del tipo de dato, largo
- > Data elements - > Descripción semántica del dominio de
datos en un cierto entorno de negocios
- > Structures - > conjunto de data elements o estructuras
- > Tipos tablas - > conjunto de líneas de una estructura o
data element.

49
Db objects -> Tablas
-> Vistas
-> Índices

Servicios -> F1 y F4 - > documentación y búsqueda para un campo


-> Lockeos de registros
-> Log de una tabla -> se pueden guardar registro de modificaciones en la DB para esa
tabla o campo

• Db objects -> Para crear una tabla en la DB es necesario crearla primero en el diccionario y activar
la nueva tabla y ese cambio se crea automáticamente en la DB (físicamente).
Los índices también se crean en el diccionario como las tablas.

• Types elements -> describe la definición de los posibles tipos que puede tener un data element.

• Tablas -> componentes (campos) - > campos clave


- > campos no clave
-> filas (registros)

• Dominio -> Describe el atributo técnico del datos (tipo de dato, decimales, longitud, etc.).
Data element -> Describe la información semántica del dato (titulo, etc.).

Capitulo 3
Tables in ABAP dictionary

• Todas las tablas creadas por el usuario son tablas transparentes. Las tablas transparentes tienen el
mismo nombre en el diccionario que en la DB, igual que el nombre de los campos, el orden de los
campos pueden variar.

• Para crear una elemento en el diccionario de datos esta la transacción SE11, seleccionamos el tipo
de elemento queremos crear y presionamos CREATE

• Los campos que son de tipo de datos cantidad (QUAN) se debe crear otro campo con la descripción
de la unidad que representa esa unidad, y estos 2 campos deben relacionarse. La relación se realiza
sobre la tabla en la solapa de quantity sobre el campo que queremos relacionar escribimos la tabla y
el nombre del campo del otro. Se puede relacionar con este tipo de relación campos de distintas
tablas.

50
• Se puede crear estructuras independientes y estas incluirlas en una tabla, se realiza esto para
reutilizar conjunto de componentes que se repiten en varias tablas. Físicamente en la DB se crean
los campos en la tabla. Para agregar una estructura en una tabla, editamos la misma y en la barra de
herramientas EDIT -> INCLUDES - > INSERT

• Las tablas en el diccionario pertenecen a una clase,


Data Class -> master Data -> son tablas en las cuales los datos
cambian rara vez
-> Organizational data -> Tablas de customizing
- > Transaction data -> Tablas que cambian constantemente
- > System Data -> Tablas del sistema R/3

• Buffering -> Cuando se crea una tabla se debe ingresar el tamaño esperado de la tabla para que la
DB cuando llegue a su máximo de registros esperados, esta pueda asignarle mas espacio
dinámicamente.

• Looging -> Se puede logear los cambios en una tabla o campos de una tabla.
La variable de sistema REC/CLIENT activa en el sistema el logeo, si una tabla tiene log
pero en el sistema no esta activo no logea nada y al revés pasa lo mismo, si en el sistema esta
activo y la tabla no tiene log no logea.

Posibles valores
REC/CLIENT -> ALL -> logeo para todos los clientes
REC/CLIENT -> 000 -> logeo para el cliente especificado
REC/CLIENT -> OFF -> No hay logeo
• Para ver el log de una tabla se utiliza la transacción SCU3.

• Cuando se crea una tabla es necesario setear los atributos técnicos, botón
TECHINICAL SETTINGS y setear el data class, size category, buffering technique.

• Tabla de objetos del repositorio (codigo fuente de pgm ) -> REPOSRC

• El programa RSRSCAN1 nos permite buscar dentro de la tabla TRDIR coddigo fuente.

Capitulo 4
Performance during table access

• Un índice es una copia física de la tabla con menos o los mismos campos y ordenada por una clave

• Index -> Primario -> Es la tabla principal y esta ordenado por los campos
clave
-> Secundario -> Se crean desde el diccionario y se pueden elegir
cualquier cantidad de campo

• Las modificaciones en la tabla principal dispara actualizaciones en todos los índices que contiene el
campo modificado.

51
• La selección de índices la realiza la DB pero se puede ayudar a la DB en el campo WHERE indicar
los campos claves en el orden declarados en la tabla.

• Buffering -> Las técnicas de buffering consisten mantener las tablas que mas s usan cargadas en el
app server en el buffer local para evitar el acceso a la DB y son leídos de ahí para nuevas consultas.
Cuando el PGM intenta leer una tabla el app server verifica si esta en el buffer, si se encuentra le
devuelve los datos al programa, si no esta el en buffer accede a la DB. Los datos almacenados en el
buffer son removidos para dar lugar a otros, los datos a remover se seleccionan por la asiduidad con
la que se acceden. La sentencia $TAB ejecutada en la línea de comando actualiza todo el buffer del
app server.

Técnicas -> Full - > se lleva toda la tabla aunque leamos 1 registro
-> Genérica -> se lleva todos los registros por una clave
definida
-> Single -> se lleva solo los registros leídos, usar select
con el addition SINGLE sino se invalida la técnica de buffering.
Cuando se intenta acceder a un registro que no existe se marca como no
existente y cuando se intente acceder otra vez con la misma clave se evita el
acceso a la DB.

• La sincronización de buffer obliga a los distintos app server a sincronizar sus buffer si encuentra que
tiene tablas en su memoria que fueron modificados y están en una tabla de sincronización, la
sincronización se ejecuta cada cierto tiempo seteado por el sistema (rdisp/bufreftime entre 60s y
3600s).

• Cuando creas un índice a una tabla dependiente de mandante hay que agregar el mandante en el
índice OBLIGATORIAMENTE.

Capitulo 5
Consistency through input check

• Valores fijos -> Un dominio de datos puede tener valores fijos predefinidos en su declaración, estos
valores fijos actuaran como chequeos de datos en el momento del ingreso, también aporta la función
F4. Estos valores fijos son guardados en el dominio.

• Valores de tabla -> los valores de tabla nos permiten generar un rango de valores para un dominio,
estos valores deben estar en una tabla. Una tabla de valores se convierte en una check table en el
momento en que se declara una clave foránea.

• Para crear una clave foránea es necesario que los dominios de estos 2 campos sean iguales y no el
elemento de datos.

• Los campos de una tabla pueden estar relacionadas con otras tablas o un conjunto de valores fijos
determinados en el dominio del campos

• F4 -> tabla de posibles valores de ese campo, se declara en el dominio del campos como un rango
de valores fijos o una tabla maestra de datos

52
• Forign key -> relaciona los campos de una tabla con otra en el momento de realizar las inserción en
el campo. Nos asegura la consistencia de datos.

• Tablas de text -> las tablas de texto no realizan validaciones sino se usan para relacionar una tabla
maestra con una de texto, el ejemplo mas común es las tablas de texto de lenguaje.

• Para crear una tabla de valores para un dominio ir a la solapa VALUE RANGE dentro del dominio e
ingresar los valores, estos pueden ser valores simple, rangos de valores o tablas de valores

• Para ver en la tabla las claves foránea esta la solapa entry help/check y en la columna check estará la
tabla con la que el campo esta relacionado.

• Existen distintos tipos de claves foráneas


-> Not specified
-> No key fields/candidate -> La clave no identifica a un registro único en la tabla
-> Key fields / candidate -> Identifica un registro único en la tabla
-> Key fields of a text table -> Es una clave foránea con la diferencia que tiene el
campo lenguaje (caso especial de Key fields)

• La particularidad de las tablas de texto son que tienen la misma clave que la tabla original pero con
el agregado del campo del lenguaje (LANG). Estas tablas guardan generalmente descripciones que
se muestran en múltiples idiomas. Solo una tabla de texto se puede crear para una tabla.

Capitulo 6
Dependencies of ABAP dictionary objects

• El diccionario trabaja con 2 versiones del objeto diccionario una inactiva y otra activa que es la que
usa el sistema.

• Objetos dependientes -> objetos que dependen de otros por ejemplo un campo depende de un
elementos de dato y este a su vez de un dominio. Toda modificación en el diccionario afecta a todos
los objetos relacionados. Si una tabla contiene un campo al cual modificamos su largo o tipo al
activar el diccionario se modificara esta.

• Para buscar objetos en el diccionario de datos entrar a través del se80 y en la solapa REPOSITORY
INFORMATION SYSTEM y buscas la carpeta ABAP DICTIONARY.

Capitulo 7
Changes to Database tables

• Cuando realizamos cambios en el diccionario de datos estos se reflejan en la DB al momento de


activar la tabla. Existen 3 tipos de cambios en la base de datos por parte del diccionario

Tipos de cambios –> Delete -> borra la tabla y la vuelve a crear si la tabla no
tiene datos
-> Change -> Se altera la tabla, los datos se mantienen y los
índices se vuelven a crear
53
-> Convert -> cambia la estructura de los campos
La modalidad para realizar los cambios depende si la tabla tiene datos o no:

No tiene datos -> La tabla es borrada y vuelta a crear con la nueva


estructura
Tiene datos -> Se recorre la tabla tratando de ajustar los datos al
nuevo formato de la nueva tabla (ALTER TABLE).

• Al realizar cambios en la DB la interfase:


1. lockea la tabla
2. borra los índices
3. la renombra con el nombre QCM<tableName>
4. crea una nueva tabla con la nueva estructura sin datos (vacía) y crea en índice
primario
5. hace un move-corresponding de la tabla QCM a la nueva tabla, al realizar la
copia tener en cuenta que las tablas se duplican
6. deslockea la tabla QCM
7. borra la tabla QCM
8. renombra la tabla al nombre original
9. crea los índices secundarios

• En caso de error en la conversión se debe arreglar el problema y se puede re-arrancar la conversión,


en el caso de que no se pueda continuar se puede cancelar la operación y volver la tabla al estado
original.

• Append -> Se usa para agregar estructuras a una tabla sin modificar el standart de SAP, las
estructuras append o se pueden agregar en mas de una tabla. Parados en la tabla barra de
herramientas GOTO -> APPEND STRUCTURE y ahí creo la estructura normalmente, se puede
asignarle claves foráneas en la estructura y también uno de los campos de la estructura pueden
formar parte de la clave de la tabla.

• Restricciones para estructuras APPEND

 No se puede agregar estructuras append a tablas del tipo cluster o pool


 No es posible agregar estructuras append en tablas o estructuras que tengan como
ultimo campo elementos de datos del tipo LRAW o LCHR

Capitulo 8
Views

• Es una estructura que combina campo de distintas tablas, las tablas se relacionan a través de un
INNER JOIN por sus claves foráneas.

• Se crea en el diccionario y se activan pero se genera solamente la estructura ya que se llena en


tiempo de ejecución.

54
• En la declaración de la vista se definen los campos que deseo que aparezcan en la tabla así también
como los registros que cumplen una condición especifica (selección de opción), esta condición no
puede ser establecida para campos enteros.

• Las vistas se utilizan igual como si fuera una única tabla transparente.

• En reemplazo de una vista se puede utilizar la sentencia select JOIN y simular una vista local al
programa.

• Para crear una vista transacción SE11 en el campo views, create.


Vamos agregando las tablas que quiero relacionar y el sistema por la estructura de las claves
primarias va armando el join en el caso de que no nos sirva la relación que nos propone el sistema se
puede cambiar

• Se pueden incluir todos los campos de una tabla y también agregar estructuras. Las vistas permiten
las mismas propiedades técnicas (Buffer) que una tabla normal.

• Existen también vistas de mantenimiento en donde se puede crear una ABM de la vista y la DB se
encarga de la lógica de inserción en la tabla. Solo se pueden crear vistas de mantenimientos a vistas
que contienen una tabla únicamente. La transacción SE13 nos permite modificar los seteos técnicos
de las vistas

• Las vistas de mantenimiento son un tipo de vista que se crea para mantener las vistas, nos permite
realizar altas bajas y modificaciones en la tabla original. Estas modificaciones se puede hacer solo
en vistas de una sola tabla.

• Cuando se genera una vista de mantenimiento es necesario generar la pantalla de dialogo para poder
hacer el mantenimiento. Para generar el dialogo en necesario ir a GOTO -> GENERATE
MANTENANCE TABLE y completar los campos que nos piden.

• Append Includes -> Son estructuras formadas por campos de las tablas que componen la vista y que
nos permiten agregar estos a la vista sin modificarla. Cuando se especifican los campos de una tabla
en una vista se puede poner en el nombre del campo “*” que indica que todos los campos de esa
tabla serán incluidos. En el caso de enumerar los campos de una tabla el agregado de campos en la
tabla original no se tomaran en cuenta, las append includes nos permite realizar esta ampliación a la
vista sin tener que modificarla.

Capitulo 9
Search help

• En search help es una ayuda de búsqueda para el usuario, existen varios tipo de search help standart
de SAP como las tablas de valores o los rangos de valores especificados en el data element.

55
• Estos search help se pueden configurar acotando búsquedas en el search help desde en diccionario
esto se llama método de selección

• Método de selección -> realiza la búsqueda en una tabla según los parámetros de selección que
asignemos. Al método es necesario pasarle una tabla o una vista para la búsqueda, el sistema tiene
la restricción de una sola tabla.

• Todo search help tiene una interfaz que le permite al usuario ingresar parámetros de búsqueda y
devolución.

Search help -> parámetros - > Import -> parámetros con los que se
hará la selección
-> Export -> parámetros que se traerán de la
ayuda y se completaran en la
pantalla de selección

• Definición de search help -> Tabla/estructura -> se mostrara en todas las


pantallas donde este
campo este declarado
-> Check Table -> todos los campos que de
la pantalla que tengan este check table contendrán esta
búsqueda.
- > Data element -> los campos que estén
declarados como ese data element
-> Campo de una pantalla -> se define con
el screen painter y solo es para esa pantalla

• Si un campo de una pantalla tiene 2 o mas search help cuando presionamos F4 no se sabe cual usar,
entonces se creo una jerarquía de search help (Pag 9-11 – ver jerarquía).

• Las funciones F4IF_FIELD_VALUE_REQUEST nos permite buscar o modificar el search help de un


campo de una tabla. Estas funciones nos permiten retornar los campos del search help. En una tabla.

* ----- Data definition -----


DATA: pe_tabname1 LIKE dd03v-tabname,
pe_fieldname1 LIKE dd03v-fieldname.
DATA: return_tab LIKE ddshretval OCCURS 0 WITH HEADER LINE.

CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'


EXPORTING
tabname = pe_tabname1
fieldname = pe_fieldname1
TABLES
return_tab = return_tab
EXCEPTIONS
field_not_found = 1
no_help_for_field = 2
inconsistent_help = 3
no_values_found = 4
OTHERS = 5.

• Un search help colectivo es un conjunto de search help elementales, se van agregando y se pueden
tener muchas búsquedas para el mismo campo. Deben tener la misma interfaz para poder reutilizar
la misma búsqueda.
56
• Un search help elemental puede estar en más de un search help colectivo, un search help colectivo
puede estar incluido en otro search help colectivo.

• Para atachar un search help a una tabla ir a EXTRAS -> SEARCH HELP FOR TABLES, ingresar
el nombre del search help que creamos y relacionar los campos de input del search help con los de
la tabla o pantalla.

• Si tenemos una check table en un campo de una tabla y queremos que en este crear un search help
hay que hacerlo en la tabla check.

• Para borrar un search help elemental en uno colectivo y el search help colectivo es standard de SAP
y no podemos modificarlo hay que crear una estructura APPEND de search help y agregar el search
help que queremos eliminar y lo marcamos como HIDE de esta manera en el search help colectivo
no aparece. (forma de modificar el standard sin modificarlo)

Capitulo 13
Reporting

• Las pantallas de reportes simples constan de 2 headers, que son la descripción del programa
mas una línea que lo separa del listado, estos 2 líneas se mantiene en la cabecera del listado
cuando scroleamos el mismo.

• REPORT -> Programa ejecutable que nos permite realizar listados básicos por pantalla, tiene
muchas addtion que nos permite configurar el formato del reporte.

-> NO STANDARD PAGE HEADING -> quita la cabecera del


reporte, viene asociado con el evento TOP-OF-PAGE
para poner un encabezado propio.
->NEW PAGE LINE-SIZE y LINE-COUNT -> son para
especificar la cantidad de filas y columnas que tiene mi
reporte.
Default LINE-SIZE = 83
LINE-COUNT = 60000
.
• WRITE -> Sentencia que nos permite armar listados simples, nos permite formatear el
campo que queremos por pantalla. Los listados básicos se desarrollan en el evento START-
OF-SELECTION, todo write dentro de este evento se mostrara como listado, en otro evento
NO.

• Formato de la sentencia WRITE -> la sentencia write nos permite formatear la salida de los
datos en el listado. También es posible dibujar iconos en la pantalla, líneas, etc,

• Un listado básico se compone de un encabezado que contiene el nombre del programa, Este
encabezado se puede cambiar desde el editor, tiene como máximo 4 renglones.

• La sentencia SET LEFT SCROLL-BOUNDARY nos permite mantener fijas columnas en un listado
básico al momento de desplazarse lateralmente en un listado.

57
• Elementos de texto -> los elementos de texto nos permite imprimir un texto en distintos
idiomas.
Se imprimen de la siguiente manera
WRITE TEXT-xxx -> busca el elemento de texto
y lo imprime en la pantalla, si no lo encuentra imprime
blanco
‘LITERAL’(xxx) -> busca el elemento de text xxx
y lo imprime en la pantalla, si no lo encuentra imprime
el literal que lo acompaña.

• Variables de sistema para la impresión de reporte simples.

SY-LINCT -> cantidad de líneas


SY-LINSZ -> largo de la línea
SY-SROWS -> cantidad de filas en pantalla
SY-SCOLS -> cantidad de columnas en pantalla
SY-PAGNO -> numero de pagina
SY-LINNO -> numero de línea seleccionada
SY-COLNO -> numero de columna seleccionada

• La sentencia ON CHANGE OF <field> … ENDON dentro de un loop nos permite realizar


un corte de control por todos losel campo especificado, la sentencia dentro solo se ejecutara
cuando el campo especificado cambie de valor.

Capitulo 14
Selection Screen

• Una pantalla de selección es una interfaz entre el usuario y el programa, existen 3 tipos de
pantallas
Pantallas de selección de una DB lógica
Pantalla de selección standard de SAP (screen 1000)
Creadas por el usuario
SELECTION-SCREEN BEGIN OF SCREEN 1100.
...
SELECTION-SCREEN END OF SCREEN 1100.

Se ejecuta así
CALL SELECTION-SCREEN 1100

Cuando se ejecuta esta sentencia la pantalla de selección se muestra en toda la pantalla. Para
mostrar una pantalla en forma de ventanita se agrega los addition que indican en donde
arranca la pantalla y donde termina (coordenadas). Antes de mostrar la pantalla se ejecuta el
evento INITIALIZATION donde se puede discriminar el número de pantalla que se mostrara
con la variable de sistema SY-DYNNR.

CALL SELECTION-SCREEN 1100 STARTING AT 10 5


ENDING AT 80 10.

• Parámetros en un pantalla de selección

Parameters

58
Normal -> MEMORY ID -> al asignarle un valor
SAP nos trae de la memoria el valor del parameter id
-> VALUE CHECK -> nos permite que el
diccionario valide los datos ingresados
-> OBLIGATORY -> nos obliga a ingresar
valores
-> As checkbox -> tilde (‘ ’ o ‘X’)
-> RadioButton Group <grp> -> son excluyentes

Select-option

-> Tabla interna que define el sistema con los campos.

SIGN OPTION LOW HIGH


[I/E] [EQ|BT|…] <valor> <valor>

en esta .tabla interna se guardaran los parámetros de selección

• Se puede poner mas de un parámetro en una línea, debe estar el en bloque. La particularidad
de esta sentencia es que los labels de los objetos de pantalla se pueden, es necesario
ingresarlos a mano con la sentencia SELECTION-SCREEN COMMENT.
SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 1(5) text-002 FOR FIELD pa_tipo.

PARAMETERS: pa_tipo TYPE zpersonal-tipo VALUE CHECK.


SELECTION-SCREEN COMMENT 10(5) text-003 FOR FIELD pa_sueld.
PARAMETERS: pa_sueld TYPE zsueldos-sueldo VALUE CHECK.

SELECTION-SCREEN END OF LINE.

• Las sentencias AT SELECTION-SCREEN ON HELP-REQUEST FOR <f> y AT SELECTION-SCREEN ON


VALUE-REQUEST FOR <f> son para capturar el F1 y F4 respectivamente en un campo
especifico.

• La sentencia SELECTION-SCREEN BEGIN OF SCREEN nos permite crear una selection screen
aparte de la que nos da SAP para ingresar datos extras. Se pueden crear select options y
parameters, se invoca con la sentencia CALL SELECTION-SCREEN xxx

SELECTION-SCREEN BEGIN OF SCREEN 1100.

PARAMETERS: pa_acc1 RADIOBUTTON GROUP acc,


pa_acc2 RADIOBUTTON GROUP acc,
pa_acc3 RADIOBUTTON GROUP acc.

SELECTION-SCREEN END OF SCREEN 1100.

La variable de sistemas sy-dynnr nos muestra en que numero de dympro nos


encontramos

• El evento AT SELECTION-SCREEN OUTPUT se ejecuta cada ves que se carga una pantalla
o el usuario presiona enter. Se ejecuta justo antes de mostrar la pantalla de selección.

59
La sentencia LOOP AT SCREEN nos permite modificar los atributos de los
elementos en la pantalla en forma dinámica. La sentencia MODIFY SCREEN aplica
los cambios realizados en los objetos de la pantalla.

AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
SCREEN-INTENSIFIED = '1'.
MODIFY SCREEN.
ENDLOOP.

• Las sentencias AT SELECTION-SCREEN ON HELP-REQUEST y AT SELECTION-SCREEN ON


VALUE-REQUEST nos permite programar su propio F1 y F4 respectivamente.

• Variantes -> Una variante nos permite guardar el contenido de los campos de una
pantalla, tiene sentido esto cuando en una pantalla generalmente se completan los
campos con la misma información. Las variantes son únicas y se almacenan en cada
programa y no pueden ser compartidas con otros. Se pueden crear más de una
variante para cada pantalla, y variantes globales a todas las pantallas del programa.
Las variantes no solo se usan para completar pantallas de programas interactivos se
utiliza para procesamiento batch.

• La tabla TVARV contiene la estructura de un select option, nos permite armar esta
tabla con el criterio de selección. Así facilitar la búsqueda en la DB.

Capitulo 15
Logical Database.

• Las DB lógicas son programas ya armados que acceden la DB y tener disponible la


información. Tienen la ventaja de que los chequeos de autorización ya fueron realizados
dentro de la DB lógica. El programa que tiene la logica de las db se llaman
SAPDB<ldbname>.

• La sentencia GET tiene disponible los campos que tiene la DB lógica de acuerdo a la
secuencia de las claves primarias de las tablas de la DB. Incorpora chequeos de seguridad
cuando se realiza el acceso.

• Se declara la Db lógica que va a usar el programa de reporte en los atributos del programa,
en la parte de declaración se declaran los nodos de la DB lógica que se van a usar, cuando
queremos leer datos un nodo usamos la sentencia GET <node_name>. Es posible declarar
una db lógica dinámicamente en un programa con la función LDB_PROCESS.

• La sentencia GET <node_name> es igual a la sentencia SELECT * en un acceso normal,


para seleccionar campos en particular se usa el addition FIELDS <f1> … <fn>

• La sentencia GET es parecida a un SELECT…ENDSELECT pero en una DB lógica, es


cíclico y cuando anidas GETs se debe hacerlo en el orden de anidamiento de la DB lógica.
La sentencia GET no tiene sentencia de cierre, tener enguanta en el caso de poner sentencias
abajo que no pertenezcan a la iteración.

• Nodos (Nombre de hasta 14 caract)

60
-> Table (Type T) -> Nombre de la tabla transparente
-> DDIC (Type S) -> El nodo es una estructura del DIC
-> Groups (Type C) -> El nodo esta definido en un type group
-> Dinamic -> El nodo no tiene estructura fija

• Cortes de flujo de programa


CHECK <log_exp> -> finaliza el bloque de procesamiento actual y sigue con el
siguiente valor
STOP -> finaliza el bloque de procesamiento actual y ejecuta la sentencia END-OF-
SELECTION si este existe. Si se ejecuta dentro del END-OF-SELECTION se
termina el programa y se muestra cualquier listado básico que se haya generado.
EXIT -> finaliza el programa y se muestra cualquier listado básico que se haya
generado.
REJECT

Capitulo 16
Data Retrieval

• Se puede ejecutar sentencias de SQL nativo, debe estar encerrado dentro de las sentencias
EXEC SQL... ENDEXEC.

DATA: f1(25), f2(25), f3(25).


f3 = '28.077.789'.
TRY.
EXEC SQL PERFORMING WRITE.
SELECT NOMBRE, APELLIDO INTO :F1, :F2
FROM ZPERSONAL
WHERE DNI = :f3
ENDEXEC.
CATCH cx_sy_native_sql_error.
ENDTRY.

FORM WRITE.
IF f1 > 0.
WRITE: / f1, f2.
Else.
EXIT FROM SQL.
Endif.
ENDFORM. "WRITE:

Las sentencias SQL nativo responden a la DB en la que se este ejecutando, no todas tienen la
misma sintaxis, El nombre de los campos y tabla van en mayúscula. Los datos de la a la
función y de la función se pasan por variables de tipo host y van precedidas dentro de la
sentencia con dos puntos (:).
Cuando la sentencia de error levanta la excepción cx_sy_native_sql_error. Se pueden ejecutar
todas las sentencias SQL estándar mas las especificas que nos provea la DB.
En el caso de que la selección de un conjunto de líneas como respuesta se utiliza el addition
PERFORMING <form_name>. El sistema ejecuta una iteración por cada línea traída ejecutando
la función. Para cortar la iteración se usa la sentencia EXIT FROM SQL función.
• Funciones de agregado a sentencias OPEN SQL
select count(*) from zpersonal into count.
select min( sueldo ) from zper_suel into count.

61
select max( sueldo ) from zper_suel into count.
select avg( sueldo ) from zper_suel into count.

• Distintas maneras de recuperar datos de una DB

-> DataBase View


-> Inner y Outer JOIN -> vinculas tablas transparentes
-> For all entries -> vinculación entre tablas transparentes y tablas internas
-> sentencias SQL anidadas

• DataBase View -> una vista es un join de 2 o mas tablas con una estructura particular que se
crea en el diccionario y se puede usar como una tabla transparente, el JOIN se resuelve en
tiempo de ejecución y no ocupa espacio en la DB. Una vista realiza in INNER JOIN para
armar la estructura. La sentencia select para una vista es igual a la de una tabla, es
transparente para abap que tipo de tabla maneja.

• JOIN -> Nos permite relacionar 2 o mas tablas por el contenido de un campo.

SELECT nombre apellido


INTO CORRESPONDING FIELDS OF TABLE it_per
FROM zpersonal AS a INNER JOIN zsueldos AS b
ON a~dni = b~dni.

• FOR ALL ENTRIES IN… WHERE… -> Busca en una tabla por cada entrada de la otra
tabla sin importar que sean tablas internas o transparentes.
IMPORTANTE: chequear que la tabla por la que queremos buscar tenga registros y
Eliminar los registros duplicados.

SELECT * FROM sflight INTO wa_sflight


FOR ALL ENTRIES IN ftab
WHERE CARRID = ftab-carrid AND
CONNID = ftab-connid AND
fldate = '20010228'.
ENDSELECT.

Para saber cuantas entradas tiene una tabla, nos devuelve la cantidad de entradas.
DESCRIBE TABLE <itab> LINES <contador>
Para borrar registros duplicados
DELETE ADJACENT DUPLICATES FROM <itab>
• Sentencias SELECT anidadas

DATA: wa_per TYPE zpersonal,


wa_suel TYPE zsueldos.

TRY.
SELECT * FROM zpersonal
INTO CORRESPONDING FIELDS OF wa_per.
SELECT * FROM zsueldos
INTO CORRESPONDING FIELDS OF wa_suel
WHERE dni = wa_per-dni.
WRITE : / wa_per-nombre,
wa_per-apellido,
wa_suel-sueldo.
ENDSELECT.
ENDSELECT.
CATCH cx_sy_open_sql_db.
ENDTRY.

62
Capitulo 17
Data formatting and control level processing

• La sentencia APPEND inserta registros al final de una tabla, la variable de sistema SY-
TABIX guarda la posición en la tabla donde se realizo la inserción. No se puede realizar esta
operación en tablas del tipo HASHED.

• La sentencia COLLECT ( pag 268 L.1) se utilice para crear una única tabla de registros,
estos registros tienen la particularidad que están compuestos por la clave y el resto de los
campos deben ser numéricos. Cuando se inserta un registro se busca en la tabla, si esta los
campos no clave (numéricos) se suma y si el registro no esta este se agrega a la tabla interna.

• SORT -> Ordena una tabla por los campos que necesitamos ascendentes o descendentes, con
el addition BY <f1>…<f2> se especifican los campos que queremos (para tablas Standard o
hashed). No es posible cambiar el ordenamiento de una tabla SORTED.

• AT... ENDAT -> FIRST -> Primer registro de la tabla


-> NEW <field> ->
-> END OF <field> ->
-> LAST ->

Estas sentencias no permiten realizar cortes de control para realizar listados básicos.

FIRST y LAST -> Se ejecuta una sola vez en el corte de control nos permite mostrar un
titulo o pie de pagina.

NEW y END OF -> con esta sentencia realizamos el corte de control pos los campo. La
iteración se realiza por una “estructura” que empieza el campo de mas izquierda hasta el
campo que ponemos en la sentencia. Si los campos de la tabla que queremos iterar no tiene
el orden que necesitamos es conveniente crear una estructura con los mismos campos y el
orden que necesitamos.
Por lo general se ordena la estructura por los campos que queremos iterar.
Los campos que están fuera de las sentencias de corte de control se mostraran como una
iteración normal.
La sentencia SUM totaliza todos los campos numericos dentro del bloque.

TYPES: BEGIN OF s,
cityfrom TYPE s_from_cit,
cityto TYPE s_to_city,

mandt TYPE s_mandt,


carrid TYPE s_carr_id,
...
END OF s.

DATA: it_spfli TYPE TABLE OF s,


wa_spfli TYPE s.

SELECT * FROM spfli


INTO CORRESPONDING FIELDS OF TABLE it_spfli.

63
SORT it_spfli BY cityfrom cityto.

LOOP AT it_spfli INTO wa_spfli.


AT FIRST. WRITE: / 'TITULO DEL LISTADO'. ULINE. ENDAT.

AT NEW cityfrom.
WRITE: / 'Aeropuerto de salida', wa_spfli-cityfrom.
ENDAT.

AT NEW cityto.
WRITE: / 'Aeropuerto de llegada', wa_spfli-cityto.
ENDAT.

WRITE : / wa_spfli-carrid, wa_spfli-connid.

AT END OF cityfrom.
ULINE.
ENDAT.

AT END OF cityto.
ULINE.
ENDAT.

ENDLOOP.
• Extract dataset -> Consiste en una secuencia de registros de una estructura predefinida, sin
embargo esta estructura no es igual para todos los registros. En un extract dataset se pueden
guardar registros de distinto largo. Es necesario definir la estructura de cada dataset en el
programa, esta puede ser definida dinámicamente. A diferencia de una tabla interna esta se
almacena temporalmente en el sistema operativo en ves de la memoria.
La única manera de acceder a los datos es recorrer el dataset con la sentencia LOOP…
ENDLOOP.
Es posible ordenar el dataset por un campo o por el header.

Definición
FIELD-GROUPS: header, order, product, date_first.

-> define cada grupo en el dataset.

FIELD-GROUPS: header.

-> define un grupo especial el cual compartirá cada uno de los dataset

INSERT onr date position INTO header.


INSERT customer INTO order.
INSERT pnr name units INTO product.
INSERT date onr position INTO date_first.

-> Define los campos que pertenecen al grupo.

ONR = 'MM00034'. DATE = '19920401'.


POSITION = '000'. CUSTOMER = 'Moneymaker'.
EXTRACT ORDER.
ADD 1 TO POSITION.
PNR = '23456'. NAME = 'Nail'. UNITS = 300.
EXTRACT PRODUCT.

-> crea el dataset con los datos

Nos permite recorrer el dataset según el grupo y acceder a los campos


64
LOOP.
AT order.
WRITE: /, / date, onr,
position, customer, 'ordered:'.
ENDAT.
AT product.
WRITE: / date, onr, position,
pnr, name, units.
ENDAT.

ENDLOOP.

Capitulo 18
Saving list and background processing

• Se puede en vez de salir por la pantalla un listado a salir por la impresora.

Activar -> NEW-PAGE PRINT ON...


Desactivar -> NEW-PAGE PRINT OFF
NEW-PAGE PRINT ON PARAMETERS print-parameters NO DIALOG.

La variable de sistema sy-spono contiene el ID del archive de spool.

• Función para obtener los parámetros de la impresora del sistema

DATA: print-parameters LIKE pri_params.

CALL FUNCTION 'GET_PRINT_PARAMETERS'


EXPORTING
no_dialog = 'X'
immediately =''
IMPORTING
out_parameters = print-parameters
EXCEPTIONS
archive_info_not_found = 1
invalid_print_params = 2
invalid_archive_params = 3
OTHERS = 4.

• SUBMIT -> llamada de un programa hacia otro, se puede llamar un programa que tiene una
salida y con la cláusula TO SAP-SPOOL y envía esta salida al spool.

• JOB -> conjunto de pasos, cada paso es un programa. Se puede crear un job dinámicamente
en un programa las funciones son ‘JOB_OPEN’, ‘JOB_SUBMIT’ y ‘JOB_CLOSE’

Capitulo 19
Interactive list

• Eventos de Basic list ->

65
START-OF-SELECTION
GET
END-OF-SELECTION
TOP-OF-PAGE
END-OF-PAGE

• Eventos de Detail list ->

AT LINE-SELECTION
AT USER-COMMAND
TOP-OF-PAGE DURING AT LINE-SELECTION

• Las listas de detalle pueden tener un nivel de hasta 20 listas de detalle. El nivel de detalle se
guarda en una variable sy-lsind.
Las listas de detalle solo se crean cuando se realice un write en el programa.

• Toda actividad en la pantalla (doble-click, F2 sobre una linea, un boton en la pantalla, etc)
ejecuta el evento AT LINE-SELECTION con el codigo de accion PICK contenido en la
variable de sistema SY-UCOMM.

• SET TITLEBAR -> nos permite poner un titulo a nuestro listado. Se le puede pasar
parámetros con el addition WITH…
Este titulo no puede tener más de 70 caracteres con los parámetros.

• TOP-OF-PAGE DURING LINE-SELECTION -> no permite poner encabezados en los


niveles de listados.

• GET CURSOR FIELDS -> nos trae el valor y el campo en donde se realizo la selección de
una línea.

• WINDOWS -> Esta sentencia funciona solamente en el evento AT LINE-SELECTION, nos


permite crear una ventana con el listado básico.
WINDOW STARTING AT 10 30
ENDING AT 60 30.

WRITE...
Capitulo 20
SAP Grid Control

• Un control es un objeto que se muestra en el frontend desde el frontend. Estos objetos deben
estar instalados en la maquina del usuario y el encargado de administrarlos es el SAP_GUI.

• Todo control se debe mostrar dentro de un contenedor y como un contenedor es un control


denota que estos pueden anidarse. El control que contiene a un control se transforma en el
padre el mismo.

• Para mostrar datos en un gris control se deben pasar los datos en forma de una tabla, además
de la tabla con los datos, se debe pasar una estructura igual a la tabla de datos que
proporcionara el orden de los campos en la grilla. Generalmente esta tabla esta activa en el
66
diccionario lo que proporcionara datos técnicos de los campo. En el caso de que se usara una
estructura interna del programa se debe especificar estos datos a través una estructura de
catalogo. Se pueden mezclar tablas del diccionario con campos internos del programa.

• Luego de crear el objeto contenedor y asignarle un objeto grilla se deben mostrar los datos.
El objeto grilla dispone del método SET_TABLE_FOR_FIRST_DISPLAY que crear las
grilla en la pantalla y la llena de datos.

• Para agregar campos a una grilla que no estén en la estructura se utiliza el catalogo, Aquí se
especifican los campos que serán agregados con sus respectivas especificaciones técnicas.
Cada línea del catalogo responde a una columna en la grilla.
El catalogo es una tabla del tipo LVC_T_FCAT a la cual se le agregaran registros que serán
mostrados en la grilla. Esta tabla será pasada por parámetro al método
SET_TABLE_FOR_FIRST_DISPLAY (parámetro it_fieldcatalog)

clear wa_fieldcat.
wa_fieldcat-fieldname = 'SUELDO'.
wa_fieldcat-col_pos = 10.
wa_fieldcat-coltext = 'SUELDO'.
APPEND wa_fieldcat TO gt_fieldcat.

CALL METHOD sap_grid->set_table_for_first_display


EXPORTING
i_structure_name = 'ZPERSONAL'
CHANGING
it_outtab = it_personal
it_fieldcatalog = gt_fieldcat

1. Instanciar ALV, declaraciones


DATA : GRID type ref to cl_gui_alv_grid,
CONTAINER TYPE REF TO cl_gui_custom_container,
IT_FLIGHT TYPE TABLE OF SFLIFGHT.

2. Crear pantalla y marcar area para el contenedor (en el programa CALL


SCREEN 100 )
En el screen painter crear pantalla TYPE: NORMAL, poner el cursor en una
línea de la pantalla y luego
EDIT ->CREATE ELEMENT->CUSTOM CONTROL.

Cerrar el area con doble clic, colocar el nombre el contenedor


'MY_CONTAINER'.
En la lista de elementos, colocar OK_CODE.

3. En PBO, instanciar la grilla y el contenedor:


If CONTAINER is INITIAL
create object container
exporting CONTAINER_NAME =3D 'MY_CONTAINER'
create object grid
exporting I_PARENT =3D container
endif

4. Cuando se llena la tabla interna con datos, se pas a la grilla :

CALL METHOD grid->set_table_for_first_display


exporting
67
I_STRUCTURE_NAME = 'SFLIGHT'
changing
IT_OUTTAB =3D it_sflight

TAW12 2/3 ABAP workbench


Manual de referencia

Capitulo 2
SAP Programing Model

• Tipos de programas -> Ejecutables (Type 1) -> Se ejecutan


Directamente desde el editor de ABAP, tienen una pantalla de
selección, normalmente crea y muestra un listado básico
-> Module Pool (Type M) -> Solo se puede ejecutar
a través de una transacción. Se debe especificar una pantalla
de inicio y luego se puede controlar la secuencia en el pgm.
-> Programas de modularizacion -> son programas
que nos permiten modularizar programas

• Organización de código -> Para organizar el código de un programa se utilizan los programas de
tipo INCLUDE. La separación de código en bloques no afecta el funcionamiento del programa.
En momento de compilar los programas internamente agrupa todo.

• Al crear el programa se crean varios INCLUDEs para separar en bloques el código que va en la
pantalla, la declaración de variables y eventos.

Capitulo 3
Introduction to screen programming

• La lógica de una screen esta separada en 2 bloques de procesamiento PBO (Process Before
Output) y PAI (Process After Input).

68
• Una screen es un contenedor de elementos de pantalla y un flujo de lógica de programa. Una
screen tiene 4 componentes
-> Screen mask
-> Screen attributes
-> Element list
-> Flujo de lógica de programa
• Es aconsejable crear la screen desde el object navigator ya que esta debe estar asociada a un
programa.
Primero -> Completar los atributos del programa
Descripción de la pantalla
Tipo de pantalla
Pantalla Siguiente
Segundo -> Crear el Layout de la pantalla en el screen
painter
Incorporar los elementos de pantalla a la
screen.
Tercero -> En la lista de elementos estarán los elementos de
ingresados en la pantalla, es necesario crear el
elemento OK_CODE el cual nos permitirá
comunicar el programa con la pantalla.
-> Debemos crear en el programa la variable
OK_CODE del tipo SY-UCOMM.
Cuarto -> Crear los módulos en el PBO y PAI

• Las pantallas se nombran con números, los números mayores a 9000 están reservadas para
SAP, las pantallas 1000 a 1010 están reservadas para las pantallas de mantenimiento del
diccionario ABAP.

• La secuencia de pantallas se puede establecer extáticamente en los atributos de la pantalla


(atributo NEXT SCREEN ) o dinámicamente por código, la sentencia SET SCREEN
<num_scr> nos permite establecer la siguiente pantalla en el ciclo lógico del programa. Si el
numero de pantalla ingresado es 0 el sistema continua procesando desde el punto de donde
se llamo la pantalla cuando esta se haya terminado de procesar.

• Los campos de una pantalla pueden venir del diccionario (recomendado) o de datos creados
internamente en el programa, los campos adoptaran la forma y tipo de los datos de origen. Al
cambiar el tipo de dato de un data object se modificara automáticamente el campo, se
recomienda crear los campos a partir de elementos del diccionario para mantener coherencia
de los datos, los cambio de tipos de datos el diccionario modificaran a todos los programas y
pantallas que los utilizan.

• La variable de sistemas SY-DYNNR contiene el numero de screen en la que el programa se


encuentra, se usa por si en proceso que estamos haciendo depende de la screen el la que se
encuentra.

• Para conectar un programa con una pantalla se utilizan estructuras y data object, estos deben
estar definidos como tipos de datos del diccionario y tener el mismo nombre en los 2 lados

• La sentencia TABLES en el programa abap se usa (no únicamente) para declarar una
estructura para interfacear los datos entre el programa y la screen
69
• Todos los atributos de elementos de una screen pueden ser modificados en momento de
ejecución, el la lógica de la screen se tiene acceso a la tabla interna SCREEN (line type
screen) donde se encuentran todos los elementos y sus atributos. Estas modificaciones son
temporales y corresponden a la corrida del programa, los atributos de los objetos de la
pantalla vuelven a la normalidad cuando la ejecución del programa termina.

• Los elementos de una pantalla se pueden agregar a un grupo para poder realizar
modificaciones masivas. Solo se pueden armar 4 grupos de elementos de pantalla

• A los elementos se los pueden acceder por su nombre o por el grupo a cual pertenecen (ver
página 3-21 estructura de la tabla). Se realiza un loop a la tabla de la siguiente manera

LOOP AT SCREEN.
IF SCREEN-NAME = ‘CAMPO1’.
SCREEN-ACTIVE = 0.
MODIFY SCREEN.
ENDIF
IF SCREEN-GROUP1 = ‘AAA’.
SCREEN-ACTIVE = 0.
MODIFY SCREEN.
ENDIF
ENDLOOP.

Estas modificaciones dinámicas generalmente se hacen en el modulo PBO de la pantalla


antes de mostrar los elementos. Esta sentencia es particular del lenguaje del screen painter,
no es una sentencia de ABAP.
Al termino de cada modificación que se realice en una línea de la tabla SCREEN se debe
ejecutar la sentencia MODIFY SCREEN ya que sino se perderán los cambios en el objeto.

• Sentencias de cambio de pantalla

SET SCREEN <scr_num> -> nos permite modificar el


flujo de pantallas modificando el atributo next screen de la
misma, se ejecutara cuando se termine de procesar el PBO, la
pantalla debe pertenecer al mismo grupo de programas

LEAVE SCREEN -> Termina el procesamiento de la


pantalla actual y pasa a la pantalla especificada por el atributo
next screen de la pantalla.

LEAVE TO SCREEN <scr_num> -> Termina el


procesamiento de la pantalla actual y pasa la pantalla
especificada. Invalida el atributo next screen.

CALL SCREEN <scr_num> -> nos permite ingresar en


nuestra secuencia de pantallas otra y hasta que no se ejecuta la
misma no nos devuelve el control a la pantalla llamadora.
70
• Para interrumpir el procesamiento de una pantalla y llamar a otra se usa la sentencia CALL
SCREEN <xxx>. Para retornar a la sentencia inmediatamente debajo de la llamada se puede
usar las sentencias SET SCREEN 0, LEAVE SCREEN o LEAVE TO SCREEN 0.

• Para terminar un programa de dialogo se usa la sentencia LEAVE PROGRAM.


La sentencia LEAVE TO SCREEN 0 vuelve el programa al menú principal (menú SAP)

• Para llamar una pantalla en forma modal se usa los addition a ala sentencia CALL SCREEN

CALL SCREEN 100 STARTING AT x1 y1


ENDING AT x2 y2

• La sentencia SET CURSOR FIELD nos permite pararnos en el campo que queremos con
solo indicar el nombre del mismo.

SET CURSOR FIELD 'ZPER_SUEL-NOMBRE' OFFSET 3.


Capitulo 4
The program interface

• SET TITLEBAR <tit_name> WITH &1... &9 -> Setea el titulo para la screen en forma
dinámica, el titulo es un objeto de la screen y debe ser creado (no es un string), hacer doble
click sobre el nombre del titulo y crearlo. Se puede pasarle variables para incluir en el titulo
del programa, hasta 9 parámetros, el titulo puede tener hasta 20 caracteres. Es posible pasar
variables a un titulo, cuando se genera el titulo el espacio para las variables se reserva con la
sentencia &x.

• SET PF-STATUS -> nos permite utilizar los botones de la pantalla, como la barra de titulo
poner un nombre y hacer doble clik sobre esta, nos llevara a la pantalla donde estarán todas
los botones a utilizar, al ponerle un código al botón que queremos utilizar solo hace falta
ponerle un nombre y listo, este nombre estará asociado al botón. El nombre del botón
pulsado viajara en la variable OK_CODE hacia el PBO.

• Técnicamente el status es una referencia a una barra de menú, teclas asignación y barra de
aplicaciones. Cada uno de los componentes pueden estar en más de un GUI STATUS. Cada
pantalla puede tener más de un status, pero no al mismo tiempo, este cambia dinámicamente.
Una barra de menú esta compuesta por menús individuales, un menú puede tener hasta 15
entradas. Una entrada puede ser una función, un separador u otro menú en cascada. La
cascada de menús puede ser hasta nivel 3.
Para crear una entrada en un menú se coloca en la parte izquierda el function key y su
descripción en la parte derecha que aparecerá en el menú. Para agregar un submenú se
coloca en la parte derecha el nombre del menú. Toda función en un menú debe ser activada
para que aparezca en el menú como seleccionable (no grisada).
Las teclas de asignación y la barra de aplicación son un subconjunto de las teclas de función.
Para poder usar una función en la barra de aplicaciones primero debe tener asignado un
fuction key.
Toda function key al ser presionado un botón, menú o tecla de funcion viaja al PAI en la
variable OK_CODE.

71
Para crear un componente (barra de menú, teclas asignación y barra de aplicaciones.) se debe
ir dentro del menú painter GOTO-> INTERFACES OBJECTS ahí tendremos todos los
componentes.

• Cada tecla de función esta diferenciada por un tipo.


E Exit command (MODULE xxx AT EXIT-COMMAND)
S System function
T Call a transaction
‘’ Normal application function
P Local GUI functions
H Internal Use

• Limpiar el data object OK_CODE en el PBO para evitar que tenga valores erróneos.
Conviene crear un modulo aparte para guardar todas las sentencias de inicialización.

CLEAR OK_CODE.

Capitulo 5
Screen elements for output

72
• Elemento de texto
-> Es un label que se puede colocar en la pantalla,
-> Para escribir un texto de varias palabra es necesario en vez de separarlos
por espacios se debe separar por un guión bajo (Separador de palabras ‘_’).
-> Se tiene muchas propiedades de diseño, asignarle iconos o ponerlo en un
grupo de elementos.
-> Para traducir los textos en distintos idiomas hay que hacerlo desde los
element list de la screen, no se hace desde el screen painter.
-> No se puede modificar el texto en tiempo de ejecución.

• STATUS ICONs
-> Son elementos gráficos de una pantalla, son campos de salida y se pueden
modificar en tiempo de ejecución, son iconos predefinidos, tienen un nombre y
atributos.
-> Al crear un status icon es necesario crear en el programa un data object
con el mismo nombre para linkearlos con la estructura icons-text, este data object
contendrá el nombre del icono a mostrar.
-> Para crear un icono se usa la función ICON CREATE a la cual se le pasa
el nombre y nos devuelve el icono que
-> Indicar el largo del icono mas el texto como atributo VIS LENGHT del
status icon (DEF LENGHT = 132).

DATA: status_icon TYPE icons-text.

CALL FUNCTION 'ICON_CREATE'


EXPORTING
name = 'ICON_CHECKED'
text = 'Cobro el sueldo'
IMPORTING
RESULT = status_icon
EXCEPTIONS
icon_not_found =1
outputfield_too_short = 2
OTHERS = 3.

• Group boxes
-> Son frame que se ponen el la pantalla para agrupar visualmente los
elementos.
-> Al marcar el atributo de OUTPUT FIELD se puede linkear el group box
con un data object, esto se puede usar para cambiar el titulo de este.
-> Cuando todos los elementos dentro de un group box están invisibles este se
pone invisible también.

• Input/Output Fields
-> Un campo de input le permite al usuario ingresar datos
-> Un campo de output muestra datos al usuario
->Los campos de entrada tienen consistencia de datos dependiendo del tipo
de dato que sea.
-> Si un campo esta relacionado con un dato del diccionario nos permite tener
consistencia de datos a través de foreign key o value set.

73
-> Los campos de output al volverlos invisibles se ocultan, los campos de
input vuelven invisible el contenido, muestran todo el contenido con asteriscos.
-> Para utilizar data object de un programa en una screen hay que definirlo
con las sentencias DATA y TABLES.

• La opción de GET_PARAMETERS nos permite traer de la memoria de sap los parametes id


de los campos, estos parámetros son específicos de la sesión o del usuario. Se ejecuta en el
PBO.

• La opción de SET_PARAMETERS nos permite setear el parameter id de un campo en la


memoria de SAP, estos parámetros son específicos de la sesión o del usuario. Se ejecuta en
el PAI.

• FIELD -> Nos permite para un campo realizar una operación única, se usa para chequear que
los datos ingresados sean correctos en el PAI, en el caso de que halla un error se procesa
nuevamente la pantalla sin procesar el PBO, se bloquean los campos que no tienen error y el
cursor se para el campo con error. El mensaje de error o warning se muestra al pie de la
pantalla.

PROCESS AFTER INPUT.


...
FIELD <f1>
MODULE check_input.

. module check_input input.


message 'error' type 'E'.
endmodule.
• CHAIN... ENDCHAIN -> Nos permite encadenar sentencias FIELD para más de un campo
a la vez, notar que el contenido de los campos no estará disponible hasta que se ejecute la
sentencia FIELD y se validen los campos.

PROCESS AFTER INPUT.


...
CHAIN.
FIELD: <f1>,
...,
<fn>,
MODULE check_input.
ENDCHAIN.

. module check_input input.


...
message 'error' type 'E'.
endmodule.

• Al momento de provocarse el error de validación en el o los campos se devuelve la pantalla


al usuario sin haber ejecutado el PBO. El usuario corregirá los datos mal ingresados y
cuando se quiera ejecutar el PAI se reanudara la ejecución desde la sentencia donde se
produjo el error. Dependiendo del tipo de mensaje será obligatorio corregir el error o
confirmando el mismo el programa seguirá.

• Las validaciones se realizan por una sentencias MODULE donde se encontrara la lógica
ABAP para la validación. El agregado de la sentencia ON INPUT hace que se ejecute el
modulo cuando el contenido del campo cambia.

74
• El addition a la sentencia MODULE de ON REQUEST permite ejecutar el modulo si el
usuario ingresa un valor nuevo al campo.

• Se puede agregar al module el addition ON CHAIN-REQUEST que lo que permite es que se


ejecute el modulo si y solo si se modifico alguno de los campos descriptos en la sentencia
FIELD. También se le puede agregar ON CHAIN-INPUT que nos permite ejecutar el
modulo cuando alguno de los campos encerrados en la sentencia CHAIN cambie.

• Un module con el addition AT EXIT-COMMAND nos permite saltear todos los chequeos
automáticos de los campo. Las function code que activan este tipo de modulo son los de tipo
de function key ‘E’. Solo se puede usar este addition una sola vez por programa. Si no se
termina el programa dentro de este module se ejecutaran inmediatamente después todos los
chequeo automáticos y el resto del PAI.
• Estructura de programa de dialogo

PBO
Modulo de status (primeras 3 líneas de la screen)
Modulo de campos (modificación de atributos de
los campos en la pantalla)
Modulo Clear_ok_code (limpiar el OK_CODE)
PAI
Modulo de exit (dependiente de la tecla que pulso si
es del tipo de function code ‘E’)
Chequeos de campos (chain .. endchain )->
Disparan módulos de chequeos
Modulo de acción (grabar, modificar, pasar a otra
Pantalla, etc.)

• Existen 2 funciones que nos permiten pedir confirmación de una accion a un usuario por una
accion.

DATA answer type c.


CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
* DEFAULTOPTION = 'Y'
textline1 = 'Salir de la pantalla?'
* TEXTLINE2 =''
titel = ''
* START_COLUMN = 25
* START_ROW =6
* CANCEL_DISPLAY = 'X'
IMPORTING
answer = answer.

CALL FUNCTION 'POPUP_TO_CONFIRM_LOSS_OF_DATA'


EXPORTING
textline1 = 'Desea perder los datos?'
* TEXTLINE2 =''
titel = ''
* START_COLUMN = 25
* START_ROW =6
* DEFAULTOPTION = 'N'
IMPORTING
answer = answer.

75
• Input Help -> Son métodos de ayuda para campos de pantallas, generalmente están definidos
en el diccionario asociados a elementos de datos. Se pueden mostrar en 2 formatos, una lista
desplegable o una pantalla se selección.

• Radio Button ->Los selección de radio buttons es excluyente entre ellos. Para crear un grupo
de radio buttons marcar todos estos e ir a la barra de herramientas EDIT->GROUP->RADIO
BUTTON GROUP->DEFINE. De esta manera quedaran definidos. al asignar un function
code, de esta manera se dispara el evento PAI.
• Checkboxes -> Nos permiten seleccionar más de una opción. Declarando data elementos en
la programa con el mismo nombre se pueden linkear estos con los de la pantalla. El tipo de
datos de estos objetos es CHAR(1).

• Pushbuttons -> Es un campo de entrada, que nos permite realizar una acción de la misma
manera que una opción de menú o un botón de aplicación. Tienen asignado un fuction code
que viajara al PAI por el OK_CODE al programa. Un botón puede contener text, iconos.
Para cambiar el texto del botón es necesario cambiar el atributo OUTPUT FIELD en activo
y declarar un data element con el mismo nombre. Igual que cualquier function key definida
en el status un pushbutton puede ser de distinto tipo.

Capitulo 7
Screen elements: subscreen and tabtrips

• Una subscreen area es un area en una screen donde se coloca otra pantalla del tipo
subscreen, la cual puede ser cambiada en tiempo de ejecución.
Una subscreen puede contener más de una subscreen. Si la screen a colocar en el espacio de
la subscreen es mas grande no se mostrara completa, el tamaño es fijo.
Se puede definir que subscreen aparecerá dinámicamente en tiempo de ejecución.
Si una screen se muestra en una area mas pequeña que esta se mostrara solo lo que entre
empezando por arriba desde a izquierda, se puede setear el atributo SCROLLABLE que nos
mostrara una barra para navegar por la subscreen.

• Las subscreen tienen propiedades distintas a una screen normal, no tienen TITLEBAR, PF-
STATUS, no se pueden usar las sentencias LEAVE SCREEN, SET SCREEN, no pueden
tener campos OK_CODE.
No se puede llamar una subscreen dentro de un ciclo LOOP o dentro de CHAIN…
ENDCHAIN.
No debe tener módulos AT EXIT-COMMAND.
Los nombres de los objetos deben ser únicos en todas las screen.

• Para ejecutar una subscreen se debe llamar en el PBO y el PAI de la screen contenedora,
estas llamadas ejecutan el PBO y el PAI de la subscreen

PROCESS BEFORE OUTPUT.


...
CALL SUBSCREEN subscreen_area1
INCLUDING sy-cprog '200'.

PROCESS AFTER INPUT.


...
76
CALL SUBSCREEN subscreen_area1.

• Para especificar dinámicamente el numero de pantalla a mostrar se crea un data object global
del tipo SY-DYNNR el cual contendrá el numero de screen a la que quiero ir.

Data dynnr type


Data dynnr type sy-dynnr.
dynnr = ‘200’.

PBO
CALL SUBSCREEN subscreen_area1
INCLUDING sy-cprog dynnr.

• A menos que la pantalla que queremos llamar este en el mismo module pool las variables
globales no son accesibles. Para resolver esto se crea un function group que contenga esta
pantalla, las variables a compartir y un 2 funciones para exportar e importar los datos.
Importante: En la llamada al grupo de funciones se debe anteponer al nombre del function
group SAPL…

PROCESS BEFORE OUTPUT.


...
MODULE llenar_pantalla200.
CALL SUBSCREEN subscreen_area1
INCLUDING 'SAPLZ_FG_PANTALLA' '0200'.

PROCESS AFTER INPUT.


...
CALL SUBSCREEN subscreen_area1.

module llenar_pantalla200 output.

PERFORM inicializar_campos(saplz_fg_pantalla).

CALL FUNCTION 'LLENAR_CAMPOS'


EXPORTING
ex_nombre = 'roberto'
ex_apellido = 'carlos'

endmodule.

Procedimiento dentro del function group.


FORM inicializar_campos.
nombre = 'patricio'.
apellido = 'nicola'.
ENDFORM.
• Un TABSTRIP es un control que nos permite mostrarle al usuario en una sola pantalla
diferentes solapas con distintos datos. Un tabstrip es un conjunto de page element. Un page
element se compone de un titulo, una subscreen area y una subscreen. Técnicamente el
titulo se maneja como un pushbutton es necesario ingresarles un nombre y un function code.

• Declaration de TABSTRIPS

1. Crear el objeto en el screen painter


2. Crear control en el programa principal

CONTROLS: tabstrip1 TYPE TABSTRIP.

77
TABSTRIP corresponde a aun estructura de tipo CXTAB_TABSTRIP, esta estructura esta
definida en el TYPE POOL CXTAB. Esta estructura tiene.

• Al navegar entre las tab pages se ejecuta el function key de cada una de ellas. El tipo de
function key marcara el comportamiento de la subscreen.
function type ‘ ’ -> Se ejecuta el PAI de la pantalla y la navegación por el
control se realiza manualmente. Se ejecuta el PBO de los subscreen.

CASE ok_code.
when 'TAB1' OR 'TAB2'.
TABSTRIP1-ACTIVETAB = OK_CODE.

function type ‘P’ -> No se dispara el PAI de la pantalla principal, los datos en
las subscreen son estaticos. La navegación es automatica.

• En cada tab page se debe asignar una subscreen que debe ser ingresado en el atributo
REFERENCE OBJECT del tabstrip.

Capitulo 8
Table Controls

• Table control -> Es un area en una pantalla para mostrar datos en forma tabular. Puede tener
hasta 255 columnas, los datos de las columanas pueden ser campos imputables o checkbox.
La particularidad es que nos permite modificar datos en la tabla y actualizar la DB

• Creacion de un Table Control ->


1. Crear en el screen painter el table control
2. Ponerle nombre al control
3. Declarar en el programa un data object del tipo TABLE VIEW

CONTROLS: tbc TYPE TABLEVIEW


USING SCREEN '0100'.

4. Para asignar el table control con columnas es igual a colocar campos en una
screen, los seleccionamos del diccionario y los arrastramos dentro del control,
automáticamente se convertirán en las columnas
5. Para tener la opción se seleccionar una línea esta la opción W/selection
Colum, hay que darle un campo para que guarda el valor de que la línea esta
marcada, este campo debe estar en la estructura que usamos para la pantalla y
debe ser char(1)
6. Código para manejar el table control.
78
TABLES: zpersonal.
DATA:
wa_per TYPE zpersonal,
it_personal2 TYPE TABLE OF zpersonal.

CONTROLS: tbc TYPE TABLEVIEW


USING SCREEN '0100'.

PBO
MODULE llenar_it_table.

LOOP AT it_personal
INTO wa_per
WITH CONTROL tbc.
MODULE copiar_al_tc.
ENDLOOP.

PAI
LOOP AT it_personal.
CHAIN.
FIELD: spfli-connid,
spfli-countryfr,
...
spfli-distid,
spfli-fltype,
spfli-period.

MODULE modificar_it_personal
ON CHAIN-REQUEST .
ENDCHAIN.
ENDLOOP.

MODULE llenar_it_table OUTPUT.


SELECT * FROM zpersonal INTO
CORRESPONDING FIELDS OF TABLE it_personal.

DESCRIBE TABLE it_personal


LINES tbc-lines.

ENDMODULE.

MODULE copiar_al_tc OUTPUT.


MOVE-CORRESPONDING wa_per TO zpersonal.
ENDMODULE.

MODULE modificar_it_personal INPUT.


MOVE-CORRESPONDING spfli TO wa_per.
MODIFY it_personal FROM wa_per
INDEX tbc-current_line.
ENDMODULE.

El manejo del scrool del table control los maneja el sistema.

• La estructura table control atributos que pueden ser modificados en tiempo de ejecución.
Esta estructura tiene atributos para el table control, uno de estos es una tabla con todas las

79
columnas. Los atributos de las columnas son iguales a la tabla SCREEN mas atributos
adicionales.

MODULE modificar_tbc OUTPUT.


DATA wa LIKE LINE OF tbc-cols.

tbc-fixed_cols = 3.
...
LOOP AT tbc-cols INTO wa.
wa-screen-intensified = 1.
...
MODIFY tbc-cols FROM wa.
ENDLOOP.
ENDMODULE. " modificar_tbc OUTPUT

• Además de poder cambiar los atributos de la tabla a través del table control, los campos se
encuentran en la tabla SCREEN como elementos de pantalla individuales.

• El posible programar un ordenamiento en un table control.


data wa2 like line of tbc-cols.

READ TABLE tbc-cols


WITH KEY selected = 'X' INTO wa2.
IF sy-subrc = 0.
SORT it_personal BY (wa2-screen-name+6).
ENDIF.

Cuando se ejecute el PBO después de de presionar el botón ordenar habiendo seleccionado


una columna se recargara el table control.
El offset puedo en el ordenamiento es ya que el atributo name de la tabla screen contiene a
que tabla pertenece y esta no concuerda con el nombre de la tabla interna.

Capitulo 9
Context Menú

• Un menú de contexto es un status gui especial, para crearlo hay que presionar sobre crear
STATUS, ponerle nombre y el tipo es de CONTEXT MENU. Se puede asignar a campos de
entrada, group box, table control o screen. Todo campo que este dentro de alguno de estos
objetos (menos el campo de entrada) que no tengan menús de contexto asignados heredan de
estos.

• Nos llevara a una pantalla donde deberemos armar el árbol del menú de contexto, se puede
poner submenús. A cada una de las opciones de le deben poner un function code a cada
función final para después capturar en el programa.

• Para asignar un menú de contexto a una screen en los atributos se le pone el nombre del
menú de contexto en el campo ON_CTMENU_

80
• Para capturar el click derecho del mouse es necesario crear un FORM.
Para que aparezca en menú de contexto se usa el método

FORM on_ctmenu_cm_pantalla
USING p_m TYPE REF TO cl_ctmenu.

CALL METHOD cl_ctmenu=>load_gui_status


EXPORTING
program = sy-cprog
status = 'MC2'
* DISABLE =
menu = p_m
EXCEPTIONS
read_error = 1
OTHERS = 2.
ENDFORM. "on_ctmenu_cm_pantalla

• Herencia de context menú


1. El context menú de la pantalla hereda a todos los objetos de esta su context menú.
Se setea desde los atributos de la pantalla.
2. Todo los objetos dentro de un group box heredan de este el context menú, si no
tiene hereda los de la pantalla.
3. Se le puede asignar explícitamente context menú a los objetos
• Table control
• Group box
• Input/output field, etc.

• Se puede modificar en tiempo de ejecución el context menú, para esto el objeto que devuelve
el método load_gui_status tiene los métodos. (pagina 9-9).

• El valor de la opción seleccionada en el menú de contexto viaja al programa por el


OK_CODE como si fuera cualquier botón en la pantalla.

Capitulo 10
List in screen processing

• Desde una pantalla se puede crear un listado básico que puede ser enviado directamente a la
impresora con la sentencia NEW-PAGE PRINT ON PARAMETERS <print_param>. Los
parámetros corresponden a los parámetros de impresión del usuario.

81
• Para mostrar un listado básico por pantalla se usa la sentencia LEAVE TO LIST-
PROCESSING, esta sentencia se ejecuta cuando termina de procesarse la pantalla que lo
usa, es indistinto si es el PBO o PAI.
La sentencia SET PF-STATUS SPACE. Invalida el pf-status de la pantalla y muestra el
status Standard de SAP.

• El listado se crea en una pantalla creada por el sistema, el número de pantalla es 120.

• Cuando de termina de procesar el listado básico se ejecuta el PBO de la pantalla que llama al
listado básico, para evitar que se ejecute se utilizan el addition AND RETURN TO SCREEN
<scr_nro>

LEAVE TO LIST-PROCESSING
AND RETURN TO SCREEN <scr_nro>

• Para que el listado vaya a una salida de spool se usa la sentencia La sentencia SUPPRESS
DIALOG. nos permite al generar un listado a través de una screen que no queremos mostrar.

• Para mostrar un listado en una pantalla en forma modal se crea una screen la cual es llamada
en forma
call screen 200 starting at 20 10
ending at 50 15

y en el PBO de la pantalla 200 se crea el listado anteponiendo las


sentencias LEAVE TO LIST-PROCESSING para que muestre el listado y la sentencia
SUPPRESS DIALOG para no mostrar la pantalla.

Capitulo 13
Programming database updates

• Las actualizaciones a la base de datos se realizan a través de sentencias OPEN SQL, estas
sentencias no dependen del tipo de base de datos que estamos utilizando, existe una interfaz
en SAP que traduce las sentencias dependiendo de la Db que utilicemos.
El conjunto de comandos de OPEN SQL contiene solamente operaciones de
manipulación de datos. Las operaciones de definición de datos no están contempladas.

• Toda ejecución de sentencias OPEN SQL retornan su resultado en 2 variable de sistema SY-
SUBRC (resultado de la Query ) y SY-DBCNT (cantidad de registros seleccionados,
modificados o insertados)

• Las sentencias OPEN SQL no realizan chequeos de autorización sobre las tablas.

82
• Para acceder a datos de otro mandante de una tabla dependiente de mandante se utiliza el
addition CLIENT SPECIFIED, esto nos permite especificar en que mandante queremos
trabajar. Si no se especifica el addition se utiliza el mandante en el que el usuario esta
logoneado.

SELECT nombre apellido


INTO CORRESPONDING FIELDS OF TABLE it_per
FROM zpersonal AS a CLIENT SPECIFIED
WHERE a~dni = '28.077.789' AND
a~mandt = '200'.

• Para insertar un registro en una tabla se utiliza la sentencia, los valores se deben ingresar en
una work area y pararlo a la sentencia

INSERT INTO <dbtable> VALUES <wa>

• Para insertar varios registros en una tabla se utiliza la sentencia, los registros se agrupan en
una tabla interna y la actualización se realiza por nombres de campo.

INSERT INTO <dbtable> FROM TABLE <it>

• Se pueden realizar actualizaciones en vistas de la DB, la operación se llevara a cabo


satisfactoriamente solo si en atributo “read and change” de la vista esta activado en el
diccionario.

• En el caso de que un registro no pueda ser en la tabla se realiza un rollback de la operación y


da error de runtime. Para evitar el error y que los registros que puedan ser insertados sean
insertados en la tabla se utiliza el adition ACCEPTING DUPLICATES KEY igual el sy-
subrc se setea en 4.

• Para actualizar una tabla en la db se utiliza la sentencia, la actualización se realiza usando los
nombres de los campos claves, la igualdad de las claves se realizan automáticamente y se
modifican los campos que en la wa tienen datos. Para una modificación masiva pasa lo
mismo

UPDATE <dbtable> FROM <wa>

UPDATE <dbtable> FROM TABLE <it>

• Se pueden realizar actualizaciones en campos puntuales a campos con sentencias WHERE.

UPDATE <dbtable>
SET <field> = <valor> ….
WHERE <condition>

• Se pueden realizar actualizaciones en vistas de la DB, la operacion se llevara a cabo


satisfactoriamente solo si en atributo “read and change” de la vista esta activado en el
diccionario.

• En la sentencia WHERE se pueden realizar cálculos de campos

83
• Las modificaciones a una tabla de la DB se realizan a través de la sentencia MODIFY.
Consta de 2 partes: 1. Si el registro existe realiza un UPDATE
según los campos que se especifiquen
2. Si el registro no existe realiza un INSERT en
la tabla con la clave proporcionada

MODIFY <db> FROM <wa>


MODIFY <db> FROM TABLE <it>

• Se pueden realizar modificaciones en vistas de la DB, la operacion se llevara a cabo


satisfactoriamente solo si en atributo “read and change” de la vista esta activado en el
diccionario.

• Para borrar registros de una DB se utiliza la sentencia DELETE, es obligatorio poner una
condición.

DELETE FROM <db> WHERE <campos_clave>


DELETE FROM <db> WHERE <condicion>

DELETE FROM <db> FROM TABLE <it>

Para borrar una tabla entera se usan condiciones especificas.

DELETE FROM <db> CLIENT ESPECIFIC


WHERE <campo> like ‘%’

• Toda sentencia OPEN SQL puede terminar en forma anómala, la variable de sistema SY-
SUBRC contiene el resultado de la ejecución, para realizar un ROLLBACK cuando sy-subrc
EQ 4 se usa la sentencia

MESSAGE A…

Esta sentencia nos permite realizar el rollback y mostrar un mensaje al mismo tiempo y
cancelar el programa

• La sentencia ROLLBACK WORK nos permite volver atrás cambios en la DB sin cancelar el
programa

• Es posible ejecutar sentencias SQL nativo en ABAP, debe ser encerrado dentro de las
sentencias EXEC ... ENDEXEC, dentro de estas sentencias se podrá ejecutar comandos SQL
particulares de la DB, tener en cuenta que distintas DB tienen distinta sintaxis en sus
sentencias SQL.

84
Capitulo 15
LUWs and Client/Server architecture

• La LUW de sap es una unidad lógica de procesamiento con la DB, consta en una serie de
cambios en la DB

• La LUW mantiene el concepto de transacción en bases de datos, dentro de esta transacción


se realizaran modificaciones en la DB y si todas las modificaciones se realizaron
exitosamente se procederán a grabar en la DB, de lo contrario volverán para atrás las
modificaciones realizadas.

• La sentencia ROLLBACK WORK cancela el ciclo de modificaciones en la DB sin que


alguna de estas cancelara.

• La sentencia COMMIT WORK guarda los cambios en la DB que se realizaron hasta el


momento. Todo rollback se realizara hasta el último punto de commit, sea implícito o
explicito.

• COMMIT implícitos -> Cuando de mientras una pantalla


-> Cuando el sistema muestra un mensaje
-> Cuando se llama a una función RFC
-> Cuando se llama a una transacción o submite un programa

Capitulo 16
SAP Locking concepts

• Los lockeos de registros se utilizan para trabajar con datos sin que se sufran cambios en los
mismos por otros procesos. Cada commit de la DB libera todos los bloqueos realizados en el
entorno de la LUW

• El addition FOR UPDATE en la sentencia SELECT SINGLE nos permite bloquear el


registro para que podamos trabajar con los datos sin que estos sean modificados por otros
procesos.

• Las operaciones de lockeo entre entradas de distintas tablas se realzan desde el diccionario
creando OBJETOS DE LOCKEO, estos objetos al ser llamados desde un programa lockean
las estradas de las tablas para poder realizar las actualizaciones. Cuando se crea el objeto se
debe ingresar la tabla a la que pertenecen los campos a lockear, si son varias tablas se debe
ingresar los campos que relacionan estas tablas.
85
• Al crear los objetos de lockeo se crean las funciones correspondientes para lockearlo y
deslockearlo

CALL FUNCTION 'ENQUEUE_EZ_PERSONAL'


CALL FUNCTION 'DEQUEUE_EZ_PERSONAL'

La interfaz de estas funciones contendrá los valores de los campos de las tablas que
lockearemos o liberaremos

CALL FUNCTION 'ENQUEUE_EZ_PERSONAL'


EXPORTING
* MODE_ZPERSONAL = 'E'
mandt = sy-mandt
dni = pa_dni
* X_DNI =''
* _SCOPE = '2'
* _WAIT =''
* _COLLECT =''
EXCEPTIONS
foreign_lock =1
system_failure =2
OTHERS =3

• Al ocurrir un error cuando queremos lockear un objeto nos mostrara un mensaje de error en
la pantalla.
Cuando se termina un programa se liberan todos los lockeos implícitamente.

• Para liberar todos los objetos lockeados de una vez esta la función CALL FUNCTION
'DEQUEUE_ALL'.

• El parámetro de cliente es opcional


1. Si no esta -> el lockeo toma de la variable de sistema SY-MANDT y
ejecuta el lockeo para este mandante
2. Si esta -> el lockeo se produce para ese mandante
3. Si el parámetro es SPACE se aplica a todos los mandantes.

• Ver parámetros adicionales en el manual (pagina 16-15)


_SCOPE -> Este parámetro indica hasta que nivel se mantiene el lockeo.

• Existen 3 tipos de lockeos

1. E -> Lockeo en forma exclusiva


No pueden realizar cambios
Son acumulativos los lockeos, acepta lockeos simultáneos del tipo E y S
2. X -> Lockeo en forma exclusiva
No pueden realizar cambios
No son acumulativos los lockeos, rechaza otros tipos de lockeos
simultáneos
3. S -> Lockeo compartido.
Acepta lockeos simultáneos del tipo E y S.

• Pasos de lockeo en un programa


86
1. Lockear el objeto
2. Si el lockeo es exitoso, leer la información
3. Realizar el cambio de la data
4. Liberar el objeto de lockeo

Capitulo 17
Organizing database updates

• Actualización DIRECTA -> Las actualizaciones se retrazaran al final del programa las
instrucciones se ejecutaran al final del programa

• PERFORM <routine_name> ON COMMIT -> sentencia que me permite encolar rutinas de


actualización en una DB en una tabla del sistema, todas las rutinas se irán encolando y se
ejecutaran todas cuando se encuentre la sentencia COMMIT WORK. No tienen parametros

• Los WP de update interactúan entre los WP de dialogo y la DB, el WPD le envía al


requerimiento al WPU, cuando este lo recibe se libera el WPD para realizar otras
operaciones

• Al pasar el control de las actualizaciones al WPU el WPD termina. Para revisar como va la
actualización se puede ver a través de la transacción SM13

• En caso de un error el WPU marca en la tabla la sentencia de actualización que dio error y
envía un mail al usuario que ejecuto la tarea utilizando el parámetro RDISP/VBMAIL o
RDISP/VB_MAIL_USER_LIST. En caso de que la actualización se halla realizado con
éxito el WPU borra la tabla log y se libera.

• Las funciones que queremos que tengan esta funcionalidad de actualización deben ser
creadas como modulo de actualización (MODULE UPDATE), estas funciones solo tienen
parámetros de importing. Al llamar a la función se debe agregar el addition IN UPDATE
TASK, esto hace que guarde en la tabla de log el requerimiento para luego ser ejecutados. La
sentencia COMMIT WORK cierra la tabla de log y la pasa al WPU que es el que realizara la
actualización.

• Si estamos utilizando objetos de lockeo en una función de tipo UPDATE (parámetro


_SCOPE = 2 ) no es necesario liberar los objetos al terminar la actualización el sistema los
libera solos. En caso de error también el sistema los libera.

• Actualizaciones Asincrónicas -> Las sentencias de actualización se irán almacenando en la


tabla de log y cuando se encuentra con la sentencia COMMIT WORK se dispara la
actualización en la DB, el programa de dialogo que disparo el commit sigue su curso.

• Actualizaciones Sincrónicas -> Las sentencias de actualización se irán almacenando en la


tabla de log y cuando se encuentra con la sentencia COMMIT WORK AND WAIT se
dispara la actualización en la DB, el programa de dialogo espera a ala finalización de esta. El
valor de finalización se guarda en la variable de sistema sy-subrc

87
• Local Updates -> Las actualizaciones en forma local son ejecutadas por el mismo WP de
dialogo que esta manejando la pantalla, no se delega la ejecución a un WP de UPDATE. Los
requerimientos de actualización siguen siendo escritos en la tabla log y ejecutados con la
sentencia COMMIT WORK. El programa espera a que se resuelvan todas las
actualizaciones y sigue con el programa.
La sentencia que activa las actualizaciones locales es
SET UPDATE TASK LOCAL
Esta sentencia sirve solo hasta el siguiente COMMIT WORK

• La sentencia ROLLBACK WORK destruye la tabla de log de actualizaciones y vuelve para


atrás todos los cambios realizados en la DB.

• Dentro de las funciones no se puede usar el ROLLBACK WORK en caso de que de error
una actualización de debe usar el mensaje de error del tipo A

MESSAGE A....

• Tipos de function module


-> V1 -> Son ejecutadas en LUW independientes
-> Los módulos pueden ser re-arrancables o
no re-arrancables en caso de un error en la
ejecución.
-> Solo cuando un modulo V1 se ejecuta
satisfactoriamente se ejecuta un modulo V2.
-> Se guardan los requerimientos
sincrónicos o asincrónicos en la tabla VBLOG. En
local updates se guardan en memoria principal
-> V2 -> Siempre son re-arrancables.
-> Collective run -> Se ejecuta solo tras la
ejecución de un programa
colector RSM13005
-> Se guardan los requerimientos VBLOG
siempre.

Capitulo 18
Complex LUW Processing

• Llamadas a programas -> existen 2 maneras de llamar a un programa dentro de un programa


ABAP.

1. La llamada al programa interrumpe al programa llamador, se ejecuta el programa


llamado y retorna al flujo de programa del programa llamador.

• CALL FUNCTION
• CALL TRANSACTION
• SUBMIT PROGRAM <pgm> AND RETURN

88
2. La llamada al programa termina al programa llamador y ejecuta al programa
llamado.

• SUBMIT PROGRAM <pgm>


• LEAVE TO TRANSACTION

• Ejecución de funciones en paralelo -> Se puede ejecutar funciones en forma paralela con el
agregado de la sentencia STARTING NEW TASK <task_name>. Para obtener los datos que
dejo la función se utiliza la sentencia RECEIVE RESULTS FROM FUNCTION
<funct_name>.

• La sentencia SUBMIT... WITH ejecuta un programa pasándole valores en la sentencia


WITH para cada parámetro, si este tiene screens que mostrar se agrega la sentencia VIA
SELECTION-SCREEN, si no esta sentencia la pantalla no se ejecuta.

SUBMIT z_selection_screen AND RETURN VIA SELECTION-SCREEN


WITH pa_dni EQ '00.000.000'
WITH pa_lname EQ 'alberto'
WITH pa_name EQ 'david'
WITH pa_sname EQ 'lopez'
WITH pa_sueld EQ '1000'
WITH pa_tipo EQ 'E'.

SUBMIT z_selection_screen AND RETURN VIA SELECTION-SCREEN


USING SELECTION-SET 'VARIANTE1'.

• Tipo de llamada a programas (ver grafico 18-20 )


-> call function -> se ejecuta dentro deLUW que el programa que
los llama. Todas las actializaciones se realizaran
al encontrar un commit.

-> submit and return


Call transaction
Submit
Leave to transaction -> se ejecutan en LUW distintas al del
programa que las llama.

Si se usa submit and return o call transaction la LUW del programa


llamador se reanuda cuando la LUW del la transacción este completa. De
manera que se pueden crear procesos de actualización anidadas
independientes.
Al correr independientemente pueden pasar 2 cosas:
1. Cada una debe tener su propio COMMIT
2. Las 2 estarán modificando la base de datos al mismo tiempo.

-> submit
Leave to transaction -> Terminan la LUW del programa
llamador, si este no realizo el commit la tabla log no
esta completa y no se ejecutaran las actualizaciones.

89
Capitulo 19
Number Assignment

• La asignación de números puede ser interna o externa. La asignación de números interna es


cuando usuario ingresa el número y se chequea para saber si cabe dentro del intervalo
asignado para ese tipo de dato. La asignación interna de número pasa cuando el sistema
asigna automáticamente el siguiente numero disponible.

• La transacción SNRO nos permite mantener los rangos de numero.

• Los rangos de números pueden ser numéricos o alfanuméricos. Múltiples rangos de números
pueden ser asignados a un objeto.

• Para pedir números al sistema se usa la sentencia

CALL FUNCTION 'NUMBER_GET_NEXT'


EXPORTING
nr_range_nr =
object =
* QUANTITY = '1'
* SUBOBJECT =''
* TOYEAR = '0000'
* IGNORE_BUFFER =''
* IMPORTING
* NUMBER =
* QUANTITY =
* RETURNCODE =
EXCEPTIONS
INTERVAL_NOT_FOUND =1
NUMBER_RANGE_NOT_INTERN =2
OBJECT_NOT_FOUND =3
QUANTITY_IS_0 =4
QUANTITY_IS_NOT_1 =5
INTERVAL_OVERFLOW =6
BUFFER_OVERFLOW =7
OTHERS =8

En el caso de de llenar el parámetro QUANTITY pidiendo mas de un


numero el parámetro NUMBER nos devolverá el ultimo numero asignado y en el
parámetro QUANTITY la cantidad de números asignados. Para calcular el resto de los
números va de (NUMBER – QUANTITY + 1) a NUMBER.

La tabla NRIV guarda todos los rangos de números para los


objetos. La cuando la funcion NUMBER_GET_NEXT pide un numero a la tabla
loquea el registro esperando a que termine la LUW del programa que pide el numero,
recién ahí responde a otras peticiones de números (utiliza para la bloquear el
registro SELECT SINGLE... FOR UPDATE)
• La función NUMBER_CHECK chequea si el numero ingresado esta dentro del rango de números
especificado para ese objeto. NO reserva el número.
La variable returncode devuelve ‘X’ si el numero esta fuera del rango, ‘ ‘ si esta dentro del
rango.

90
CALL FUNCTION 'NUMBER_CHECK'
EXPORTING
nr_range_nr =
number =
object =
subobject =''
toyear = '0000'
numeric_check =''
IMPORTING
returncode =
exceptions
interval_not_found =1
number_range_not_extern =2
object_not_found =3
OTHERS = 4.

• Para obtener información sobre el numero que se esta ingresando se utiliza la función
NUMBER_GET_INFO. La estructura que devuelve tiene la estructura de NRIV que contiene
todos atributos del número para ese objeto.

CALL FUNCTION 'NUMBER_GET_INFO'


EXPORTING
nr_range_nr =
object =
subobject =''
toyear = '0000'
IMPORTING
interval =
exceptions
interval_not_found =1
object_not_found =2
OTHERS =3

• La tabla NRIV que contiene en cada línea un rango de números, esta tabla generalmente esta
en el buffer del application server para optimizar el acceso.

Capitulo 20
Change Document

• Para logear cambios en una tabla de aplicación usando change document es necesario
actualizar la tabla de aplicación y actualizar la tabla de change document.
Para logear los datos se debe pasar al modulo de actualización los datos del registro antes del
cambio, el registro cambiado y datos administrativos (usuario, fecha, hora, nombre de la
transacción, etc.)

• Para logear cambios usando change document es necesario crear el objeto change document
en el sistema, también se debe incluir las correspondientes tablas.

91
El sistema crea los correspondientes módulos de funciones como también 2 includes con
definición de datos.
Estos 2 includes contienen programas que permiten grabar los datos en la tabla de change
document.
Los change document se guardan en la tabla CDCLS.

• Para crear un change document se utiliza la transacción SCDO. Por cada definición el
sistema genera los correspondientes módulos de funciones. Se crean estructuras en el
diccionario para la operación de logeo.

• Uso de chage document

******* modulos de funciones y definición de datos *******


INCLUDE fz_zdnicdt.
INCLUDE fz_zdnicdc.

DATA wa TYPE zpersonal.

START-OF-SELECTION.
******* seleccion de datos de la DB **********************
SELECT SINGLE * FROM zpersonal
INTO CORRESPONDING FIELDS OF xzpersonal
WHERE dni = '00.000.000'.

******* copia de registro nuevo a registro viejo *********


MOVE-CORRESPONDING xzpersonal TO yzpersonal.

******* modificamos la wa ********************************


xzpersonal-snombre = 'carlos'.

******* comletamos los parametros de la funcion **********


MOVE : 'ZDNI' TO objectid,
sy-tcode TO tcode,
sy-uzeit TO utime,
sy-datum TO udate,
sy-uname TO username.
upd_icdtxt_z_zdni = 'U'.
upd_zpersonal = 'U'.

******* modificamos la tabla de la db ********************


MODIFY zpersonal FROM xzpersonal.

******* agregamos el cambio a la change document table ***


PERFORM cd_call_z_zdni.

COMMIT WORK.

• Para ver el chage document se utiliza el programa RSSCD100 el cual nos muestra para el
objeto específico todas las modificaciones que sufrió.

92
TAW12 3/3
ABAP Workbench Concept

Transacción Descripción
SPRO Transacción de customizing
SE43 Mantenimiento de Menús
SHD0 Creación de variantes de transacción
LSMW Herramienta de carga inicial
CMOD Modificación de elementos del usuario
SMOD Modificación de elementos de SAP
SNRO Manejo de rangos de números
FIBF Administración de BTE
SE18 Visor de definiciones de BADIs
SE19 Implementación de BADIs
SPDD Modificaciones al Diccionario
PFCG Creación y mantenimiento de roles
SE95 Modification browser
SPAU Modificaciones al repositorio
SNOTES Notes assistant

93
Toda modificación hecha al standard de SAP a través de estas herramientas no modifican el
standard, las modificaciones se guardan en lo que se llama es CUSTOMER NAME SPACE, este es un
espacio reservado para el usuario para crear sus modificaciones. Las actualizaciones del sistema hechas por
SAP no afectan a las modificaciones que nosotros hallamos hecho siempre y cuando se realicen con las
herramientas apropiadas.

Capitulo 3
Changing SAP Standard.

• Herramientas -> Business Engineer -> Customizing y


personalization utilizan esta
herramienta.
-> ABAP Workbench -> customer development,
enhancement and
modification utilizan esta herramienta.

• Tipos de modificaciones
Personalization -> Transaction Variant
Modification -> Modification Assistant
User exits
Enhancement -> Abap Dictionary -> Tables
Data element
-> Customer exit -> Function module
-> Menu Exit
-> Screen Exit
-> Business transaction events (BTE solo
para FI)
-> Business Add-ins (BADIs)

• Customizing -> Modificaciones de procesos y funciones en el sistema acorde a guías de


implementación (IMG).

• Personalization -> Atributos globales -> SET/GET parameters


94
-> Variantes de transacción.
-> Parámetros de table
controls.
-> Menús personalizados -> Menús basados en roles
-> Favoritos
-> Accesos directos en el
menú.

• Modification -> Cambios en el repositorio de SAP hechos por en cliente. En el caso de que
SAP modifique un objeto en el repositorio estas modificaciones deben ser realizadas por el
cliente para poder reflejar los cambios. Este procedimiento se realiza con la herramienta
MODIFICATION ASSISTANT.

• Enhancement -> El concepto de enhancement implica llamadas en programas standard SAP


a funciones que no fueron implementadas y que se dejan al usuario para que implemente.
Existen distintos tipos de enhancement:

In ABAP concept -> function module exit


On GUI -> Menu exit
On screen (subscreen) -> screen exits
On screen (fields) -> fields exits
In ABAP dictionary -> Table enhancement

• Table enhancement -> SAP provee 2 tipos de ampliación en tablas, ninguna de estas
ampliaciones modifican el standard.

APPEND -> Solo puede estar en una sola tabla


(Estructuras) -> Una tabla puede tener mas de una
estructura append

INCLUDE -> Se pueden usar en mas de una


(customizing includes) tabla
-> Los campos de la tabla son
referencias a una estructura externa

• Program Enhancement -> Consta de 3 técnicas para realizar ampliaciones a programas


standard

Customer Exits -> Es un modulo de funciones especial que


son llamados desde programas SAP.
Business Transaction events
Businnes add-ins

• Menu enhancement ->Nos permite agregar funciones al menú de un programa. Existen 2


técnicas customer exits y business add-ins.

• Screen enhancement -> Son subscreen en las pantallas de SAP que nos permiten agregar
campos, controles, etc. Desde la versión SAP WAS 6.2 solo se pueden usar business add-ins.

95
• Modification -> Toda modificación a objetos de SAP se llaman modificaciones, estas
modificaciones pueden llevar a inconvenientes al momento de una actualización del sistema
ya que deberá decidir que objeto actualizar para no perder los cambios realizados. Para
realizar esta tarea de modificación esta la herramienta MODIFICATION ASSISTANT.

• Customer Development -> Creación en el repositorio de objetos independientes. Caen en el


customer name space.

• Objetos en el sistema -> Originales -> Un objeto es original solo


en el sistema en el que se creo. Para los objetos SAP el
sistema original es SAP, para los objetos del cliente
es el sistema de desarrollo.
-> Copia -> Los objetos son transportados
de sistema en sistema, el objeto es copiado de
un sistema en otro.

• Ordenes de transporte

Correction Repair

Sistema Sistema 2 Sistema 3


Original

Cambios de un objeto original SAP se llama CORRECTION


Cambios a un objeto copia se llama REPAIR (custom object)
Reparación de un objeto SAP se llama MODIFICATION

• Después de un upgrade del SAP se deben comparar los objetos nuevos con los que fueron
modificados para no perder los cambios y modificar los nuevos.
Desde la versión 4.5 se utiliza la herramienta MODIFICATION ASSISTANT.

Capitulo 4
Personalization
96
• Creación de Roles -> Los roles nos permiten estandarizar la configuración de usuario
basándonos en el tipo de usuario y su actividad. La creación y mantenimiento de roles se
realiza desde la transacción PFCG.

• En la transacción SE43 se puede crear un menú de transacciones para un usuario, este menú
es una transacción la cual se ejecuta y nos muestra en la parte derecha un árbol de
transacciones con todas las transacciones creadas.

• Una variante de transacción en un conjunto de variantes de pantalla, para crearlos se utiliza


la transacción SHD0, se debe poner el nombre de la transacción a la cual queremos asociar
esta variante, para crear la variante se ejecuta la transacción y en cada pantalla se modifican
los atributos de los objetos correspondientes a esta. Cuando se termina de ejecutar la
transacción ya la variante esta creada, a cada variante de pantalla se le debe poner un
nombre, una descripción y el cliente si es una variante de transacción client-specific.
Para poder ejecutar la variante es necesario crear una transacción ya que la variante no es
una transacción. El tipo de transacción a crear en la VARIANT TRANSACTION.
Cuando se crea la transacción es necesaria crearla CROSS-CLIENT para que pueda ser
ejecutable por todo el entorno.
La opción GUIXT nos permite diseñar pantallas de manera más flexible, esta herramienta
usa un lenguaje script.

Capitulo 5
Table enhancement

• Append Structure -> Estructura que se puede agregar a una tabla para agregar campos a esta,
esta estructura se puede agregar solo a una tabla. Cuando una tabla con estructuras append es
copiada la tabla destino tiene estos campos como propios y no como una estructura agregada

Notas Importantes
-> Las tablas POOL y CLUSTER no pueden tener
append structure, solo tablas transparentes.
-> Las tablas transparente que tienen como ultimo campo son
del tipo LCHAR o LRAW no se puede agregar un append structure

97
-> Los campos de una estructura append deben empezar con
las letras ZZ o YY.

• Include structure -> Las estructuras include son estructuras que pueden estar compartidas en
mas de una tabla. Algunas tablas de standard se le pueden agregar estructuras, solo a las que
ya la tienen definidas. No se puede crear un include en tablas que no tengas esta include ya
definido. El nombre standard de la estructura empieza con CI_xxx.

• Text Element -> Se pueden cambiar las descripciones que traen los elementos de datos por
unos que quiere el usuario, para esto se usa la transacción CMOD. Las modificaciones de
texto y documentación no son partes de un proyecto de ampliación, se entra por la CMOD
pero se acceden por la barra de herramientas GOTO->TEXT ENHANCEMENT.
Las modificaciones que se pueden hacer a un text element varían entre KEYWORD
(descripción del campo) y DATA ELEMENT ( agregar documentación al data element).
Toda modificación de un text element impactara en forma global en el sistema
Para que los campos en una pantalla tomen los cambios cuando modificamos el text
element se debe setear el atributo modif. En el screen painter.
Las modificaciones en keyword deben ser vueltos a aplicar luego de una
actualización de la versión de SAP.

• Por la transacción SE95 se pueden ver todas las modificaciones que se realizaron en el
sistema, se pueden activar o desactivar cada una por separado.

Capitulo 6
Enhancement

• User Exits -> Son FORMs metidos en los programas standard de SAP que están declarados
pero no creados, para usarlo es necesario crearlo y meterle código propio a este form.

• Customer Exits -> Se basa en proyectos de ampliación, no solo de programas, también de


menús y pantallas. Con la transacción CMOD se pueden administrar los proyectos de
ampliación.

• En los programas Standard de SAP contiene llamadas funciones, estas funciones se utilizan
para ampliar la funcionalidad de los programas Standard, estas funciones están contenidas en
módulos de funciones, y estos módulos en grupos de funciones

• Nomenclaturas standard
-> Grupo de funciones -> X…
-> Modulo de funciones -> EXIT_<pgm_name>_xxx

• Los módulos de funciones tienen definidas una interfaz de parámetros para usar en la
función, no se puede modificar esta interfaz de parámetros para agregarle más. La
convención para módulos de funciones es EXIT_<pgm_name>_xxx.

• Se invoca con la sentencia

CALL CUSTOMER-FUNCTION ‘xxx’

El numero de la función es el numero del modulo de funciones


98
• La modificación de una función se hace a través del include que contiene, el include que
contiene tiene la siguiente nomenclatura ZX…, para declarar data elements en la función, el
modulo de funciones tiene includes para declararlos. Es necesario activarlo y luego activar el
proyecto.

• Estructura del function group -> Los grupos de funciones de ampliación contienen includes
de la forma LX o ZX, los LX son código de SAP, los ZX son código nuestro, solo estos
incluyes podemos modificar ya que caen en el customer name space.
El include del tipo LXaaaTAP guarda las variables del globales declaradas por SAP, el
incluye LXaaaTOP contiene las variables nuestras.
Los includes de la forma ZXaaaUnn contiene el código fuente de las funciones de
ampliación. En este incluye es solo para funciones, no es posible insertar código de
subrutinas (FORM), módulos (modules) o eventos. La declaración de variables en este
include son solo locales para los módulos de funciones.
Los includes de la forma ZXaaaFnn o ZXaaaOnn o ZXaaaInn o ZXaaaEnn guardan los
módulos, eventos y funciones del usuario.

• Menú Exits -> funciones de menú agregados al menú standard. Los menú exits están
programados en la pantalla standard de SAP, lo único que necesitamos es activarlo para que
aparezca, y en el código standard que atrapa el OK_CODE de este menú esta la función que
debemos programar adentro para agregarle funcionalidad, el OK_CODE de este menú
empiezan con +. El menú exit viene junto con un modulo de funciones que implementara el
funcionamiento.

• Screen Exits -> En algunas de las pantallas de SAP standard existen subscreen escondidas en
donde podemos poner screens propias con campos o controles que queramos. En el
programa standard existe una llamada en el PBO y PAI la sentencia.

PBO
CALL CUSTOMER-SCREEN xxx
INCLUDING <funct_group> <scr_num>
PAI
CALL CUSTOMER-SCREEN xxx

• Cuando encontrados el screen exit nos fijamos a que ampliación pertenece y creamos un
proyecto para esa ampliación, esta ampliación contendrá 2 componentes, uno será la screen
que debemos crear (con formato SUBSCREEN ) y customer exit donde podremos pasar
datos la screen a nuestra subscreen, es necesario en la función crear un data object (tables)
para poder ligar la función con la screen y asignarle a esta la estructura que nos pasa por
parámetro la función (siempre dentro del include, para declarar el data object el modulo de
funciones trae un TOP include para nosotros)

• Para asignarle una screen a la subscreen que deseamos en tiempo de ejecución se usa la
sentencia

PBO
CALL SUBSCREEN <scr_conteiner>
INCLUDING <pgm_name> <scr_nro>

99
PAI
CALL SUBSCREEN <scr_conteiner>
• Observaciones
-> No pueden tener nombre la subscreen
-> No esta permitido definir status GUI
-> La subscreen no puede tener definido el atributo next screen

• Para trasferir datos entre el programa principal y la subscreen la ampliación dispone


módulos de funciones en el PBO y PAI para trasferir los datos.

• El nombre técnico de la screen exit tiene el nombre del programa que lo llama, 4 números
que es el nombre de la screen más el nombre de la subscreen area.

Capitulo 7
Business Transaction Events

• BTE (business Transaction Event) -> Herramienta solo para FI


En una herramienta que nos permite comunicarnos con sistemas SAP y no SAP exteriores.
Se pueden realizar muchas implementaciones para cada BTE, cuando se ejecuta la BTE se
llaman a todas las implementaciones de esta, corren en forma secuencial y no en paralelo sin
orden especifico.
Estas implementaciones se guardan en una tabla interna la cual es loopeada ejecutando cada
una de ellas. La ejecución de cada implementación no estorba a la otra.
Las BTE tienen una interfaz ya definida y todas las implementaciones se deben ceñir a esta.
En la implementación NO se puede utilizar la sentencia COMMIT WORK.

Existen 2 tipos de BTE -> public & subscribe


La comunicación es saliente únicamente, el sistema avisa que
un evento ocurrió y delega la operación. No retorna nada al
sistema, el flujo de datos es unidireccional.
-> Process interfase
La comunicación es vi direccional, se envía la petición y se
espera por la respuesta del otro sistema.

Las funciones tienen la nomenclatura

OPEN_FI_PERFORM_<ev_number>
OUTBOUND_CALL_<ev_number>

La transacción FIBF nos permite ver todos los eventos con sus implementaciones. Consta
transacción se crean “productos”, este producto agrupa un conjunto de ampliaciones. La
activación o desactivación se realiza a nivel de producto.
Las BTE son client-specified, esto quiere decir que el mismo evento puede ser reutilizado
por distintos clientes.
Estas ampliaciones en los programas son solo para código, no se pueden agregar pantallas ni
menús.

• Diferencias entre CUSTOMER EXIT y BTE


100
CUSTOMER BTE
EXIT
Source code + +
Menus + -
Screens + -
Tables + -
Administration level + -
Reusable - +
Client-specific - +
Filter-specific - +

Las BTE's, o Business Transaction Events son un tipo de extensión del sistema SAP. A diferencia de las BADI's,
únicamente se puede modificar código con las BTE's; no es posible modificar dynpros o menúes.
Las BTE's están basadas en Módulos de Funciones y Productos, a diferencia de las BADI's que están basadas en
objetos.
Al implementar una BTE, se debe crear una interfase para el módulo de funciones de la BTE. De esta manera, el
sistema leé una tabla Z y llama dinámicamente la función implementada por el cliente.
Existe 2 tipos de interfases:
- Interfases de Publicación y Suscripción
- Interfases de Proceso

Las interfases de Publicación y Suscripción brindan información sobre eventos en particular, como la creación o la
modificación de un documento. Por otro lado, las interfases de proceso se utilizan para reemplazar la lógica
estándar de SAP por lógica de cliente.

En este link vas a encontrar más información acercar de las BTE's y todo lo relacionado con la programación
ABAP:

Business Transaction Events - BTE's

Capitulo 8
Business ADD-ins

101
• BADIs -> Tipo de ampliación implementada en Objetos.
Una BADI es una llamada en el código standard de SAP a métodos que no están
implementados. Cuando se crea una implementación de una BADI se crea la interfaz
del método y la clase que lo va a implementar.

Existen 3 tipos de BADIs -> Ampliación de programa


-> Ampliación de menú
-> Ampliación de pantalla

Pasos para utilizar una BADI


 Declarar una variable
Data : r_var type ref to ZIF_EX_PRUEBA,
 Llamar al método
CALL METHOD cl_exithandler=>get_instance pasándole como parámetro la
variable declarada.
 Llamar al método de la interfaz
CALL METHOD r_var->metodo

Definición de una BADI

 Entrar con la transacción SE18 ingresamos el nombre a la BADI y seteamos


sus atributos
 La BADI crea una clase con el siguiente formato
‘Z’ -> prefijo
‘CL_’ -> indica de que es una clase
‘EX_’ -> indica que la clase es de exit
<badi_name> -> nombre de la badi sin
Prefijo

ZCL_EX_<badi_name>

 En la solapa INTERFACE se crea la interfaz con los métodos que serán


implementados, la nomenclatura de la clase es
‘Z’ -> prefijo
‘IF_’ -> indica de que es una clase
‘EX_’ -> indica que la clase es de exit
<badi_name> -> nombre de la badi sin
Prefijo

ZIF_EX_<badi_name>

 Se definen los métodos y sus atributos. Si la BADI es filter-dependent se debe


definir un parámetro extra en todos los métodos FLT_VAL
 Entrar con la transacción SE19, colocamos el nombre a la implementación,
seleccionamos la badi que queremos implementar
 En la solapa INTERFACE se crea la clase con los métodos que para
implementados, la nomenclatura de la clase es ZIF_IM_<badi_name>
 Haciendo doble clic sobre el método se abrirá el editor de ABAP donde
deberemos implementar el método.

102
• En la definición el atributo MULTIPLE USE indica que pueden existir múltiples clases de
implementación. Las ampliación del tipo pantalla o menú NO pueden tener múltiples
implementaciones.

• Las ampliaciones de menú con BADIs se aplican igual que las ampliaciones con customers
exits, en el STATUS GUI de la pantalla debe estar declarado el function code con el formato
‘+<exit>’, y en el programa en la captura del OK_CODE debe estar contemplado la llamada
al método de la interfaz de la BADI.

• Solo se puede activar la implementación de una BADI desde el sistema original y luego
transportar la activación al resto de los sistemas.

• Las ampliaciones de pantalla con BADIs mantienen el mismo principio de customer exit, se
prepara un screen conteiner a la cual se le asignaran subscreen dinámicamente.
La comunicación entre la screen principal y la subscreen no se realiza en forma directa sino
que se maneja a través de una clase BADI.
Si una BADI contiene más de una ampliación de pantalla no puede tener marcado el atributo
de REUSABLE

• Cuando no haya implementación activa para una BADI se puede crear una implementación
por default, en la definición ir a GOTO -> DEFAULT CODE.

• La maquina virtual de ABAP no puede contener pantallas, solo los programas del tipo 1, F o
M. Cuando se crea una BADI de ampliación de pantalla se tiene en el programa el
contenedor para la screen, el problema es que el programa y la screen no se comunican
directamente, se deben crear métodos para la comunicación entre estos.

Las BADI's (Business ADd Ins) son un nuevo tipo de extensión al sistema SAP basado en ABAP
Objetcs. El objetivo de los mismos es cumplir con los requerimientos del cliente permitiendo
agregar nuevas funcionalidades dentro del código estándar de SAP.
De la misma manera que con los User Exit's, las BADI's tienen dos vistas: la de definición y la de
implementación. Mediante la transacción SE18 accedemos a la Definición de las BADI's. Allí se
puede ver las características de la misma: parámetros de entrada, salida, tipo de BADI, etc. En la
Implementación de la BADI, a la que se accede mediante la transacción SE19, se pueden ver todas
las implementaciones que existan de una BADI determinada.

La definición de las BADI's viene definida en el sistema estándar (muy pocas veces es necesario
crear una nueva definición para una BADI). En la definición se indica si la BADI es de
implementación simple (se puede utilizar sólo una vez, como los User Exits) o múltiple (pueden
existir varias implementaciones activas de la misma BADI en el mismo sistema). Además, se
pueden definir filtros para la ejecución de la misma permitiendo de esta forma tener diferentes
procesos para, por ejemplo, países diferentes. Esto le permite a SAP poder utilizar las BADI's para
realizar localizaciones del sistema; por eso es que el sistema estándar ya incluye varias
implementaciones de BADI's.

Mediante las implementaciones de BADI's también se pueden hacer aplicaciones para negocios
específicos (papeleras, petroleras, químicas, etc). Esto hace que las BADI's sean muy útiles. Esto es
así porque a diferencia de los User Exits las BADI's poseen una arquitectura Multicapa (SAP,
partners, soluciones de clientes, localizaciones, soluciones específicas para industrias, etc); los User

103
Exits son doble capa únicamente (SAP y soluciones de cliente).

En www.todoabap.com.ar van a encontrar métodos para encontrar las BADI's de una transacción o
programa.

Capitulo 9
Modifications

• Un objeto es original en un solo sistema, en el sistema de creación, en el resto son copias.


Esta regla aplica para objetos de SAP (sistema origen SAP) y los objetos propios del cliente.

• Los objetos creados por el usuario tienen origen en el sistema de desarrollo y al ser creados
se le asigna una orden de cambio del tipo DEVELOPMENT/CORRECTION. Esta orden
asegura que el objeto será enviado a los subsecuentes sistemas.

• El cambio de objetos originales se denomina CORRECTIONS y se le asigna a una orden de


cambio del tipo DEVELOPMENT/CORRECTION. En el caso de que se realicen cambios a
un objeto “copia” se denomina MODIFICATION y se asigna a una orden de cambio del tipo
REPAIR.

• Al modificar un objeto SAP se debe pedir autorización.


Objetos que están exentos de esta autorización
-> Matchcode
-> Database index
-> Buffer settings
-> Customer objects
-> Objetos de Customizing

La petición de autorización se realiza a través del OSS que


necesitara el PGMID, el tipo de objeto OBJ y el nombre del mismo. De esta
manera generara un número de autorización para ese objeto. La petición para modificar un
objeto es única, una vez “liberado” las siguientes modificaciones son libres.

• Al modificar el objeto el sistema pedirá asignarle una orden de cambio del tipo REPAIR.
Este tipo de orden tiene las siguientes funciones
-> Change Lock -> Luego de asignar la tarea, solo
el owner de esta puede modificarla.
-> Import Lock -> El objeto no podrá ser sobre
escrito en caso de un update.
-> Version Creation -> El sistema crea una copia
del objeto original y guarda las diferencias
del viejo objeto y el nuevo en la DB.

• Cualquier modificación a tablas pertenecientes a BASIS COMPONENTS se pierden al


momento de un upgrade del sistema.
• La herramienta de MODIFICATION ASSISTANT nos permiten realizar modificaciones en
forma ordenada. Lleva registro de cada modificación y permite volver atrás las
modificaciones hechas. Para que la herramienta este disponible se debe activar en el
application server la variable de sistema EU/CONTROLLED_MODIFICATION.

104
La herramienta permite ver un registro de todas las modificaciones que se realización
en el sistema separados por el tipo de modificación realizada.

• User exits se crearon principalmente para SD, son consideradas MODIFICATION. Tienen
una nomenclatura especial, USEREXIT_<name>. Utilizan variables globales y son
almacenados en includes especiales. Cuando SAP agrega un nuevo user exit este se guarda
en un nuevo include.
Son funciones ya creadas vacías a las cuales debemos poner nuestra lógica. Para
utilizar user exist se debe activar el parámetro ABAP/FIELDEXIT.

• No solo existen actualizaciones para R/3, SAP periódicamente manda correcciones al


sistema llamadas NOTES. Estas modificaciones se implementan utilizando la transacción
SNOTE.
Un conjunto de NOTES se denominan SUPPORT PACKAGE, funcionan como una
actualización conjunta y en un orden especifico.
Las notas o support package se implementan a través del note assistant (SNOTE) pero es
posible aplicarlas en forma manual a través del programa SCWN_REGISTER_NOTES.

• Luego una actualización es necesario volver a customizar algunas opciones que la


actualización modifica, para esto están las herramientas SPDD (Modificación de
diccionario) y SPAU (Objetos del repositorio).

• SPDD -> Esta transacción nos acomodar nuestros objetos modificados a los nuevos que SAP
instalo en la actualización, esta transacción se ocupa de los objetos del diccionario
(Domains, Data elements y tables).

• Todo ajuste luego de una modificación se debe transportar a los subsiguientes sistemas para
esto hay 2 tipos de ordenes de trasporte.

SPDD adjustment
SPAU adjustment

Cuando se transportan a otro sistema estos ajustes se almacenan, para


decidir cual se quiere implementar a esta fase se la llama ADJUSTCHK.

• Para evitar conflictos con los nombres entre los objetos del cliente y los de SAP se utiliza
una nomenclatura especial para diferenciarlos, pero entre los distintos objetos también, esta
nomenclatura se guarda en una vista del sistema V_TRESN.

105
Validaciones y substituciones

Las validaciones y sustituciones son eventos que se dispara en caso de crear o modificar documentos de FI.
(Únicamente FI).

Los programas que contienen los FORM son:


⇒ RGGBS000 → Sustitución
⇒ RGGBR000 → Validación

Estos programas son estándar y no pueden ser modificados. SAP recomienda que estos sean copiados a otro y
modificados.
Para decirle a SAP en que programa buscar los form se debe modificar la tabla T80D que es la que tiene
customizados los programas estándar.

106
Validaciones

Las validaciones se utilizan para chequear valores ingresados en documentos.


Para agregar una validación se modifica el programa ZRGGBR000 a la estructura exit una línea con nuestra
validación.

exits-name = 'U990'. → nombre del exit


exits-param = c_exit_param_none. → interfaz del exit exits-title = text-104. →
descripción del exit
APPEND exits.

El código de la validación se debe se pone en el mismo programa (ZRGGBR000).

FORM u990 USING bool_data TYPE gb002_015.


...
ENDFORM.

Tipo de interfaz

Existen 2 tipos de interfaz para los exit de validación.

→ C_EXIT_PARAM_NONE → Sin parámetros excepto B_RESULT


La variable B_RESULT puede devolver TRUE o FALSE que
indica el resultado de la validación.
→ C_EXIT_PARAM_CLASS → El parámetro es la estructura
BOOL_DATA. Esta estructura contiene la cabecera y las
posiciones del documento.

Customizing de validaciones

107
Para customizar una validación se ingresa a la transacción GGB0. Ahí encontraremos, los distintos
módulos en donde crear la validación dentro de FI.

Para crear una validación debemos pararnos el modulo que queremos y decidir si se ejecutar cuando
se modifica o crea una cabecera, por posición o por documento completo.
Dentro de las validaciones se crean pasos que son los encargados de ejecutar nuestro FORM de
validación.
Para que se ejecute un paso de validación este debe cumplir con la condición ingresada en la solapa
“Condición”.

108
En la solapa “Verif” se ingresa cual es el exit que se ejecutara para realizar la verificación.

109
En la solapa “Mensaje” se ingresa cual es el mensaje que se emitirá si el exit que realice la
validación. El resultado del exit depende de la variable B_RESULT. Se puede pasar variables a este
mensaje.

La transacción OB28 indica si la validación (no el paso dentro de este) esta activo o no.

110
Sustitución

Las validaciones se utilizan para cambiar el/los valores ingresados en documentos.


Para agregar una sustitución se modifica el programa ZRGGBS000 a la estructura exit una
línea con nuestra validación.

exits-name = 'U993'. → nombre del exit

111
exits-param = C_EXIT_PARAM_FIELD. → interfaz del exit exits-title = text-104. →
descripción del exit
APPEND exits.

El código de la validación se debe se pone en el mismo programa (ZRGGBS000).


(C_EXIT_PARAM_FIELD)
FORM u993 CHANGING p_zfbdt.
...
ENDFORM.

(C_EXIT_PARAM_CLASS)
FORM u994 USING bool_data TYPE gb002_015.
...
ENDFORM.

Tipo de interfaz

Existen 2 tipos de interfaz para los exit de validación.

→ C_EXIT_PARAM_NONE
→ C_EXIT_PARAM_FIELD → El parámetro es el campo que vamos a
sustituir.
→ C_EXIT_PARAM_CLASS → El parámetro es la estructura
BOOL_DATA. Esta estructura contiene la cabecera y las
posiciones del documento.

Customizing de validaciones

La transacción para customizar una sustitución es GGB1. Ahí encontraremos, los distintos módulos
en donde crear la validación dentro de FI.

Para crear una sustitución se selecciona en que tipo de evento se ejecutara la sustitución, por
cabecera, por posición o por documento completo.

112
Como en validaciones se debe crear un paso dentro de la sustitución. Cuando se crea un paso debe elegir
que campo debe sustituirse. Si se elige un campo este campo marcara la interfaz del FORM. Si se elige “Solo exit”,
la interfaz del form será la estructura BOOL_DATA.

Al elegir el campo a sustituir se mostrara que tipo de sustitución se realizara.

113
Valor constante -> Se modificara el campo por un valor const
Exit -> Se ejecutara un FORM de validación
Asignación campo-campo -> Se modificara un campo por otro.

En la solapa “Condición” se ingresara la condición que por la cual que se ejecutara o no la sustitución.

En la solapa “Sustitución” en caso de haber elegido el tipo EXIT se ingresara el nombre del exit que se
ejecutara.

114
La transacción OBBH indica si la sustitución (no el paso dentro de este) esta activo o no.

NOTA: Hay casos de que las sustituciones y validaciones creadas no aparecen en el customizing.
Existe un programa que regenera las validaciones y sustituciones, el programa es RGUGBR00

Se ingresa el area de aplicación y marcaran todas las opciones menos la ultima.


Este programa regenerara todos los FORM que se crearon.

115
116

Vous aimerez peut-être aussi