subrutinas - AprendeABAP

Anuncio
SUBRUTINAS
¿Qué son las Subrutinas?
Las subrutinas forman parte de la programación modular, esto es, ejecutar cierta porción de
código en un lugar externo con respecto al flujo de sentencias principal. Es de utilidad si se
requiere una misma funcionalidad para varios reportes o partes de un mismo programa. También
permite una mayor limpieza en el código escrito para su mejor entendimiento.
Usemos una calculadora como ejemplo práctico, en la cual diseñaremos las siguientes funciones
matemáticas: suma, resta, multiplicación, división, potenciación y raíz cuadrada.
Estructuraremos el código con el condicional CASE-ENDCASE que vimos anteriormente, para
controlar las diferentes funciones.
(El usuario selecciona una función y la capturamos en la variable <función>).
Podemos escribir el código de forma directa.
CASE <función>.
WHEN 'SUMA'. (Código necesario para realizar la suma).
WHEN 'RESTA'. (Código necesario para realizar la resta).
WHEN 'MULTIPLICACION'. (Código necesario para realizar la multiplicación).
WHEN 'DIVISION'. (Código necesario para realizar la división).
WHEN 'RAIZ'. (Código necesario para realizar la raíz).
WHEN 'POTENCIACION'. (Código necesario para realizar la potenciación).
ENDCASE.
Operaciones como la 'RAIZ', requiere repetir las mismas instrucciones que la 'DIVISION'; mientras
que la 'POTENCIACION' utiliza instrucciones aplicadas a la 'MULTIPLICACION'; por lo que, si
escribimos el código de forma lineal, estaríamos repitiendo código, haciendo menos legible el
código que creamos.
Para ello existe la modularización, que nos permite estructurar el flujo del programa en rutinas
externas para un mejor performance y entendimiento.
Si escribimos el programa de la calculadora de manera modularizada, quedaría así.
Sub Rutinas – RichardRey.com - 2
CASE <función>.
WHEN 'SUMA'. (Llamado a rutina SUMA).
WHEN 'RESTA'. (Llamado a rutina RESTA).
WHEN 'MULTIPLICACION'. (Llamado a rutina MULTIPLICACION).
WHEN 'DIVISION'. (Llamado a rutina DIVISION).
WHEN 'RAIZ'. (Llamado a rutina RAIZ).
WHEN 'POTENCIACION'. (Llamado a rutina POTENCIACION).
ENDCASE.
Luego, en otro lugar del programa, se creará el contenido de cada rutina.
RUTINA 'SUMA'.
...
FINRUTINA.
RUTINA 'MULTIPLICACION'.
....
FINRUTINA.
RUTINA 'DIVISION'.
...
FINRUTINA.
Cuando creemos la rutina 'RAIZ', en su interior podemos hacer el llamado a la rutina 'DIVISION', de
la misma manera que se hizo en el CASE-ENDCASE para el WHEN 'DIVISION'.
RUTINA 'RAIZ'.
...
Llamado a rutina 'DIVISION'.
...
FINRUTINA.
Sub Rutinas – RichardRey.com - 3
Para el caso de la 'POTENCIACION', aplica lo mismo.
RUTINA 'POTENCIACION'.
...
Llamado a rutina 'MULTIPLICACION'.
...
FINRUTINA.
Tipos de subrutinas
Existen 3 tipos de subrutinas o subprogramas.
Internas: El código de la subrutina está dentro del programa que la llama.
Externas: La subrutina está en un programa distinto al llamante.
Biblioteca de funciones (Módulos de función): Funciones externas al programa con interface de
llamada claramente definido. (De este tipo se hablará en el siguiente capítulo).
Subrutinas internas
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.
Las instrucciones para llamados y declaración de subrutinas son las siguientes:
PERFORM <modulo>. Llamada a un procedimiento o subprograma.
FORM <modulo>
.... __Subprograma.
ENDFORM.
Sub Rutinas – RichardRey.com - 4
El programa principal y el procedimiento se podrán comunicar mediante parámetros.
PERFORM <modulo> USING var1 var2...
FORM <modulo> USING var1 var2...
...
ENDFORM.
Los parámetros pueden ser pasados por valor o por referencia. Por defecto serán por referencia.
•
•
Valor: El campo se pasa a modo de lectura únicamente, es decir, no podrá ser modificado
dentro del módulo.
Referencia: El campo se pasa al módulo de manera editable, permitiendo su modificación
dentro del mismo.
Si queremos utilizar parámetros por valor, la cabecera del módulo será:
FORM <modulo> USING VALUE (var1).
...
ENDFORM.
Si queremos utilizar parámetros que puedan ser modificados dentro de la subrutina, se escribirían
así:
PERFORM <modulo> CHANGING var1 var2.
FORM <modulo> CHANGING var1 var2.
...
ENDFORM.
Con la instrucción CHANGING, estamos permitiendo que los campos pasados como parámetros
puedan haber cambiado su valor al regresar de la subrutina.
Tanto las variables definidas al inicio del programa como las tablas son globales a todas las
subrutinas y por tanto accesibles en cualquier momento, por lo que dichas variables declaradas al
comienzo no requieren ser pasadas explícitamente en los llamados a módulos o subrutinas.
Si encontramos alguna instrucción del tipo CHECK o EXIT que signifique salir de un cierto FORM,
previamente ejecutará el ENDFORM y por tanto se pasarán los parámetros que tenga el
procedimiento.
Sub Rutinas – RichardRey.com - 5
También es posible pasar como parámetro tablas internas.
PERFORM <modulo> TABLES <itab>...USING <var1><var2>...
FORM <modulo> TABLES <itab> USING <var1>...
...
ENDFORM.
Especificaremos las tablas siempre antes que el resto de parámetros.
En este caso sólo se pueden hacer operaciones con filas enteras, pero no nos podremos
referenciar sobre campos concretos de la tabla o hacer COLLECTS (totalizaciones), ya que no se
conocerá la estructura de la tabla.
Podemos pasar como parámetros registros de datos o áreas de trabajo con:
PERFORM <modulo> USING <reg>.
FORM <modulo> USING <reg> STRUCTURE <estructura>.
...
ENDFORM.
Es decir, con la cláusula STRUCTURE podemos pasar la estructura de una tabla, entonces podemos
acceder a campos de una tabla pasada como parámetro con:
PERFORM <modulo> TABLES <itab> USING <var1>...
FORM <modulo> TABLES <itab> STRUCTURE <estructura> USING <var1>...
....
ENDFORM.
Dentro de cada subrutina es posible declarar datos con la sentencia DATA, que sólo serán visibles
dentro del módulo donde esté declarado. ABAP/4 creará un espacio para esas variables que será
liberado al salir del módulo. Por tanto se podrán utilizar variables con el mismo nombre que
variables globales, aunque el valor que tengan será siempre el local en el módulo o subrutina.
NOTA: Las tablas de base de datos son globales a todo el programa, si se quiere utilizar una tabla
localmente en una subrutina, se debe declarar con LOCAL, al inicio de la subrutina, en vez de con
TABLES.
LOCAL <tabla>.
Sub Rutinas – RichardRey.com - 6
Subrutinas Externas.
En un reporte o programa, podemos llamar a subrutinas que no se encuentren dentro de nuestro
código. Para ello disponemos de la modalidad de llamada a subrutina pasándole el programa, el
uso de INCLUDES, y las llamadas a módulos de función.
•
•
Si queremos llamar a una subrutina que está en un programa distinto utilizamos:
PERFORM <sub> (<programa>) USING...
También existe la posibilidad de añadir porciones de código del tipo INCLUDE con la
instrucción: INCLUDE <reporte>.
En el código del INCLUDE no utilizaremos la sentencia REPORT (con la que se empieza cualquier
programa).
Módulos de Funciones.
Esta es la vía para el manejo de subrutinas en un programa ABAP; como vimos al comienzo de este
capítulo, existe una tercera vía para la comunicación modular de parámetros, llamados "Módulos
de Funciones", de ellos hablaremos en el siguiente capítulo.
Richard Rey
http://aprendeabap.com
Sub Rutinas – RichardRey.com - 7
Descargar