Sunteți pe pagina 1din 12

1|

Qu son las subrutinas?

Las subrutinas son secciones de cdigo que pueden ser utilizadas ms


de una vez. La idea de pasar el cdigo de los programas a subrutinas,
es para que los programas sean ms fciles de leer y de mantener.
MODULARIZAR. Se llama as a la accin de pasar el cdigo de un
programa a subrutinas, para mejorar la lectura y mantenimiento
del mismo. Lo ideal es que una subrutina no tenga ms de 50
lneas de cdigo.
La modularizacin ayuda a encontrar ms fcilmente los errores en
los programas. Esto se debe a que al debaguear un programa solo
me preocupo por que el resultado de una subrutina sea el esperado
sin entrar en detalle de como se llega a ese resultado.
Una subrutina se declara con la palabra reservada PERFORM seguida del
nombre de la subrutina. Veamos un ejemplo:

Aqu creamos una subrutina para modularizar la seleccin de los datos.


Si hacemos doble click en el nombre de la subrutina, el sistema nos
propondr crear la subrutina en la siguiente ventana de dilogo:

Contestaremos que s y el sistema nos preguntar donde queremos


guardar la subrutina, las opciones son: crear un nuevo include de datos
o crearlas en el mismo programa de control. En este caso, las
crearemos en el programa de control.
Luego el sistema generar el siguiente bloque de cdigo en nuestro
programa para que lo completemos con el cdigo que corresponda:

Es importante que el nombre que se le asigne a una subrutina


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

2|

Tipos de subrutinas

Existen dos tipos de subrutinas:


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

3|

Subrutinas internas

Como vimos en el ejemplo del punto 1, para crear una subrutina


interna usamos la palabra clave PERFORM seguida del nombre de la
subrutina. Esto crea un bloque FORM-ENDFORM donde colocamos
nuestro cdigo.
Se pueden pasar datos entre los programas principales y una subrutina
a travs de parmetros. A los parmetros definidos en el programa
principal, a la derecha de la palabra PERFORM se los llama parmetros
actuales. A los parmetros definidos en la subrutina, a la derecha de la
palabra FORM, se los llama parmetros formales.
Los parmetros pueden ser de tres tipos:

De entrada: cuando se utilizan para pasar datos del programa


principal a la subrutina.
De salida: cuando se utilizan para pasar datos de la subrutina al
programa principal.
De entrada y salida: cuando se utilizan para pasar datos de la
subrutina al programa principal y tambin viceversa.

4|

Paso de parmetros a subrutinas

Para pasar los parmetros utilizaremos tres opciones: USING,


CHANGING y TABLES. Estas opciones se deben escribir en el orden
que mostramos a continuacin en el siguiente grfico:

En el bloque FORM-ENDFORM debemos especificar el tipo de los


parmetros formales. De esta forma nos aseguramos que solo se pasen
parmetros del tipo que corresponde a la subrutina. Veamos un
ejemplo donde pasamos una tabla interna, una estructura y una
variable de tipo carcter.

Cuando una subrutina es llamada, los parmetros deben ser


pasados en el mismo orden en el que fueron declarados, por lo

tanto, se debe respetar esta misma secuencia en el bloque


FORM-ENDFORM.

Existen tres formas de pasar parmetros:


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

Y la salida ser B.

Paso por referencia: durante la llamada a la subrutina, solo la


direccin de los parmetros actuales se transfieren a los parmetros
formales. Dentro de la subrutina, se trabaja con el campo del programa
que hace la llamada. Si cambiamos los parmetros formales, el
contenido del campo del programa que hace la llamada tambin
cambia.

Y la salida ser A B y A X.

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


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

Y la salida ser H1 es: B.

5|

Subrutinas externas

Si quisiramos llamar a una subrutina que est en un programa


distinto al que estamos procesando, debemos utilizar la siguiente
sintaxis

Tambin podemos agregar includes de subrutinas a nuestro programa


de la siguiente manera:

Codigo fuennte del ejemplo


*&--------------------------------------------------------------------*
*& Report zprueba_abap_4_1
*&
*&--------------------------------------------------------------------*
REPORT zprueba_abap_4_1.
DATA: ti_vuelos LIKE STANDARD TABLE OF sflight,
st_vuelos LIKE LINE OF ti_vuelos,
v_flag
TYPE sy-subrc.
* Procesar los datos de entrada
PERFORM procesar_datos TABLES
ti_vuelos
USING
st_vuelos
CHANGING v_flag.
**********************************************************************
**
*** Paso de parametros por valor
***************************************
**********************************************************************
**
DATA: v_f1(1) TYPE c VALUE 'B'.
PERFORM paso_por_valor USING v_f1.
WRITE v_f1.
**********************************************************************
***
**** Paso de parametros por referencia
**********************************

**********************************************************************
***
DATA: v_g1(1) TYPE c VALUE 'A',
v_g2(1) TYPE c VALUE 'B'.
WRITE: v_g1 , v_g2.
PERFORM paso_por_referencia USING
v_g1
CHANGING v_g2.
WRITE: v_g1 , v_g2.
**********************************************************************
**
*** Paso de parametros por valor y resultado
***************************
**********************************************************************
**
DATA: v_h1(1) TYPE c VALUE 'A'.
PERFORM paso_por_valor_y_resultado1 CHANGING v_h1.
PERFORM paso_por_valor_y_resultado2 CHANGING v_h1.
**********************************************************************
**
END-OF-SELECTION.
**********************************************************************
**
WRITE:/'H1 es:', v_h1.
*&--------------------------------------------------------------------*
*&
Form procesar_datos
*&--------------------------------------------------------------------*
*
text
*---------------------------------------------------------------------*
FORM procesar_datos TABLES
t_vuelos STRUCTURE sflight
USING
st_vuelos STRUCTURE sflight
CHANGING p_flag
TYPE sy-subrc.
ENDFORM.

"procesar_datos

*&--------------------------------------------------------------------*
*&
Form PASO_POR_VALOR
*&--------------------------------------------------------------------*
FORM paso_por_valor USING value(pf1).
pf1 = 'X'.
ENDFORM.

" PASO_POR_VALOR

*&--------------------------------------------------------------------*
*&
Form PASO_POR_REFERENCIA
*&--------------------------------------------------------------------*
FORM paso_por_referencia USING
p_g1

CHANGING p_g2.
p_g1 = p_g2 = 'X'.
ENDFORM.

" PASO_POR_VALOR

*&--------------------------------------------------------------------*
*&
Form PASO_POR_VALOR_Y_RESULTADO1
*&--------------------------------------------------------------------*
FORM paso_por_valor_y_resultado1 CHANGING p_f1.
p_f1 = 'B'.
ENDFORM.
" PASO_POR_VALOR_Y_RESULTADO1
*&--------------------------------------------------------------------*
*&
Form PASO_POR_VALOR_Y_RESULTADO2
*&--------------------------------------------------------------------*
FORM paso_por_valor_y_resultado2 CHANGING p_f1.
p_f1 = 'X'.
STOP.
ENDFORM.

" PASO_POR_VALOR_Y_RESULTADO2

PRACTICA

PROGRAMADOR ABAP NIVEL INICIAL


Unidad: Subrutinas, Funciones y Batch
Leccin: Subrutinas
EJERCICIO 4.1
1) Tomar el programa Abap ZABAP_USUARIOS_ABM creado
en el ejercicio 3.5 y modularizarlo de modo de respetar
que cada rutina no tenga ms de 50 lneas de cdigo.

SOLUCION A LA PRACTICA
*&--------------------------------------------------------------------*
*& Report ZABAP_USUARIOS_ABM
*&
*&--------------------------------------------------------------------*
*&
ACLARACIONES IMPORTANTES
*&--------------------------------------------------------------------*
*& Para realizar este ejercicio se deber crear la clase de mensajes
*& Z_PRUEBA, se deber completar el texto correspondiente a los
parametros
*& de la pantalla de seleccin y se deber crear el INCLUDE de datos y
*& de subrutinas
*&--------------------------------------------------------------------*
REPORT ZABAP_USUARIOS_ABM.
* Include de Datos y Subrutinas
INCLUDE: zabap_usuarios_abm_top,
zabap_usuarios_abm_sub.
*---------------------------------------------------------------------*
START-OF-SELECTION.
*---------------------------------------------------------------------*
* Creacin de Usuarios
IF p_crear EQ 'X'.
PERFORM alta_de_usuarios.
* Modificacin de Usuarios
ELSEIF p_modif EQ 'X'.
PERFORM modificacion_de_usuarios.
* Borrado de Usuarios
ELSEIF p_borra EQ 'X'.
PERFORM borrado_de_usuarios.
ENDIF.
*&--------------------------------------------------------------------*
*& Include
ZABAP_USUARIOS_ABM_TOP
*&--------------------------------------------------------------------*
* Declaracin de Tablas y estructura
DATA: wa_usuarios TYPE ztabla_usuarios.
* Declaracin de variables
DATA: v_dni TYPE z_dni,
v_nombre_ape TYPE z_nombre_ape,
v_estado_usu TYPE z_estado_usu,
v_direccion TYPE z_direccion,

v_fecha TYPE z_fecha_nac,


v_estado_civil TYPE z_estado_civil.
* Pantalla de seleccin
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETER: p_dni LIKE v_dni OBLIGATORY,
p_nomape LIKE v_nombre_ape,
p_estusu LIKE v_estado_usu,
p_dir
LIKE v_direccion,
p_fecha LIKE v_fecha,
p_estciv LIKE v_estado_civil.

"
"
"
"
"
"

DNI
Nombre y Apellido
Estado del usuario
Direccin
Fecha de Nacimiento
Estado civil

SELECTION-SCREEN SKIP 1.
PARAMETER: p_crear
p_modif
p_borra

RADIOBUTTON GROUP rbg,


RADIOBUTTON GROUP rbg,
RADIOBUTTON GROUP rbg.

" Crear
" Modificar
" Borrar

SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN END OF BLOCK b1.
*&--------------------------------------------------------------------*
*& Include
ZABAP_USUARIOS_ABM_SUB
*&--------------------------------------------------------------------*
*&--------------------------------------------------------------------*
*&
Form ALTA_DE_USUARIOS
*&--------------------------------------------------------------------*
*
text
*---------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*---------------------------------------------------------------------*
FORM alta_de_usuarios .
CLEAR v_dni.
SELECT SINGLE dni
FROM ztabla_usuarios
INTO v_dni
WHERE dni EQ p_dni.
IF sy-subrc EQ 0.
MESSAGE e001(z_prueba) WITH 'El registro que intenta crear ya
existe'.
ELSE.
CLEAR wa_usuarios.
wa_usuarios-mandt = sy-mandt.
wa_usuarios-dni = p_dni.
wa_usuarios-nombre_ape = p_nomape.
wa_usuarios-estado_usu = p_estusu.
wa_usuarios-direccion = p_dir.
wa_usuarios-fecha_nac = p_fecha.

wa_usuarios-estado_civil = p_estciv.
INSERT into ztabla_usuarios values wa_usuarios.
IF sy-subrc EQ 0.
MESSAGE s001(z_prueba) WITH 'El registro fue creado
correctamente'.
ENDIF.
ENDIF.
ENDFORM.

" ALTA_DE_USUARIOS

*&--------------------------------------------------------------------*
*&
Form BORRADO_DE_USUARIOS
*&--------------------------------------------------------------------*
*
text
*---------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*---------------------------------------------------------------------*
FORM borrado_de_usuarios .
CLEAR v_dni.
SELECT SINGLE dni
FROM ztabla_usuarios
INTO v_dni
WHERE dni EQ p_dni.
IF sy-subrc NE 0.
MESSAGE e001(z_prueba) WITH 'El registro que intenta borrar no
existe'.
ELSE.
CLEAR wa_usuarios.
wa_usuarios-mandt = sy-mandt.
wa_usuarios-dni = p_dni.
wa_usuarios-nombre_ape = p_nomape.
wa_usuarios-estado_usu = p_estusu.
wa_usuarios-direccion = p_dir.
wa_usuarios-fecha_nac = p_fecha.
wa_usuarios-estado_civil = p_estciv.
DELETE ztabla_usuarios FROM wa_usuarios.
IF sy-subrc EQ 0.
MESSAGE s001(z_prueba) WITH 'El registro fue borrado
correctamente'.
ENDIF.
ENDIF.
ENDFORM.

" BORRADO_DE_USUARIOS

*&--------------------------------------------------------------------*
*&
Form MODIFICACION_DE_USUARIOS
*&--------------------------------------------------------------------*

*
text
*---------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*---------------------------------------------------------------------*
FORM modificacion_de_usuarios .
CLEAR v_dni.
SELECT SINGLE dni
FROM ztabla_usuarios
INTO v_dni
WHERE dni EQ p_dni.
IF sy-subrc NE 0.
MESSAGE e001(z_prueba) WITH 'El registro que intenta modificar no
existe'.
ELSE.
CLEAR wa_usuarios.
wa_usuarios-mandt = sy-mandt.
wa_usuarios-dni = p_dni.
wa_usuarios-nombre_ape = p_nomape.
wa_usuarios-estado_usu = p_estusu.
wa_usuarios-direccion = p_dir.
wa_usuarios-fecha_nac = p_fecha.
wa_usuarios-estado_civil = p_estciv.
MODIFY ztabla_usuarios FROM wa_usuarios.
IF sy-subrc EQ 0.
MESSAGE s001(z_prueba) WITH 'El registro fue modificado
correctamente'.
ENDIF.
ENDIF.
ENDFORM.

" MODIFICACION_DE_USUARIOS

S-ar putea să vă placă și