W Pub: ABAP Cursosentenciaassign

<html>

<head>

<title>ASSIGN</title>

</head>

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

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

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

<p align="left">Si conocemos el nombre del objeto de datos que

  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 el

  campo 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 
  ⚠ &lt;a href="tables.htm" tppabs="tables.htm"&gt;TABLES⚠ &lt;/a&gt; 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 estar

  interesados 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 especificado

  sobre 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">⚠ &lt;b&gt;Ejemplo 1:⚠ &lt;/b&gt;</p>

<dl>

  <dd> 
    <pre>DATA NAME(4) VALUE 'JOHN'.

FIELD-SYMBOLS <F>.

ASSIGN NAME TO <F>.

WRITE <F>.

</pre>

  </dd>

</dl>

<p>Salida: JOHN</p>

<p>⚠ &lt;b&gt;Ejemplo 2:⚠ &lt;/b&gt;</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">⚠ &lt;b&gt;Ejemplo 3:⚠ &lt;/b&gt;</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>⚠ &lt;b&gt;Ejemplo 4:⚠ &lt;/b&gt;</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">⚠ &lt;b&gt;Ejemplo 5:⚠ &lt;/b&gt;</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>⚠ &lt;b&gt;Ejemplo 6:⚠ &lt;/b&gt;</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">⚠ &lt;b&gt;Ejemplo 7:⚠ &lt;/b&gt;</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>⚠ &lt;b&gt;Ejemplo 8:⚠ &lt;/b&gt;</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>⚠ &lt;b&gt;Ejemplo 9:⚠ &lt;/b&gt;</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>⚠ &lt;b&gt;Ejemplo 10:⚠ &lt;/b&gt;</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">⚠ &lt;b&gt;Vease tambin: ⚠ &lt;/b&gt;⚠ &lt;a href="describe_field.htm" tppabs="describe_field.htm"&gt;DESCRIBE

  FIELD⚠ &lt;/a&gt;, ⚠ &lt;a href="move.htm" tppabs="move.htm"&gt;MOVE⚠ &lt;/a&gt;.</p>

<p align="left"> </p>

</body>

</html>