✒️ABAP El lenguaje SQL y la sentencia SELECT
ABAP El lenguaje SQL y la sentencia SELECT
SENTENCIAS SQL
SELECT: Esta sentencia realiza una lectura lineal de los datos de las tablas de la base de datos y los asigna directamente a los campos de nuestra tabla interna. Con la cláusula SELECT identificamos los campos que queremos leer, si se usa con la cláusula FROM es obligatoria e identifica la tabla que hay que leer. La cláusula FROM especifica la tabla o vista de la base de datos que va a ser leída. Pero para que queden almacenados sobre la tabla interna, para cada registro seleccionado debemos utilizar la sentencia APPEND. Así, añadiremos los registros a nuestra tabla interna.
La sentencia SELECT...ENDSELECT irá pasando uno a uno por cada uno de los registros que cumplan la condición de la cláusula WHERE y los irá almacenando gracias a la sentencia APPEND dentro de nuestra tabla interna.
El mayor inconveniente de trabajar con la forma SELECT...ENDSELECT es que la lectura se hace linealmente, es decir, SAP debe pasar por cada uno de los registros individualmente hasta llegar al final. Esto hace que la búsqueda de datos sea muy ineficiente en términos de rendimiento y alarga innecesariamente el tiempo de ejecución del programa.
Una forma de mejorar el rendimiento sería no utilizar la cláusula (*) sino indicar específicamente los campos que necesitamos llenar. Al no usar todos los campos mejoramos el rendimiento y con la cláusula INTO asignamos directamente el valor al campo de la tabla interna.
Otra forma de la sentencia SELECT mucho más eficiente nos permite almacenar los datos en la tabla interna sin necesidad de utilizar la sentencia APPEND.
SELECT * FROM n_tabla INTO CORRESPONDING FIELDS OF TABLE tabla_int WHERE campoX IN s_tablaX.
La cláusula INTO especifica un área de destino de los datos seleccionados. La opción CORRESPONDING FIELDS OF TABLE compara el nombre del campo de la tabla de SAP con cada nombre de la tabla interna. Si encuentra coincidencia le asigna su valor correspondiente. Si se especifica la cláusula PACKAGE SIZE la lectura se realiza en paquetes de líneas.
Por eso, es tan importante que el nombre de los campos de una tabla interna sean iguales al nombre de los campos de una tabla SAP. De lo contrario, esta forma no se puede utilizar.
Se mantiene la cláusula WHERE. Se elimina la sentencia APPEND ya que la lectura deja de ser secuencial sino en bloques. Es decir, SAP ya no tiene que recorrer uno a uno todos los registros, sino que toma el bloque de registros que coinciden con la condición determinada a través de la cláusula WHERE y lo asigna en bloque a la tabla interna.
Existe otra variación que se puede utilizar:
SELECT campo1 campo2 campo3 campo_n FROM tabla INTO TABLE tabla_int WHERE campoX IN s_tablaX.
Esta forma es todavía más eficiente ya que evita el uso de (*) y en su lugar sólo toma el valor de los campos que nos interesa.
La cláusula INTO TABLE asigna estos cuatro campos a los cuatro primeros campos de la tabla interna. Así que, cuidado, el orden en que se hayan declarado estos campos en la tabla interna es importante. Aquí no hay asignación por nombre de campo, sino por posición, el valor del campo1 de la tabla se asignará al primer campo de la tabla interna, el valor del campo2 de la tabla se asignará al segundo campo de la tabla interna, y así sucesivamente.
Aquí ya no es tan importante el nombre de los campos de la tabla interna, pero sí la longitud y el tipo de esos campos. Si no lo tenemos cuenta nuestro programa acabar abruptamente con dump (http://abapysap.blogspot.com.co/2011/03/log-del-sistema-analisis-de-dumps.html) breve.
SELECT para recuperar registros individualmente
Otra forma que se utiliza mucho, es la sentencia SELECT SINGLE. Se utiliza si lo que nos interesa es únicamente un registro de nuestra tabla de base de datos. Con la cláusula SINGLE es necesario especificar todos los campos de la clave primaria en la cláusula WHERE para identificar de forma única un registro.
Es muy habitual que después de escribir esta sentencia se escriba una condición del tipo IF sy-subrc ... ENDIF.
El campo sy-subrc es un campo de sistema y si el resultado es 0 significa que la sentencia que se ha ejecutado anteriormente lo ha hecho de forma satisfactoria. Si el valor, en cambio fuese 4 o cualquier otro, entonces hemos de suponer que dentro de la tabla no existe ningún registro que confirme la condición dada en la cláusula WHERE. Con la cláusula SINGLE leemos una sola línea de la tabla y sin la cláusula la selección es múltiple. Cada vez que el sistema nos deja una línea sobre el área de trabajo especificado, se ejecuta el bloque de sentencias hasta la sentencia ENDSELECT.
En lugar de leer todas las columnas de la tabla se puede leer ciertas columnas o aplicar ciertas funciones a dichas columnas. Veamos todas las posibilidades de la cláusula:
%u25CF * -> Son todos los campos de la tabla.
%u25CF <campo> -> Es una lista de campos de la tabla.
%u25CF MAX( ) -> Devuelve el valor máximo de la columna <campo>.
%u25CF MIN( ) -> Devuelve el valor mínimo de la columna <campo>.
%u25CF AVG( ) -> Devuelve la media de valores de la columna <campo>.
%u25CF SUM( ) -> Devuelve la suma de valores de la columna <campo>.
%u25CF COUNT([ DISTINCT ]<campo>) -> Devuelve el número de registros seleccionados. Con DISTINCT sólo se cuentan los registros distintos.
%u25CF (<tabla>) -> Es una tabla interna donde se especifica cualquier opción de las vistas anteriormente.
 
 
 
Sobre el autor
Publicación académica de Sergio Armando Beltran Castaneda, en su ámbito de estudios para la Carrera Consultor ABAP.
Sergio Armando Beltran Castaneda
Profesión: Ingeniero de Sistemas con Especialización en Gerencia de Proyectos - Colombia - Legajo: WK55K
✒️Autor de: 70 Publicaciones Académicas
🎓Cursando Actualmente: Consultor ABAP Nivel Avanzado
🎓Egresado del módulo:
Disponibilidad Laboral: FullTime
Presentación:
Soy ingeniero de sistemas desde hace mas de 10 años y quiero enfocarme en el mundo sap, iniciando en el lenguaje abap, con miras a ampliar mi conocimiento profesional y laboral.
Certificación Académica de Sergio Beltran