✒️ABAP El lenguaje SQL y la sentencia SELECT
ABAP El lenguaje SQL y la sentencia SELECT
iNSTRUCCIONES SQL
Sentencia SQL
conjunto de sentencias que se utilizan para accedera a las bases de datos.
La sintaxis es:
SELECT <resultado> "En resultado se colocan los campos que se quieren recuperar, si dejamos un asterisco recuperamos todos los campos.
FROM <tabla> " Tabla es la tabla origen donde se sacaran los datos
INTO <target> " Target es el destino donde será alojados los datos
WHERE <condiciones> "Condiciones de la búsqueda
Para obtener todos los registros de la tabla usuarios seria lo siguiente
SELECT *
FROM ZTABLA_USUARIOS
INTO TABLE ti_usuarios.
Donde TI_USUARIOS es una tabla interna del mismo tipo de la tabla ZTABLA_USUARIOS. en caso de existir registros de la tabla ZTABLA_USUARIOS en la tabla interna estos se pisarán. puede que queramos conservar el contenido de la tabla TI_USUARIOS en esta caso tendriamos que usar la cláusula APPENDING TABLE en lugar de INTO TABLE.
Recomendación: es hacer CLEAR Y REFRESH de la tabla interna antes de realizar la selección.
Si quisieramos obtener el campo DNI de la tabla deberiamos crear una tabla auziliar solo con el campo DNI para alojar el resultado de la consulta.
Ejemplo:
SELECT dni
FROM ztabla_usuarios
INTO TABLE ti_usuarios-aux.
Importante: Siempre despues de un SELECT se debe preguntar por el SY_SUBRC para saber como proseguir.
Si quisieramos obtener la primera ocurrencia de la ZTABLA_USUARIOS donde se cumpla determinada condicion debemos usar la clausula SINGLE
ejemplo
* Selecciono el primer registro que cumpla la condicion
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 que es del mismo tipo que la tabla ztabla_usuarios
SINGLE ; es una clausula de SELECT prduce que solo se seleccione la primera ocurrencia que cumpla las condiciones de seleccion.
Ahora si quiesieromhacer la misma consulta pero solo obtener el campo DNI entonces no necesitamos la estructura wa-usuarios sino que se guardaria el resultado en una variable v-dni
* Selecciono el primer registro que cumpla la condicion
CLEAR v_dni.
SELECT SINGLE dni
FROM ztabla_usuarios
INTO v_dni
WHERE nombre_ape NE space.
Si quisieramos obtener los registros que cumplan una condicion pero queremos guardarlos en una abla interna que no tiene la misma estructura que la tabla, entonces tenemos que usar la cláusula INTO CORRESPONDING FIELDS OF TABLE
* Selecciono el primer registro que cumpla la condicion
SELECT nombre_ape estado_usu
FROM ztabla_usuarios
INTO CORRESPONDIG FIELDS OF TABLE ti_usuarios2
WHERE nombre_ape NE space
AND estado_usu = 'A' .
Audio tips; la posición del campo en la tabla ZTABLA_USUARIOS está en pos 1 y es un tipo char de 4 ,en la tabla interna ti_usuarios2 tambien tendrá la misma posción y tipo de dato.
En el ejemplo anterior la tabla TI_USUARIOS2 está compuesta por los campos nombre-ape y estado_usu.
Suponemos que tenemos un reporte que tiene la pantalla de seleccion;
Nombre y Apellido es el parameter y
Estado Usuario es el select options S_ESTADO. Si quisieramos haer una seleccion a la tabla en base a lo que los usuarios ingresan por pantalla hariamos lo siguiente:
* Selecciono los registeros que 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 clausula IN se utiliza para los select-options en las condiciones de un SELECT
Ahora si quisieramos obtener el usuario activo con DNI mas lato tendriamos que usar la clausula MAX
* Obtengo el usuario activo con DNI mas alto
SELECT SINGLE MAX (dni)
INTO v_dni
FROM ztabla_usuarios
WHERE estado_usu = 'A' .
AUDIO TIPS:
Cuando creemos la sentencia SELECT para el compilador ABAp si colocamos primero FROM y luego INTO o al revés.
Si quisieramos saber la cantidad de usuarios con estado ='activo" debemos usar la clausula COUNT;
Ejemplo
* Obtengo la cantidad de usuaruios activos
SELECT COUNT (*)
INTO v_activos
FROM ztabla_usuarios
WHERE estado_usu = 'A'.
Si quisieramos obtenerde una tabla para todos los registros que existan en una tabla interna cargada con datos, entonces usemos 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.
Audio Tips:
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 AT y por cada registro de esta tabla interna realizarí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 unpatrón de text en alguno de sus campos debemos utilizar la sentencia LIKE
Ejemplo
* Recupero los usuarios cuyo nombre empeice con "A"
SELECT *
FROM ztabla_usuarios
INTO TABLE ti_usuarios
WHERE nombre_ape LIKE 'A%'.
 
 
 
Sobre el autor
Publicación académica de Carlos Alberto Carreira, en su ámbito de estudios para la Carrera Consultor ABAP.
Carlos Alberto Carreira
Profesión: Consultor Técnico en Jde W.s. - Argentina - Legajo: KC15G
✒️Autor de: 92 Publicaciones Académicas
🎓Cursando Actualmente: Consultor ABAP Nivel Inicial
🎓Egresado de los módulos:
Certificación Académica de Carlos Carreira