✒️ABAP El lenguaje SQL y la sentencia SELECT
ABAP El lenguaje SQL y la sentencia SELECT
INSTRUCCIONES SQL: LA SENTENCIA SELECT.
1.- LA SENTENCIA SELECT:
Sentencia de ABAP que se utiliza para acceder a las bases de datos de SAP.
Sintaxis: SELECT <resultado> FROM <tabla> INTO <target> WHERE <condiciones>.
dde: resultado: se colocan los campos q se quieren recuperar
tabla: es la tabla origen de dde se sacan los datos
target: es el destino dde serán alojados los datos
condiciones: condiciones de la busqueda.
Ej: Si queremos obtener todos los registros de la tabla ZTABLA_USUARIOS:
* Selecciono todos los registros
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 q se obtendrán todos los campos de la tabla. La cláusula INTO TABLE se utiliza cdo el resultado de la consulta se guarda en una tabla interna.
Evitar el uso del * cdo solo se requiera obtener algunos campos de la tabla origen.
Podría ocurrir q queramos conservar el contenido de la tabla interna TI_USUARIOS luego de reiteradas selecciones. En este caso tendríamos q usar la clausula APPENDING TABLE en lugar de INTO TABLE.
Es recomendable hacer CLEAR y REFRESH de la tabla interna antes de realizar la selección.
Ej: si queremos 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 después de un SELECT se debe preguntar por el SY-SUBRC para saber como proseguir.
- Cláusula SINGLE: para obtener la primera ocurrencia de la tabla ZTABLA_USUARIOS donde se cumpla determinada
condición.
Ej:
* Selecciono el primer registro q cumpla la condición
CLEAR wa_usuarios.
SELECT SINGLE *
FROM ztabla_usuarios INTO wa_usuarios where nombre_ape NE space.
el resultado se guardará en la estructura wa_usuarios q es del mismo tipo q la tabla ZTABLA_USUARIOS.
Si quisiéramos hacer la misma consulta anterior pero necesitamos obtener solo el campo DNI entonces ya no sería necesaria la estructura WA_USUARIOS sino q guardaríamos el resultado en la variable V_DNI tal como vemos en el sgte ejemplo:
* Selecciono el primer registro q cumpla la condición
CLEAR v_dni.
SELECT SINGLE dni FROM ztabla_usuarios INTO v_dni WHERE nombre_ape NE space.
Si quisiéramos obtener de una tabla los registros q cumplan una condición pero queremos guardarlo en una tabla interna q no tiene la misma estructura q la tabla, entonces tenemos q usar la cláusula INTO CORRESPONDING FIELDS OF TABLE.
Ej:
* Selecciono los registros q cumpla la condición
SELECT nombre_ape estado_usu frm ztabla_usuarios INTO CORRESPONDING FIELDS OF TABLE ti_usuario2
WHERE nombre_ape NE space AND estado_usu = 'A'.
Si quisiéramos hacer una selección a la tabla ZTABLA_USUARIOS en base a q los usuarios ingresan por pantalla:
* Selecciono los registros q cumplan con los parámetros 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 de un select.
Ej: si quisiéramos obtener el usuario activo con DNI más alto tendríamos q 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'.
Ej: si quisiéramos 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'.
Sentencia FOR ALL ENTRIES IN: obtener de una tabla todos los registros q existan en una tabla interna cargada con datos, esto nos permite especificar condiciones en tiempo de ejecución.
Ej:
* Obtengo los registros de los usuarios q 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.
Sentencia LIKE: si quisiéramos obtener todos los registros q cumplan con un patrón de texto en alguno de sus campos.
Ej:
* Recupero los usuarios cuyo nombre empiece con A
SELECT * FROM ztabla_usuarios INTO TABLE ti_usuarios WHERE nombre_ape LIKE 'A%'.
Cdo 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.
Con FOR ALL ENTRIES lo q hacemos es seleccionar todos los registros de la tabla ZTABLA_USUARIOS q se encuentra en la tabla interna TI_PROVEEDORES siendo q el campo DNI sea igual en ambos tablas y almacenamos la coincidencias en la tabla interna TI_USUARIOS. Esto mismo se podria realizar recorriendo la tabla interna TI_PROVEEDORES con un LOOK y por cada registro de esta tabla interna realizaríamos un select a la tabla ZTABLA_USUARIO, pero q sucede, debemos tener en cuenta la performar de los programas q realizamos ya q si la tabla interna TI_PROVEEDORES almacena solo 3 registros entonces al ejecutar nuestro programa estaríamos accediendo a la BD solo 3 veces pero si la tabla interna TI_PROVEEDORES almacena 100 000 registro entonces al ejecutar nuestro programa estaríamos accediendo a la BD 100 000 veces lo cual produciría un tiempo de espera enorme, para evitar estas situaciones nos aseguramos de acceder una sola vez a la BD utilizando FOR ALL ENTRIES
 
 
 
Sobre el autor
Publicación académica de Mayra Maria Pino Rodriguez, en su ámbito de estudios para la Carrera Consultor ABAP.
Mayra Maria Pino Rodriguez
Profesión: Licenciada Cibernética Matemática - Republica Dominicana - Legajo: RA62Z
✒️Autor de: 56 Publicaciones Académicas
🎓Egresado del módulo:
Certificación Académica de Mayra Pino