Objectives
After completing this lesson, you will be able to:
- Definir vistas CDS con parámetros de entrada.
- Proporcione valores para los parámetros de vista CDS.
- Enlazar parámetros a campos del sistema ABAP.
La necesidad de parámetros de entrada
En las lecciones anteriores, vio cuán potentes son las vistas CDS cuando se trata de realizar cálculos en la base de datos. Tal vez ya se haya preguntado hasta qué punto el consumidor de la vista CDS puede influir en la forma en que se realizan los cálculos. Por supuesto, el consumidor puede proporcionar una cláusula WHERE para realizar una selección en el resultado. Pero, ¿cómo ayuda cuando desea seleccionar la moneda de destino para una conversión de moneda?
Las vistas CDS con parámetros de entrada cierran esta discontinuidad. Permiten al consumidor de una vista proporcionar información adicional al recuperar datos de esta vista. La vista CDS, a su vez, evalúa esta información y la tiene en cuenta al calcular los resultados. Algunos casos de uso posibles para los parámetros son los siguientes:
El consumidor especifica la moneda de destino de una conversión de moneda.
El consumidor especifica si los precios se calculan con o sin impuestos.
El consumidor proporciona un separador que se utiliza al concatenar campos.
el consumidor especifica el idioma en el que se devuelve el texto traducible.
Otra motivación importante para las vistas de entrada son las vistas CDS con agregaciones en las que desea filtrar los datos que introducen la agregación. Si, por ejemplo, calcula los ingresos totales y desea especificar una fecha hasta la que se deben tener en cuenta los ingresos.
Por último, SQL no conoce los criterios de selección obligatorios. Un consumidor puede proporcionar una cláusula WHERE o no. Con un parámetro de entrada obligatorio, la vista puede obligar al consumidor a proporcionar un criterio de selección necesario, por ejemplo, una clave de idioma, una fecha o un nombre de usuario.
Declaración de parámetros de entrada
Los parámetros de entrada se definen añadiendo WITH PARAMETERS después del nombre de entidad de la vista CDS. A continuación, los parámetros se definen en una lista separada por comas.
Cada parámetro de entrada debe especificarse con un tipo de datos elemental. El nombre del parámetro y el tipo de parámetro están separados por dos puntos (:). El tipo de un parámetro puede ser un tipo de Dictionary ABAP predefinido (en el formato abap.<type>(<len>)) o un elemento de datos. Los tipos de estructuras, los tipos de tabla o los tipos de referencia no se permiten.
Puede utilizar anotaciones de parámetros para proporcionar metadatos para los parámetros.
Acceso a parámetros
Para acceder a los parámetros de entrada dentro de la definición de vista CDS, debe utilizar el prefijo $parameter seguido de un signo de período (.).
Puede utilizar un parámetro de entrada en las siguientes posiciones:
- Como elemento independiente en la lista de elementos
- Como entrada para una distinción CASE
- Como entrada para expresiones y funciones
- En la parte derecha de una condición en una cláusula WHERE
- En la parte derecha de una condición de filtro en una expresión de ruta
Ahora veremos algunos ejemplos aquí.
El parámetro TargetCurrency se utiliza directamente en la lista de elementos. Una motivación típica podría ser que este elemento se utilice en una anotación @semantics.amount.currencyCode: para otro elemento.
Aquí, se utiliza un parámetro en una distinción CASE, lo que permite al consumidor decidir si se devuelven los asientos libres o los ocupados.
En este ejemplo, el parámetro de entrada TargetCurrency se utiliza como entrada para una función integrada, es decir, la función de conversión de moneda. Permite al consumidor de una vista especificar la moneda en la que se muestran los precios de los vuelos.
En este ejemplo, el parámetro de entrada Idioma se utiliza en la condición de filtro de una expresión de vía de acceso. Permite al consumidor de la vista especificar el idioma del texto en el elemento CurrencyName.
En este ejemplo, el parámetro de entrada FirstFlightDate se utiliza en la condición WHERE de la definición de vista. Esto establece una especie de criterio de selección obligatorio. El consumidor está obligado a filtrar los vuelos por una fecha de vuelo mínima.
Parámetros de entrada en la presentación preliminar de datos
Al abrir la herramienta Vista previa de datos para una vista CDS que define parámetros de entrada, se le pedirá que introduzca valores reales para estos parámetros de entrada antes de poder analizar el resultado. Observe el signo de asteriscos (*) junto a los nombres de parámetro, que indica que los parámetros son obligatorios.
Solo se aceptan entradas que sean compatibles con el tipo de parámetro. No obstante, la herramienta no realiza ninguna otra verificación.
Consejo
Cuando el enfoque está en un campo de entrada, la pantalla muestra el tipo esperado encima de la máscara de entrada.
Parámetros de entrada en vista en vista
Al definir una nueva vista CDS y utilizar una vista CDS con parámetros de entrada como fuente de datos, debe suministrar todos los parámetros de entrada con valores reales. Veamos un ejemplo:
Esta vista CDS lee desde una vista CDS que define cuatro parámetros.
Los parámetros se suministran dentro de un par de paréntesis que siguen al nombre de la vista fuente. Como no solo hay un parámetro, los parámetros se proporcionan en una lista separada por comas.
Consejo
Al definir una vista CDS que lee desde una vista CDS con parámetros, puede utilizar la finalización de código (Ctrl + Espacio) para insertar la firma completa de la vista CDS.
Cada nombre de parámetro va seguido de un signo de dos puntos (:), que sirve como operador de asignación de parámetros y, a continuación, el valor real. Una opción es un literal como valor real. Otra opción muy común es "reenviar" un parámetro. Esto significa que la vista de llamada define un parámetro en sí y lo utiliza para proporcionar el parámetro de su fuente de datos. Por lo tanto, el consumidor de esta vista es responsable de suministrar el valor real. Con esta técnica, puede entregar información a través de toda una pila de vistas CDS.
Parámetros de entrada en ABAP SQL
La sintaxis para proporcionar los parámetros de entrada de una vista CDS en ABAP SQL es muy similar a la sintaxis que utiliza en CDS. La única diferencia es el operador de asignación: en CDS, es el signo de dos puntos ":", mientras que en ABAP SQL se utiliza el signo de igual (=) en su lugar.
Para proporcionar los valores reales, puede elegir entre las siguientes opciones:
- Literales
- En función del tipo de parámetro, puede utilizar literales numéricos o literales de texto como valores reales.
- Variables de host
- En lugar de literales, puede utilizar constantes ABAP o variables ABAP para proporcionar los valores reales. Como es habitual en ABAP SQL, las variables de host y las constantes deben escaparse con el signo "at" (@). El tipo debe ser compatible con el tipo de parámetro. En concreto, solo se permiten objetos de datos ABAP elementales.
- Expresiones de host
- Incluso puede incrustar expresiones ABAP completas en la sentencia ABAP SQL y utilizar el resultado como valor real para un parámetro de vista. Estas expresiones de host deben estar rodeadas por un par de paréntesis y con el prefijo "at" ( @). Tenga en cuenta que los espacios en blanco son obligatorios después del paréntesis de apertura y antes del paréntesis de cierre. La expresión debe tener un resultado elemental y el tipo debe ser compatible con el tipo de parámetro.
Cómo definir y utilizar una vista CDS con un parámetro de entrada
Reproduzca el vídeo para ver cómo definir y utilizar una vista CDS con un parámetro de entrada.
Acceso a campos de sistema ABAP mediante parámetros de vista CDS
El tiempo de ejecución ABAP actualiza varios campos de sistema que contienen información de interés general: la fecha y hora del sistema, el mandante de inicio de sesión y el idioma, el nombre de usuario del usuario actual, etc. Si desea utilizar los valores de estos campos de sistema en entidades CDS, la forma recomendada es la siguiente:
- En su vista CDS, defina parámetros de entrada con un tipo que coincida con el tipo del campo del sistema, por ejemplo, una fecha o una clave de idioma.
- Anote el parámetro con Environment.systemField: y seleccione el valor de anotación relacionado con el campo de sistema al que desea acceder, por ejemplo, #SYSTEM_DATE o #SYSTEM_LANGUAGE.
Si un parámetro se anota así, el tiempo de ejecución ABAP suministrará automáticamente el parámetro con el valor del campo de sistema relacionado, en caso de que el consumidor no proporcione ningún otro valor. Como consecuencia, aún puede proporcionar todos los parámetros como antes cuando utiliza la vista como fuente de datos en una sentencia SQL ABAP. Sin embargo, la verificación de sintaxis solo le obliga a proporcionar los parámetros que NO están vinculados a un campo de sistema. Para aquellos parámetros que están vinculados a un campo de sistema, el tiempo de ejecución ABAP utiliza el valor para el campo de sistema relacionado como una especie de valor predeterminado.
En el ejemplo, los dos parámetros de la vista CDS están vinculados a la fecha del sistema y al idioma del sistema. El código ABAP no proporciona ninguno de los parámetros. Por lo tanto, el tiempo de ejecución ABAP toma los valores de los campos del sistema.
Los parámetros que están vinculados a campos del sistema ABAP se parecen mucho a los parámetros opcionales. Sin embargo, tenga en cuenta lo siguiente: este mecanismo solo funciona al acceder a la vista desde ABAP. En CDS y a nivel de base de datos, los parámetros siguen siendo obligatorios.
Actualmente, la anotación Environment.systemField admite siete valores diferentes. La lista los muestra junto con el campo de sistema relacionado.
Nota
Para algunos de los campos del sistema, no se recomienda el acceso directo en la nube ABAP. Se recomienda utilizar métodos getter de la clase ABAP CL_ABAP_CONTEXT_INFO en su lugar.
Cómo acceder a un campo de sistema ABAP en ABAP CDS
Reproduzca el vídeo para ver cómo acceder a un campo de sistema ABAP en ABAP CDS.
Definir y utilizar una entidad de vista CDS con parámetros de entrada
Ha ampliado la entidad de vista CDS con funciones SQL y ha utilizado literales y variables de sesión como entrada. Ahora sustituya algunos literales y variables de sesión por parámetros de entrada.
Tarea 1: Definir parámetros de entrada
Cree una copia de la entidad de vista CDS en la que ha trabajado en el ejercicio anterior (nombre sugerido: Z##_C_EmployeeQueryP, donde ## es su número de grupo).
Nota
Si no ha finalizado el ejercicio anterior, cree una copia de la definición de datos CDS /LRN/C_EMPLOYEE_FNC en su lugar.
En la nueva definición de datos, sustituya la moneda de destino de codificación fija por un parámetro de entrada (nombre sugerido: p_target_curr) y la variable de sesión $session.system_field por un segundo parámetro de entrada (nombre sugerido: p_date).
Pasos
Cree una copia de su definición de datos con funciones SQL (el nombre sugerido era: Z##_C_EmployeeQuery, donde ## es su número de grupo). Como alternativa, copie de la definición de datos /LRN/C_EMPLOYEE_FNC (nombre sugerido para la nueva entidad de vista: Z##_C_EmployeeQueryP).
En la vista Explorador de proyectos, haga clic con el botón derecho en la definición de datos Z##_C_EMPLOYEE_QUERY o en la definición de datos /LRN/C_EMPLOYEE_FUNC para abrir el menú contextual.
En el menú contextual, seleccione Duplicar ....
Introduzca el nombre del paquete en el campo Paquete. En el campo Nombre, introduzca el nombre Z##_C_EmployeeQueryP, donde ## representa su número de grupo.
Ajuste la descripción y seleccione Siguiente.
Confirme la orden de transporte y seleccione Finalizar.
Edite la definición de su entidad de vista. Defina un parámetro de entrada para sustituir el código de moneda de codificación fija para la conversión de moneda (nombre sugerido: p_target_curr). Utilice el mismo tipo que se utiliza en el elemento de vista CurrencyCodeUSD.
Ajuste el código de la siguiente manera:
123456
define view entity Z##_C_EmployeeQueryP
with parameters
p_target_curr : /dmo/currency_code
as select from Z##_R_Employee
Defina un segundo parámetro de entrada para sustituir el uso de la variable de sesión $session.system_date (nombre sugerido: p_date). Utilice un tipo predefinido adecuado.
Ajuste el código de la siguiente manera:
1234567
define view entity Z##_C_EmployeeQueryP
with parameters
p_target_curr : /dmo/currency_code,
p_date : abap.dats
as select from Z##_R_Employee
Anote el segundo parámetro con una etiqueta (valor sugerido: Fecha de evaluación).
Nota
Esto no es necesario para el primer parámetro porque este parámetro está tipificado con un elemento de datos.
Ajuste el código de la siguiente manera:
12345678
define view entity Z##_C_EmployeeQueryP
with parameters
p_target_curr : /dmo/currency_code,
@EndUserText.label: 'Date of evaluation'
p_date : abap.dats
as select from Z##_R_Employee
En la definición del elemento de vista CurrencyCodeUSD, sustituya la expresión CAST por el parámetro de entrada.
Consejo
Utilice compleción de código para acceder al parámetro.
Ajuste el código de la siguiente manera:
1234
// cast( 'USD' as /dmo/currency_code ) as CurrencyCodeUSD,
$parameters.p_target_curr as CurrencyCodeUSD,
Ajuste el nombre del elemento de vista CurrencyCodeUSD (nombre sugerido: CurrencyCode).
Nota
No olvide ajustar también el valor de las dos anotaciones @Semantics.amount.currencyCode.
Ajuste el código de la siguiente manera:
123456789101112131415161718
@EndUserText.label: 'Annual Salary'
@Semantics.amount.currencyCode: 'CurrencyCode'
currency_conversion( amount=> AnnualSalary,
source_currency => CurrencyCode,
target_currency => $projection.CurrencyCode,
exchange_rate_date => $session.system_date
) as AnnualSalaryConverted,
@EndUserText.label: 'Monthly Salary'
@Semantics.amount.currencyCode: 'CurrencyCode'
cast( $projection.AnnualSalaryConverted as abap.fltp )
/ 12.0 as MonthlySalaryConverted,
// CurrencyCode,
// cast( 'USD' as /dmo/currency_code ) as CurrencyCodeUSD,
$parameters.p_target_curr as CurrencyCode,
En la conversión de moneda, sustituya la variable de sesión $session.system_date por el parámetro date.
Ajuste el código de la siguiente manera:
123456789
@EndUserText.label: 'Annual Salary'
@Semantics.amount.currencyCode: 'CurrencyCode'
currency_conversion( amount => AnnualSalary,
source_currency => CurrencyCode,
target_currency => $projection.CurrencyCode,
exchange_rate_date => $parameters.p_date
) as AnnualSalaryConverted,
En el cálculo del elemento de vista CompanyAffiliation, sustituya la variable de sesión $session.system_date por el parámetro date.
Ajuste el código de la siguiente manera:
123456
division( dats_days_between( EntryDate,
$parameters.p_date ),
365,
1 ) as CompanyAffiliation,
Active y pruebe la entidad de vista CDS.
Pulse Ctrl + F3 para activar el objeto de desarrollo.
Pulse F8 para probar la entidad de vista CDS en la herramienta Vista previa de datos.
Introduzca valores para los dos parámetros y seleccione Abrir vista previa de datos.
Consejo
Los parámetros obligatorios tienen un símbolo de asterisco (*) junto al nombre del parámetro.
Tarea 2: Utilizar parámetros de entrada en ABAP SQL
Cree una copia de la clase ABAP /LRN/CL_S4D430_RLS_PATH_EXPR (nombre sugerido: ZCL_##_PARAMETER, donde ## es su número de grupo). En la nueva clase, ajuste la sentencia SELECT. En la cláusula FROM, sustituya la entidad de vista CDS /LRN/C_Employee_Qry por la entidad de vista CDS que ha creado en este ejercicio (el nombre sugerido era: Z##_C_EmployeeQueryP). En la lista FIELDS, añada algunos elementos de vista que utilicen los parámetros de entrada.
Pasos
Copie la clase /LRN/CL_S4D430_RLS_PATH_EXPR en una clase de su propio paquete (nombre sugerido: ZCL_##_PARAMETER, donde ## es para su número de grupo).
En la vista Explorador de proyectos, haga clic con el botón derecho en la clase /LRN/CL_S4D430_RLS_PATH_EXP para abrir el menú contextual.
En el menú contextual, seleccione Duplicar ....
Introduzca el nombre del paquete en el campo Paquete. En el campo Nombre, introduzca el nombre ZCL_##_PARAMETER, donde ## es su número de grupo.
Ajuste la descripción y seleccione Siguiente.
Confirme la orden de transporte y seleccione Finalizar.
En el método IF_OO_ADT_CLASSRUN~MAIN, modifique la sentencia SELECT. En la cláusula FROM, sustituya /LRN/C_Employee_Qry por el nombre de la entidad de vista CDS que acaba de crear (Z##_C_EmployeeQueryP).
Ajuste el código de la siguiente manera:
123456
SELECT
FROM Z##C_EmployeeQueryP
FIELDS employeeid,
Proporcione valores a los parámetros de entrada de la entidad de vista. Utilice un literal para el código de moneda (por ejemplo, "JPY") y el campo de sistema sy-datum para el parámetro de fecha.
Consejo
Recuerde que sy-datum es una variable host y que debe escapar con @.
Ajuste el código de la siguiente manera:
12345678
SELECT
FROM Z##C_EmployeeQueryP(
p_target_curr = 'JPY',
p_date = @sy-datum )
FIELDS employeeid,
Añada los siguientes elementos de vista a la lista FIELDS: MonthlySalaryConverted, CurrencyCode, CompanyAffiliation.
Ajuste el código de la siguiente manera:
1234567891011121314151617181920
SELECT
FROM Z##C_EmployeeQueryP(
p_target_curr = 'JPY',
p_date = @sy-datum )
FIELDS employeeid,
firstname,
lastname,
departmentid,
departmentdescription,
assistantname,
\_department\_head-lastname AS headname,
MonthlySalaryConverted,
CurrencyCode,
CompanyAffiliation
INTO TABLE @DATA(result).
Active la clase global y ejecútela como una aplicación de consola.
Pulse Ctrl + F3 para activar el objeto de desarrollo.
Pulse F9 para ejecutar la clase global como una aplicación de consola.
Tarea 3: Parámetro de enlace a campo de sistema
Asegúrese de que el sistema ABAP lo rellena automáticamente con la fecha del sistema cuando no se especifique ningún otro valor. A continuación, elimine el parámetro de la sentencia SELECT de su clase ABAP.
Pasos
Vuelva a la definición de datos CDS y anote el parámetro p_date para vincularlo con la fecha del sistema. Utilice la compleción de código para seleccionar el valor de anotación.
Ajuste el código de la siguiente manera:
123456789
define view entity Z##_C_EmployeeQueryP
with parameters
p_target_curr : /dmo/currency_code,
@EndUserText.label: 'Date of evaluation'
@Environment.systemField: #SYSTEM_DATE
p_date : abap.dats
as select from Z##_R_Employee
Active y pruebe la entidad de vista CDS.
Pulse Ctrl + F3 para activar el objeto de desarrollo.
Pulse F8 para probar la entidad de vista CDS en la herramienta Vista previa de datos.
Introduzca un valor para el parámetro de código de moneda y seleccione Abrir vista previa de datos.
Consejo
Los parámetros obligatorios tienen un símbolo de asterisco (*) junto al nombre del parámetro.
Vuelva a su clase ABAP y elimine o comente el parámetro de fecha en la cláusula FROM.
Ajuste el código de la siguiente manera:
12345678
SELECT
FROM /LRN/C_Employee_Par(
p_target_curr = 'JPY'
* , p_date = @sy-datum
)
FIELDS employeeid,
Active la clase global y ejecútela como una aplicación de consola.
Pulse Ctrl + F3 para activar el objeto de desarrollo.
Pulse F9 para ejecutar la clase global como una aplicación de consola.