✒️ABAP El lenguaje SQL y la sentencia SELECT
ABAP El lenguaje SQL y la sentencia SELECT
Existen en ABAP una serie de sentencias que se utilizan para acceder a las bases de datos, la principal es la sentencia SELECT. La sintaxis es la siguiente:
SELECT <resultado> Se colocan los campos que se quieren recuperar
FROM <tabla> Es la table origen de donde se sacan los datos
INTO <target> Es el destino de los datos donde serán alojados
WHERE <condiciones> Condiciones de la búsqueda.
Si quisiéramos utilizar la tabla que acabamos de crear, lo haríamos de la siguiente manera:
SELECT *
FROM ZTABLA_USULG32F
INTO TABLE ti_usuarios.
En este caso TI_USUARIOS es una tabla interna del mismo tipo de la tabla base de dato ZTABLA_USULG32F. El asterisco indica que se obtendrán todos los campos de la tabla. La sentencia INTO TABLE se utiliza para guardar los resultados de la consulta en una tabla interna.
Nota: Hay que evitar el uso del * cuando no se requiera de la totalidad de los campos de la tabla.
En la sentencia anterior, en caso de existir registros en la tabla ZTABLA_USULG32F estos pasarán y sustituirán todo lo que haya en TI_USUARIOS. En caso de querer conservar ambas tablas usaremos la sentencia APPENDING TABLE en lugar de INTO TABLE.
Nota: Es recomendable aplicar CLEAR y REFRESH de la tabla antes de realizar la selección.
Si quisiéramos obtener de todos los campos de la tabla únicamente, por ejemplo, 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_USULG32F
INTO TABLE ti_usuarios_aux
Nota: 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_USULG32F donde se cumpla determinada condición debemos usar la cláusula SINGLE, como vemos a continuación.
CLEAR wa_usuarios.
SELECT SINGLE *
FROM ztabla_usulg32f
Into_wa_usuarios
WHERE nombre_ape NE space.
Ahora bien, si quisiéramos hacer la misma consulta anterior pero necesitamos obtener solo el campo DNI entonces ya no sería necesaria WA_USUARIO 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_usulg32f
INTO v_dni
WHERE nombre_apre NE space.
IN TO CORRESPONDING FIELDS OF TABLE: Esta sentencia se utiliza para guardar los datos de una tabla en una tabla interna aunque no tengan la misma estructura. Ejemplo:
SELECT nombre_ape estado_usu
FROM ztabla_usulg32f
INTO CORRESPONDING FIELDS OF TABLE ti_usuarios2
WHERE nombre_ape NE space.
AND estado_usu = ‘A’.
Esta sentencia 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. Es decir, si en la posición 1 se encuentra un campo de tipo CHAR de cuatro posiciones entonces en la misma posición de la otra tabla también debe existir un campo igual para que la comparación sea correcta.
En este ejemplo, la tabla interna TI_USUARIOS2 está compuesta por los campos nombre_ape y estado_usu.
Suponiendoque se tiene el reporte que tiene la siguiente pantalla de selección.
Donde nombre y apellido es el parameter P_NOMBRE y Estado de 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 bien, si lo que deseamos es 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
WHERE estado_usu = ‘A’.
Si quisiéramos saber la cantidad de usuarios con estado activo debemos usar la cláusula COUNT de la siguiente manera
INTO v_activos
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
SELECT *
TINTO TABLE ti_usuarios
FROM ztabla_usuarios
FOR ALL ENTRIES IN ti_proveedores
FROM ztabla_usulg32f
INTO TABLE ti_usuarios
WHERE nombre_ape LIKE ‘A%’.
 
 
 
Sobre el autor
Publicación académica de Jose Alberto Rivera Gonzalez, en su ámbito de estudios para la Carrera Consultor ABAP.
Jose Alberto Rivera Gonzalez
Profesión: Técnico Informático - Mexico - Legajo: LG32F
✒️Autor de: 102 Publicaciones Académicas
🎓Egresado de los módulos:
Certificación Académica de Jose Rivera