<html>
<head> <title>ASSIGN</title> </head> <BODY BGCOLOR="#000000" TEXT="#FFFFFF" LINK="#0099FF" VLINK="#AA0000"> <p align="left">⚠ <b>
<span class="titulo">APPEND</span>⚠ </b>
</p>
<p align="left">⚠ <b>
Definicin⚠ </b>
</p>
<p align="left">Asigna con una referencia directa o dinmica el
nombre del objeto que deseamos asignar a un campo.</p>
<p align="left">⚠ <b>
Sintaxis:⚠ </b>
</p>
deseamos asignar a un field-symbol antes de la ejecucin del programa debemos realizar una asignacin esttica, es decir, con una referencia directa al objeto de dato. Si no conocemos el objeto de dato hasta la ejecucin del programa, la asignacin deber ser dinmica, es decir, con una referencia indirecta.</p>
<p align="left">La sintaxis de la sentencia ASSIGN esttica, sin
especificacin del offset, es la siguiente:</p>
<p align="left">ASSIGN <campo> TO <FS> { <tipo>
} { <decimales> }.</p>
<p align="left">Despus de la asignacin, el field-symbol <FS>
tiene los atributos del objeto de datos <campo>, y apunta a la misma posicin de memoria. Las clusulas <tipo> y <decimales> son opciones y las veremos en posteriores apartados.</p>
<p align="left">La sintaxis de la sentencia ASSIGN esttica, con
especificacin del offset, es la siguiente:</p>
<p align="left">ASSIGN <campo> { +<offset> } { (<longitud>)
} TO <FS> { <tipo> } { <decimales> }.</p>
<p align="left">La nica diferencia con la variante anterior es
que en sta especificamos el offset y la longitud del objeto de datos que hay que asignar. Las clusulas <tipo> y <decimales> son opcionales y las veremos en posteriores apartados. <offset> y <longitud> pueden ser variables. El sistema no comprueba si la parte seleccionada en el campo, contando el offset y la longitud, es mayor que la longitud del campo. Se puede referenciar direcciones ms all de la longitud del campo, siempre y cuando no sobrepasemos el rea de memoria asignada. Si no especificamos la longitud del campo con <longitud>, el field-symbol <FS> apunta al rea perteneciente a los lmites del campo. Si <offset> es mayor que 0, <FS> siempre apunta a un rea perteneciente a los lmites del campo. Si <offset> es menor que la longitud del campo, se puede especificar un asterisco (*) para <longitud>, para evitar sobrepasar el rea asignada al campos. las clusulas <tipo> y <decimales> son opcionales y las vceremos en posteriores apartados.</p>
<p align="left">Si slo en tiempo de ejecucin conocemos el nombre
del objeto de dato que hay que asignar al field-symbol debemos realizar una asignacin dinmica. Para ello utilizaremos la sentencia ASSIGN con la siguiente sintaxis:</p>
<p align="left">ASSIGN (<campo>) TO <FS> { <tipo>
} { <decimales> }.</p>
<p align="left">El nombre de objeto de dato que hay que asignar
al field-symbol estar contenido en <campo> (asignacin indirecta). En tiempo de ejecucin, el sistema busca el campo referenciado siguiendo la siguiente secuencia:</p>
<ul>
<li> <p align="left">Si la asignacin se realiza en una subrutina o mdulo de funcin, el sistema busca el campo en la subrutina o mdulo de funcin como objeto local. </li> <li> <p align="left">Si la asignacin se realiza fuera de una subrutina o mdulo de funcin, o el campo no se encuentra all, el sistema busca el campo como objeto global al programa. </li> <li> <p align="left">Si el campo tampoco se encuentra como objeto global al programa, el sistema busca un rea de trabajo declarada con la sentencia TABLES en el programa principal, o en el grupo de programas actual. La definicin "grupo de programas" engloba un programa principal y todos los programa contenidos, incluyendo aqullos en los que se realice una llamada a una subrutina. </li>
</ul>
<p align="left">Si la bsqueda del campo es satisfactoria y elcampo puede ser asignado al field-symbol, el campo SY-SUBRC valdr 0. En otro caso valdr 4. Por razones de seguridad, se debe comprobar el valor de SY-SUBRC despus de realizar la asignacin para prevenir que un field-symbol apunte a un rea indefinida. Las clusulas <tipo> y <decimales> son opcionales y las veremos en posteriores apartados. Ya que este tipo de bsqueda tiene unos efectos adversos en cuanto al tiempo de respuesta del programa, debemos utilizar este tipo de asignacin slo si es absolutamente necesario. Si antes de la ejecucin del programa sabemos que la asignacin slo ser de reas de trabajo, se puede utilizar la variante de la sentencia ASSIGN que veremos a continuacin.</p>
<p align="left">Si antes de la ejecucin del programa sabemos
que vamos a asignar un rea de trabajo a un field-symbol, pero hasta la ejecucin no sabemos de dicha rea de trabajo se puede utilizar la siguiente variante dinmica de la sentencia ASSIGN:</p>
<p align="left">ASSIGN TABLE FIELD (<campo>) TO <FS>
{ <tipo> } { <decimales> }.</p>
<p align="left">El sistema busca el objeto de dato que vamos a
asignar al field-symbol slo en las reas de trabajo declaradas con la sentencia⚠ <a href="tables.htm" tppabs="tables.htm">
TABLES⚠ </a>
en el programa principal de un grupo de programa. El sistema slo realiza el paso 3 de la sentencia anteriormente vista. Si la bsqueda es satisfactoria y el campo puede ser asignado al field-symbol, SY-SUBRC es 0; en caso contrario es 4. Las clusulas <tipo> y <decimales> son opcionales y las veremos en posteriores apartados.</p>
<p align="left">Adems de poder asignar objetos de datos a field-symbols,
el sistema nos permite asignar un field-symbol sobre otro field-symbol. Para realizar esto se puede utilizar cualquier variante vista hasta el momento de la sentencia ASSIGN, pero en lugar de utilizar un objeto de dato utilizaremos un field-symbol. Resumamos estas variantes a continuacin:</p>
<p align="left">ASSIGN (<FS1>) TO <FS2> { <tipo>
} { <decimales> }.</p>
<p align="left">ASSIGN (<FS1>) { +<offset> } { (<longitud>)
}TO <FS2> { <tipo> } { <decimales> }.</p>
<p align="left">ASSIGN (<campo>) TO <FS2> { <tipo>
} { <decimales> }.</p>
<p align="left">ASSIGN TABLE FIELD (<campo>) TO <FS>
{ <tipo> } { <decimales> }.</p>
<p align="left"><campo> es un objeto de datos con el valor
de un field-symbol. Las clusulas <tipo> y <decimales> son opcionales y las veremos en posteriores apartados. Se puede especificar componentes de un field-string a un field-symbol con la siguiente variante de la sentencia ASSIGN:</p>
<p align="left">ASSIGN COMPONENT <c> OF STRUCTURE <e>
TO <FS> { <tipo> } { <decimales> }.</p>
<p align="left">El sistema asigna el componente <c> de la
estructura <e> al field-symbol <FS>. <c> puede ser un literal o una variable. Si la asignacin es satisfactoria, SY-SUBRC es 0; en caso contrario es 4. Las clusulas <tipo> y <decimales> son opcionales y las veremos en posteriores apartados.</p>
<ul>
<li> <p align="left">Se puede definir el tipo de un field-symbol utilizando la clusula TYPE de la sentencia ASSIGN. La clusula TYPE se puede utilizar con todas las variantes de la sentencia ASSIGN vistas anteriormente. <tipo> puede ser un literal a una variable. Se produce un error en tiempo de ejecucin si el tipo de datos es desconocido, o si la longitud del tipo de datos especificado es incompatible con el tipo de dato asignado. </li> <li> <p align="left">Tambin se puede especificar el nmero de decimales de un field-symbol si el campo asignado es del tipo P (empaquetado). Para ello se especifica la clusula DECIMALS de la sentencia ASSIGN. La clusula DECIMALS se puede utilizar con todas las variantes de la sentencia ASSIGN. Con esta clusula se puede tener distinto nmero de decimales entre el objeto de dato asignado y el field-symbol. <decimales> puede ser un literal o una variable. Un erro en tiempo de ejecucin se produce si <decimales> no tiene un valor comprendido entre 0 y 14, o si el objeto de dato asignado no es del tipo P. </li>
</ul>
<p align="left">Cuando trabajamos con subrutinas, se puede estarinteresados en crear copias locales de datos globales sobre la pila de datos. Para realizar esto, disponemos de la siguiente clusula de la sentencia ASSIGN:</p>
<p align="left">ASSIGN LOCAL COPY OF ... TO <FS>.</p>
<p align="left">El sistema es una copia del dato global especificadosobre la pila. En la subrutina, se puede acceder y cambiar esta copia sin cambiar el valor del dato global. Se puede utilizar esta clusula con todas las variantes de la sentencia ASSIGN a excepcin de la vista en el apartado "Sentencia ASSIGN con componentes de un field-string".</p>
<p align="left">⚠ <b>
Ejemplo 1:⚠ </b>
</p>
<dd> <pre>DATA NAME(4) VALUE 'JOHN'.
FIELD-SYMBOLS <F>.
ASSIGN NAME TO <F>. WRITE <F>. </pre></dd>
</dl>
<p>Salida: JOHN</p> <p>⚠ <b>
Ejemplo 2:⚠ </b>
</p>
<dl>
<dd> <pre>DATA: NAME(12) VALUE 'JACKJOHNCARL', X(10) VALUE 'XXXXXXXXXX'.
FIELD-SYMBOLS <F>.
ASSIGN NAME+4 TO <F>. WRITE <F>. ASSIGN NAME+4(*) TO <F>. WRITE <F>. </pre></dd>
</dl>
<span>Salida: JOHNCARLXXXX JOHNCARL<br> </span> <p align="left">⚠ <b>
Ejemplo 3:⚠ </b>
</p>
<dl>
<dd> <pre>DATA SALES_DEC2(10) TYPE P DECIMALS 2 VALUE 1234567.
FIELD-SYMBOLS <SALES_DEC5>.
ASSIGN SALES_DEC2 TO <SALES_DEC5> DECIMALS 5.
WRITE: / SALES_DEC2,/ <SALES_DEC5>.
</pre>
</dd>
</dl>
<span>Salida:<NP> <br> 1,234,567.00<br> 1,234.56700<br> </span> <dl><pre>⚠ <b>
Ejemplo 4:⚠ </b>
</pre> <dd> <pre>DATA X(4) VALUE 'Carl'.
PERFORM U.
FORM U.FIELD-SYMBOLS <F>. ASSIGN LOCAL COPY OF X TO <F>. WRITE <F>. MOVE 'John' TO <F>. WRITE <F>. WRITE X.
ENDFORM.
</pre></dd>
</dl>
<span>Salida: Carl John Carl<br> </span> <p align="left">⚠ <b>
Ejemplo 5:⚠ </b>
</p>
<dl>
<dd> <pre>DATA: NAME(4) VALUE 'XYZ', XYZ VALUE '5'.
FIELD-SYMBOLS <F>.
ASSIGN (NAME) TO <F>. WRITE <F>. </pre></dd>
</dl>
<span>Salida: 5<br> </span> <p>⚠ <b>
Ejemplo 6:⚠ </b>
</p>
<dl>
<dd> <pre>TABLES TRDIR.
DATA NAME(10) VALUE 'TRDIR-NAME'.
FIELD-SYMBOLS <F>. MOVE 'XYZ_PROG' TO TRDIR-NAME. ASSIGN TABLE FIELD (NAME) TO <F>. WRITE <F>. </pre></dd>
</dl>
<span>Salida: XYZ_PROG<br> </span> <p align="left">⚠ <b>
Ejemplo 7:⚠ </b>
</p>
<dl>
<dd> <pre>TABLES TRDIR.
DATA: F(8) VALUE 'F_global',
G(8) VALUE 'G_global'.
MOVE 'XYZ_PROG' TO TRDIR-NAME.
PERFORM U. FORM U.DATA: F(8) VALUE 'F_local', NAME(30) VALUE 'F'. FIELD-SYMBOLS <F>. ASSIGN (NAME) TO <F>. WRITE <F>. MOVE 'G' TO NAME. ASSIGN (NAME) TO <F>. WRITE <F>. MOVE 'TRDIR-NAME' TO NAME. ASSIGN (NAME) TO <F>. WRITE <F>.
ENDFORM.
</pre></dd>
</dl>
<span>Salida: F_local G_global XYZ_PROG </span> <p>⚠ <b>
Ejemplo 8:⚠ </b>
</p>
<dl>
<dd> <pre>PROGRAM P1MAIN. TABLES TRDIR. DATA NAME(30) VALUE 'TFDIR-PNAME'. FIELD-SYMBOLS <F>. MOVE 'XYZ_PROG' TO TRDIR-NAME. PERFORM U(P1SUB). ASSIGN (NAME) TO <F>. WRITE <F>. CALL FUNCTION 'EXAMPLE'.
</pre>
</dd> <dd> <pre>PROGRAM P1SUB. TABLES TFDIR. ... FORM U. FIELD-SYMBOLS <F>. DATA NAME(30) VALUE 'TRDIR-NAME'. ASSIGN TABLE FIELD (NAME) TO <F>. WRITE <F>. MOVE 'FCT_PROG' TO TFDIR-PNAME. ENDFORM.
</pre>
</dd> <dd> <pre>FUNCTION-POOL FUN1. FUNCTION EXAMPLE. DATA NAME(30) VALUE 'TRDIR-NAME'. FIELD-SYMBOLS <F>. ASSIGN (NAME) TO <F>. IF SY-SUBRC = 0. WRITE <F>. ELSE. WRITE / 'TRDIR-NAME cannot be accessed'. ENDIF. ENDFUNCTION.
</pre>
</dd>
</dl>
<span>Salida: XYZ_PROG FCT_PROG<br> TRDIR-NAME no se tiene acceso.<br> </span> <p>⚠ <b>
Ejemplo 9:⚠ </b>
</p>
<dl>
<dd> <pre>PROGRAM P1MAIN. TABLES TRDIR. DATA NAME(30) VALUE 'TFDIR-PNAME'. FIELD-SYMBOLS <F>. MOVE 'XYZ_PROG' TO TRDIR-NAME. CALL FUNCTION 'EXAMPLE'.
</pre>
</dd> <dd> <pre>FUNCTION-POOL FUN1. FUNCTION EXAMPLE. DATA NAME(30) VALUE 'TRDIR-NAME'. FIELD-SYMBOLS <F>. ASSIGN LOCAL COPY OF MAIN TABLE FIELD (NAME) TO <F>. IF SY-SUBRC = 0. WRITE <F>. ELSE. WRITE / 'TRDIR-NAME cannot be accessed'. ENDIF. ENDFUNCTION.
</pre>
</dd>
</dl>
<span>Salida: XYZ_PROG<br> </span> <dl><pre>⚠ <b>
Ejemplo 10:⚠ </b>
</pre> <dd> <pre>PROGRAM P1MAIN. DATA: BEGIN OF REC, A VALUE 'a', B VALUE 'b', C VALUE 'c', D VALUE 'd', END OF REC, CN(5) VALUE 'D'. FIELD-SYMBOLS <FS>. DO 3 TIMES. ASSIGN COMPONENT SY-INDEX OF STRUCTURE REC TO <FS>. IF SY-SUBRC <> 0. EXIT. ENDIF. WRITE <FS>. ENDDO. ASSIGN COMPONENT CN OF STRUCTURE REC TO <FS>. WRITE <FS>.
</pre>
</dd>
</dl>
<p>Output: a b c d<br> </p> <p align="left">⚠ <b>
Vease tambin: ⚠ </b>
⚠ <a href="describe_field.htm" tppabs="describe_field.htm">
DESCRIBE
FIELD⚠ </a>
,⚠ <a href="move.htm" tppabs="move.htm">
MOVE⚠ </a>
.</p>
<p align="left"> </p>
</body>
</html>