Top Banner
Grupo ASSA ABAP Open SQL
14

Abap Open SQL

Jul 07, 2016

Download

Documents

basiler89

sap
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Abap Open SQL

Grupo ASSA

ABAP Open SQL

Page 2: Abap Open SQL

2 www.grupoassa.com

Condic iones WHERE

Operadores

La tabla de abajo muestra una lista de operaciones que Open SQL acepta en condiciones WHERE:

Operador Significado y Uso

=, <, >, <=, <=, <>EQ, LT, GT, LE, GE, NE

Comparación con un solo valor.

IN (dobj1, dobj2, ...)Comparación con una lista de valores individuales

BETWEEN dobj1 AND dobj2Comparación con un intervalo.

LIKE dobjComparación con cadenas de caracteres. Los comodines ‘_’ y ‘%’ permiten definir un patrón de comparación en ‘dobj’. ‘_’ reemplaza a un caracter y ‘%’ a varios.

IN seltabEvaluación de una tabla de selección (select-options).

IS [NOT] NULLVerifica si el campo de la base de datos tiene un valor null.

AND, OREnlazar expresiones lógicas.

NOTNegación de una expresión lógica.

El siguiente diagrama muestra un ejemplo de una búsqueda compleja:

Page 3: Abap Open SQL

3 www.grupoassa.com

Cuando hay condiciones enlazadas, los operadores AND son evaluados antes que los operadores OR. Este orden puede ser alterado colocando paréntesis.

Comparación entre campos de tablas

Además de variables y constantes, también se pueden colocar campos de la misma base de datos luego de los operadores de comparación (=, <, >, <=, <=, <>,EQ, LT, GT, LE, GE, NE) .El diagrama de abajo muestra dos ejemplos:

Page 4: Abap Open SQL

4 www.grupoassa.com

Advertencia: Los campos comparados deben tener el mismo tipo básico y longitud (idealmente, que estén basados en el mismo dominio).

Sumando y procesando conjuntos de valores

Expresiones de suma

Una expresión de suma (aggregate expression) usa una función de suma (aggregate function) para especificar una columna en la sentencia SELECT. El cálculo se realiza en el sistema de base de datos. ABAP Open SQL soporta las siguientes funciones de suma:

Función Significado del resultado y condiciones

Tipo de datos del resultado

MIN( col ) Mínimo valor en la columna ‘col’ dentro del conjunto de resultados.

Como la columna ‘col’.

MAX( col ) Máximo valor en la columna ‘col’ dentro del conjunto de resultados.

Como la columna ‘col’.

SUM( col ) Suma de los contenidos de la columna ‘col’ en el conjunto de resultados. La columna debe ser numérica.

Como la columna ‘col’.

AVG( col ) Valor promedio de los contenidos de la columna ‘col’ en el conjunto

Coma flotante. Float (F).

Page 5: Abap Open SQL

5 www.grupoassa.com

de resultados. La columna debe ser numérica.

COUNT( * )COUNT(*)

Entero. Integer (I).

Lista de campos con sólo expresiones de suma.

Si la lista de campos en una sentencia SELECT contiene solamente expresiones de suma, el resultado es un solo registro. Una estructura puede ser especificada como el destino (similar a la sentencia SELECT SINGLE). El siguiente diagrama muestra un ejemplo:

Lista de campos con expresiones de suma y etiquetas de campos

Si la lista de campos de un SELECT contiene etiquetas de campos (campos) además de expresiones de suma , el resultado es siempre multilínea. En consecuencia, se debe cargar en una tabla interna o procesarlo secuencialmente (SELECT loop). La sentencia SELECT debe contener la adición GROUP BY (agrupar por) y todos los campos que no son argumentos de una función de suma deben ser listados luego de la adición GROUP BY.

Page 6: Abap Open SQL

6 www.grupoassa.com

Cuando la adición GROUP BY es especificada, la base de datos no aplica las funciones de suma a todos los registros encontrados juntos, sino que los divide en grupos antes. Cada grupo contiene todos los registros que tienen el mismo contenido en las columnas especificadas luego de GROUP BY. Las funciones de suma son evaluadas por separado para cada uno de estos grupos. Cada grupo corresponde a una línea del resultado de la selección (ver diagrama anterior, tabla resultado lt_flightocc).Las siguientes restricciones aplican con la adición GROUP BY:

Sólo columnas individuales son listadas luego de SELECT (SELECT * no está permitido). No se puede usar con tablas ‘pooled’ o ‘cluster’. Los campos luego de GROUP BY no pueden tener tipo STRING o RAWSTRING.

Cuando se usa GROUP BY, se puede especificar una expresión lógica luego de la expresión HAVING, para restringir más aún los resultados.

Page 7: Abap Open SQL

7 www.grupoassa.com

En contraste con la condición WHERE, la expresión lógica luego de HAVING también puede contener funciones de suma. Además de las funciones de suma, la expresión lógica luego de HAVING sólo puede contener campos especificados luego de GROUP BY.Advertencia: Si son usadas etiquetas de campos luego de HAVING que no estén listadas luego de GROUP BY, esto no causa un error de sintaxis, pero sí un error en tiempo de ejecución.Las funciones de suma luego de HAVING pueden ser diferentes de las funciones de suma luego de SELECT.

Solicitando datos ordenados de la Base de Datos

En Open SQL, se puede hacer que la base de datos ordene los datos por criterios específicos directamente.Para lograrlo, se usa la adición ORDER BY en la sentencia SELECT.

Page 8: Abap Open SQL

8 www.grupoassa.com

En su forma más simple, la adición ORDER BY PRIMARY KEY, la tabla es ordenada por su clave primaria completa en orden ascendente. Para usar esta adición, los siguientes prerrequisitos deben cumplirse:

La cláusula FROM debe contener una única tabla de base de datos (no views o joins). La lista de campos luego de SELECT debe contener todos los campos claves de la tabla (incluyendo el

cliente).La sintaxis ORDER BY col1 col2 ... ordena los datos por cualquier columna existente. La secuencia de columnas especificada determina su prioridad de orden. Las siguientes restricciones aplican:- Las tablas pooled y cluster no pueden ser ordenadas por cualquier campo.- Sólo se puede ordenar por columnas que aparezcan luego de la sentencia SELECT, lo que significa que las columnas deben formar parte del conjunto de resultados.- No se puede ordenar por campos de tipo LCHAR, LRAW, STRING, o RAWSTRING.El siguiente diagrama muestra un ejemplo de la adición ORDER BY con elección libre de columnas:

Page 9: Abap Open SQL

9 www.grupoassa.com

Si no se usa una adición, el sistema ordena en orden ascendente. Se pueden usar las adiciones opcionales DESCENDING y ASCENDING luego de un campo determinado para definir la dirección del ordenamiento.Nota: El ordenamiento puede ser un proceso caro (en ciclos y tiempo) para la base de datos si el resultado es grande y los campos de ordenamiento no coinciden con los campos usados en el índice de la base de datos.

Leyendo de múltiples bases de datos

Panorama

Cuando se almacena datos en una base de datos relacional, es normal que cuando ciertos datos de una base de datos (tabla primaria) son accedidos, registros de otras bases de datos (tablas secundarias) deban ser leídos también. Un método obvio accede a las tablas secundarias en un loop de los registros de la tabla primaria. Esta estrategia es llamada SELECTs anidados.

Page 10: Abap Open SQL

10 www.grupoassa.com

Como puede ser necesario leer datos adicionales para los datos de las tablas secundarias, no hay límite a la profundidad del anidamiento.Por una serie de razones, los SELECTs anidados son el método que más memoria consume para leer múltiples bases de datos, y deben ser evitados siempre que sea posible. Provocan una carga alta en la base de datos y en la red.En esta lección, aprenderá distintas técnicas que le permitirán evitar por completo los SELECTs anidados, o al menos reducir su impacto negativo en la performance del sistema.

Join ABAP y Vistas de Bases de Datos

Para leer datos distribuidos en varias tablas, se debe crear un enlace entre estas. El correspondiente operador de bases de datos lógicas es llamado JOIN.Se pueden usar vistas de bases de datos en el Diccionario ABAP o joins ABAP para implementar un JOIN.Nota: Las vistas de bases de datos y joins ABAP sólo pueden ser usados con tablas transparentes (no con tablas ‘pooled’ ni ‘cluster’).

Page 11: Abap Open SQL

11 www.grupoassa.com

Se puede derivar la lógica del INNER JOIN y el OUTER JOIN de los conjuntos de datos que se pretenden obtener como resultado.Un INNER JOIN corresponde al resultado que sólo considera los registros de la tabla exterior para los cuales existen registros adecuados en la tabla interior (la de la izquierda en el ejemplo de arriba).Un LEFT OUTER JOIN corresponde al resultado que contiene todos los registros de la tabla exterior, sin considerar si existen registros adecuados en la tabla interior. Si no existen registros adecuados en la tabla interior, los campos de la tabla exterior en registros correspondientes a la tabla interior son puestos a cero en el resultado. Las tablas involucradas en un JOIN son llamadas tablas base. El resultado de un JOIN puede ser una proyección (selección de columnas) o una selección (selección de líneas).Restricciones para el Outer Join

Sólo se puede tener una tabla o una vista a la derecha del operador JOIN, nunca otra expresión JOIN. Sólo AND puede ser usado como operador lógico en una condición ON. Cada comparación en la condición ON debe contener un campo de la tabla de la derecha. Ninguno de los campos de la tabla de la derecha puede aparecer en las condiciones WHERE de un LEFT

OUTER JOIN.

Page 12: Abap Open SQL

12 www.grupoassa.com

Atributos y beneficios de las Vistas de Bases de Datos- Podemos usar vistas en otros programas también.- Hay listas de “dónde se usan” (where-used lists) y funciones de búsqueda (SE84 / SE81) para encontrar vistas existentes rápidamente.- Como con las bases de datos, se pueden crear buffers para las vistas.- Los campos comunes a ambas tablas (campos join) son transferidos desde la base de datos al servidor de aplicaciones una sola vez.- La vista es implementada como un inner join en el Diccionario ABAP. Esto significa que si la tabla interior no contiene registros que correspondan a la tabla exterior, no son transferidos datos.

Adición FOR ALL ENTRIES

Hoy en día, esta técnica es frecuentemente usada cuando algunos datos ya están disponibles en una tabla interna, pero datos adicionales deben ser leídos de la base de datos. En estos casos, reemplaza a un SELECT SINGLE dentro de un LOOP a la tabla interna, y suele tener mucha mejor performance que dicho LOOP.El siguiente diagrama da un ejemplo de cómo funciona la sentencia:

Page 13: Abap Open SQL

13 www.grupoassa.com

El contenido de la tabla interna (tabla conductora) es usado como una restricción para el acceso a la base de datos.Advertencia: Si usa FOR ALL ENTRIES, tiene que asegurarse de que la tabla interna es NO vacía. Si la tabla interna está vacía, no provee una condición límite a la sentencia SELECT, y es leída la tabla de base de datos completa. Esto puede causar tiempos de ejecución muy largos para la sentencia. Por otra parte, si se desea leer grandes volúmenes de datos, sólo en casos excepcionales se debería usar FOR ALL ENTRIES.