Definição de Visões CDS com parâmetros de entrada

Objectives

After completing this lesson, you will be able to:
  • Definir visões CDS com parâmetros de entrada.
  • Fornecer valores para parâmetros de visão CDS.
  • Vincular parâmetros a campos do sistema ABAP.

A necessidade de parâmetros de entrada

Nas lições anteriores, você viu como as visões CDS são poderosas quando se trata de fazer cálculos no banco de dados. Talvez você já tenha se perguntado em até que ponto o consumidor da visão CDS pode influenciar a forma como os cálculos são efetuados. Obviamente, o consumidor pode fornecer uma cláusula WHERE para executar uma seleção no resultado. Mas como isso ajuda quando você quer escolher a moeda de destino para uma conversão de moeda?

As visões CDS com parâmetros de entrada fecham essa lacuna. Eles permitem que o consumidor de uma visão forneça informações adicionais ao recuperar dados desta visão. A visão CDS, por sua vez, avalia essas informações e considera as mesmas ao calcular os resultados. Alguns casos de utilização possíveis para parâmetros são os seguintes:

  • O consumidor indica a moeda de destino de uma conversão de moeda.

  • O consumidor indica se os preços são calculados com ou sem imposto.

  • O consumidor fornece um separador que é usado ao concatenar campos.

  • o consumidor indica o idioma no qual o texto traduzível é retornado.

Outra motivação importante para visões de entrada são as visões CDS com agregações onde você quer filtrar os dados que inserem a agregação. Se, por exemplo, você calcular a receita total e quiser indicar uma data até a qual a receita deve ser considerada.

Por fim, o SQL não conhece os critérios de seleção obrigatórios. Um consumidor pode fornecer uma cláusula WHERE ou não. Com um parâmetro de entrada obrigatório, a visão pode forçar o consumidor a fornecer um critério de seleção necessário - por exemplo, um código de idioma, uma data ou um nome de usuário.

Declaração de parâmetro de entrada

Você define parâmetros de entrada adicionando WITH PARAMETERS após o nome da entidade da visão CDS. Os parâmetros são depois definidos em uma lista separada por vírgulas.

Cada parâmetro de entrada deve ser digitado com um tipo de dados elementar. O nome e o tipo de parâmetro são separados por dois pontos (:). O tipo de um parâmetro pode ser um tipo ABAP Dictionary predefinido (no formulário abap.<type>(<len>)) ou um elemento de dados. Tipos de estruturas, tipos de tabela ou tipos de referência não são permitidos.

Você pode usar anotações de parâmetro para fornecer metadados para parâmetros.

Acesso a parâmetros

Para acessar os parâmetros de entrada Dentro da definição da visão CDS, você deve utilizar o prefixo $parameters seguido de um sinal de ponto (.).

Você pode utilizar um parâmetro de entrada nas seguintes posições:

  • Como elemento independente na lista de elementos
  • Como entrada para uma distinção de casos
  • Como entrada para expressões e funções
  • No lado direito de uma condição em uma cláusula WHERE
  • No lado direito de uma condição de filtro em uma expressão de caminho

Vejamos alguns exemplos aqui.

O parâmetro TargetCurrency é utilizado diretamente na lista de elementos. Uma motivação típica pode ser que esse elemento é usado em um @semantics.amount.currencyCode: anotação para outro elemento.

Aqui, um parâmetro é usado em uma distinção CASE, permitindo que o consumidor decida se os assentos livres ou os assentos ocupados são retornados.

Neste exemplo, o parâmetro de entrada TargetCurrency é usado como entrada para uma função integrada, ou seja, a função de conversão de moeda. Ele permite que o consumidor de uma visão indique a moeda na qual os preços de voo são exibidos.

Neste exemplo, o parâmetro de entrada Idioma é usado na condição de filtro de uma expressão de caminho. Ele permite que o consumidor da visão indique o idioma do texto no elemento CurrencyName.

Neste exemplo, o parâmetro de entrada FirstFlightDate é utilizado na condição WHERE da definição de visão. Isso estabelece um tipo de critério de seleção obrigatório. O consumidor é forçado a filtrar os voos por uma data mínima de voo.

Parâmetros de entrada na visualização de dados

Quando você abre a ferramenta Visualização de dados para uma visão CDS que define parâmetros de entrada, você é solicitado a inserir valores reais para esses parâmetros de entrada antes de poder analisar o resultado. Observe o sinal de asterisco (*) ao lado dos nomes dos parâmetros, indicando que os parâmetros são obrigatórios.

Só são aceitas entradas compatíveis com o tipo de parâmetro. Mas a ferramenta não executa nenhuma outra verificação.

Dica

Quando o foco estiver em um campo de entrada, a tela exibirá o tipo previsto acima da máscara de entrada.

Parâmetros de entrada na visão na visão

Quando você define uma nova visão CDS e usa uma visão CDS com parâmetros de entrada como fonte de dados, deve fornecer todos os parâmetros de entrada com valores reais. Vejamos um exemplo:

Esta visão CDS lê a partir de uma visão CDS que define quatro parâmetros.

Os parâmetros são fornecidos dentro de um par de parênteses que seguem o nome da visão de origem. Uma vez que não existe somente um parâmetro, os parâmetros são fornecidos em uma lista separada por vírgulas.

Dica

Quando você define uma visão CDS que lê a partir de uma visão CDS com parâmetros, pode usar a conclusão de código (Ctrl + espaço) para inserir a assinatura completa da visão CDS.

Cada nome de parâmetro é seguido por um sinal de dois pontos (:), que serve como operador de atribuição de parâmetros e, depois disso, o valor real. Uma opção é um literal como valor real. Outra opção muito comum é "encaminhar" um parâmetro. Isso significa que a visão de chamada define um parâmetro e o utiliza para fornecer o parâmetro de sua fonte de dados. Por isso, o consumidor desta visão é responsável pelo fornecimento do valor real. Com esta técnica, você pode transferir informações por toda uma pilha de visões CDS.

Parâmetros de entrada no ABAP SQL

A sintaxe para fornecer os parâmetros de entrada de uma visão CDS no ABAP SQL é muito semelhante à sintaxe que você usa no CDS. A única diferença é o operador de atribuição: no CDS, é o sinal de dois pontos ":", enquanto no ABAP SQL é usado o sinal de igual (=).

Para fornecer os valores reais, você pode selecionar entre as seguintes opções:

Literais
Dependendo do tipo do parâmetro, você pode usar literais numéricos ou literais de texto como valores reais.
Variáveis de host
Em vez de literais, você pode usar constantes ABAP ou variáveis ABAP para fornecer os valores reais. Como de costume no ABAP SQL, as variáveis e constantes do host devem ser escapadas com o sinal "at" (@). O tipo deve ser compatível com o tipo de parâmetro. Em particular, só são permitidos objetos de dados ABAP elementares.
Expressões de host
Você pode até incorporar expressões ABAP inteiras na instrução ABAP SQL e usar o resultado como valor real para um parâmetro de visão. Essas expressões de host devem estar entre parênteses e prefixadas com o sinal "at" ( @). Considere que os espaços em branco são obrigatórios após o parêntese de abertura e antes do parêntese de fechamento. A expressão deve ter um resultado elementar e o tipo deve ser compatível com o tipo de parâmetro.

Como definir e utilizar uma visão CDS com um parâmetro de entrada

Assista ao vídeo para ver como definir e usar uma visão CDS com um parâmetro de entrada.

Acesso a campos de sistema ABAP usando parâmetros de visão CDS

O tempo de execução ABAP atualiza vários campos do sistema que contêm informações de interesse geral: a data e hora do sistema, o mandante e o idioma de logon, o nome do usuário atual, etc. Quando você quer usar os valores desses campos do sistema em entidades CDS, a forma recomendada é a seguinte:

  1. Na sua visão CDS, defina parâmetros de entrada com um tipo que corresponda ao tipo do campo do sistema, por exemplo, uma data ou um código de idioma.
  2. Anote o parâmetro com Environment.systemField: e selecione o valor de anotação relacionado ao campo do sistema que você deseja acessar, por exemplo, #SYSTEM_DATE ou #SYSTEM_LANGUAGE.

Se um parâmetro for anotado dessa forma, o tempo de execução ABAP irá fornecer automaticamente o parâmetro com o valor do campo do sistema relacionado, caso nenhum outro valor seja fornecido pelo consumidor. Como consequência, você ainda pode fornecer todos os parâmetros como antes quando usa a visão como fonte de dados em uma instrução ABAP SQL. No entanto, a verificação de sintaxe só força você a fornecer os parâmetros que NÃO estão ligados a um campo do sistema. Para os parâmetros que estão ligados a um campo de sistema, o tempo de execução ABAP utiliza o valor para o campo de sistema relacionado como um tipo de valor proposto.

No exemplo, os dois parâmetros da visão CDS estão ligados à data do sistema e ao idioma do sistema. A codificação ABAP não fornece nenhum dos parâmetros. Por isso, o tempo de execução ABAP retira os valores dos campos do sistema.

Os parâmetros ligados a campos do sistema ABAP se parecem muito com parâmetros opcionais. No entanto, considere o seguinte: este mecanismo só funciona ao acessar a visão a partir do ABAP. No CDS e no nível do banco de dados, os parâmetros permanecem parâmetros obrigatórios.

Atualmente, a anotação Environment.systemField suporta sete valores diferentes. A lista exibe os mesmos juntamente com o campo de sistema relacionado.

Nota

Para alguns dos campos do sistema, o acesso direto não é recomendado na nuvem ABAP. Em vez disso, é recomendado que você use métodos getter da classe ABAP CL_ABAP_CONTEXT_INFO.

Como acessar um campo do sistema ABAP no CDS ABAP

Assista ao vídeo para ver como acessar um campo do sistema ABAP no CDS do ABAP.

Definir e utilizar uma entidade de visão CDS com parâmetros de entrada

Você ampliou sua entidade de visão CDS com funções SQL e utilizou literais e variáveis de sessão como entrada. Agora você substitui alguns literais e variáveis de sessão por parâmetros de entrada.

Modelo:

  • /LRN/CL_S4D430_RLS_PATH_EXPR (classe global)

Solução:

  • /LRN/C_EMPLOYEE_PAR (Definição de dados)
  • /LRN/CL_S4D430_CPS_PARAMETER (classe global)

Tarefa 1: Definir parâmetros de entrada

Crie uma cópia da entidade da visão CDS na qual você trabalhou no exercício anterior (nome sugerido: Z##_C_EmployeeQueryP, em que ## é o número do seu grupo).

Nota

Se você não concluiu o exercício anterior, crie uma cópia da definição de dados CDS /LRN/C_EMPLOYEE_FNC.

Na nova definição de dados, substitua a moeda de destino com programação incondicional por um parâmetro de entrada (nome sugerido: p_target_curr) e a variável da sessão $session.system_field por um segundo parâmetro de entrada (nome sugerido: p_date).

Etapas

  1. Crie uma cópia de sua definição de dados com funções SQL (o nome sugerido foi: Z##_C_EmployeeQuery, onde ## é o número do seu grupo). Como alternativa, copie da definição de dados /LRN/C_EMPLOYEE_FNC (nome sugerido para a nova entidade de visão: Z##_C_EmployeeQueryP).

    1. Na visão Explorador de projetos, clique com o botão direito na definição de dados Z##_C_EMPLOYEE_QUERY ou na definição de dados /LRN/C_EMPLOYEE_FUNC para abrir o menu de contexto.

    2. No menu de contexto, selecione Duplicar ....

    3. Insira o nome do seu pacote no campo Pacote. No campo Nome, insira o nome Z##_C_EmployeeQueryP, onde ## representa seu número de grupo.

    4. Ajuste a descrição e selecione Seguinte.

    5. Confirme a ordem de transporte e selecione Concluir.

  2. Edite a definição da sua entidade de visão. Defina um parâmetro de entrada para substituir o código da moeda com programação incondicional para a conversão de moeda (nome sugerido: p_target_curr). Utilize o mesmo tipo que é utilizado no elemento de visão CurrencyCodeUSD.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456
      define view entity Z##_C_EmployeeQueryP with parameters p_target_curr : /dmo/currency_code as select from Z##_R_Employee
  3. Defina um segundo parâmetro de entrada para substituir a utilização da variável da sessão $session.system_date (nome sugerido: p_date). Utilize um tipo predefinido adequado.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      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
  4. Anote o segundo parâmetro com uma etiqueta (valor sugerido: Data de avaliação).

    Nota

    Isso não é necessário para o primeiro parâmetro porque esse parâmetro é tipificado com um elemento de dados.
    1. Ajuste o código da seguinte forma:

      Code Snippet
      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
  5. Na definição do elemento de visão CurrencyCodeUSD, substitua a expressão CAST pelo parâmetro de entrada.

    Dica

    Use code-completion para acessar o parâmetro.
    1. Ajuste o código da seguinte forma:

      Code Snippet
      1234
      // cast( 'USD' as /dmo/currency_code ) as CurrencyCodeUSD, $parameters.p_target_curr as CurrencyCodeUSD,
  6. Ajuste o nome do elemento de visão CurrencyCodeUSD (nome sugerido: CurrencyCode).

    Nota

    Não se esqueça de ajustar também o valor das duas anotações @Semantics.amount.currencyCode.
    1. Ajuste o código da seguinte forma:

      Code Snippet
      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,
  7. Na conversão de moeda, substitua a variável de sessão $session.system_date pelo parâmetro de data.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      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,
  8. No cálculo do elemento de visão CompanyAffiliation, substitua a variável de sessão $session.system_date pelo parâmetro de data.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456
      division( dats_days_between( EntryDate, $parameters.p_date ), 365, 1 ) as CompanyAffiliation,
  9. Ative e teste a entidade de visão CDS.

    1. Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.

    2. Pressione F8 para testar a entidade de visão CDS na ferramenta Visualização de dados.

    3. Insira valores para os dois parâmetros e selecione Abrir visualização de dados.

      Dica

      Os parâmetros obrigatórios têm um símbolo de asterisco (*) ao lado do nome do parâmetro.

Tarefa 2: Usar parâmetros de entrada no ABAP SQL

Crie uma cópia da classe ABAP /LRN/CL_S4D430_RLS_PATH_EXPR (nome sugerido: ZCL_##_PARAMETER, em que ## é seu número de grupo). Na nova classe, ajuste a instrução SELECT. Na cláusula FROM, substitua a entidade de visão CDS /LRN/C_Employee_Qry pela entidade de visão CDS que você criou neste exercício (o nome sugerido era: Z##_C_EmployeeQueryP). Na lista CAMPOS, adicione alguns elementos de visão que usam os parâmetros de entrada.

Etapas

  1. Copie a classe /LRN/CL_S4D430_RLS_PATH_EXPR para uma classe em seu próprio pacote (nome sugerido: ZCL_##_PARAMETER, em que ## é para seu número de grupo).

    1. Na visão Explorador de projetos, clique com o botão direito do mouse na classe /LRN/CL_S4D430_RLS_PATH_EXP para abrir o menu de contexto.

    2. No menu de contexto, selecione Duplicar ....

    3. Insira o nome do seu pacote no campo Pacote. No campo Nome, insira o nome ZCL_##_PARAMETER, em que ## é o seu número de grupo.

    4. Ajuste a descrição e selecione Seguinte.

    5. Confirme a ordem de transporte e selecione Concluir.

  2. No método IF_OO_ADT_CLASSRUN~MAIN, modifique a instrução SELECT. Na cláusula FROM, substitua /LRN/C_Employee_Qry pelo nome da entidade de visão CDS que você acabou de criar (Z##_C_EmployeeQueryP).

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456
      SELECT FROM Z##C_EmployeeQueryP FIELDS employeeid,
  3. Forneça valores aos parâmetros de entrada da entidade de visão. Utilize um literal para o código de moeda (por exemplo, 'JPY') e o campo do sistema sy-datum para o parâmetro de data.

    Dica

    Lembre-se de que sy-datum é uma variável de host e que você tem que escapar com @.
    1. Ajuste o código da seguinte forma:

      Code Snippet
      12345678
      SELECT FROM Z##C_EmployeeQueryP( p_target_curr = 'JPY', p_date = @sy-datum ) FIELDS employeeid,
  4. Adicione os seguintes elementos de visualização à lista de CAMPOS: MonthlySalaryConverted, CurrencyCode, CompanyAffiliation.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      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).
  5. Ative a classe global e execute-a como um app de console.

    1. Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.

    2. Pressione F9 para executar a classe global como um aplicativo de console.

Tarefa 3: Vincular parâmetro ao campo do sistema

Certifique-se de que o sistema ABAP preenche o mesmo automaticamente com a data do sistema quando nenhum outro valor é indicado. Em seguida, remova o parâmetro da instrução SELECT em sua classe ABAP.

Etapas

  1. Retorne à definição de dados CDS e anote o parâmetro p_date para ligá-lo à data do sistema. Use o code completion para selecionar o valor de anotação.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      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
  2. Ative e teste a entidade de visão CDS.

    1. Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.

    2. Pressione F8 para testar a entidade de visão CDS na ferramenta Visualização de dados.

    3. Insira um valor para o parâmetro de código de moeda e selecione Abrir visualização de dados.

      Dica

      Os parâmetros obrigatórios têm um símbolo de asterisco (*) ao lado do nome do parâmetro.
  3. Retorne à sua classe ABAP e remova ou comente o parâmetro de data na cláusula FROM.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      12345678
      SELECT FROM /LRN/C_Employee_Par( p_target_curr = 'JPY' * , p_date = @sy-datum ) FIELDS employeeid,
  4. Ative a classe global e execute-a como um app de console.

    1. Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.

    2. Pressione F9 para executar a classe global como um aplicativo de console.