Ampliar objetos Dictionary

Objective

After completing this lesson, you will be able to ampliar objetos Dictionary utilizando estruturas append.

Estruturas append

Você já aprendeu que uma definição de tabela de banco de dados no ABAP Dictionary corresponde a uma tabela física no banco de dados. As modificações no objeto Dictionary são transmitidas para o objeto de banco de dados durante a ativação (ALTER TABLE) ou por meio do procedimento de ajuste do banco de dados.

As estruturas append são uma técnica que permite adicionar campos a uma tabela de banco de dados sem modificar realmente a definição de tabela no ABAP Dictionary.

Consideremos uma tabela de banco de dados definida por um provedor de software, por exemplo, SAP. Um cliente ou parceiro quer adicionar campos a esta tabela de banco de dados.

Em vez de adicionar os campos à definição de tabela de banco de dados no Dictionary, eles criam uma estrutura append. A estrutura append é um objeto Dictionary separado, pertencente e atualizado pelo cliente ou parceiro. Tecnicamente, é um tipo de estrutura no ABAP Dictionary. No entanto, ele está ligado à definição de tabela de banco de dados e define campos adicionais para a tabela de banco de dados relacionada. Quando a estrutura append é ativada, seus componentes são adicionados como campos à tabela no banco de dados.

Você pode dizer que a tabela no banco de dados é definida por dois objetos Dictionary: a definição da tabela de banco de dados e a estrutura append.

Nota

Uma estrutura append pertence exatamente a uma tabela de banco de dados. No entanto, uma tabela de banco de dados pode ter várias estruturas append.

No ABAP Cloud, você só pode criar um append se o provedor de software tiver liberado a definição de tabela para ampliação.

Mas o que acontece se o provedor de software enviar uma nova versão da definição de tabela de banco de dados?

Consideremos que, em um release futuro, a tabela de banco de dados conterá um campo adicional. A solução é simples: durante o upgrade, o novo campo é simplesmente adicionado ao catálogo de campos da tabela de banco de dados, usando a instrução ALTER TABLE. A sequência de campos diferente no banco de dados e no dicionário não é um problema para o ambiente ABAP.

Aqui está um exemplo para uma estrutura append.

O código à esquerda exibe a definição da tabela de banco de dados /DMO/AGENCY. O código à direita exibe a definição da estrutura append Z00_EXT_AGENCY. A ligação entre os dois objetos Dictionary é estabelecida na estrutura append, mencionando a tabela de banco de dados após a palavra-chave EXTEND TYPE.

A estrutura append tem um componente zzcategory. Ele é adicionado à lista de campos da tabela de banco de dados /DMO/AGENCY.

Existe uma razão pela qual o componente da estrutura append começa com "ZZ". Os campos de tabela e os componentes de estrutura que começam com "ZZ" ou "YY" se encontram no espaço de nomes de cliente. A SAP garante que as tabelas enviadas pela SAP nunca conterão campos no espaço de nomes de cliente. Ao selecionar nomes de campo no espaço de nomes de cliente, os clientes podem evitar conflitos de nome de campo se a SAP adicionar novos campos à tabela de destino.

A técnica append não só funciona para definições de tabela de banco de dados. Você também pode utilizar estruturas append para adicionar componentes a um tipo de estrutura.

Neste exemplo, a estrutura append à direita amplia a estrutura Dictionary /DMO/S_EXT_INCL_AGENCY com um campo ZZCATEGORYZAG.

Controle de extensibilidade para objetos Dictionary

Para evitar conflitos posteriores, o proprietário de uma definição de tabela de banco de dados ou tipo de estrutura pode restringir a extensibilidade ou até mesmo proibi-la.

O provedor de software controla a extensibilidade usando as seguintes subanotações da anotação @ABAPCatalog.enhancement:

categoria

Define a categoria de ampliação. Os seguintes valores podem ser indicados:

  • #NOT_CLASSIFIED - não classificado
  • #NOT_EXTENSIBLE - não pode ser ampliado
  • #EXTENSIBLE_CHARACTER - pode ser ampliado (em forma de caractere)
  • #EXTENSIBLE_CHARACTER_NUMERIC - pode ser ampliado (em forma de caractere ou numérico)
  • #EXTENSIBLE_ANY - pode ser ampliado (profundo - só para estruturas)
Sufixo de campo

Define um sufixo de elemento de 3 caracteres. Este sufixo deve ser utilizado para todos os campos de uma ampliação criados por clientes ou parceiros. O objetivo é evitar conflitos de nomes de campo.

quotaMaximumFields

Define o número máximo de campos que podem ser anexados ao objeto correspondente por clientes e parceiros. Por outras palavras, ele reserva uma contagem de campos para ampliações do cliente e do parceiro.

quotaMaximumBytes

Define a capacidade máxima de bytes que pode ser anexada ao objeto correspondente por clientes e parceiros. Em outras palavras, ele reserva uma capacidade de bytes para ampliações de cliente e parceiro.

Nota

Para a documentação completa de anotações de extensibilidade, consulte a documentação de palavra-chave ABAP.

A SAP geralmente usa o controle de extensão para impor o uso de includes de extensão.

Os includes de ampliação são tipos de estrutura específicos incluídos em uma ou várias definições de tabela de banco de dados. Se os clientes ou parceiros pretenderem adicionar campos à tabela, eles devem criar uma estrutura append para este include de ampliação em vez de um append direto para a tabela de banco de dados.

Os principais benefícios são os seguintes:

  • O provedor de software pode utilizar o mesmo include de ampliação em várias definições de tabela de banco de dados e tipos de estrutura. Isso garante que os campos adicionais são adicionados a várias tabelas de uma forma consistente.
  • O provedor de software pode decidir liberar somente o include de ampliação e não a definição de tabela de banco de dados em si.

Vejamos um exemplo de uma extensão indireta:

A estrutura append à direita não amplia diretamente a tabela de banco de dados /DMO/AGENCY. Em vez disso, ele amplia o tipo de estrutura /DMO/S_EXT_INCL_AGENCY. Uma vez que a estrutura é utilizada como estrutura include na tabela de banco de dados /DMO/AGENCY, qualquer campo adicionado à estrutura também é adicionado à tabela de banco de dados.

Criação de estrutura append

Criar uma estrutura append

Assista ao vídeo para ver como criar uma estrutura append.

Como ampliar uma definição de tabela de banco de dados

Assista ao vídeo para ver como ampliar uma definição de tabela de banco de dados.

Ampliar uma definição de tabela de banco de dados

Você pretende ampliar uma tabela de banco de dados com campos adicionais. Em vez de processar a definição de tabela de banco de dados diretamente, você cria uma estrutura APPEND.

Nota

Neste exercício, você amplia sua própria tabela de banco de dados para dados do empregado (o nome sugerido era: Z##EMPLOY, em que ## é o número do seu grupo). Isso é feito por simplicidade. Para motivar a utilização da técnica append, você tem que fingir que a tabela de banco de dados está em um espaço de nomes diferente e que você não tem autorização para efetuar modificações diretas nela.

Modelo:

  • n.a.

Solução:

  • /LRN/S_EXT_EMPLOYEE (tipo de estrutura)

Pré-requisitos

Para este exercício, você precisa da definição da tabela de banco de dados para os dados do empregado que você criou em um exercício anterior (o nome sugerido foi: Z##EMPLOY, em que ## é o número do seu grupo). Se você não tiver criado essa tabela de banco de dados, crie-a agora como uma cópia da definição de tabela de banco de dados /LRN/EMPLOY_REL.

Tarefa 1: Ativar extensibilidade

Ajuste as configurações de extensibilidade de sua tabela de banco de dados para os dados do empregado (o nome sugerido foi: Z##EMPLOY, em que ## é o número do seu grupo). Permitir a ampliação com campos de tipos de dados planos, ou seja, campos numéricos e em forma de caractere. Imponha que os nomes dos campos adicionais terminem com as mesmas letras (valor sugerido: ZEM).

Etapas

  1. Abra a definição da sua tabela de banco de dados para dados do empregado.

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

  2. Ajuste a categoria de ampliação para permitir a ampliação com campos numéricos e em forma de caractere.

    1. Modifique o valor da anotação @ABAPCatalog.enhancement.category de #NOT_EXTENSIBLE para #EXTENSIBLE_CHARACTER_NUMERIC.

  3. Defina um sufixo obrigatório para os campos adicionais (valor proposto: ZEM).

    1. Adicione a anotação @ABAPCatalog.enhancement.fieldSuffix.

    2. Ajuste o código da seguinte forma:

      Code Snippet
      1234
      @AbapCatalog.enhancement.category : #EXTENSIBLE_CHARACTER_NUMERIC @AbapCatalog.enhancement.fieldSuffix : 'ZEM'
  4. Ative a tabela de banco de dados.

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

Tarefa 2: Criar estrutura append

Crie uma estrutura append (nome sugerido: Z##_S_EXT_EMPLOYEE, onde ## é o número do seu grupo) para ampliar sua tabela de banco de dados para dados do empregado (nome sugerido: Z##EMPLOY). Adicione um campo para o cargo do empregado (nome sugerido: ZZTITLE_ZEM) e um campo para o país onde o empregado se baseia (nome sugerido: ZZCOUNTRY_ZEM). Digite os novos campos com os elementos de dados /DMO/TITLE e LAND1.

Etapas

  1. Utilize uma correção rápida para criar uma estrutura append para esta tabela (nome sugerido: Z##_S_EXT_EMPLOYEE, em que ## é o seu número de grupo).

    1. Posicione o cursor no nome da tabela de banco de dados e pressione Ctrl + 1 para chamar a correção rápida.

    2. A partir da lista de soluções rápidas disponíveis, selecione Criar estrutura append para ....

    3. Em Nome, insira Z##_S_EXT_EMPLOYEE e, em Descrição, insira Empregado (estrutura append) e, em seguida, selecione Seguinte.

    4. Atribua a estrutura append a uma ordem de transporte e selecione Concluir.

  2. Na lista de componentes da estrutura append, defina um novo componente (nome sugerido: zztitle) com o elemento de dados /DMO/TITLE como tipo de componente.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      12345
      extend type z##employ with z##_s_ext_employee { zztitle_zem : /dmo/title; }
  3. Defina um segundo componente (nome sugerido: zzcountry_zem) com o elemento de dados LAND1 como seu tipo de componente.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456
      extend type z##employ with z##_s_ext_employee { zztitle_zem : /dmo/title; zzcountry_zem : land1; }
  4. Ative a estrutura append.

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

  5. Exiba a descrição de informação rápida para a tabela de banco de dados ampliada para confirmar que a tabela contém os novos campos.

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

Tarefa 3: Preencher campos de ampliação

Na sua tabela de empregados, preencha os campos de ampliação. Para isso, crie uma cópia da classe ABAP /LRN/CL_S4D430_CHECK_AND_FILL e ajuste os valores das constantes c_version e c_Employ_table. Em seguida, ative e execute a classe como um aplicativo de console.

Etapas

  1. Crie uma cópia da classe ABAP /LRN/CL_S4D430_CHECK_AND_FILL, nomeie-a como Z##_S4D430_CHECK_AND_FILL e coloque-a em seu pacote ZS4D430_##.

    Nota

    Ignore esta etapa se você criou uma cópia de /LRN/CL_S4D430_CHECK_AND_FILL em um exercício anterior.
    1. Na visão Explorador de projetos, localize a classe ABAP no pacote /LRN/S4D430_EXERCISE e clique com o botão direito do mouse nela para abrir o menu de contexto.

    2. No menu de contexto, selecione Duplicar.

    3. Insira o nome do seu pacote, o nome da cópia e uma descrição. Em seguida, selecione Seguinte.

    4. Atribua o novo objeto a uma ordem de transporte e selecione Concluir.

  2. Modifique o valor da constante c_version para lcl_Generator=>with_extension.

    Dica

    Você pode adicionar um sinal de comentário antes da definição atual e remover o sinal de comentário da segunda definição alternativa.
    1. Ajuste o código da seguinte forma:

      Code Snippet
      12345
      * CONSTANTS c_version TYPE t_version VALUE lcl_generator=>employee_table_only. * CONSTANTS c_version TYPE t_version VALUE lcl_generator=>with_relationships. CONSTANTS c_version TYPE t_version VALUE lcl_generator=>with_extensions.
  3. Se necessário, modifique o valor da constante c_Employ_table para o nome da sua tabela de banco de dados.

    Nota

    A constante c_depment_table não é necessária nesta versão do código.
    1. Role para baixo até a linha de código que começa com CONSTANTS c_employ_table.

    2. Se o literal depois de VALUE ainda contiver ##, substitua-o pelo seu número de grupo.

  4. Ative a classe ABAP e execute-a como um app de console. Se a saída de console contiver erros, ajuste a definição da sua tabela de banco de dados para empregados até que ela seja compatível com a definição de tabela de banco de dados /LRN/EMPLOY_EXT.

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

    2. Pressione F9 para executar a classe ABAP como app de console.

    3. Certifique-se de que a saída do console contenha o texto Tabela preenchida ... para a tabela de banco de dados.