<html>
<head> <title>PERFORM</title> </head> <BODY BGCOLOR="#000000" TEXT="#FFFFFF" LINK="#0099FF" VLINK="#AA0000"> <p align="left">⚠ <b>
<span class="titulo">PERFORM</span>⚠ </b>
</p>
<p align="left">⚠ <b>
Definicin⚠ </b>
</p>
<p align="left">Nos permite realizar una llamada a una subrutina.
Se puede llamar a subrutinas que se encuentran en el mismo programa donde se encuentra la llamada (subrutinas internas) o en otros programas (subrutinas externas). Se puede especificar el nombre de la subrutina esttica o dinmicamente en tiempo de ejecucin. Se puede realizar llamadas a subrutinas desde un subrutina, incluso es posible que una subrutina se llame as misma (llamada recursiva).</p>
<p align="left">⚠ <b>
Sintaxis:⚠ </b>
</p>
[ USING <parmetro_actuales> ] [ CHANGING <parmetro_actuales> ].</pre>
<p>Esta variante primera llama a la subrutina interna <subrutina>.
En la clusula <parmetros> se especifican los parmetros que hay que pasar a la subrutina (parmetros actuales). La subrutina puede acceder a todos los objetos de datos definidos en el programa, por lo tanto, el uso de parmetros es opcional. Se suelen utilizar por claridad en la codificacin y por la posibilidad de ser variables.</p>
<pre>PERFORM <subrutina>(<programa>) [ TABLES <parmetros_actuales> ]
[ USING <parmetro_actuales> ] [ CHANGING <parmetro_actuales> ] [ IF FOUND ].</pre>
<p>Esta variante permite realizar llamadas a subrutinas que se
encuentran en otro programa. La nica forma de pasar datos es a travs de los parmetros o utilizando un rea comn de memoria (COMMON PARTS).</p>
<ul>
<li>Si utilizamos la clusula IF FOUND, el programa continuar sin producir ningn error si la subrutina no existe.</li>
</ul>
<p>Cada vez que llamamos a una subrutina externa, el programaque la contiene se carga en memoria. Este hecho hay que tenerlo muy en cuenta a la hora de disear una aplicacin para evitar cargas excesivas de informacin.</p>
<pre>PERFORM <subrutina>(<programa>) IN PROGRAM <programa>
[ TABLES <parmetros_actuales> ] [ USING <parmetro_actuales> ] [ CHANGING <parmetro_actuales> ] [ IF FOUND ].</pre>
<p>Aqu se permite realizar una llamada a una subrutina que especificamos
en tiempo de ejecucin. Con la clusula IN PROGRAM se puede determinar que la subrutina es externa, tambin de forma dinmica.</p>
<pre>PERFORM <ndice> OF <subrutina-1> <subrutina-2> ... <subrutina-n>.</pre>
<p>Esta variante nos permite llamar a una subrutina en funcindel valor de un campo ndice y la posicin que guarda la subrutina en la sentencia. La subrutinas slo pueden ser internas.</p>
<p>El concepto de parmetro formal corresponde con la definicin
del parmetro en la subrutina (sentencia⚠ <a href="form_endform.htm" tppabs="form_endform.htm">
FORM⚠ </a>
). El concepto de parmetro actual corresponde con el parmetro utilizado en la llamada a la subrutina (sentencia PERFORM). Un parmetro (formal o actual) puede ser definido con la clusula TABLES, USING o CHANGING. El significado de cada una de estas clusulas:</p>
<ul>
<li>TABLES -> Los parmetros definidos con esta clusula slo pueden ser tablas internas, con o sin lnea de cabecera.</li> <li>USING -> Los parmetros definidos con esta clusula pueden ser de cualquier tipo de dato, incluidas las tablas internas. Se suelen utilizar como parmetros de entrada a la subrutina.</li> <li>CHANGING -> Los parmetros definidos con esta clusula pueden ser de cualquier tipo de dato, incluidas las tablas internas. Se suelen utilizar como parmetro de salida de la subrutina.</li>
</ul>
<p>Los parmetros formales con USING o CHANGING pueden ser especificadosen el parmetro actual utilizando los siguientes mtodos:</p>
<ul>
<li>Llamada por referencia -> Es el mtodo por defecto. No se especifica nada, tanto en los parmetros USING como en los parmetros CHANGING. En la llamada transferimos la direccin del objeto de dato. Cualquier modificacin realizada sobre el objeto de dato tendr efecto despus de la llamada.</li> <li>Llamada por valor -> Se antepone a los parmetros la opcin VALUE (el parmetro entre parntesis) con la clusula USING. En la llamada se crea una copia del parmetro, que ser la utilizada por la subrutina. Cualquier modificacin realizada en la subrutina no afectar al objeto de dato fuera de sta.</li> <li>Llamada por valor y resultado -> Se antepone a los parmetros la opcin VALUE (el parmetro entre parntesis) con la clusula CHANGING. En la llamada se crea una copia del parmetro, que ser la utilizada por la subrutina. Cualquier modificacin realizada en la subrutina (copia de parmetro actual) afectar al objeto de dato (parmetro actual) slo si la subrutina termina correctamente, es decir, si no se ha ejecutado ninguna sentencia MESSAGE. Este tipo de mtodo slo tiene sentido en programacin de transacciones.</li>
</ul>
<p>En los parmetros formales (sentencia⚠ <a href="form_endform.htm" tppabs="form_endform.htm">
FORM⚠ </a>
)
se puede especificar un tipo de dato para asegurarnos el tipo de ste. Las conversiones de tipo realizadas entre los parmetros actuales y los parmetros formales cumplen las siguientes reglas:</p>
<table border="0" width="100%">
<tr> <td width="35%">⚠ <b>
Especificacin de tipo⚠ </b>
</td> <td width="65%">⚠ <b>
Conversin⚠ </b>
</td> </tr> <tr> <td width="35%">Sin especificacin / TYPE ANY</td> <td width="65%">El sistema acepta cualquier tipo del parmetro actual. Todos los atributos del parmetro actual se traspasan al parmetro formal.</td> </tr> <tr> <td width="35%">TYPE TABLE</td> <td width="65%">El sistema comprueba si el parmetro actual es una tabla interna. Todos los atributos y estructura del parmetro actual se transporta al parmetro formal.</td> </tr> <tr> <td width="35%">TYPE C, N, P o X</td> <td width="65%">El sistema comprueba si el parmetro actual es del tipo especificado. La longitud del parmetro y las especificamos de decimales, para el tipo P se transportan del parmetro actual al parmetro formal.</td> </tr> <tr> <td width="35%">TYPE D, F, I o T</td> <td width="65%">El tipo de dato del parmetro actual debe coincidir con el tipo de dato del parmetro formal.</td> </tr> <tr> <td width="35%">LIKE <campo> / TYPE <tipo-usuario></td> <td width="65%"></td> </tr>
</table>
<p>⚠ <b>
Ejemplo 1:⚠ </b>
</p>
<pre>DATA: RNAME(30) VALUE 'WRITE_STATISTIC',
PNAME(8) VALUE 'ZYX_STAT'.
PERFORM WRITE_STATISTIC(ZYX_STAT).
PERFORM (RNAME) IN PROGRAM ZYX_STAT. PERFORM WRITE_STATISTIC IN PROGRAM (PNAME). PERFORM (RNAME) IN PROGRAM (PNAME).</pre> <p>⚠ <b>
Ejemplo 2:⚠ </b>
</p>
<pre>DATA: BEGIN OF ITAB OCCURS 100,
TEXT(50), NUMBER TYPE I, END OF ITAB. STRUC LIKE T005T.
...
PERFORM DISPLAY TABLES ITABUSING STRUC.</pre>
<pre>FORM DISPLAY TABLES PAR_ITAB STRUCTURE ITAB
USING PAR STRUCTURE T005T. DATA LOC_COMPARE LIKE PAR_ITAB-TEXT.</pre>
<pre> WRITE: / PAR-LAND1, PAR-LANDX.
... LOOP AT PAR_ITAB WHERE TEXT = LOC_COMPARE. ... ENDLOOP. ...
ENDFORM.</pre>
<p>⚠ <b>
Ejemplo 3:⚠ </b>
</p>
<pre>DATA: NUMBER_I TYPE I VALUE 5,
NUMBER_P TYPE P VALUE 4, BEGIN OF PERSON, NAME(10) VALUE 'Paul', AGE TYPE I VALUE 28, END OF PERSON, ALPHA(10) VALUE 'abcdefghij'.
FIELD-SYMBOLS .
ASSIGN NUMBER_P TO . PERFORM CHANGE USING 1NUMBER_I NUMBER_P </pre>
<pre> PERSON
ALPHA+NUMBER_I().</pre>
<pre>FORM CHANGE USING VALUE(PAR_1)
PAR_NUMBER_I PAR_NUMBER_P PAR_POINTER PAR_PERSON STRUCTURE PERSON PAR_PART_OF_ALPHA. ADD PAR_1 TO PAR_NUMBER_I. PAR_NUMBER_P = 0. PAR_PERSON-NAME+4(1) = ALPHA. PAR_PERSON-AGE = NUMBER_P + 25. ADD NUMBER_I TO PAR_POINTER. PAR_PART_OF_ALPHA = SPACE.
ENDFORM.</pre>
<pre>El contenido de los campos despus del PERFORM es:</pre> <pre>NUMBER_I = 6 NUMBER_P = 6 PERSON-NAME = 'Paula' PERSON-AGE = 25 ALPHA = 'abcde j'</pre> <p>⚠ <b>
Vase tambin:⚠ </b>
⚠ <a href="form_endform.htm" tppabs="form_endform.htm">
FORM⚠ </a>
.</p>
</body>
</html>