W Pub: ABAP Cursosentenciaselectendselect

<html>

<head>

<title>SELECT .. ENDSELECT</title>

</head>

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

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

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

<p align="left" class="letras_menu_izquierdo"><span>Se utiliza

  para leer un/os registro/s de una tabla de la base de datos. Lectura de un nico 
  registro de una tabla de la base de datos.</span></p>

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

<pre class="letras_menu_izquierdo"><span>SELECT [ SINGLE ] <opciones-select>

       FROM <opciones-from>
       [ INTO <opciones-into  | APPENDING <opciones-appending> ]
       [ WHERE <opciones-where> ]
       [ GROUP BY <opciones-group> ]
       [ ORDER BY <opciones-order> ].
       ...
       [ ENDSELECT. ]</span></pre>

<ul>

  <li class="letras_menu_izquierdo"><span>Con la clusula SELECT 
    identificamos los campos que queremos leer, si se usa con la clusula FROM 
    es obligatoria e identifica la tabla que hay que leer.</span></li>
  <li class="letras_menu_izquierdo"><span>INTO o APPENDING -> 
    Son opcionales e identifican los campos destino de la lectura.</span></li>
  <li class="letras_menu_izquierdo"><span>WHERE -> Es opcional 
    e identifica las condiciones de seleccin.</span></li>
  <li class="letras_menu_izquierdo"><span>GROUP BY -> Es opcional 
    y sirve para la agrupacin de campos.</span></li>
  <li class="letras_menu_izquierdo"><span>ORDER BY -> Es opcional 
    y sirve para marcar el criterio de ordenacin.</span></li>
  <li class="letras_menu_izquierdo"><span>ENDSELECT -> Marca 
    el final de un bloque si la sentencia SELECT no se ha puesto la opcin SINGLE.</span></li>

</ul>

<p class="letras_menu_izquierdo"><span>La sentencia ⚠ &lt;i&gt;Open SQL⚠ &lt;/i&gt;

  utilizan de forma automtica el campo mandante. Las sentencias acceden a tablas 
  dependientes de mandante leen y procresan slo los datos del mandante actual 
  (mandante de conexin). Sin la clusula CLIENT SPECIFIED no es posible utilizar 
  el campo mandante en la clusula WHERE (provocan un error de sintaxis). Si rellenamos 
  el campo mandante en las sentencias ⚠ &lt;a href="insert.htm" tppabs="insert.htm"&gt;INSERT⚠ &lt;/a&gt;, ⚠ &lt;a href="update.htm" tppabs="update.htm"&gt;UPDATE⚠ &lt;/a&gt; 
  o ⚠ &lt;a href="delete.htm" tppabs="delete.htm"&gt;DELETE⚠ &lt;/a&gt; no se produce ningn error en tiempo de  
  ejecucin, el sistema sobrescribe el campo mandante del rea de trabajo con 
  el mandante actual antes de procesar la sentencia Open SQL. Si deseamos especificar 
  un mandante distinto al actual debemos utilizar la clusula CLIENT SPECIFIED 
  en las sentencias SELECT, ⚠ &lt;a href="insert.htm" tppabs="insert.htm"&gt;INSERT⚠ &lt;/a&gt;, ⚠ &lt;a href="update.htm" tppabs="update.htm"&gt;UPDATE⚠ &lt;/a&gt;, 
  ⚠ &lt;a href="modify.htm" tppabs="modify.htm"&gt;MODIFY⚠ &lt;/a&gt; o ⚠ &lt;a href="delete.htm" tppabs="delete.htm"&gt;DELETE⚠ &lt;/a&gt;.</span></p>

<pre class="letras_menu_izquierdo"><span>... CLIENT SPECIFIED.</span></pre>

<p class="letras_menu_izquierdo"><span>Esta opcin debe ir siempre

  a continuacin del nombre de la tabla. Con esta opcin desconectamos el automatismo 
  del manejo del campo mandante, por lo tanto, habr que rellenarlo en la sentencias 
  de insercin o modificacin.</span></p>

<p class="letras_menu_izquierdo"><span>La clusula SELECT define

  la seleccin sencilla o mltiple de fila, define tambin si las filas duplicadas 
  sern excluidas, as como las columnas que seleccionar.</span></p>

<pre class="letras_menu_izquierdo"><span>SELECT [ SINGLE [ FOR UPDATE ] ] [ DISTINCT ]

       { * | <campos> | MAX(<campo> ) AS <m> | MIN(<campo> ) AS <m> |    
         AVG(<campo> ) AS <m> | SUM(<campo> ) AS <m> | COUNT(* ) as <m> | (lista)
         COUNT([ DISTINCT ] <campo> ) AS <m> } 

...

[ ENDSELECT ].</span></pre>

<p class="letras_menu_izquierdo"><span>Para leer todas las columnas

  de una tabla se utiliza el asterisco (*).</span></p>

<p class="letras_menu_izquierdo"><span>Con la clusula SINGLE

  es necesario especificar todos los campos de la clave primaria en la clusula 
  WHERE para identificar de forma nica un registro. Si la lnea no se encuentra 
  SY-SUBRC vale 4. Si el sistema consigue leer hasta una lnea SY-SUBRC valdr 
  0. Con la clusula FOR UPDATE el sistema bloquea la lnea leda. Slo puede 
  ser utilizada en combinacin con la clusula SINGLE. El programa espera hasta 
  que recibe por parte del sistema confirmacin del bloqueo. Si no se pudiera 
  realizar el bloqueo el programa termina con un error. La clusula no se pudiera 
  realizar el bloqueo el programa termina con un error. La clusula FOR UPDATE 
  debe ser utilizada en combinacin con los mecanismos de bloque y desbloqueo. 
  Con la clusula SINGLE leemos una sola lnea de la tabla y sin la clusula la 
  seleccin es mltiple. Cada vez que el sistema nos deja una lnea sobre el rea 
  de trabajo especificado, se ejecuta el bloque de sentencias hasta la sentencia 
  ENDSELECT.</span></p>

<p class="letras_menu_izquierdo"><span>Con la opcin DISTINCT

  automticamente se excluyen las lnea duplicadas. Si al menos se lee una lnea 
  de la tabla, SY-SUBRC vale 0, en caso contrario vale 4. La variable del sistema 
  SY-DBCNT se incrementa en uno por cada paso del bucle. Al final de ste conserva 
  el nmero de lneas ledas.</span></p>

<p class="letras_menu_izquierdo"><span>En lugar de leer todas

  las columnas de la tabla se puede leer ciertas columnas o aplicar ciertas funciones 
  a dichas columnas. Veamos todas las posibilidades de la clusula:</span></p>

<ul>

  <li class="letras_menu_izquierdo"><span>* -> Son todos los 
    campos de la tabla.</span></li>
  <li class="letras_menu_izquierdo"><span><campo> -> 
    Es una lista de campos de la tabla.</span></li>
  <li class="letras_menu_izquierdo"><span>MAX(<campo> ) 
    -> Devuelve el valor mximo de la columna <campo>.</span></li>
  <li class="letras_menu_izquierdo"><span>MIN(<campo> ) 
    -> Devuelve el valor mnimo de la columna <campo>.</span></li>
  <li class="letras_menu_izquierdo"><span>AVG(<campo> ) 
    -> Devuelve la media de valores de la columna <campo>.</span></li>
  <li class="letras_menu_izquierdo"><span>SUM(<campo> ) 
    -> Devuelve la suma de valores de la columna <campo>.</span></li>
  <li class="letras_menu_izquierdo"><span>COUNT([ DISTINCT ]<campo> 
    ) -> Devuelve el nmero de registros seleccionados. Con DISTINCT slo se 
    cuentan los registros distinto</span></li>
  <li class="letras_menu_izquierdo"><span>(<tabla> ) -> 
    Es una tabla interna donde se especifica cualquier opcin de las vistas anteriormente.</span></li>

</ul>

<p class="letras_menu_izquierdo"><span>Se deben dejar espacios

  en blanco entre los parntesis y el argumento de la funcin. Con la opcin AS 
  se utiliza un nombre alternativo <m>. Si se especifican campos a leer 
  o funciones, la clusula INTO es obligatoria.</span></p>

<blockquote class="letras_menu_izquierdo"><span> Opciones de la

  clusula FROM </span></blockquote>

<p class="letras_menu_izquierdo"><span>Esta clusula especifica

  la tabla o vista de la base de datos que va a ser leda.</span></p>

<pre class="letras_menu_izquierdo"><span>FROM { <tabla> | <vista> | <tabla> }

[ CLIENT SPECIFIED ] [ BYPASSING BUFFER ] [ UP TO <n> ROWS ]</span></pre>

<p class="letras_menu_izquierdo"><span>La tabla o vista <tabla>

  debe estar definida en el diccionario de datos, y debe estar declarada en el 
  programa en la sentencia ⚠ &lt;a href="tables.htm" tppabs="tables.htm"&gt;TABLES⚠ &lt;/a&gt;. Con la opcin BYPASSING 
  BUFFER el sistema lee los datos de la tabla directamente de la base de datos, 
  sin utilizar el buffer de la tabla. Con ellos nos aseguramos de que los datos 
  son los ms recientes. Cuando se define un tabla en el diccionario de datos 
  se puede especificar que el sistema utilice un buffer local de la tabla. Este 
  buffer se actualiza de forma asncrona. Normalmente la sentencia SELECT utiliza 
  este buffer, y no tiene por qu ser la versin ms reciente. Para asegurar la 
  lectura de la ltima versin, se utiliza esta opcin. Si queremos leer un nmero 
  determinado de lneas se utiliza la opcin UP TO <n> ROWS. <n> determina 
  el nmero de lneas a leer. Si <n> es igual a 0 se leen todas las lneas, 
  si <n> es menor que 0, se produce un error en tiempo de ejecucin. Si 
  combinamos la opcin UP TO <n> ROWS con la clusula ORDER BY, el sistema 
  primero ordena la tabla y posteriormente procesa las <n> primeras lneas.</span></p>

<p class="letras_menu_izquierdo"><span>Se puede especificar el

  nombre de la tabla en tiempo de ejecucin, para ello, se utiliza la clusula 
  (<campo>). <campo> contiene el nombre de la tabla, y no tiene por 
  qu declararse con la sentencia ⚠ &lt;a href="tables.htm" tppabs="tables.htm"&gt;TABLES⚠ &lt;/a&gt;. Con esta opcin 
  la clusula INTO es obligatoria.</span></p>

<blockquote>

  <p class="letras_menu_izquierdo"><span>Opciones de la clusula 
    INTO</span></p>

</blockquote>

<p class="letras_menu_izquierdo"><span>Para especificar un rea

  de destino de los datos seleccionados se utiliza la clusula INTO de la sentencia 
  SELECT.</span></p>

<pre class="letras_menu_izquierdo"><span>INTO [ CORRESPONDING FIELD OF ]

{ <rea> | TABLE <tabla> | [ PACKAGE SIZE <n> ] }</span></pre>

<p class="letras_menu_izquierdo"><span>Esta clusula es necesaria

  si queremos utilizar un rea de trabajo distinto al rea de trabajo de la tabla 
  leda. Las reas de trabajo de las tablas se generan automticamente en el momento 
  de declarar la tabla con la sentencia ⚠ &lt;a href="tables.htm" tppabs="tables.htm"&gt;TABLES⚠ &lt;/a&gt;. La clusula 
  INTO tambin aparece en otras sentencias ⚠ &lt;i&gt;Open SQL⚠ &lt;/i&gt; como ⚠ &lt;a href="fetch.htm" tppabs="fetch.htm"&gt;FETCH⚠ &lt;/a&gt;. 
  El campo <rea> debe estar declarado como objeto de datos y debe tener, 
  al menos, la longitud de los campos ledos. Con la opcin CORRESPONDING FIELD 
  OF el sistema  deja los campos sobre la estructura especificada, sobre 
  los campos con el mismo nombre que los ledos. Con la opcin TABLE la lectura 
  se realiza en una sola operacin (no es necesario ENDSELECT) y cada lnea leda 
  es insertada en la tabla interna. Si se especifica la clusula PACKAGE SIZE 
  la lectura se realiza en paquetes de <n> lneas (si es necesario ENDSELECT).</span></p>

<blockquote>

  <p class="letras_menu_izquierdo"><span>Opciones de la clusula 
    APPENDING</span></p>

</blockquote>

<p class="letras_menu_izquierdo"><span>Con la clusula APPENDING

  las lneas aadidas en la tabla interna se aaden al final-</span></p>

<pre class="letras_menu_izquierdo"><span>APPENDING [ CORRESPONDING FIELD OF]

   TABLE <tabla> [ PACKAGE SIZE <n> ]</span></pre>

<p class="letras_menu_izquierdo"><span>Las opciones CORRESPONDING

  FIELDS OF, TABLE y PACKAGE SIZE tienen el mismo significado que en la clusula 
  INTO.</span></p>

<blockquote>

  <p class="letras_menu_izquierdo"><span>Opciones de la clusula 
    WHERE</span></p>

</blockquote>

<p class="letras_menu_izquierdo"><span>la clusula WHERE nos permite

  indicar los criterios de seleccin. Esta clusula tambin se utiliza en las 
  sentencias ⚠ &lt;a href="update.htm" tppabs="update.htm"&gt;UPDATE⚠ &lt;/a&gt;, ⚠ &lt;a href="delete.htm" tppabs="delete.htm"&gt;DELETE⚠ &lt;/a&gt; 
  y ⚠ &lt;a href="open_cursor.htm" tppabs="open_cursor.htm"&gt;OPEN CURSOR⚠ &lt;/a&gt;.</span></p>

<pre class="letras_menu_izquierdo"><span>WHERE { <campo_bd> <operador> <campo> |

      <campo_bd> [ NOT ] BETWEEN <campo1> AND <campo2>             |
      <campo_bd> [ NOT ] LIKE <campo> [ ESCAPE <e> ]               |
      <campo_bd> [ NOT ] IN <campo1> (campo1>, ... , <campon> )    |
      <campo_bd> IS [ NOT ] NULL                                   |
      <campo_bd> [ NOT ] IN  <criterio_seleccion>                  |
      ( <tabla_condiciones> ) }
      [ { NOT, AND, OR, (, ) } ... ]</span></pre>

<p class="letras_menu_izquierdo"><span>El significado de las opciones

  de esta clusula es el siguiente:</span></p>

<ul>

  <li class="letras_menu_izquierdo"><span><campo_bd> <operador> 
    <campo> -> Los operadores vlidos para <operador> son los siguientes:</span></li>

</ul>

<table border="0" width="100%">

  <tr> 
    <td width="33%" class="letras_menu_izquierdo"><span>⚠ &lt;b&gt;Operador⚠ &lt;/b&gt;</span></td>
    <td width="33%" class="letras_menu_izquierdo"><span>⚠ &lt;b&gt;Equivalente⚠ &lt;/b&gt;</span></td>
    <td width="34%" class="letras_menu_izquierdo"><span>⚠ &lt;b&gt;Significado⚠ &lt;/b&gt;</span></td>
  </tr>
  <tr> 
    <td width="33%" class="letras_menu_izquierdo"><span>EQ</span></td>
    <td width="33%" class="letras_menu_izquierdo"><span>=</span></td>
    <td width="34%" class="letras_menu_izquierdo"><span>Igual 
      a</span></td>
  </tr>
  <tr> 
    <td width="33%" class="letras_menu_izquierdo"><span>NE</span></td>
    <td width="33%" class="letras_menu_izquierdo"><span><> 
      o ><</span></td>
    <td width="34%" class="letras_menu_izquierdo"><span>No igual</span></td>
  </tr>
  <tr> 
    <td width="33%" class="letras_menu_izquierdo"><span>LT</span></td>
    <td width="33%" class="letras_menu_izquierdo"><span><</span></td>
    <td width="34%" class="letras_menu_izquierdo"><span>Menor 
      que</span></td>
  </tr>
  <tr> 
    <td width="33%" class="letras_menu_izquierdo"><span>LE</span></td>
    <td width="33%" class="letras_menu_izquierdo"><span><=</span></td>
    <td width="34%" class="letras_menu_izquierdo"><span>Menor 
      o igual a</span></td>
  </tr>
  <tr> 
    <td width="33%" class="letras_menu_izquierdo"><span>GT</span></td>
    <td width="33%" class="letras_menu_izquierdo"><span>></span></td>
    <td width="34%" class="letras_menu_izquierdo"><span>Mayor 
      que</span></td>
  </tr>
  <tr> 
    <td width="33%" class="letras_menu_izquierdo"><span>GE</span></td>
    <td width="33%" class="letras_menu_izquierdo"><span>>=</span></td>
    <td width="34%" class="letras_menu_izquierdo"><span>Mayor 
      o igual que</span></td>
  </tr>

</table>

<ul>

  <li class="letras_menu_izquierdo"><span><campo_bd> [ NOT 
    ] BETWEEN <campo1> AND <campo2>  -> El valor del campo 
    de la base de datos <campo_bd> debe estar comprendido (o no, si se utiliza 
    NOT) entre los valores de los campos <campo1> y <campo2>. <campo1> 
    y <campo2> pueden ser literales.</span></li>
  <li class="letras_menu_izquierdo"><span><campo_bd> [ NOT 
    ] LIKE <campo> [ ESCAPE <e> ] -> Esta opcin slo puede ser 
    utilizada con campos alfanumricos. El campo de la base de datos debe, o no, 
    corresponder con el patrn <campo>. Patrn significa que el campo puede 
    tener caracteres con un significado especial. El guin bajo ( _ ) representa 
    cualquier carcter individual, el carcter porcentaje ( % ) representa cualquier 
    nmero de caracteres. Si queremos utilizar estos caracteres especiales como 
    carcter significativo hay que anteponerle el carcter de escape <e>.</span></li>
  <li class="letras_menu_izquierdo"><span><campo_bd> [ NOT 
    ] IN  <criterio_seleccion> <campo1> (campo1>, ... , <campon> 
    ) -> El valor de la base de datos debe, o no, ser el valor nulo.</span></li>
  <li class="letras_menu_izquierdo"><span><campo_bd> IS 
    [ NOT ] NULL  -> El valor del campo de la base de datos debe, o no, 
    ser el valor nulo.</span></li>
  <li class="letras_menu_izquierdo"><span><campo_bd> [ NOT 
    ] IN  <criterio_seleccion>  -> El campo de la base de datos 
    debe, o no, cumplir las condiciones del criterio.</span></li>
  <li class="letras_menu_izquierdo"><span>( <tabla_condiciones> 
    ) -> Se puede especificar la expresin en tiempo de ejecucin a travs 
    de la tabla interna <tabla_condiciones>. La tabla debe contener slo 
    un campo alfanmerico de longitud 72. La tabla debe estar especificada entre 
    parntesis sin espacios en blanco entre los parntesis y el nombre de la tabla. 
    Puede estar combinada con expresiones estticas gracias a los operadores AND 
    y OR.</span></li>

</ul>

<p class="letras_menu_izquierdo"><span>Se puede crear una expresin

  combinada gracias a los operadores AND, OR y NOT. NOT no tiene prioridad sobre 
  AND y a su vez OR. Se pueden utilizar los parntesis para marcar la prioridad 
  en una expresin.</span></p>

<blockquote>

  <p class="letras_menu_izquierdo"><span>Hay un formato especial 
    de la sentencia WHERE que es el siguiente:</span></p>

</blockquote>

<pre class="letras_menu_izquierdo"><span>FOR ALL ENTRIES IN <tabla> WHERE <condicin>.</span></pre>

<p class="letras_menu_izquierdo"><span>Con esta variante se puede

  especificar condiciones en tiempo de ejecucin. En <condicin> se puede 
  especificar campos de la tabla interna y literales. Con esta variante no se 
  puede utilizar en <condicin> las opciones LIKE, BETWEEN e IN.</span></p>

<blockquote>

  <p class="letras_menu_izquierdo"><span>Opciones de la clusula 
    GROUP BY</span></p>

</blockquote>

<p class="letras_menu_izquierdo"><span>Para combinar en contenido

  de un grupo de lneas de una tabla de la base de datos en una sola lnea se 
  utiliza la clusula GROUP BY.</span></p>

<pre class="letras_menu_izquierdo"><span>GROUP BY { <campo1> ... <campon> | (<tabla>) }</span></pre>

<p class="letras_menu_izquierdo"><span>Con campo <campo1>

  ... <campon> especificamos los campos de agrupamiento. Con (<tabla>) 
  se puede especificar los campos de agrupamiento dinmicamente, es decir, en 
  tiempo de ejecucin.</span></p>

<blockquote>

  <p class="letras_menu_izquierdo"><span>Opciones de la clusula 
    ORDER BY</span></p>

</blockquote>

<p class="letras_menu_izquierdo"><span>Con dicha clusula fijamos

  un criterio de ordenacin en los datos.</span></p>

<pre class="letras_menu_izquierdo"><span>ORDER BY { PRIMARY KEY |

         <campo1> [ ASCENDING | DESCENDING ] ...
         <campon> [ ASCENDING | DESCENDING ]   | 
         (<tabla>) }</span></pre>

<p class="letras_menu_izquierdo"><span>Con la opcin PRIMARY KEY

  se ordenan por los campo de la clave primaria ascendentemente. <campo1> 
  puede ser cualquier campo de la tabla. Se puede especificar si el criterio de 
  ordenacin, en cada campo, es ascendente (por defecto) o descendente. Si especificamos 
  ms de un campo se ordenarn en la secuencia especificada. Con la opcin (<tabla>) 
  se puede indicar los campos de ordenacin dinmicamente. La lnea de la tabla 
  debe ser del tipo C y longitud 72.</span></p>

<p class="letras_menu_izquierdo"><span>⚠ &lt;b&gt;Ejemplo:⚠ &lt;/b&gt;</span></p>

<pre class="letras_menu_izquierdo"><span>TABLES SBOOK.</span></pre>

<pre class="letras_menu_izquierdo"><span>SELECT * FROM SBOOK

  WHERE
    CARRID   = 'LH '      AND
    CONNID   = '0400'     AND
    FLDATE   = '19950228'
  ORDER BY PRIMARY KEY.
  WRITE: / SBOOK-BOOKID, SBOOK-CUSTOMID,   SBOOK-CUSTTYPE,
           SBOOK-SMOKER, SBOOK-LUGGWEIGHT, SBOOK-WUNIT,
           SBOOK-INVOICE.

ENDSELECT.</span></pre>

<p> </p>

</body>

</html>