Ampliar visões CDS

Objective

After completing this lesson, you will be able to ampliar entidades CDS usando ampliações de visão CDS.

Ampliações de visão CDS

Tecnicamente, a ampliação de entidades CDS é muito semelhante à ampliação de objetos Dictionary. Os clientes ou parceiros criam novos objetos de desenvolvimento que se referem ao objeto de desenvolvimento que desejam ampliar. No ABAP Dictionary, eles criam estruturas APPEND e, no CDS, definem extensões de entidade CDS. As entidades de visão CDS são ampliadas com ampliações de visão CDS. Uma ampliação de visão CDS é definida em uma definição de dados dedicada usando a instrução EXTEND VIEW ENTITY. Uma visão CDS existente pode ter uma ou mais ampliações de visão CDS.

Neste exemplo, a entidade de visão CDS /DMO/E_Agency à esquerda contém um elemento na lista de elementos. A extensão de visão à direita adiciona um elemento, ZZCategoryZAG, a esta lista. A ligação entre as duas definições de dados é estabelecida por meio do nome da entidade da visão CDS após a palavra-chave EXTEND VIEW ENTITY.

Nota

A ampliação da entidade de visão CDS deve indicar o nome da fonte de dados ao abordar campos ou elementos. No exemplo, ele utiliza Agência que é definida na entidade de visão CDS /DMO/E_Agency como um nome de alias para a tabela de banco de dados /DMO/AGENCY.

As ampliações de visão CDS também podem definir associações adicionais. Dependendo das configurações de extensibilidade (veja abaixo), eles podem expor essas associações ou usá-las em expressões de caminho na lista de elementos.

Neste exemplo, a ampliação de visão CDS define a associação _ZZTextZAG e adiciona a mesma à lista de elementos da entidade de visão CDS /DMO/E_Agency.

Controle de extensibilidade para entidades CDS

O controle de extensibilidade para entidades CDS é muito semelhante ao controle de extensibilidade para objetos Dictionary. A maioria das anotações tem uma sintaxe e um significado semelhantes. Para uma documentação completa, consulte a documentação de palavras-chave ABAP.

No entanto, existem algumas diferenças mínimas, como mostrado aqui:

  • As anotações começam com @ABAPCatalog.extensibility. No CDS, eles começam com @ABAPCatalog.enhancement.
  • Existe uma anotação simples verdadeiro/falso para permitir ou não a extensibilidade.

    Nota

    A anotação AbapCatalog.viewEnhancementCategory indica como uma visão CDS pode ser ampliada.

    Opcionalmente, AbapCatalog.viewEnhancementCategory e AbapCatalog.extensibility.extensible podem ser especificados em conjunto na mesma visão CDS. Neste caso, os valores de anotação devem corresponder. Eles devem permitir ou proibir extensões.

  • Não é possível distribuir a quota entre clientes e parceiros.
  • Você pode definir um elementSuffix e não um fieldSuffix, porque a lista de elementos de uma entidade CDS pode ser composta por mais do que apenas campos. As associações expostas são um exemplo.

A diferença mais importante são as subanotações allowNewDatasources e dataSources, que não têm equivalente no ABAP Dictionary. Com essas anotações, o proprietário de uma entidade de visão CDS pode controlar a partir de onde as ampliações podem ler os respectivos dados. Se allowNewDatasources estiver definido como verdadeiro, o desenvolvedor de uma extensão poderá ler a partir de qualquer fonte de dados da qual a visão original lê. Se estiver definido como falso, o desenvolvedor da ampliação só pode ler a partir das fontes de dados listadas em dataSources. Esta pode ser a(s) fonte(s) de dados direta(s) da visão original ou os destinos de suas associações.

A SAP geralmente usa isso para forçar o uso de includes de ampliação, que são uma melhor prática para ampliações de visão CDS.

Os includes de ampliação são uma melhor prática para ampliações de visão CDS. O nome é um pouco enganoso porque o ABAP CDS não suporta uma técnica include como o ABAP Dictionary. Em vez disso, o que a SAP utiliza são entidades de visão CDS especiais, geralmente identificáveis pelo prefixo "E_". A entidade de visão CDS padrão, por exemplo, uma visão com o prefixo "R_", é definida com uma associação a uma visão E desse tipo.

Na figura, a definição da visão CDS na parte superior esquerda contém uma associação à visão do include de ampliação na parte inferior esquerda. As duas visões CDS são ampliáveis, mas para forçar a utilização da visão E, a visão principal restringe a extensibilidade a elementos da associação à visão E. A visão E, por outro lado, permite a ampliação com os elementos da fonte de dados principal. Como consequência, os desenvolvedores de extensão devem adicionar primeiro novos elementos à visão E, antes de poderem adicioná-los à visão principal.

Vejamos um exemplo.

Este exemplo ilustra como ampliar a entidade de visão CDS /DMO/R_AgencyTP (na parte superior esquerda) com o campo ZZCATEGORYZAG da tabela de banco de dados /DMO/AGENCY.

Não é possível efetuar a ampliação diretamente, porque a entidade de visão CDS /DMO/R_AgencyTP restringe a ampliação à associação _Extension, que tem a entidade de visão CDS /DMO/E_Agency como destino (parte inferior esquerda).

Por isso, em uma primeira etapa, o desenvolvedor amplia /DMO/E_Agency (canto inferior direito) e só depois amplia o elemento de endereçamento /DMO/R_AgencyTPZZCategoryZAG por meio de uma expressão de caminho.

Criação de ampliação de visão CDS

Tal como as visões CDS, as ampliações de visão CDS são definidas em definições de dados CDS.

Para definir uma ampliação de visão CDS, proceda da seguinte forma:

  1. No explorador de projetos, localize a definição de dados da entidade CDS que você quer ampliar.
  2. Clique com o botão direito do mouse na definição de dados e selecione Nova definição de dados.
  3. Ajuste o pacote, insira um nome e uma descrição para o novo objeto. Em seguida, selecione Seguinte.

    Nota

    Normalmente, a definição de dados com a ampliação não se encontra no mesmo pacote que o objeto de base. Por isso, é importante ajustar o pacote sugerido.

  4. Insira uma ordem de transporte e selecione Seguinte.
  5. Na lista de modelos, selecione Ampliar entidade de visão e, em seguida, Concluir.

    Também existe um modelo Ampliar visão. Ele pertence a uma geração mais antiga de visões CDS. Utilize este modelo somente se você tiver que ampliar uma visão definida com define view e não com define view entity.

Ampliar entidades de visão CDS

Você quer ampliar entidades de visão CDS com elementos adicionais e associações. Em vez de editar as definições de dados diretamente, você cria ampliações de visão CDS.

Nota

Neste exercício, você amplia suas próprias entidades de visão CDS Z##_R_Employee e Z##_C_EmployeeQueryP, em que ## é seu número de grupo. Isso é feito por simplicidade. Para motivar a utilização de ampliações, você tem que fingir que as entidades de visão estão em um espaço de nomes diferente e que você não tem autorização para efetuar modificações diretas nelas.

Modelo:

  • n.a.

Solução:

  • /LRN/EXT_R_EMPLOYEE ( definição de dados)
  • /LRN/EXT_C_EMPLOYEE (Definição de dados)

Pré-requisitos

Para este exercício, você precisa da entidade de visão básica para dados do empregado (o nome sugerido foi: Z##_R_Employee), desenvolvida em exercícios anteriores. Se você não concluiu esses exercícios, crie uma cópia da definição de dados /LRN/R_EMPLOYEE_AUT.

Além disso, você precisa da entidade de visão com parâmetros para dados do empregado (o nome sugerido era: Z##_C_EmployeeQueryP). Se você não tiver concluído os exercícios relacionados, crie uma cópia da definição de dados /LRN/C_EMPLOYEE_AUT e deixe que ela leia a partir da sua entidade de visão de base.

Tarefa 1: Ativar extensibilidade

Ajuste as configurações de extensibilidade da sua entidade de visão de base para os dados do empregado (o nome sugerido foi: Z##_R_Employee, em que ## é o seu número de grupo). Permita a ampliação da lista de elementos com campos provenientes de sua tabela de banco de dados para dados do empregado (o nome sugerido era Z##_EMPLOY).

Da mesma forma, ajuste as configurações de extensibilidade de sua entidade de visão com parâmetros para dados do empregado (o nome sugerido foi: Z##_C_EmployeeQueryP, em que ## é o número do seu grupo). Permita a extensão da lista de elementos com elementos provenientes de sua entidade de visão de base (o nome sugerido era Z##_R_Employee).

Etapas

  1. Abra a definição da sua entidade de visão de base para dados do empregado.

    1. Pressione Ctrl + Shift + A, insira o nome da definição de dados e selecione OK.

  2. Ajuste a categoria de ampliação de visão para permitir a ampliação da lista de elementos.

    1. Modifique o valor da anotação @ABAPCatalog.viewEnhancementCategory de #NONE para #PROJECTION_LIST.

  3. Atualize a lista de fontes de dados permitidas para a ampliação. Adicione a tabela de banco de dados a partir da qual a entidade de visão lê para esta lista.

    Nota

    Para adicionar a tabela de banco de dados à lista, você precisa definir um nome de alias para ela (nome de alias sugerido: Empregado).
    1. Adicione a anotação @ABAPCatalog.extensibility.dataSources da seguinte forma:

      Code Snippet
      1234567
      @AbapCatalog: { dataMaintenance: #RESTRICTED, viewEnhancementCategory: [#PROJECTION_LIST], extensibility.dataSources: [ 'Employee' ] }
    2. Defina o alias para a fonte de dados da seguinte forma:

      Code Snippet
      1234
      define view entity Z##_R_Employee as select from z##employ as Employee
  4. Defina um sufixo obrigatório para os campos adicionais (valor proposto: ZEM).

    1. Adicione a anotação @ABAPCatalog.extensibility.elementSuffix da seguinte forma:

      Code Snippet
      12345678
      @AbapCatalog: { dataMaintenance: #RESTRICTED, viewEnhancementCategory: [#PROJECTION_LIST], extensibility.dataSources: [ 'Employee' ], extensibility.elementSuffix: 'ZEM' }
  5. Ative a definição de dados.

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

  6. Abra a definição de sua entidade de visão com parâmetros para dados do empregado.

    1. Pressione Ctrl + Shift + A, insira o nome da definição de dados e selecione OK.

  7. Como antes, ajuste a categoria de ampliação de visão, atualize as fontes de dados permitidas e defina o sufixo do elemento.

    Nota

    Utilize o mesmo alias de fonte de dados e sufixo de elemento que antes.
    1. Ajuste o código da seguinte forma:

      Code Snippet
      12345678
      @AbapCatalog: { dataMaintenance: #RESTRICTED, viewEnhancementCategory: [#PROJECTION_LIST], extensibility.dataSources: [ 'Employee' ], extensibility.elementSuffix: 'ZEM' }
    2. Defina o alias para a fonte de dados 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 as Employee
  8. Ative a definição de dados.

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

Tarefa 2: Ampliar a entidade de visão de base

Para sua entidade de visão básica, crie uma ampliação de visão CDS (nome sugerido: Z##EXT_R_EMPLOYEE) para adicionar os campos para o título do empregado e o país à lista de elementos (os nomes sugeridos foram: ZZTITLE_ZEM e ZZCOUNTRY_ZEM).

Etapas

  1. Crie uma ampliação de visão CDS para sua entidade de visão CDS Z##_R_Employee.

    1. No Explorador de projetos, localize a definição de dados Z##_R_EMPLOYEE, clique com o botão direito do mouse nela e selecione Nova definição de dados.

    2. Certifique-se de que o campo Pacote contém o nome do seu próprio pacote.

    3. Insira Z##EXT_R_Employee em Name and Extension of Z##_R_Employee em Description. Em seguida, selecione Seguinte.

    4. Confirme a ordem de transporte e selecione Seguinte.

      Nota

      Não selecione Concluir ainda ou você não poderá selecionar o modelo correto.
    5. Na lista de Modelos, selecione Ampliar entidade de visão e, em seguida, Concluir.

  2. Edite a lista de elementos da ampliação de visão. Remova o caractere de preenchimento e utilize a conclusão de código para adicionar o título e o país do empregado.

    1. No texto fonte, substitua base_data_source_code.element_name. por zz e pressione Ctrl + espaço para chamar code-completion.

    2. A partir da lista de sugestões, selecione zztitle_zem- z##Employ como empregado (coluna) para adicionar o campo append à lista de elementos da ampliação de visão CDS.

    3. Repita para ajustar o código da seguinte forma:

      Code Snippet
      1234567
      extend view entity Z##_R_Employee with { employ.zztitle_zem, employ.zzcountry_zem }
  3. Defina nomes de alias para os novos elementos de visualização (nomes sugeridos: ZZTitleZem e ZZCoutryZem).

    1. Ajuste o código da seguinte forma:

      Code Snippet
      1234567
      extend view entity Z##_R_Employee with { employ.zztitle_zem as ZZTitleZem, employ.zzcountry_zem as ZZCountryZem }
  4. Ative a ampliação de visão.

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

  5. Exiba a Descrição da dica da entidade de visão ampliada para confirmar que ela contém os novos elementos.

    1. Na linha de código que começa com extend view entity, posicione o cursor em z##_R_Employee e pressione F2.

Tarefa 3: Ampliar a entidade de análise

Para sua entidade de visão de consulta com parâmetros, crie uma ampliação de visão CDS (nome sugerido: Z##EXT_C_EMPLOYEE) para adicionar os elementos que você adicionou à visão de base (os nomes de elementos sugeridos eram: ZZTitleZem e ZZCountryZem). Adicione também uma função SQL para concatenar o nome e o sobrenome do empregado, separados por um único espaço em branco (nome do elemento sugerido: ZZFullNameZem). Por fim, amplie a visão com um código que informa se o empregado está sediado na União Europeia ou não (nome do elemento sugerido: ZZEUBasedZem).

Dica

Os dados mestre do país contêm um sinalizador IsEuropeanUnionMember. Para acessar este elemento, você deve primeiro ampliar a visão com uma associação à entidade de visão CDS I_Country (nome de associação sugerido: _ZZCountryZem). Em seguida, adicione uma expressão de caminho à lista de elementos da ampliação de visão.

Etapas

  1. Crie uma ampliação de visão CDS para sua entidade de visão CDS Z##_C_EmployeeQueryP.

    1. No Explorador de projetos, localize a definição de dados Z##_C_EMPLOYEEQUERYP, clique com o botão direito do mouse nela e selecione Nova definição de dados.

    2. Certifique-se de que o campo Pacote contém o nome do seu próprio pacote.

    3. Insira Z##EXT_C_Employee em Name e Extension of Z##_C_EmployeeQueryP em Description. Em seguida, selecione Seguinte.

    4. Confirme a ordem de transporte e selecione Seguinte.

      Nota

      Não selecione Concluir ainda ou você não poderá selecionar o modelo correto.
    5. Na lista de Modelos, selecione Ampliar entidade de visão e, em seguida, Concluir.

  2. Edite a lista de elementos da ampliação de visão. Remova o caractere de preenchimento e utilize a conclusão de código para adicionar o título e o país do empregado.

    1. No texto fonte, substitua base_data_source_code.element_name. por zz e pressione Ctrl + espaço para chamar code-completion.

    2. Na lista de sugestões, selecione ZZTitleZem - Z##_R_Employ como Empregado (coluna) para adicionar o campo de ampliação à lista de elementos.

    3. Repita para ajustar o código da seguinte forma:

      Code Snippet
      1234567
      extend view entity Z##_C_EmployeeQueryP with { Employee.ZZTitleZem, Employee.ZZContryZem }
  3. Utilize a função concat_with_space para concatenar o nome e sobrenome do empregado, separados por um único espaço em branco.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456789
      extend view entity Z##_C_EmployeeQueryP with { Employee.ZZTitleZem, Employee.ZZContryZem, concat_with_space( Employee.FirstName, Employee.LastName, 1 ) }
  4. Adicione um nome para este novo elemento (nome sugerido: ZZFullNameZem) e use a anotação relevante para fornecer uma etiqueta.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      12345678910
      extend view entity Z##_C_EmployeeQueryP with { Employee.ZZTitleZem, Employee.ZZContryZem, @endUserText.label: ' concat_with_space( Employee.FirstName, Employee.LastName, 1 ) as ZZFullNameZem }
  5. Amplie a visão com uma associação à entidade de visão CDS I_Country (nome sugerido: _ZZCountryZem).

    Dica

    Na condição ON, utilize o código do país da lista de elementos e o elemento-chave da entidade de visão I_Country.
    1. Ajuste o código da seguinte forma:

      Code Snippet
      12345678910111213
      extend view entity Z##_C_EmployeeQueryP with association [1..1] to I_Country as _ZZCountryZem on $projection.ZZCountryZem = _ZZCountryZem.Country { Employee.ZZTitleZem, Employee.ZZContryZem, concat_with_space( Employee.FirstName, Employee.LastName, 1 ) as ZZFullNameZem }
  6. Na lista de elementos, adicione o elemento IsEuropeanUnionMember do destino da associação (nome sugerido: ZZEUBasedZem).

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456789101112131415
      extend view entity Z##_C_EmployeeQueryP with association [1..1] to I_Country as _ZZCountryZem on $projection.ZZCountryZem = _ZZCountryZem.Country { Employee.ZZTitleZem, Employee.ZZContryZem, concat_with_space( Employee.FirstName, Employee.LastName, 1 ) as ZZFullNameZem, _ZZCountryZem.IsEuropeanUnionMember as ZZEUBasedZem }
  7. Ative a ampliação de visão e exiba a Descrição de dica para a entidade de visão ampliada para confirmar que ela contém os novos elementos.

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

    2. Na linha de código que começa com extend view entity, posicione o cursor em z##_C_EmployeeQueryP e pressione F2.