
¿Qué son las subrutinas?
Son secciones de código que pueden ser utilizadas más de una vez dentro de un mismo programa y también pueden ser utilizadas por otros programas que las referencian.
La idea de pasar el código de los programas a subrutinas, es para que los programas sean más fáciles de leer y de mantener.
Modularizar: pasar el código de un programa a subrutinas, para mejorar la lectura y el mantenimiento del mismo. Lo ideal es que una subrutina no tenga más de 50 líneas de código. Ayuda a encontrar más fácilmente los errores en los programas.
En ABAP una subrutina se declara con la palabra reservada PERFORM seguida del nombre de la subrutina.
PERFORM seleccionar_datos CHANGING v_hay_datos.
Los tipos de subrutinas
Existen dos tipos de subrutinas:
- Internas: cuando la subrutina se encuentra dentro del mismo programa que la llama o en un include de subrutinas, el cuál se encuentra declarado en el programa de control.
- Externas: cuando la subrutina se encuentra en un programa distinto al que la llama. Para llamar a una subrutina
externa desde otro programa.
PERFORM seleccionar_datos IN PROGRAM ZTEST_SUBRUTINAS.
El paso de parámetros a subrutinas
Podemos pasar datos entre el programa principal y una subrutina a través de parámetros
- 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 también viceversa.
Para pasar los parámetros en las subrutinas vamos a utilizar tres palabras reservadas
- USING para declarar parámetros de entrada que serán utilizados en la subrutina.
- CHANGING para declarar parámetros de entrada/salida que serán utilizados en la subrutina
- TABLES para declarar parámetros de entrada/salida que son tablas, las cuales serán utilizadas en la subrutina.
PERFORM procesar_datos TABLES ti_usuarios
USING wa_usuarios
CHANGING v_flag.
Existen tres formas de pasar parámetros:
DATA: v_f1(1) TYPE c VALUE 'B'.
PERFORM paso_por_valor USING v_f1.
WRITE v_f1.
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 por valor y resultado:
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.
Las declaraciones de datos globales y locales
Cuando declaramos datos en un programa ABAP, es decir variables, estructuras, tablas internas u otros tipos de datos, podemos hacerlo de dos formas diferentes:
Hasta este momento siempre que declaramos datos en los programas con los que trabajamos, realizamos las declaraciones luego de la ejecución de la sentencia REPORT y antes de la declaración del evento START-OFSELECTION
Las declaraciones de datos que realizamos en este lugar de un programa son llamadas declaraciones globales, lo cual significa que estas declaraciones pueden ser utilizadas en cualquier lugar del programa y con esto nos referimos a que pueden ser utilizadas tanto en el programa principal como en cualquiera de las subrutinas que el programa contenga.
Las declaraciones globales de datos tienen una ventaja y una desventaja:
- Como ventaja podemos decir que se facilita el armado del programa ya que no tenemos que estar pensando en donde particularmente va a ser utilizada una declaración de datos, sino que simplemente la declaramos globalmente y la utilizamos en donde corresponda.
- Como desventaja podemos decir que al realizar todas las declaraciones de datos en forma global no estamos generando un código ABAP tan eficiente en cuanto a la modularización, lo cual en algún punto puede complicar el mantenimiento futuro del programa.
Otra posibilidad con la que contamos consiste en realizar declaraciones locales, es decir dentro de una subrutina podríamos declarar exclusivamente los datos que vamos a utilizar, de modo de modularizar lo más posible el código y consumir la menor cantidad de recursos del sistema.