W Pub: ABAP Cursosentenciaperform

<html>

<head>

<title>PERFORM</title>

</head>

<BODY BGCOLOR="#000000" TEXT="#FFFFFF" LINK="#0099FF" VLINK="#AA0000">

<p align="left">⚠ &lt;b&gt;<span class="titulo">PERFORM</span>⚠ &lt;/b&gt;</p>

<p align="left">⚠ &lt;b&gt;Definicin⚠ &lt;/b&gt;</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">⚠ &lt;b&gt;Sintaxis:⚠ &lt;/b&gt;</p>

<pre>PERFORM <subrutina> [ TABLES <parmetros_actuales> ]

                    [ 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 programa

  que 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 funcin

  del 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 ⚠ &lt;a href="form_endform.htm" tppabs="form_endform.htm"&gt;FORM⚠ &lt;/a&gt;). 
  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 especificados

  en 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 ⚠ &lt;a href="form_endform.htm" tppabs="form_endform.htm"&gt;FORM⚠ &lt;/a&gt;)

  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%">⚠ &lt;b&gt;Especificacin de tipo⚠ &lt;/b&gt;</td>
    <td width="65%">⚠ &lt;b&gt;Conversin⚠ &lt;/b&gt;</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>⚠ &lt;b&gt;Ejemplo 1:⚠ &lt;/b&gt;</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>⚠ &lt;b&gt;Ejemplo 2:⚠ &lt;/b&gt;</p>

<pre>DATA: BEGIN OF ITAB OCCURS 100,

        TEXT(50),
        NUMBER TYPE I,
      END   OF ITAB.
      STRUC LIKE T005T.

...

PERFORM DISPLAY TABLES ITAB

                USING  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>⚠ &lt;b&gt;Ejemplo 3:⚠ &lt;/b&gt;</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 1

                     NUMBER_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>⚠ &lt;b&gt;Vase tambin:⚠ &lt;/b&gt; ⚠ &lt;a href="form_endform.htm" tppabs="form_endform.htm"&gt;FORM⚠ &lt;/a&gt;.</p>

</body>

</html>