Está en la página 1de 8

Subrutinas

Existen 2 tipos de subrutinas: internas (el código de la subrutina está dentro del programa que la
llama) y externas (la subrutina está en un programa distinto al llamante). Las subrutinas se codifican
al final del programa principal, tras todos los eventos. No se pueden anidar. Se puede salir de una
subrutina con un EXIT (salida incondicional) o un CHECK (salida condicional), si estas sentencias no
están dentro de un bucle. Sólo dentro de una subrutina se puede usarse la sentencia LOCAL campo,
para declarar variables locales a la subrutina (sólo visibles dentro de ella). Deja oculto el valor de ese
campo que tuviera antes de entrar a la subrutina, y lo restaura al salir de ésta.

• Sintaxis de declaración: (igual para subrutinas internas y externas)

FORM nombre [ parámetros ].

bloque.

ENDFORM.

• Sintaxis de la llamada:
o Llamada a una subrutina interna: PERFORM nombre [ parámetros ].
o Llamada a una subrutina externa: PERFORM name (programa) [ paráms ] [
IF FOUND ].
En este caso se debe indicar el programa en el cual se encuentra la subrutina llamada.
Con IF FOUND, si la subrutina no existe, la sentencia PERFORM es ignorada y no se
genera error.
o Llamada dinámica: PERFORM (var) [ IN PROGRAM (var2) ] [ parám ] [ IF
FOUND ].
Se llama a la subrutina cuyo nombre está contenido en el campo o variable ‘var’. Se
puede indicar opcionalmente el nombre del programa donde está (así vale para
subrutinas internas y externas), en el campo o variable ‘var2’. IF FOUND es igual que
antes.
o Llamada a partir de una lista: PERFORM índice OF subrutina1 subrutina2 ...
subrutinaN.
El sistema ejecuta la subrutina que ocupe la posición especificada en ‘índice’ (literal o
variable), de la lista dada de subrutinas. Con esto sólo se puede llamar a subrutinas
internas.
• Parámetros formales:

FORM nombre [ TABLES lista_tablas ] [ USING lista_var ] [ CHANGING lista_var ][


TYPE ... | LIKE ... ].

Las distintas opciones deben escribirse en este mismo orden. Los parámetros formales de una
subrutina interna pueden ser cualesquiera variables declaradas en el llamante (no las
variables locales internas a la subrutina), pues son visibles. Por esa misma razón ni siquiera
es necesario declarar esos parámetros formales. En cambio en las subrutinas externas sí es
necesario pues esas variables no serán visibles directamente. Usando parámetros ya no es
necesario declarar un COMMON PART en el llamante y llamado para pasar valores a una
subrutina externa.

Las variables de USING y CHANGING pueden ser de cualquier tipo, mientras que las de
TABLES deben ser tablas internas (con o sin área de trabajo). Por tanto, con CHANGING y
USING pueden pasarse también tablas, pero hay que pasar explícitamente la estructura de la
misma (por ejemplo con un LIKE) para poder referenciar luego a sus campos.
Ejemplo:

PERFORM nombre CHANGING itabla.

FORM nombre CHANGING ztabla LIKE itabla.



ENDFORM.

• Parámetros actuales:

PERFORM nombre [(prog)] [ TABLES lista_tablas ] [ USING lista_var ][ CHANGING


lista_var ].

• Paso de parámetros:Hay 3 formas de pasar datos (parámetros) a una subrutina:


o Paso por valor: El parámetro formal y el actual ocupan posiciones de
memoria distintas, es una copia, con lo que su valor no puede ser modificado por la
subrutina. Sólo se puede usar en USING con la opción VALUE.
o Paso por referencia: El parámetro formal y el actual ocupan la misma
posición de memoria, con lo que su valor puede ser modificado por la subrutina. Se
pasa la dirección del parámetro, no una copia. Se puede usar en TABLES, USING y
CHANGING.
Ejemplos:

PERFORM fecha_fin_mes USING fedat.

PERFORM load TABLES itab USING zcampo zfile.

• Paso por valor y resultado: El parámetro formal y el actual ocupan


posiciones de memoria distintas (se pasa una copia), pero su valor puede ser
modificado por la subrutina (sólo si ésta termina incorrectamente y por tanto
se lanza algún mensaje. En otro caso el parámetro no se modifica). Sólo se
puede usar en CHANGING con VALUE.
Crear subrutinas en Function Group . SE80 Object Navigator
Código de las funciones
FUNCTION-POOL Z_FUNCIONES_PROPIAS. "MESSAGE-ID ..

*&---------------------------------------------------------------------*
*& Form z_mensaje_aviso
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form z_mensaje_aviso using Mensaje Type string .
"mensaje de aviso
MESSAGE Mensaje TYPE 'W'.
endform. " z_mensaje_aviso

*&---------------------------------------------------------------------*
*& Form Z_Mensaje_Dump
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form Z_Mensaje_Dump using Mensaje Type string .
"mensaje que provoca la finalización del programa y muestra un mensaje de dump
MESSAGE Mensaje TYPE 'X'.
endform. " Z_Mensaje_Dump
*&---------------------------------------------------------------------*
*& Form z_mensaje_informacion
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form z_mensaje_informacion using Mensaje Type string.
"mensaje de aviso - se muestra al final de la pantalla
MESSAGE Mensaje TYPE 'S'.
endform. " z_mensaje_información

*&---------------------------------------------------------------------*
*& Form z_mensaje_Error
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form z_mensaje_Error using Mensaje Type string.
"mensaje de error - se muestra al final de la pantalla
MESSAGE Mensaje TYPE 'E'.

endform. " z_mensaje_Error

*&---------------------------------------------------------------------*
*& Form z_mensaje_stop
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form z_mensaje_stop using Mensaje Type string.
" mensaje de stop
MESSAGE Mensaje TYPE 'A'.

endform. " z_mensaje_stop


Programa para llamar a una subrutina de un function group
*&---------------------------------------------------------------------*
*& Report Z_SELECTION_SCREEN
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT Z_SELECTION_SCREEN.
DATA Campo1(30).
*---------------------------------------------------------------------------------*
* evento de inicialización *
*Se ejecuta siempre antes de que aparezca la pantalla de selección, una sola vez. *
* Se usa para inicializar parámetros y criterios de selección. *
*---------------------------------------------------------------------------------*
INITIALIZATION.
* enviar mensaje de información al usuario - se muestra en la parte baja de la pantalla *
"MESSAGE 'INICIO APLICACIÓN- Evento Inicialización' TYPE 'I'.

SELECT-OPTIONS Opcion1 FOR Campo1.

SELECTION-SCREEN BEGIN OF BLOCK Bloque1.


PARAMETERS: TEST1(10),
TEST2(10).
SELECTION-SCREEN END OF BLOCK Bloque1.

PARAMETERS: R1 RADIOBUTTON GROUP RD1 DEFAULT 'X',


R2 RADIOBUTTON GROUP RD1.

*===================================================================================*
* EVENTO *
*Bloque de proceso que se ejecutará tras procesar la pantalla de selección *
*(después de INITIALIZATION), y antes de acceder a las tablas de la base de datos *
*lógica, para empezar a escribir la salida (normalmente un programa Abap hará uso de*
*una o más bases de datos lógicas, que son programas estándar que acceden las tablas*
*SAP de forma simple yjerárquica). En este evento tiene lugar la selección de datos *
*por parte del usuario.Evento por defecto *
*===================================================================================*
START-OF-SELECTION.

*===================================================================================*
* EVENTO *
*Se activa tras procesar todas las tablas de la base de datos lógica (que se acceden*
*en/con el evento GET), o tras finalizar elSTART-OF-SELECTION si no se usan éstas. *
*===================================================================================*
END-OF-SELECTION.

* llamada a una subrutina *


PERForm Nombre_Rutina.

*===================================================================================*
* Evento-Llama al programa de la base de datos lógica, y devuelve la entrada leída *
*de la tabla especificada. Con LATE, GET se activa cuando se han procesado todas *
*las tablas jerárquicamente inferiores a la dada (las tablas se organizan en árbol,*
*y se van recorriendo pasando por ellas hasta alcanzar el dato a leer). SinLATE,GET*
*se dispara al leer la primera tabla; conLATEespera a recorrer la rama del árbol de*
*tablas. SinFIELDS se leen todos los campos; conFIELDS sólo se leen los campos *
*especificados, aparte de los clave. *
*===================================================================================*
*GET nombre_tabla [ LATE ] [ FIELDS c1 c2 ...].

*===================================================================================*
* EVENTO *
*Se activa justo antes de imprimir la página actual (antes del primerWRITE). Sirve *
*para escribir cabeceras de páginas y títulos. Se ejecuta antes de la primera línea *
*de cada página. Sin la opción DURING LINE-SELECTION, se activa sólo en el informe *
*básico; con esta opción, se activa además en los informes secundarios. La sentencia*
*END-OF-PAGEno activa este evento, pero NEW-PAGE sí lo activa. *
*===================================================================================*
"TOP-OF-PAGE [ DURING LINE-SELECTION ].

*===================================================================================*
* EVENTO *
*Se activa si se alcanza el área de la página reservada para este evento (con la *
*opción LINE-COUNT en PROGRAM o REPORT) al final de la página; si no hay área *
*definida, no se activa el evento. Con RESERVE n LINES se reservan n líneas al final*
*de la página para escribir el pie de página. La sentencia NEW-PAGEno activa este *
*evento. *
*===================================================================================*
END-OF-PAGE.

*===================================================================================*
* EVENTO *
*Bloque de proceso que se activa mientras se procesa la pantalla de selección,o bien*
*después de ésta (PAI). Según sus parámetros, se activará cuando el usuario realice *
*cierta acción en la pantalla de selección, como dar valor a un SELECT-OPTIONS. Por *
*tanto, se usa para controlar los datos que introduce el usuario, y sólo tiene *
*sentido en reports. Parámetros: ON RADIOBUTTON GROUP grupo, ON criterio_selección, *
*ONBLOCK bloque, ON END OF criterio_ selección, ON VALUE REQUEST FOR *
*criterio_selección, ON OUTPUT(se ejecuta el evento cada vez que se pulse Enter en *
*la pantalla de selección, mientras que el evento INITIALIZATION sólo se ejecuta una*
* vez, esa es la diferencia). *
*===================================================================================*
AT SELECTION-SCREEN.

* ===============================================================================*
*Los listados interactivos se muestran igual por pantalla que los normales (la *
*lista básica. Se puede usar un modelo estándar de listado, y adaptarlo a cada *
*report concreto), salvo que en ellos el usuario puede lanzar una(s) lista(s) *
*secundaria(s) en función del (los) evento(s) que active. La lista secundaria *
*machaca en pantalla la lista primera. Pueden generarse como mucho 20 nuevos *
*listados, salvo que se use la sentencia WINDOW para crear una ventana nueva *
*para el nuevo listado. Sentencias o eventos propias de estos listados: *
*================================================================================*

*=================================================================================*
* Evento *
*Para reports interactivos: el usuario puede seleccionar elementos de la lista *
*mostrada. Se activa si el usuario selecciona (pick-up: doble clic) una línea del *
*informe (generada por WRITE, ULINE, SKIP, ... Pueden incluso seleccionarse líneas*
*en blanco o válidas: el programa debe discriminarlas), y sólo tras mostrar el *
*informe básico, o bien pulsando F2 o por menú Edit # Choose. Se usa para ver *
* información asociada al elemento seleccionado. *
*=================================================================================*
AT LINE-SELECTION.
*===================================================================================*
* Evento *
*Se activa al ser pulsada la tecla de función Fn especificada (n va de 0 a 99), y *
*sólo tras mostrar el informe básico. Sin crear un status específico, se pueden usar*
* las funciones Fn que no estén ya predefinidas (como son F1 para la ayuda o F3 para*
*back); el código de la tecla Fn pulsada se guarda en SY-UCOMM. Pero este evento *
*debería usarse sólo para probar el programa; para su versión final usar *
*AT USER-COMMAND. *
*===================================================================================*
AT PF04.

*===================================================================================*
* EVENTO *
* Se procesa si el usuario activa un comando, asociado a un icono, botón o elemento *
* de menú, en un status específico, y sólo tras mostrar el informe básico. Una vez *
* disparado el evento es cuando se puede decidir qué comando se ha pulsado, *
*consultando el campo del sistema SY-UCOMM. *
*===================================================================================*
AT USER-COMMAND.

*-------------------------------------------*
* Inicio subrutina *
*-------------------------------------------*
FORM Nombre_Rutina.
DATA Mensaje Type string.

Mensaje = 'Prueba mensaje'.

" Llamar a una subrutina situada en un modulo de funciones


PERFORM Z_MENSAJE_AVISO(SAPFUNCIONES_PROPIAS) USING Mensaje.

ENDFORM.

*al nombre del grupo de funciones se añade el prefijo SAP.

También podría gustarte