✒️ABAP El lenguaje SQL y la sentencia SELECT
ABAP El lenguaje SQL y la sentencia SELECT
Sentencia SELECT
Su sintaxis es la siguiente:
SELECT <resultado> "En resultado se colocan los campos que se quieren recuperar
FROM <tabla> "Tabla es la tabla origen de donde se sacan los datos
INTO <target> "Target es el destino donde serán alojados los datos
WHERE <condiciones>. "Condiciones de la búsqueda
Si quisieramos obtener todos los registros de la tabla ZTABLA_USUARIOS usuaríamos el siguiente código:
SELECT *
FROM ztabla_usuarios
INTO TABLE ti_usuarios.
Donde TI_USUARIOS es una tabla interna del mismo tipo de la tabla ZTABLA_USUARIOS. El asterisco indica que se obtendrán todos los campos de la tabla. La cláusula INTO TABLE se usa cuando el resultado de la consulta se guarda en una tabla interna.
Hay que evitar el uso del * cuando se requiera obtener algunos campos de la tabla origen.
En la sentencia anterior, en caso de existir registros en la tabla ZTABLA_USUARIOS, estos pisarán el contenido de la tabla interna TI_USUARIOS.
Si quisieramos conservar el contenido de la tabla interna TI_USUARIOS luego de reiteradas selecciones, tendriamos que usar la cláusula APPENDING TABLE en lugar de INTO TABLE.
Se recomienda hacer CLEAR y REFRESH de la tabla interna antes de realizar la seleccion.
Si quisieramos obtener de todos los campos de la tabla ZTABLA_USUARIOS el campo DNI deberíamos crear una tabla auxiliar solo con el campo DNI para alojar el resultado de la consulta.
* Selecciono de todos los registros el campo DNI
SELECT dni
FROM ztabla_usuarios
INTO TABLE ti_usuarios_aux.
Siempre despues de un SELECT se debe preguntar por el SY-SUBRC para saber como proseguir.
Si quisieramos obtener la primera ocurrencia de la tabla ZTABLA_USUARIOS donde se cumpla determinada condición debemos usar la cláusula SINGLE como vemos a continuación:
*Selecciono el primer registro que cumpla la condición
CLEAR wa_usuarios.
SELECT SINGLE *
FROM ztabla_usuarios
INTO wa_usuarios
WHERE nombre_ape NE space.
El resultado de esta consulta será guardado en la estructura WA_USUARIOS que el del mismo tipo que la tabla ZTABLA_USUARIOS.
Si quisieramos hacer la misma consulta anterior pero necesitaramos obtener solo el campo DNI entonces ya no sería necesaria la estructura WA_USUARIOS sino que guardaríamos el resultado en la variable V_DNI. Ejemplo:
* Selecciono el primer registro que cumpla la condición
CLEAR v_dni.
SELECT SINGLE dni
FROM ztabla_usuarios
INTO v_dni
WHERE nombre_ape NE space.
Si quisieramos obtener de una tabla los registros que cumplan una condición pero queremos guardarlos en una tabla interna que no tiene la misma estructura que la tabla, entonces tenemos que usar la cláusula INTO CORRESPONDING FIELDS OF TABLE.
* Selecciono los registros que cumplan la condición
SELECT nombre_ape estado_usu
FROM ztabla_usuarios
INTO CORRESPONDING FIELDS OF TABLE ti_usuarios2
WHERE nombre_ape NE space
AND estado_usu = 'A'.
La sentencia INTO CORRESPONDING FIELDS OF TABLE realiza la comparación de los campos teniendo en cuenta los tipos de los campos de cada tabla y la posicion de cada uno de ellos, es decir, por ejemplo si en la posicion 1 se encuentra un campo de tipo CHAR de 4 posiciones entonces en la misma posicion de la otra tabla tambien debe existir un campo de tipo CHAR de 4 posiciones para que la comparación sea correcta.
En el ejemplo anterior la tabla interna TI_USUARIOS2 está compuesta por los campos NOMBRE_APE y ESTADO_USU.
Si tenemos un reporte que tiene la pantalla de seleccion:
Nombre y Apellido:
Estado Usuario: --- a
Donde Nombre y Apellido es el parameter P_NOMAPE y Estado Usuario es el select-options S_ESTADO. Si quisieramos hacer una seleccion a la tabla ZTABLA_USUARIOS en base a lo que los usuarios ingresan por pantalla haríamos lo siguiente:
* Selecciono los registros que cumplan con los parametros de pantalla
SELECT ztabla_usuarios
INTO TABLE ti_usuarios
WHERE nombre_ape = p_nomape
AND estado_usu IN s_estado.
La cláusula IN se usa para los select-options en las condiciones de un select.
Si quisieramos obtener el usuario activo con DNI mas alto tendriamos que usar la clausula MAX de la siguiente manera:
* Obtener el usuario activo con DNI mas alto
SELECT SINGLE MAX ( dni )
INTO v_dni
FROM ztabla_usuarios
WHERE estado_usu = 'A'.
Cuando escribimos la sentencia SELECT es totalmente igual para el compilador ABAP si colocamos primero la sección FROM y luego la sección INTO o al revés.
Si quisieramos saber la cantidad de usuarios con estado = "activo", debemos usar la cláusula COUNT de la siguiente manera:
* Obtengo la cantidad de usuarios activos
SELECT COUNT ( * )
INTO v_activos
FROM ztabla_usuarios
WHERE estado_usu = 'A'.
Si quisieramos obtener de una tabla todos los registros que existan en una tabla interna cargada con datos, debemos usar la sentencia FOR ALL ENTRIES IN que nos permite especificar condiciones en tiempo de ejecución. Ejemplo:
* Obtengo los registros de los usuarios que existan en la tabla
* interna TI_PROVEEDORES
SELECT *
INTO TABLE ti_usuarios
FROM ztabla_usuarios
FOR ALL ENTRIES IN ti_proveedores
WHERE dni = ti_proveedores-dni.
Con FOR ALL ENTRIES lo que hacemos es seleccionar todos los registros de la tabla ztabla_usuarios que se encuentran en la tabla interna ti_proveedores siendo que el campo dni sea igual en ambas tabla y almacenamos las coincidencias en la tabla interna ti_usuarios. Esto mismo se podría realizar recorriendo la tabla interna ti_proveedores con un loop y por cada registro de esta tabla interna ralizaríamos un select a la tabla ztabla_usuarios, pero debemos tener en cuenta la performance de los programas que realizamos ya que si la tabla interna ti_proveedores almacena solo tres registros entonces al ejecutar nuestro programa estariamos accediendo a la base de datos solo tres veces, pero si la tabla interna ti_proveedores almacena cien mil registros entonces al ejecutar nuestro programa estariamos accediendo a la base de datos cien mil veces y esto produciría u tiempo de espera enorme. Para evitar estas situaciones nos aseguramos de acceder una sola vez a la base de datos usando FOR ALL ENTRIES.
Si quisieramos obtener todos los registros que cumplan con un patrón de texto en algunos de sus campos, debemos usar la sentencia LIKE como en el siguiente ejemplo:
* Recupero los usuarios cuyo nombre empiece con A
SELECT *
FROM ztabla_usuarios
INTO TABLE ti_usuarios
WHERE nombre_ape LIKE 'A'.
 
 
 
Agradecimiento:
Ha agradecido este aporte: Carlos Carreira
Sobre el autor
Publicación académica de Manuel Antonio Moncada Vera, en su ámbito de estudios para la Carrera Consultor ABAP.
Manuel Antonio Moncada Vera
Profesión: Ingeniero en Informatica - Colombia - Legajo: JT58S
✒️Autor de: 68 Publicaciones Académicas
🎓Egresado del módulo:
Certificación Académica de Manuel Moncada