✒️ABAP El lenguaje SQL y la sentencia SELECT
ABAP El lenguaje SQL y la sentencia SELECT
UNIDAD 3: DICCIONARIO DE DATOS
LECCIÓN 6: Instrucciones SQL: La sentencia SELECT.
1) 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>
FROM <tabla>
INTO <target>
WHERE <condiciones>
Si queremos obtener todos los registros de la tabla ZTABLA_USUARIOS usaríamos el siguiente código:
SELECT *
FROM ZTABLA_USUARIOS
IN TABLE TI_USUARIOS.
Donde TI_USUARIOS es una tabla interna (es un objeto de datos que permite guardar en memoria grandes cantidades de registros de datos con la misma estructura) del mismo tipo de la tabla ZTABLA_USUARIOS. El asterisco indica que se obtendrán todos los campos de la tabla. La cláusula
NOTA: Evitar el uso de * cuando solo 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.
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 (produce que los registros de las tablas que se seleccionan se añadan al final de la tabla interna sin pisar los registros preexistentes en la tabla interna) en lugar de INTO TABLE.
NOTA: 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 con el campo DNI para alojar el resultado de la consulta.
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 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 vemos a continuació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 es del mismo tipo que 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 que guardaríamos el resultado en la variable V_DNI tal como vemos en el siguiente ejemplo:
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 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 (es necesaria si queremos utilizar un área de trabajo distinta al área de trabajo de la tabla leída).
SELECT NOMBRE_APE ESTADO_USU
FROM ZTABLA_USUARIOS
INTO CORRESPONDING FIELDS OF TABLE TI_USUARIOS2
WHERE NOMBRE_APE NE SPACE
AND ESTADO_USU = 'A'.
AUDIO: 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 posición de cada uno de ellos. Por ejemplo: si en la posición 1 se encuentra un campo de tipo CHAR de 4 posiciones, entonces en la misma posición de la otra tabla también 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. Supongamos que tenemos un reporte que tiene la pantalla de selección:
Donde Nombre y Apellido es el parameter P_NOMAPE y Estado Usuario es el select-options S_ESTADO. Si quisiéramos hacer una selección a la tabla ZTABLA_USUARIOS en base a lo que los usuarios ingresan por pantalla haríamos lo siguiente:
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.
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:
SELECT SINGLE MAX (DNI)
INTO V_DNI
FROM ZTABLA_USUARIOS
WHERE AND ESTADO_USU = 'A'.
AUDIO: 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 quisiéramos saber la cantidad de usuarios con estado = “activo”, debemos usar la cláusula COUNT de la siguiente manera:
SELECT COUNT(*)
INTO V_ACTIVOS
FROM ZTABLA_USUARIOS
WHERE AND 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:
SELECT *
INTO TABLE TI_USUARIOS
FROM ZTABLA_USUARIOS
FOR ALL ENTRIES IN TI_PROVEEDORES
WHERE DNI = TI_PROVEEDORES-DNI.
AUDIO: con FOR ALL ENTRIES IN lo que hacemos es seleccionar todos los registros que se encuentren en la tabla ZTABLA_USUARIOS que se encuentre en la tabla interna TI_PROVEEDORES siendo que el campo DNI sea igual en ambas tablas y almacenamos las coincidencia en la tabla interna TI_USUARIOS. Se utiliza por motivo de performance dela base de datos dado que solo accedemos una sola vez.
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:
SELECT *
FROM ZTABLA_USUARIOS
INTO TABLE TI_USUARIOS
WHERE NOMBRE_APE LIKE 'A%'
 
 
 
Sobre el autor
Publicación académica de Jesus Robinson Cruz Monroy, en su ámbito de estudios para la Carrera Consultor ABAP.
Jesus Robinson Cruz Monroy
Profesión: Ingeniero de Sistemas - Peru - Legajo: RP21W
✒️Autor de: 74 Publicaciones Académicas
🎓Cursando Actualmente: Consultor ABAP Nivel Inicial
🎓Egresado del módulo:
Certificación Académica de Jesus Cruz