Está en la página 1de 41

DESARROLLOS ABAP CON SAP

NETWEAVER

1. INFORMACIÓN PREVIA...................................................................................................................... 2
2. DICCIONARIO DE DATOS – SE11 ....................................................................................................... 4
3. PROGRAMAS – SE38 ....................................................................................................................... 26
4. OBJETOS DE AUTORIZACIÓN ........................................................................................................... 41
5. MÓDULO DE FUNCIONES – SE37 .................................................................................................... 41
6. SERVICIOS WEB ............................................................................................................................... 41
7. QUERYS – SQ01 ............................................................................................................................... 41
8. SMARTFORMS ................................................................................................................................. 41
9. AMPLIACIONES................................................................................................................................ 41
1. INFORMACIÓN PREVIA

OBJETOS DE CLIENTE: Al crear un nuevo objeto en SAP ERP, este debe iniciar con la letra Z o Y.

ÓRDENES DE TRANSPORTE: Los objetos ABAP se transportan de un ambiente a otro mediante


órdenes del tipo WORKBENCH

- Crearemos una orden de transporte tipo WORKBENCH, ingresamos a la transacción


SE09/SE10 y hacemos clic en el ícono .
- Ingresamos la descripción breve y grabamos

- SAP nos crea una orden de transporte DEVK933989 y la tarea DEVK933990.

- De aquí en adelante, cuando creemos un objeto lo guardaremos en nuestra orden.


2. DICCIONARIO DE DATOS – SE11

2.1. ELEMENTO DE DATOS Y DOMINIOS

- DOMINIO: Un dominio es un objeto en SAP que describe los atributos técnicos de un campo, tales
como el tipo de datos, cantidad de posiciones del campo o rutinas de conversión.

Ejemplo Tipo de datos: STRING, CHAR, INT, DATS

Para crear un dominio ingresamos a la transacción SE11, indicando la opción “Domino” y el nombre
del dominio.

Crearemos el Domino ZID01

Ingresamos la descripción, Tipo de datos, cantidad de posiciones y grabamos .


Al grabar, nos pedirá un paquete. Ingresamos paquete ZABAP y guardamos.

Luego nos pide una orden de transporte, buscamos la que creamos anteriormente, haciendo clic
en .

Hacemos doble clic sobre nuestra orden


Confirmamos con

Por último, activamos el Dominio con el ícono .

(*) Los objetos que se crearán en adelante, se guardarán en la misma orden.

- ELEMENTO DE DATOS: Es un objeto SAP que puede contener un dominio o un tipo de datos y
define características como la denominación de un campo.

Para crear un elemento de datos, ingresamos a la transacción SE11, indicando la opción “Tipo de
Datos” y el nombre del elemento de datos.

Crearemos el elemento de datos ZID01


Luego, seleccionamos “Elem.datos”.

Ingresamos la descripción breve y en la pestaña “Tipo datos”, ingresamos el dominio que


creamos anteriormente.

En la pestaña “Denom.campo”, ingresamos la denominación que tendrá el campo, cuando se


muestre en DYNPROS o en reportes ALV.

Por último, grabamos y activamos .


2.2. CREAR TABLAS
Crearemos la tabla ZTPRUEBA_01, con los siguientes campos:

CAMPO ELEMENTO DE DATOS CAMPO CLAVE


MANDT MANDT X
ID ZID01 X
DESCRIPCION ZDESC01
PRECIO ZPREC01

*Crear elemento de datos ZDESC01 y dominio ZDESC01 con tipo de datos CHAR LONGITUD 50

*Crear elemento de datos ZPREC01 y dominio ZPREC01 con tipo de datos CURR LONGITUD 11 y 2
DECIMALES

Para crear una tabla ingresamos a la transacción SE11, indicando la opción “Tabla de base de datos”,
indicamos el nombre de la tabla que crearemos.

En la pestaña Entrega y actualización indicamos:

o Descripción breve
o Clase de entrega: Indica con que fin crearemos la tabla, para este caso, crearemos una
tabla “A” de datos maestros y de movimiento.
o Browser datos/Actual.vista tabla: Permite indicar si la tabla podrá ser actualizada por
el usuario.
Cuando creamos campos dentro de una tabla, tenemos que indicar el Tipo de Datos o Elemento de
datos.

Creamos los campos con sus respectivos elementos de datos, indicando los campos clave ID y
MANDT.

Luego grabamos .
A continuación, hacemos clic en e indicamos la Clase de datos y Categoría de
tamaño.

Luego grabamos .

Volvemos y luego vamos al menú DetallesCategoría de ampliación


Aceptamos el mensaje informativo.

Seleccionamos la segunda opción y luego

Para los campos de tipo precio (CURR), siempre se necesita como referencia un campo del tipo de
datos MONEDA.

Grabamos .

Por último, activamos .


Una vez que tengamos la tabla creada y activada, podemos ingresar registros usando la transacción

SE16, ingresando el nombre de la tabla y haciendo clic en el botón .

Ingresamos los datos y grabamos

Para visualizar el registro creados, volvemos y hacemos clic en el botón .


Para visualizar el registro, ejecutamos .

El mandante se graba automáticamente cuando creamos un nuevo registro.

De esta forma, sólo podemos crear registros de uno en uno

HOMEWORK N° 01
Crear la siguiente tabla:

CAMPO DESCRIPCIÓN TIPO DE DATOS CLAVE


MANDT MANDT X
IDPERSONA N° DE PERSONAL CHAR 10 X
NOMBRES NOMBRES CHAR 50
APELLIDOS APELLIDOS CHAR 50
EDAD EDAD INT
FECHA FECHA DE NACIMINETO DATUM
SUELDO SUELDO INT
* Para cada campo, crear su dominio y elemento de datos
* El campo mandante debe tener el Elemento de datos MANDT
2.3. CREAR VISTAS DE ACTUALIZACIÓN
Para poder tener una vista en la cual podamos actualizar varios registros de una tabla a la vez y de
manera más fácil, podemos crear una vista de actualización.

Una de las maneras de crear esta vista, es modificando la tabla mediante la transacción SE11.

Luego ir al menúGenerador actualiz.tab.


Ingresamos:
- Grupo de autorizaciones: &NC&
- Grupo de funciones: ZTPRUEBA_01
- Tipo de actualización: un nivel
- N° imagen actualización: 1
- Rutina de grabación: Rutina grabación individual o ninguna

Y hacemos clic en

Nos pedirá indicar un paquete más de una vez, así como nuestra orden de transporte.
Con esto, ya tenemos nuestra vista de actualización creada, ahora vamos a la transacción SM30,
ingresamos el nombre de nuestra tabla y actualizamos.

* La transacción SM30 es una transacción genérica, en la cual podemos actualizar cualquier tabla,
siempre y cuando tenga una vista de actualización.

Nos muestra el registro que creamos anteriormente.


Para ingresar nuevos registros, hacemos clic en

Ingresamos los registros que deseamos y grabamos .

*
* Los registros se graban en el ambiente (DEV, QAS, PRD) y mandante que los creamos.

* Si deseamos que, al momento de grabar los registros, además se graben en una orden de
transporte CUZTOMIZING para luego poder transportarlos a otro ambiente, debemos modificar la
rutina de grabación a “Rutina de grabación estándar”.
2.4. ASIGNAR TRANSACCIÓN A VISTA DE ACTUALIZACIÓN

Para asignar una transacción a una vista de actualización, ingresamos a la transacción SE93,
indicando el nombre de la transacción a crear.

Ingresamos el texto breve y seleccionamos Transacción con parámetros (transacción de parámetros).


Ingresamos las opciones tal como muestra la imagen y en Val.propuesta. Ingresamos el nombre de la
vista de actualización que creamos anteriormente.

Luego grabamos .

Finalmente, podremos ingresar a nuestra vista como una transacción normal.

HOMEWORK N° 02
Crear una vista de actualización para la tabla creada en el HOMEWORK 01
2.5. CREAR VISTAS DE BASE DE DATOS

Las vistas de base de datos nos ayudan a unir más de una tabla indicando sólo los campos que
queremos visualizar.

Crearemos una vista para listar los documentos de compra dentro de un rango de fechas, así como el
nombre de su respectivo proveedor.

Ingresamos a la transacción SE11

Las tablas involucradas son:


EKKO Documentos de compra
LFA1  Maestro de proveedores

Seleccionamos Vista base de datos y hacemos clic en Tomar.

La vista a crear contendrá los siguientes campos

CAMPO DESCRIPCIÓN
EKKO-EBELN N° documento de compra
EKKO-BUKRS Sociedad
EKKO-BEDAT Fecha Pedido
EKKO-BSTYP Tipo documento de compras
EKKO-BSART Clase documento de compras
EKKO-LIFNR N° Proveedor
LFA1-NAME1 Nombre proveedor
LFA1-NAME2 Apellido
Ingresamos una descripción breve, luego en la sección tablas, indicamos las tablas que vamos a unir
en nuestra vista y al lado derecho los campos por los que se relacionarán las 2 tablas.

Los 6 primeros campos se encuentran en la tabla EKKO, pero el nombre del proveedor se encuentra
en la tabla LFA1.

La relación entre la tabla EKKO y la LFA1 es el campo LIFNR (código de proveedor)

En la pestaña Cpo.vista definimos los campos que se serán visibles en nuestra vista, indicando el el
nombre de nuestro campo, la tabla a la que pertenece y el campo de la tabla de referencia.

Por último, guardamos

Para ver el resultado de nuestra vista, podemos usar la transacción SE16 o SE16N.
2.6. AYUDA DE BÚSQUEDA

Para crear una ayuda de búsqueda, iremos a la transacción SE11, opción Ayuda p.búsqueda e indicar
el nombre de la ayuda.

Seleccionamos la primera opción.

Primero indicamos la descripción breve, luego en método de selección, elegimos “Buscar tablas de
base de datos” e ingresamos nuestra tabla creada anteriormente.
Luego elegimos tipo de diálogo D y finalmente indicamos los campos que se mostrarán en la ayuda
de búsqueda.

Finalmente, grabamos y activamos

Ahora asignamos la ayuda de búsqueda a nuestra tabla, para ello volvemos a la transacción SE11 e
ingresamos a modificar nuestra tabla.

Seleccionamos el campo ID, hacemos clic en e ingresamos el nombre de nuestra


ayuda de búsqueda.
Luego clic en tomar

Finalmente, grabamos y activamos

Para probar el funcionamiento, vamos a la transacción SE16 O SE16, ingresamos nuestra tabla y
listamos los datos.
Cuando situamos el cursor en el campo ID aparece un ícono, que es la ayuda de búsqueda le
hacemos clic o presionamos F4.

Nos muestra la ayuda de búsqueda

* La ayuda de búsqueda que creamos la podemos asignar más de una vez.


3. PROGRAMAS – SE38

3.1. EVENTOS DE UN PROGRAMA

LOAD-OF-PROGRAM
Código que se ejecuta cuando se carga el programa.

INITIALIZATION
Normalmente se inicializan variables de la pantalla de selección.

AT SELECTION-SCREEN OUTPUT
Se usa para validar todos datos de la pantalla de selección.

AT SELECTION-SCREEN ON FIELD
Se usa para validar un solo parámetro de la pantalla de selección.

AT SELECTION-SCREEN ON VALUE REQUEST


A veces queremos utilizar una ayuda de búsqueda diferente a la que tenga por defecto un parámetro.
O tal vez no tenga una y tengamos que hacerla nosotros.

AT SELECTION-SCREEN ON HELP REQUEST


Lo mismo que el punto anterior, pero para mostrar una ayuda diferente o nueva cuando pulsas F1 en
un campo de la pantalla de selección.

AT SELECTION-SCREEN
También usado para validar parámetros de la pantalla de selección.

START-OF-SELECTION
En este evento se implementa toda la lógica de negocio. Lo que sería la selección de datos y su
procesamiento.

END-OF-SELECTION
Se utiliza para indicar que ha finalizado el bloque de "START-OF-SELECTION".

TOP-OF-PAGE Y END-OF-PAGE
En programas que utilizan la sentencia WRITE, se usa para mostrar un encabezado o un pie de
página.
EJEMPLO 1:

Para crear un programa ingresamos a la transacción SE38 e ingresamos un nombre para nuestro
programa.

Indicamos el título del programa y en Tipo elegimos “Programa ejecutable”, luego


Ahora ingresamos el siguiente código:

DATA: LV_NUM1 TYPE I,


LV_NUM2 TYPE I,
LV_TOTAL TYPE I.

START-OF-SELECTION.

LV_NUM1 = 5.
LV_NUM2 = 4.
LV_TOTAL = LV_NUM1 + LV_NUM2.

END-OF-SELECTION.
WRITE: 'TOTAL:'.
WRITE LV_TOTAL.

Explicación del código:

Con la sentencia DATA, declaramos las variables que usaremos en nuestro programa indicando su tipo
de datos, para este ejemplo declaramos 3 variables de tipo entero.

En el evento START-OF-SELECTION, contendrá nuestra lógica. Para este ejemplo, asignamos un


valor a las variables LV_NUM1 y LV_NUM2, para luego sumarlas y almacenar el resultado en la variable
LV_TOTAL.

En el evento END-OF-SELECTION, mostramos en pantalla el valor de la variable LV_TOTAL,


usando la sentencia WRITE.

Luego de escribir el código del programa, grabamos y activamos .

Para ejecutar el programa, volvemos a la pantalla inicial de la transacción SE38 y usamos el ícono
Resultado:

EJEMPLO 2:

En este ejemplo usaremos parámetros de ingreso.

PARAMETERS: P_NUM1 TYPE I,


P_NUM2 TYPE I.

DATA: LV_TOTAL TYPE I.

START-OF-SELECTION.

LV_TOTAL = P_NUM1 + P_NUM2.

END-OF-SELECTION.

WRITE: 'TOTAL:'.
WRITE: LV_TOTAL.
Explicación del código:

Con la sentencia PARAMETERS, definimos los parámetros de entrada, para es ejemplo definimos 2
parámetros de tipo entero.

Con la sentencia DATA, declaramos las variables que usaremos en nuestro programa indicando su tipo
de datos, para este ejemplo definimos la variable que almacenará el resultado de la operación de los 2
parámetros.

En el evento START-OF-SELECTION, contendrá nuestra lógica. Sumamos los parámetros P_NUM1


y P_NUM2 en la variable LV_TOTAL.

En el evento END-OF-SELECTION, mostramos en pantalla el valor de la variable LV_TOTAL,


usando la sentencia WRITE.

Luego de escribir el código del programa, grabamos y activamos .

Para ejecutar el programa, volvemos a la pantalla inicial de la transacción SE38 y usamos el ícono

Resultado:

Ingresamos valores a nuestros parámetros y ejecutamos .


EJEMPLO 3:

En este ejemplo veremos la sentencia condicional IF.

PARAMETERS: P_NUM1 TYPE I,


P_NUM2 TYPE I,
R_SUMA RADIOBUTTON GROUP G1,
R_RESTA RADIOBUTTON GROUP G1.

DATA: LV_TOTAL TYPE I.

START-OF-SELECTION.

IF R_SUMA = 'X'.
LV_TOTAL = P_NUM1 + P_NUM2.
ELSEIF R_RESTA = 'X'.
LV_TOTAL = P_NUM1 - P_NUM2.
ENDIF.

END-OF-SELECTION.

WRITE: 'TOTAL:'.
WRITE: LV_TOTAL.

Explicación del código:

Con la sentencia PARAMETERS, definimos los parámetros de entrada, para es ejemplo definimos 2
parámetros de tipo entero. También definimos 2 parámetros de tipo radio, indicándoles que
pertenecerán al mismo grupo G1.

Con la sentencia DATA, declaramos las variables que usaremos en nuestro programa indicando su tipo
de datos, para este ejemplo definimos la variable que almacenará el resultado de la operación de los 2
parámetros.

En el evento START-OF-SELECTION, contendrá nuestra lógica. Utilizamos la sentencia IF para


preguntar si la variable R_SUMA fue marcada, si fue marcada entonces realizamos una suma entre
P_NUM1 y P_NUM2, de lo contrario se realiza la resta.

En el evento END-OF-SELECTION, mostramos en pantalla el valor de la variable LV_TOTAL,


usando la sentencia WRITE.

Luego de escribir el código del programa, grabamos y activamos .

Para ejecutar el programa, volvemos a la pantalla inicial de la transacción SE38 y usamos el ícono
Resultado:

Ingresamos los 2 valores, marcamos el parámetro suma y ejecutamos .

Ahora lo contrario, ingresamos los 2 valores, marcamos el parámetro resta y ejecutamos .


* Para estilizar un poco nuestro programa, podemos agregar un bloque (líneas en amarrillo), luego
grabamos y activamos.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.

PARAMETERS: P_NUM1 TYPE I,


P_NUM2 TYPE I,
R_SUMA RADIOBUTTON GROUP G1,
R_RESTA RADIOBUTTON GROUP G1.
SELECTION-SCREEN END OF BLOCK B1.

DATA: LV_TOTAL TYPE I.

START-OF-SELECTION.

IF R_SUMA = 'X'.
LV_TOTAL = P_NUM1 + P_NUM2.
ELSEIF R_RESTA = 'X'.
LV_TOTAL = P_NUM1 - P_NUM2.
ENDIF.

END-OF-SELECTION.

WRITE: 'TOTAL:'.
WRITE: LV_TOTAL.

Luego hacemos doble clic sobre TEXT-001 y confirmamos diciendo que queremos crear el objeto.
Ingresamos el texto “Parámetros de selección”, luego guardamos y activamos .

* Aceptamos los mensajes informativos que aparezcan.

Volvemos a ejecutar el programa y observamos que ya tiene un bloque con el texto que ingresamos.

Ahora renombraremos los parámetros con nombre más amigables, para eso vamos al programa,
luego al MenúPasar aElementos de textoTextos de selección.
Ingresamos descripciones para los parámetros, grabamos y activamos .

Luego, volvemos a nuestro programa y ejecutamos . Observamos que ahora se muestra un


programa más intuitivo.
EJEMPLO 4:

********************************************************
*************Pantalla de selección**********************
********************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS : p_num TYPE i.
SELECTION-SCREEN END OF BLOCK b1.

********************************************************
*************Tipos y Tablas*****************************
********************************************************
TYPES: BEGIN OF gy_tabla,
campo01 TYPE char20,
campo02 TYPE char20,
campo03 TYPE char20,
END OF gy_tabla.

DATA: lt_tabla TYPE STANDARD TABLE OF gy_tabla.

********************************************************
*************Variables Globales*************************
********************************************************
DATA: lv_01 TYPE char2.
********************************************************
******************Field Symbols*************************
********************************************************
FIELD-SYMBOLS: <fs_tabla> LIKE LINE OF lt_tabla.

START-OF-SELECTION.

DO p_num TIMES.
lv_01 = sy-index.
APPEND INITIAL LINE TO lt_tabla ASSIGNING <fs_tabla>.
CONCATENATE 'PRIMER CAMPO' lv_01 INTO <fs_tabla>-
campo01 SEPARATED BY space.
CONCATENATE 'SEGUNDO CAMPO' lv_01 INTO <fs_tabla>-
campo02 SEPARATED BY space.
CONCATENATE 'TERCER CAMPO' lv_01 INTO <fs_tabla>-
campo03 SEPARATED BY space.
ENDDO.
END-OF-SELECTION.

uline.
LOOP AT lt_tabla ASSIGNING <fs_tabla>.
WRITE: <fs_tabla>-campo01.
WRITE: '|'.
WRITE: <fs_tabla>-campo02.
WRITE: '|'.
WRITE: <fs_tabla>-campo03.
WRITE: /.
ENDLOOP.
EJEMPLO 5:

En este ejemplo realizaremos una consulta a una tabla y la selección de datos la guardaremos en una
tabla interna, finalmente mostraremos los datos en pantalla.

*TABLAS
TABLES: ZTPRUEBA_01.

*DEFINICIÓN TIPOS
TYPES: BEGIN OF LTY_TABLA01,
ID TYPE ZID01,
DESCRIPCION TYPE ZDESC01,
PRECIO TYPE ZPREC01,
END OF LTY_TABLA01.

*DEFINICIÓN TABLAS INTERNAS


DATA: GT_TABLA01 TYPE STANDARD TABLE OF LTY_TABLA01.

*FIELD SYMBOLS
FIELD-SYMBOLS: <FS_TABLA> LIKE LINE OF GT_TABLA01.

*PARÁMETROS DE SELECCIÓN
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: S_ID FOR ZTPRUEBA_01-ID.
SELECTION-SCREEN END OF BLOCK B1.

START-OF-SELECTION.

SELECT ID DESCRIPCION PRECIO INTO TABLE GT_TABLA01


FROM ZTPRUEBA_01
WHERE ID IN S_ID.

END-OF-SELECTION.

LOOP AT GT_TABLA01 ASSIGNING <FS_TABLA>.


WRITE: <FS_TABLA>-ID,
'|',
<FS_TABLA>-DESCRIPCION,
'|',
<FS_TABLA>-PRECIO.
WRITE: /.
ENDLOOP.
Explicación del código:

Con la sentencia PARAMETERS, definimos los parámetros de entrada, para es ejemplo definimos 2
parámetros de tipo entero. También definimos 2 parámetros de tipo radio, indicándoles que
pertenecerán al mismo grupo G1.

Con la sentencia DATA, declaramos las variables que usaremos en nuestro programa indicando su tipo
de datos, para este ejemplo definimos la variable que almacenará el resultado de la operación de los 2
parámetros.

En el evento START-OF-SELECTION, contendrá nuestra lógica. Utilizamos la sentencia SELECT para


consultar los campos ID, DESCRIPCIÓN y PRECIO de la tabla ZTPRUEBA_01 y los almacenamos en
la tabla interna GT_TABLA01.

En el evento END-OF-SELECTION, recorremos la tabla interna con la sentencia LOOP los valores
seleccionados, usando la sentencia WRITE.

Luego de escribir el código del programa, grabamos y activamos .

Para ejecutar el programa, volvemos a la pantalla inicial de la transacción SE38 y usamos el ícono

HOMEWORK N° 03
Crear un programa que muestre los datos de la tabla creada en el HOMEWORK N° 01. Debe
tener como parámetro de selección, el número de personal. (tomar como ejemplo el programa
anterior).

Se deben mostrar los siguientes campos en pantalla:

N° DE PERSONAL
NOMBRES
APELLIDOS
EDAD
FECHA DE NACIMINETO
SUELDO
3.2. CARGA DESCARGA
En este ejemplo realizaremos la carga de un archivo TXT a una tabla Z y luego realizaremos la
descarga de los datos de la tabla Z en un archivo TXT.

Para esto usaremos la clase CL_GUI_FRONTEND_SERVICES

Usaremos el siguiente archivo para cargar los datos en el programa de CARGA.

CÓDIGO FUENTE DE PROGRMA CARGA DE ARCHIVO

CÓDIGO FUENTE DE PROGRAMA DESCARGA DE ARCHIVO


3.3. CREAR ALV

*TABLAS
TABLES: ZTPRUEBA_01.

*DEFINICIÓN TIPOS
TYPES: BEGIN OF LTY_TABLA01,
ID TYPE ZID01,
DESCRIPCION TYPE ZDESC01,
PRECIO TYPE ZPREC01,
END OF LTY_TABLA01.

*DEFINICIÓN TABLAS INTERNAS


DATA: GT_TABLA01 TYPE STANDARD TABLE OF LTY_TABLA01,

LR_ALV TYPE REF TO CL_SALV_TABLE,


FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS_LIST.

*FIELD SYMBOLS
FIELD-SYMBOLS: <FS_TABLA> LIKE LINE OF GT_TABLA01.

*PARÁMETROS DE SELECCIÓN
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-
001.
SELECT-OPTIONS: S_ID FOR ZTPRUEBA_01-ID.
SELECTION-SCREEN END OF BLOCK B1.

START-OF-SELECTION.

SELECT ID DESCRIPCION PRECIO INTO TABLE GT_TABLA01


FROM ZTPRUEBA_01
WHERE ID IN S_ID.

END-OF-SELECTION.

CALL METHOD CL_SALV_TABLE=>FACTORY


IMPORTING
R_SALV_TABLE = LR_ALV
CHANGING
T_TABLE = GT_TABLA01.

FUNCTIONS = LR_ALV->GET_FUNCTIONS( ).
FUNCTIONS->SET_ALL( ).

LR_ALV->DISPLAY( ).
3.4. DEPURAR (DEBUG)

4. OBJETOS DE AUTORIZACIÓN
5. MÓDULO DE FUNCIONES – SE37
6. SERVICIOS WEB
6.1. EXPONER SERVICIO WEB
6.2. CONSUMIR SERVICIO WEB

7. QUERYS – SQ01
7.1. CREAR QUERY
7.2. ASIGNAR TRANSACIÓN A QUERY

8. SMARTFORMS
8.1. CREAR SMARTFORM
8.2. DEPURAR SMARTFORM (DEBUG)

9. AMPLIACIONES