Definição de estruturas Dictionary

Objective

After completing this lesson, you will be able to definir estruturas Dictionary.

Estruturas Dictionary

As estruturas Dictionary podem ser utilizadas como categorias de dados no ABAP Dictionary.

A estrutura no lado esquerdo do nosso exemplo é composta por cinco componentes. Os quatro primeiros componentes fazem referência a vários elementos de dados. O último componente é tipificado diretamente com o tipo de dicionário predefinido CHAR.

O código ABAP no lado direito define exatamente o mesmo tipo de estrutura usando a instrução TYPES. Este código pode estar localizado em um método, na parte de definição de uma classe ou em uma interface. Os primeiros quatro componentes utilizam os mesmos elementos de dados que os componentes na estrutura Dictionary. O último componente utiliza o tipo ABAP integrado C.

Além da extensibilidade e da etiqueta, as duas estruturas são totalmente compatíveis.

Estruturas embutidas

Tipos de estrutura embutida no ABAP Dictionary

Assista ao vídeo para saber mais sobre tipos de estrutura embutida no ABAP Dictionary.

Nota

Quando você digita um objeto de dados com um tipo de estrutura embutida, deve acessar seus componentes da seguinte forma:

Code Snippet
1234
gs_struct-address-post_code = '69190'. gs_struct-address-city = 'Walldorf'.

Não é possível acessar diretamente os subcomponentes do endereço.

Como definir uma estrutura embutida

Reproduza o vídeo para ver como definir uma estrutura embutida.

Estruturas include

As estruturas embutidas não devem ser confundidas com estruturas que incluem outro tipo de estrutura.

Anteriormente, neste curso, você aprendeu a incluir uma estrutura na lista de campos de uma tabela de banco de dados. A mesma técnica está disponível ao definir um tipo de estrutura.

No exemplo, a estrutura zs4d430s_person_include tem um total de sete componentes: os componentes first_name e last_name são definidos diretamente na estrutura, enquanto os outros cinco componentes são adicionados incluindo o tipo de estrutura zs4d430s_address.

O código ABAP no lado direito ilustra como você pode definir o mesmo tipo usando a instrução TYPES em uma classe ABAP ou interface.

Nota

Para compreender este código, você deve estar ciente de que INCLUDE TYPES é uma instrução própria e não um suplemento à instrução TYPES. A instrução de cadeia TYPES é encerrada antes da instrução INCLUDE com um sinal de ponto (.) e uma nova instrução de cadeia TYPES começa após a instrução INCLUDE.

Nota

Quando você usa um tipo de estrutura desse tipo no ABAP, o include não é visível. Você acessa os componentes adicionais como habitualmente:

Code Snippet
12345
gs_struct-first_name = 'John'. gs_struct-post_code = '69190'. gs_struct-city = 'Walldorf'.

Includes nomeados

Quando você inclui uma estrutura em outra estrutura, pode dar um nome ao include. Este include é então chamado de include nomeado.

No ABAP Dictionary, você adiciona o nome antes da palavra-chave INCLUDE e separa os dois por um sinal de dois pontos (:). Quando você define seu tipo de estrutura no ABAP, você coloca o nome após o nome da estrutura include, com a palavra-chave AS na frente da mesma.

O include indicado estabelece um tipo de grupo de campos que permite a você acessar os campos não só diretamente, mas também mediante o nome do include.

Consideremos uma estrutura de objeto de dados tipificada com o tipo de estrutura zs4d430s_person_include. Você pode acessar o campo cidade de duas formas: como struct-city como faria com um include normal ou como struct-address-city.

Nota

Os includes nomeados e os grupos de campos são muito utilizados nos tipos de dados derivados do modelo de programação de aplicação ABAP RESTful.

Como incluir estruturas

Assista ao vídeo para ver como incluir estruturas.

Definir e utilizar estruturas Dictionary

Você precisa de alguns tipos de estrutura que pode acessar em várias classes globais. Você decide definir tipos de estrutura no ABAP Dictionary.

Dica

Antes de definir tipos de estrutura no ABAP Dictionary, você deve investigar a opção de definir tipos de estrutura públicos em uma das classes globais ou em uma interface global.

Modelo:

  • /LRN/CL_S4D430_TYT_STRUCTURE (classe global)

Solução:

  • /LRN/CL_S4D430_TYS_STRUCTURE (classe global)
  • /LRN/S_ADDRESS (Tipo de estrutura)
  • /LRN/S_NAME (Tipo de estrutura)
  • /LRN/S_PERSON (Tipo de estrutura)

Tarefa 1: Definir uma estrutura simples

Crie uma cópia da classe global /LRN/CL_S4D430_TYT_STRUCTURE (nome sugerido: ZCL_##_STRUCTURE, em que ## é seu número de grupo). Substitua o tipo de estrutura st_address por uma estrutura Dictionary (nome sugerido: Z##S_ADDRESS).

Etapas

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

    1. Na visão Explorador de projetos, clique com o botão direito do mouse na classe /LRN/CL_S4D430_TYT_STRUCTURE 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_##_STRUCTURE, 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. Na PUBLIC SECTION da definição de classe, analise a definição do tipo st_address.

    1. Execute esta etapa como você efetuou anteriormente.

  3. Crie um novo objeto Dictionary do tipo Estrutura (nome sugerido: Z##S_ADDRESS).

    1. Na visão Explorador de projetos, expanda seu pacote e abra o menu de contexto no subnó Dicionário.

    2. Selecione Nova→estrutura.

    3. Confirme o pacote, insira o nome Z##S_ADDRESS e a descrição Endereço e, em seguida, selecione Seguinte.

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

  4. Remova o caractere de preenchimento component_to_be_Changed : abap.string(0);da lista de componentes da estrutura. Em seguida, substitua-o por uma rua componente. Utilize o mesmo elemento de dados que no tipo st_address na sua classe global.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456
      define structure z##s_address { street : /dmo/street; }
  5. Adicione componentes para o código postal, a cidade e o país. Utilize os mesmos nomes de componente e elementos de dados que no tipo st_address na sua classe global.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456789
      define structure z##s_address { street : /dmo/street; postal_code : /dmo/postal_code; city : /dmo/city; country : land1; }
  6. Ative o tipo de estrutura.

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

  7. Retorne ao texto fonte de sua classe global. Na implementação do método IF_OO_ADT_CLASSRUN~MAIN, substitua st_address pelo seu novo tipo de estrutura Dictionary. Certifique-se de que não existem erros de sintaxe.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      1234567891011
      * Task 1 ***************************************************************** * DATA address TYPE st_address. DATA address TYPE z##s_address. address-street = 'Dietmar-Hopp-Allee 16'. address-postal_code = '69190'. address-city = 'Walldorf'. address-country = 'DE'.

Tarefa 2: Definir uma estrutura embutida

Em sua classe global, remova ou comente o tipo de estrutura pública st_person e substitua-o por uma estrutura de dicionário (nome sugerido: Z##S_PERSON). Para o endereço, reutilize o tipo de estrutura que você já criou. Para o nome, utilize uma correção rápida para criar uma segunda estrutura simples com dois componentes (nome sugerido: Z##S_NAME).

Etapas

  1. Crie um novo objeto Dictionary do tipo Estrutura.

    1. Na visão Explorador de projetos, expanda seu pacote e abra o menu de contexto no subnó Dicionário.

    2. Selecione Nova→estrutura.

    3. Confirme o pacote, insira o nome Z##S_PERSON e a descrição Pessoa (nome e endereço) e, em seguida, selecione Seguinte.

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

  2. Remova o caractere de preenchimento component_to_be_Changed : abap.string(0); da lista de componentes da estrutura e substitua-o por um componente para o endereço (nome proposto: endereço). Digite o novo componente com a estrutura que você criou na tarefa anterior (Z##S_ADDRESS).

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456
      define structure z##s_person { address : z##s_address; }
  3. Adicione outro componente para o nome da pessoa (nome sugerido: Nome). Insira Z##S_NAME como nome do tipo de componente.

    Nota

    Este tipo de estrutura ainda não existe. Você cria o mesmo na etapa seguinte.
    1. Ajuste o código da seguinte forma:

      Code Snippet
      1234567
      define structure z##s_person { name : z##s_name; address : z##s_address; }
  4. Grave o tipo de estrutura. Em seguida, utilize uma solução rápida para criar o tipo de estrutura Z##S_NAME.

    1. Pressione Ctrl + S para salvar o objeto de desenvolvimento.

    2. Clique com o botão esquerdo do mouse no ícone de erro ao lado da linha de código que você acabou de adicionar e selecione Criar estrutura Dictionary ....

    3. Insira o Nome da descrição e selecione Seguinte.

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

  5. Remova o caractere de preenchimento component_to_be_Changed : abap.string(0);da lista de componentes da estrutura e substitua-o por um componente para o primeiro nome (nome sugerido: first_name) e um componente para o sobrenome (nome sugerido: last_name). Utilize elementos de dados adequados do espaço de nomes /DMO/ como tipos de componentes.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      1234567
      define structure z##s_name { first_name : /dmo/first_name; last_name : /dmo/last_name; }
  6. Grave o tipo de estrutura. Em seguida, ative todos os objetos de desenvolvimento inativos.

    1. Pressione Ctrl + S para salvar o objeto de desenvolvimento.

    2. Na barra de ferramentas eclipse, selecione Ativar objetos de desenvolvimento ABAP inativos. Como alternativa, pressione Ctrl + Shift + F3.

    3. Selecione Selecionar tudo e Ativar.

  7. Retorne ao texto fonte de sua classe global. Na PUBLIC SECTION da definição de classe, remova ou comente a definição dos tipos st_name e st_person.

    1. Execute esta etapa como anteriormente.

  8. Na implementação do método IF_OO_ADT_CLASSRUN~MAIN, substitua st_person pelo seu novo tipo de estrutura Dictionary. Certifique-se de que não existem erros de sintaxe.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      12345678910111213
      * Task 2 *********************************************************** * DATA person TYPE st_person. DATA person TYPE z##s_person. person-name-first_name = 'Dictionary'. person-name-last_name = 'ABAP'. person-address-street = 'Dietmar-Hopp-Allee 16'. person-address-postal_code = '69190'. person-address-city = 'Walldorf'. person-address-country = 'DE'.

Tarefa 3: Definir includes nomeados

Em sua classe global, remova ou comente o tipo de estrutura pública st_person_inc e substitua-o por uma estrutura de dicionário (nome sugerido: Z##S_PERSON_INC). Em vez dos componentes estruturados NAME e ADDRESS, defina includes nomeados com o mesmo nome.

Etapas

  1. Crie uma cópia de sua estrutura Dictionary embutida (nome sugerido: Z##S_PERSON_INC, em que ## é seu número de grupo).

    1. Na visão Explorador de projetos, expanda seu pacote e subnó Estrutura→do dicionário.

    2. Abra o menu de contexto no tipo de estrutura Z##S_PERSON e selecione Duplicar.

    3. Insira o nome Z##S_PERSON_INC e selecione Seguinte.

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

  2. Transforme o nome do componente estruturado em um include nomeado.

    1. Após os dois pontos que separam o nome do componente e o tipo de componente, insira a palavra-chave INCLUDE.

  3. Repita isso para o endereço do componente estruturado.

    1. Certifique-se de que o tipo de estrutura agora tenha o seguinte aspecto:

      Code Snippet
      123456
      define structure z##s_person_inc { name : include z##s_name; address : include z##s_address; }
  4. Ative o tipo de estrutura.

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

  5. Retorne ao texto fonte de sua classe global. Na PUBLIC SECTION da definição de classe, remova ou comente a definição do tipo st_person_inc.

    1. Execute esta etapa como anteriormente.

  6. Na implementação do método IF_OO_ADT_CLASSRUN~MAIN, substitua st_person_inc pelo seu novo tipo de estrutura Dictionary. Certifique-se de que as duas alternativas para acessar os componentes funcionam.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456789101112131415161718192021
      * Task 3 ********************************************************************** * DATA person2 TYPE st_person_inc. DATA person2 TYPE z##s_person_inc. person2-name-first_name = 'Dictionary'. person2-name-last_name = 'ABAP'. person2-address-street = 'Dietmar-Hopp-Allee 16'. person2-address-postal_code = '69190'. person2-address-city = 'Walldorf'. person2-address-country = 'DE'. * or ------------------------------------------------------- person2-first_name = 'Dictionary'. person2-last_name = 'ABAP'. person2-street = 'Dietmar-Hopp-Allee 16'. person2-postal_code = '69190'. person2-city = 'Walldorf'. person2-country = 'DE'.
  7. Ative e depure a classe como um aplicativo de console. Analise o conteúdo dos objetos de dados endereço, pessoa e person2.

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

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