CDS con asociaciones

Sintaxis
… ASSOCIATION [ [min..max] ] TO target [AS _assoc] ON cond_exp
[ WITH DEFAULT FILTER cond_exp ]
Efecto
Define una asociación con el nombre _assoc en una instrucción SELECT de una vista CDS. Una asociación asocia la vista de CDS actual como una fuente de datos de origen con el destino de la fuente de datos de destino especificado en la definición de la asociación usando una condición ON cond_exp. Un destino de origen de datos puede ser una tabla de base de datos definida en ABAP Dictionary, una vista clásica, una vista externa o una entidad CDS.
Cuando se activa una vista CDS, cada asociación especificada aquí se transforma en una expresión de unión. La fuente de datos de origen representa el lado izquierdo y la fuente de datos de destino representa el lado derecho. La condición ON de la asociación se agrega a la condición ON de la unión. Por defecto, la categoría de la unión está determinada por el lugar donde se usa la expresión de ruta:

  • Después de FROM, es una unión interna (INNER JOIN).
  • En todas las demás ubicaciones, es una combinación externa izquierda (LEFT OUTER JOIN).

Cuando se especifica la condición de ON, se aplican las siguientes reglas especiales:

  • Si se publica la asociación en la lista SELECT, los campos especificados en la condición ON también se deben enumerar en la lista SELECT. Esto asegura que una expresión de unión se puede generar a partir de la asociación. En la condición de ON, el nombre del campo puede ser prefijado por “$projection” en lugar del nombre de la fuente de datos de origen. Aquí se puede usar un nombre de elemento alternativo o alias definido usando AS en lugar del nombre del campo.
  • Los campos de la fuente de datos de destino deben estar prefijados en la condición de ON por el nombre de la asociación (prefijo _assoc separado por un punto).

Notas
Las asociaciones que no se enumeran en la lista, sólo se pueden usar en las expresiones de ruta de la instrucción SELECT actual.
El uso de asociaciones en lugar de programación por JOIN facilita la lectura de la definición de una vista de CDS. Las asociaciones se pueden usar para modelar relaciones entre entidades de CDS a las que se puede acceder simplemente usando expresiones “path” en vistas de CDS o en Open SQL.
Cuando se activa una vista de CDS, se crea JOIN definido por una asociación para cada uso en una expresión “path” y no para la definición de la asociación. No se crean combinaciones para las asociaciones que no se utilizan en sus vistas de CDS.
Las asociaciones y expresiones de JOIN se pueden usar en una instrucción SELECT de una vista de CDS.
[min..max]
Define la cardinalidad de la fuente de datos de destino de una vista de CDS, que se define con una asociación ASSOCIATION. Los corchetes [] son parte de la sintaxis. Para “min” y “máx” se pueden especificar enteros positivos (incluido 0) y asterisco (*):

  • “max” no puede ser 0.
  • Un asterisco * para “max” significa cualquier cantidad de filas.
  • “min” se puede omitir (se establece en 0 si se omite).
  • “min” no puede ser *.

Cuando una asociación se usa en una condición WHERE, se debe especificar 1 para “max”.
Si la cardinalidad no está definida explícitamente, la cardinalidad “a 1” se usa implícitamente ([min..1]).
Cuando se especifica, la cardinalidad se usa principalmente para documentar la semántica del modelo de datos. La cardinalidad no se valida en tiempo de ejecución, pero puede producir advertencias de verificación de sintaxis.
La cardinalidad especificada se evalúa mediante la comprobación de sintaxis para las rutas especificadas en el DDL del CDS o en Open SQL. Actualmente, se produce una advertencia si se especifica un máximo de 1 para “max”, lo que indica que una ruta especificada de esta manera influye en la cardinalidad del conjunto de resultados.
AS _assoc
Define el nombre _assoc de una asociación definida utilizando ASSOCIATION de una vista de CDS. Si no se define ningún nombre explícitamente utilizando AS, _assoc se establece implícitamente con el nombre de la fuente de datos de destino. El nombre _assoc debe cumplir con las reglas de nombres.
Es aconsejable usar un guion bajo _ como el primer carácter del nombre de la asociación.
WITH DEFAULT FILTER con_exp
Define una condición de filtro estándar para una expresión “path”.
Cuando la verificación de sintaxis evalúa una cardinalidad especificada usando [min..max], la condición de filtro predeterminada se respeta junto con la condición de ON.
Ejemplo práctico
En nuestro paquete de desarrollo creamos dos CDS. El primero uno básico que será utilizado en el segundo como asociación:

  1. El primer CDS con el nombre ZB_04_GVALER y con el tipo de vista #BASIC y con el nombre ZVB_04_GVALER para la anotación del catálogo ABAP. Utilizamos como fuente de datos la tabla de base de datos estándar MARD y añadimos las siguientes columnas como elementos del CDS por el nombre alias asignado:
    Nombre columna Nombre elemento CDS
    MATNR Material
    WERKS Plant
    LGORT StorageLocation

    Los primeros dos elementos son claves. Aparte, asignamos el elemento Material como clave representativa utilizando la anotación ObjectModel.

  2. El segundo elemento ZB_05_GVALER con el tipo de vista #BASIC y con el nombre ZVB_05_GVALER para la anotación del catálogo ABAP. Utilizamos como fuente de datos el CDS con el nombre ZVB_02_USUARIOSAP* creado en la lección “CDS con Inner Join”. Según puede observar este CDS requiere un parámetro para poder ser utilizado. Creamos un parámetro igual y lo pasamos al que se utiliza como fuente de datos. La sintaxis necesaria es la siguiente: as select from zb_02_usuariosap( p_plant: $parameters.p_plant )

Por último, el CDS tendrá una asociación con el primer CDS ZB_04_GVALER creado anteriormente. La asociación se relaciona por los elementos Material y Plant. Como elementos publicaremos el Material y el Plant del CDS que se utiliza como fuente y StorageLocation de la asociación.

Con Data Preview visualizamos los datos que devuelve el último CDS informando el parámetro P_PLANT.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *