✒️ABAP El lenguaje SQL y la sentencia SELECT
ABAP El lenguaje SQL y la sentencia SELECT
Introducción a 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:
<< imágen 1.1 >>
Si quisiéramos obtener todos los registros de la tabla ZTABLA_USUARIOS usaríamos el siguiente código:
<< imágen 1.2 >>
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 utiliza cuando el resultado de la consulta se guarda en una tabla interna.
Si se quieren obtener solo algunos campos de la tabla origen, es preferible nombrar dichos campos en lugar de utilizar el *.
En la sentencia anterior, en caso de existir registros en la tabla ZTABLA_USUARIOS, estos machacarán el contenido de la tabla interna ti_usuarios.
Podría ocurrir que queramos conservar el contenido de la tabla ti_usuarios después de varios accesos. En ese caso tendríamos que usar la cláusula APPENDING TABLE en lugar de INTO TABLE.
Es recomendable realizar un CLEAR y REFRESH de la tabla interna antes de realizar el select. Con CLEAR borramos el contenido la cabecera de la tabla interna, y con REFRESH el contenido de la tabla interna.
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.
<< imágen 1.3 >>
Después de ejecutar un SELECT debemos preguntar siempre por el SY-SUBRC para saber qué acciones debemos tomar a continuación.
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:
<< imágen 1.4 >>
El resultado de esta consulta será guardado en la estructura wa_usaurios que es del mismo tipo que la tabla ZTABLA_USUARIOS (es como un registro de la tabla).
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 como vemos en el siguiente ejemplo:
<< imágen 1.5 >>
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.
<< imágen 1.6 >>
En el ejemplo anterior, la tabla interna ti_usuarios2 está compuesta por los campos nombre_ape y estado_usu.
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 una de las tablas, 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 tipo CHAR de 4 posiciones para que la comparación sea correcta. No es necesario que los campos tengan el mismo nombre en ambas tablas.
Supongamos que tenemos un reporte que tiene la pantalla de selección:
<< imágen 1.7 >>
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:
<< imágen 1.8 >>
La cláusula IN se utiliza para los select-options en las condiciones de un select.
Si quisiéramos obtener el usuario activo con DNI más alto, tendríamos que usar la cláusula MAX de la siguiente forma:
<< imágen 1.9 >>
Audio: Cuando escribimos la sentencia SELECT, es totalmente igual para el compilador ABAP si colocamos la sentencia FROM y luego la sentencia INTO, o si las colocamos al revés.
Si quisiéramos saber la cantidad de usuarios con estado "=activo", debemos usar la cláusula COUNT de la siguiente forma:
<< imágen 1.10 >>
Si quisiéramos obtener de una tabla todos los registros que existan en una tabla interna cargada con datos, entonces utilizaríamos la sentencia FOR ALL ENTRIES IN, que nos permite especificar condiciones en tiempo de ejecución:
<< imágen 1.11 >>
Audio: 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, para los cuales el campo dni es igual en ambas tablas 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 realizaríamos un SELECT a la tabla ZTABLA_USUARIOS. Pero ¿qué sucede? Debemos tener en cuenta el rendimiento o performance de los programas que realizamos, ya que si la tabla interna ti_proveedores almacena solo 3 registros, entonces al ejecutar nuestro programa estaríamos accediendo a la base de datos solo 3 veces, pero si la tabla ti_proveedores almacena 1000´00 registros, entonces al ejecutar nuestro programa estaríamos accediendo a la base de datos 100000 veces, lo cual produciría un tiempo de espera enorme. Para evitar esta situaciones, nos aseguramos de acceder una sola vez a la base de datos utilizando FOR ALL ENTRIES.
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:
<< imágen 1.12 >>
 
 
 
Favorito:
Está publicación ha sido agregada a sus favoritos por: Lorena Amoretti
Sobre el autor
Publicación académica de José Antonio Saavedra Rodríguez, en su ámbito de estudios para la Carrera Consultor ABAP.
José Antonio Saavedra Rodríguez
El Salvador - Legajo: SX28V
✒️Autor de: 166 Publicaciones Académicas
🎓Egresado de los módulos:
- Carrera Consultor ABAP Nivel Inicial
- Carrera Consultor en SAP SD Nivel Avanzado
- Carrera Consultor en SAP SD Nivel Inicial