![](/cvo_files/imgs_sap_abap/logos/logo_cvo_academy_it.png)
✒️ABAP El lenguaje SQL y la sentencia SELECT
ABAP El lenguaje SQL y la sentencia SELECT
![ABAP El lenguaje SQL y la sentencia SELECT ABAP El lenguaje SQL y la sentencia SELECT](https://www.cvosoft.com/cvo_files/imgs_sap_abap/og-images/264.jpg)
INSTRUCCIONES SQL: LA SENTENCIA SELECT
Existen en ABAP un conjunto de sentencias que se utilizan para acceder a las bases de datos. La principal sentencia es SELECT, cuya 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 de la búsqueda”
Si quisiéramos obtener todos los registros de la tabla ZTABLA_USUARIOS usaríamos el siguiente código:
* selecciono todos los registros
SELECT *
FROM ztabla_usuarios
INTO TABLE ti_usuarios.
Donde TI_USUARIOS es una tabla 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 se utiliza cuando el resultado de la consulta se guarda en una tabla interna.
Evitar el uso * cuando solo se quiere obtener algunos campos de la tabla origen.
En la sentencia anterior, en caso de existir registros en la tabla ZTABLA_USUARIOS, estos pisaran el contenido de la tabla interna TI_USUARIOS.
Podría ocurrir que queramos conservar el contenido de la tabla interna TI_USUARIOS luego de reiteradas selecciones. En este caso tendríamos que usar la cláusula APPENDING TABLE en lugar de INTO TABLE.
Es recomendable hacer CLEAR Y REFRESH de la tabla interna antes de realizar la selección.
Si quisiéramos obtener de todos los campos de la tabla ZTABLA_USUARIOS el campo DNI deberíamos crear una tabla auxiliar solo son el campo DNI para alojar el resultado de la consulta.
* selecciono de todos los registros el campo DNI
SELECT dni
FROM ztabla_usuario
INTO TABLE ti_usuarios_aux.
Siempre después de un SELECT se debe preguntar por el SY-SUBRC para saber cómo proseguir.
Si quisiéramos obtener la primera ocurrencia de la tabla ZTABLA_USUARIOS donde se cumpla determinada condición debemos usar la cláusula SINGLE como veremos 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 la consulta será guardado en la estructura WA_USUARIOS que es del mismo tipo que la tabla ZTABLA_USUARIO
Si quisiéramos hacer la misma consulta anterior pero necesitamos obtener solo el campo DNI entonces ya no sería necesario la estructura WA_USUARIO sino que guardaríamos el resultado en la variable V_DNI tal como vemos en el siguiente ejemplo:
* selecciono el primer registro que cumpla la condición
CLEAR v_dni.
SELECT dni
FROM ztabla_usuarios
INTO v_dni
WHERE nombre_ape NE SPACE.
Si quisiéramos obtener de una tabla los registros que cumpla una condición pero queremos guardarlos en una tabla interna que no tiene la mimas 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’.
En el ejemplo anterior, la tabla interna TI_USUARIOS2 está compuesta por los campos NOMBRE_APE y ESTADO_USU.
Supongamos que tenemos un reporte que tiene la pantalla de selección. Donde Nombre y Apellido es el parameter P_NOMAPE y usuario es el select-options S_ESTADO. Si quisiéramos hacer una selección a la tabla ZTABLA_USUARIOS en la base a lo que los usuarios ingresan por pantalla haríamos lo siguiente:
* selecciono los registros que cumplan con los parámetro de pantalla
SELECT *
FROM ztabla_usuarios
INTO TABLE ti_usuarios
WHERE nombre_ape = p_nomape
AND estado_usu IN s_estado
La cláusula IN se utiliza para los select-options en las condiciones select.
Ahora, si quisiéramos obtener el usuario activo con DNI más alto tendríamos que usar la cláusula MAX de la siguiente forma:
* obtengo el usuario activo con DNI más alto
SELECT SINGLE MAX (DNI)
INTO v_dni
FROM ztabla_usuarios
WHERE estado_usu = ‘A’.
Si quisieramos saber la cantidad de usuario 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 quisiéramos obtener de una tabla todos los registros que existan en una tabla interna cargada con datos, entonces debemos utilizar la sentencia FOR ALL ENTRIES IN que nos permite especificar condiciones en tiempo de ejecución. Veamos un ejemplo:
* obtengo los registros de los usuarios que existen en la tabla interna TI_PROVEEDORE
SELECT *
INTO TABLE ti_usuarios
FROM ztabla_usuarios
FOR ALL ENTRIES IN ti_proveedores
WHERE dni = ti_proveedores-dni
Si quisiéramos obtener todos los registros que cumplan con un patrón de texto en alguno de sus campos, debemos utilizar la sentencia LIKE como vemos 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%’.
 
 
 
Sobre el autor
Publicación académica de Jean Carlos Lopez Uzcategui, en su ámbito de estudios para la Carrera Consultor ABAP.
Jean Carlos Lopez Uzcategui
Profesión: Sistemas - Venezuela - Legajo: HS82J
✒️Autor de: 53 Publicaciones Académicas
🎓Egresado del módulo:
Disponibilidad Laboral: FullTime