W Pub: ABAP Cursosentenciainsert

<html>

<head>

<title>INSERT</title>

</head>

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

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

<p align="left">⚠ &lt;b&gt;Definicin⚠ &lt;/b&gt;</p>

<p align="left">Se utiliza para insertar lneas en una tabla interna

  antes de una posicin determinada.</p>

<p align="left">⚠ &lt;b&gt;Sintaxis:⚠ &lt;/b&gt;</p>

<pre>INSERT [ <rea-trabajo> INTO | INITIAL LINE INTO ] <tabla> [ INDEX <ndice> ].</pre>

<p align="left">Con <rea-trabajo> INTO especificamos el

  rea de trabajo que vamos a insertar. Si omitimos esta opcin, el rea de trabajo 
  que se va a insertar ser la asociada con la tabla interna. El significado de 
  las clusulas es el siguiente:</p>

<ul>

  <li> 
    <p align="left">INITIAL LINE TO -> inserta una lnea con 
      los valores iniciales de cada campo.
  </li>
  <li> 
    <p align="left">INDEX -> Inserta una lnea antes de la 
      posicin indicada en <ndice> y la nueva tiene el ndice <ndice>.
  </li>

</ul>

<p align="left">Si la tabla tiene <ndice> - 1 entradas

  la lnea se insertara en la ltima posicin. Si la tabla tiene menos de <ndice> 
  - 1 posiciones la lnea no se insertara. Si se produce algn error al insertar 
  la lnea la variable SY-SUBRC valdr 4, en caso contrario valdr 0.</p>

<p align="left">Si la sentencia se utiliza sin la clusula INDEX

  slo se podr utilizar en un LOOP .. ENDLOOP. El sistema insertara la lnea 
  antes de la lnea tratada en el bucle.</p>

<pre>INSERT LINES OF <tabla1> [ FROM <n1> ] [ TO <n2> ] INTO <tabla2> [ INDEX <ndice> ]</pre>

<ul>

  <li> 
    <p align="left">Si no se especifican las clusulas FROM <n1> 
      y TO <n2> la tabla <tabla1> se inserta entera sobre la tabla 
      <tabla2>. Especificando estas clusulas se puede indicar la primera 
      y la ltima lnea que se va insertar. <n1> y <n2> son ndice 
      de la tabla interna.
  </li>
  <li> 
    <p align="left">Si especificamos la clusula INDEX <ndice>, 
      la lnea se insertar antes de la lnea con el ndice <ndice>. Si 
      la sentencia INSERT se utiliza sin la clusula INDEX slo se podr ser utilizada 
      en un bucle ⚠ &lt;a href="loop_endloop.htm" tppabs="loop_endloop.htm"&gt;LOOP .. ENDLOOP⚠ &lt;/a&gt;. El sistema inserta 
      la lnea tratada en el bucle. Despus de ejecutarse la sentencia la variable 
      del sistema SY-TABIX tiene el ndice de la ltima lnea aadida. Dependiendo 
      del tamao de la tabla interna que hay que copiar, con este mtodo el proceso 
      en 20 veces ms rpido que insertarlas lnea a lnea.
  </li>

</ul>

<p align="left">La sentencia INSERT puede ser utilizada para insertar

  una o varias lneas (a partir de una tabla interna) en una tabla de la base 
  de datos. Si no sabemos si la clave primaria existe, se debe utilizar la sentencia 
  ⚠ &lt;a href="modify.htm" tppabs="modify.htm"&gt;MODIFY⚠ &lt;/a&gt;. Se puede utilizar una vista como especificacin 
  de tabla, siempre y cuando la vista haga referencia a una sola tabla.</p>

<pre>INSERT INTO { <tabla> | (<campo>) } [ CLIENT SPECIFIED ] VALUES <rea>.</pre>

<p align="left">Esta sentencia se utiliza para insertar una lnea

  a una tabla de diccionario. El contenido del rea de trabajo <rea> ser 
  escrito en la tabla de la base de datos <tabla>. La tabla tiene que estar 
  declarada en la sentencia ⚠ &lt;a href="tables.htm" tppabs="tables.htm"&gt;TABLES⚠ &lt;/a&gt; y la rea de trabajo 
  <rea> tiene que tener la misma estructura que <tabla> (se recomienda 
  utilizar el operador LIKE en la sentencia ⚠ &lt;a href="data.htm" tppabs="data.htm"&gt;DATA⚠ &lt;/a&gt; para declararla 
  de la misma estructura).</p>

<p align="left">Si la tabla no contiene una lnea con la misma

  clave primaria que la especificada en el rea de trabajo <rea>, la variable 
  SY-SUBRC valdr 0, en caso contrario, la lnea no se insertara y la variable 
  SY-SUBRC valdr 4.</p>

<p align="left">Para especificar el nombre de la tabla en tiempo

  de ejecucin utilizaremos la opcin (<campo>). En tiempo de ejecucin 
  se debe rellenar con el nombre de la tabla donde realizaremos la operacin de 
  insercin.</p>

<pre>INSERT { <tabla> | (<campo>) } [ CLIENT SPECIFIED ] [ FROM <field-string> ].</pre>

<p align="left">Esta variante tiene el mismo efecto que la variante

  vista anteriormente.</p>

<ul>

  <li> 
    <p align="left">Se trata de una versin ⚠ &lt;i&gt;simplificada⚠ &lt;/i&gt; 
      donde la clusula INTO no se especifica y en lugar de VALUES se pone FROM.
  </li>
  <li> 
    <p align="left">Si no se especifica la clusula FROM, los 
      datos que hay que insertar sern los del rea de trabajo de la tabla <tabla>. 
      Si especificamos el nombre de la tabla en tiempo de ejecucin, la clusula 
      FROM es obligatoria.
  </li>

</ul>

<pre>INSERT { <tabla> | (<campo>) } [ CLIENT SPECIFIED ] FROM TABLE <tabla-interna>

[ ACCEPTING DUPLICATE KEYS].</pre>

<p>En esta variante se puede insertar ms de una lnea en la tabla

  de diccionario. La estructura de la tabla interna debe ser la misma que la estructura 
  de la tabla en la que se van a insertar lneas. Las lneas sern ejecutadas 
  en una sola operacin. Si la sentencia se ejecuta correctamente SY-SUBRC valdr 
  0, en caso contrario valdr 4. </p>

<p>Si alguna de las lneas de la tabla interna no puede ser insertada,

  el sistema activa un error en tiempo de ejecucin (suele ser por duplicacin 
  de claves). Para evitar este error en tiempo de ejecucin, se utiliza la clusula 
  ACCEPTING DUPLICATE KEYS. Con estos forzamos al sistema a saltar las lneas 
  que no puede insertar. La variable SY-DBCNT tendremos las lneas insertadas 
  y la variable SY-SUBRC valdr 4 cuando se salte alguna lnea.</p>

<p>Es ms eficiente utilizar esta ltima sentencia para insertar

  un conjunto de lneas, que utilizar las otras variantes que las insertara de 
  en una en una.</p>

<p align="left">⚠ &lt;b&gt;Ejemplo 1:⚠ &lt;/b&gt;</p>

<pre>DATA: VALUE TYPE I,

      ITAB  TYPE I OCCURS 100 WITH HEADER LINE.</pre>

<pre>ITAB = 5.

VALUE = 36.</pre>

<pre>INSERT ITAB INDEX 1.

INSERT VALUE INTO ITAB INDEX 2.

INSERT INITIAL LINE INTO ITAB INDEX 2.</pre>

<p align="left">⚠ &lt;b&gt;Ejemplo 2:⚠ &lt;/b&gt;</p>

<pre>TYPES NAME(10) TYPE C.</pre>

<pre>DATA: NAME_TAB_1 TYPE NAME OCCURS 5,

      NAME_TAB_2 TYPE NAME OCCURS 5.</pre>

<pre>APPEND 'Alice' TO NAME_TAB_1.

APPEND 'Martha' TO NAME_TAB_1.

APPEND 'Ruth' TO NAME_TAB_1.</pre>

<pre>APPEND 'Harry' TO NAME_TAB_2.

APPEND 'Walter' TO NAME_TAB_2.</pre>

<pre>INSERT LINES OF NAME_TAB_1 FROM 2 INTO NAME_TAB_2 INDEX 2.</pre>

<p align="left">⚠ &lt;b&gt;Vase tambin:⚠ &lt;/b&gt; ⚠ &lt;a href="append.htm" tppabs="append.htm"&gt;APPEND⚠ &lt;/a&gt;,

  ⚠ &lt;a href="collect.htm" tppabs="collect.htm"&gt;COLLECT⚠ &lt;/a&gt;, ⚠ &lt;a href="modify.htm" tppabs="modify.htm"&gt;MODIFY⚠ &lt;/a&gt;, ⚠ &lt;a href="loop_endloop.htm" tppabs="loop_endloop.htm"&gt;LOOP⚠ &lt;/a&gt;, 
  ⚠ &lt;a href="read_table.htm" tppabs="read_table.htm"&gt;READ TABLE⚠ &lt;/a&gt;.</p>

</body>

</html>