Objectives
After completing this lesson, you will be able to:
- Defina um tipo de tabela Dictionary.
- Defina um tipo de tabela aninhada.
Tipos de tabela Dictionary
Criação de um tipo de tabela de dicionário
Reproduza o vídeo para aprender a criar um tipo de tabela de dicionário.
Tipos de tabela Dictionary
O editor para objetos Dictionary do tipo Tipo de tabela é baseado em formulário e não baseado em código, uma vez que os editores são para estruturas e tabelas de banco de dados. O editor é composto pelas quatro seções seguintes:
- Tipo de linha
Este quadro contém a origem e o nome da categoria de linha. Quando você cria um novo tipo de tabela, ele usa o tipo de dicionário predefinido CHAR com um comprimento de 1.
- Inicialização e acesso
Este quadro contém a definição da categoria de acesso à tabela (padrão/ordenada/hash). Por padrão, a categoria de acesso está definida como Tabela padrão.
O número inicial de linhas pode ser utilizado para dar ao tempo de execução ABAP uma dica sobre o tamanho da memória obrigatória inicial. Com o valor proposto 0, o tempo de execução ABAP aloca a área de memória inicial completamente por si só. Observe que, na maioria dos casos, é melhor manter o valor padrão 0 inalterado.
- Visão geral da chave
Este quadro fornece uma síntese das chaves. Selecione a chave para a qual você quer ver detalhes.
Cada tipo de tabela contém a definição de uma chave primária. As chaves secundárias são opcionais. O tipo de tabela no exemplo não contém chaves secundárias.
- Detalhes principais
Este quadro exibe detalhes para a chave selecionada. Isso pode ser para a categoria de chave, ou seja, se a chave é única ou não única e a definição de chave. No exemplo, a chave primária não é única e consiste em todo o tipo de linha.
Quando comparamos a definição de um tipo de tabela Dictionary e um tipo de tabela definido com a instrução ABAP TYPES, você pode identificar facilmente as diferentes partes:
- O tipo de linha é especificado após a adição de FO.
Nota
A sintaxe da instrução TYPES só permite uma palavra aqui. Ao utilizar um tipo integrado ABAP que necessite de um comprimento (tipo ABAP incompleto), a categoria de linha deve ser definida em uma instrução TYPES separada.
- A categoria de acesso à tabela é indicada após o suplemento TYPE.
- A definição da chave primária é especificada após a adição WITH. Valor de definição de chave Tipo de linha, corresponde a table_line na sintaxe ABAP.
Opções para definir o tipo de linha
Quando você define um tipo de tabela, tem várias opções para indicar o tipo de linha:
- Tipo de dicionário
- Esta é a categoria de tipo de linha mais comum. A categoria de linha é indicada através de um outro objeto Dictionary, na maioria das vezes uma estrutura. Se o tipo de linha for um elemento de dados, a tabela interna só terá uma coluna que não tenha um nome.
- Tipo predefinido
- Tecnicamente, a utilização de um tipo predefinido como categoria de linha é idêntica à utilização de um elemento de dados. O que falta é a semântica adicional de um elemento de dados.
- Referência a
- Com uma destas opções, o tipo de linha é um tipo de referência. A tabela interna terá uma coluna sem nome contendo uma lista de referências, seja para objetos de dados ou para instâncias de classes.
- Tabela de intervalos em
- Com uma destas opções, o tipo de tabela define o tipo de uma tabela range. Embora você indique somente um tipo predefinido ou um elemento de dados, a tabela range terá quatro colunas: OPTION, SIGN, LOW e HIGH. Para mais informações sobre a utilização de tabelas range, consulte a documentação ABAP.
Quando você define o tipo de linha de um novo tipo de tabela, pode procurar tipos de dicionário existentes. Você encontrará elementos de dados, estruturas, mas também tabelas de banco de dados e tipos de tabela. Posicione o cursor no campo de entrada Nome do tipo e pressione Ctrl + Espaço ou selecione Navegar.
Dica
Se o tipo de dicionário especificado existir, clique com o botão esquerdo do mouse em Nome do tipo para navegar até a definição.
Cuidado
Embora os tipos de tabela sejam oferecidos aqui, não faz sentido utilizá-los como tipos de linha. A "Tabela de Tabelas" resultante é difícil de manusear porque não há uma maneira fácil de identificar as linhas da tabela externa. Em vez disso, utilize estruturas com componentes em forma de tabela. Discutiremos essas tabelas aninhadas mais tarde.
Categoria e chaves de acesso
A categoria de tabela é uma característica técnica do tipo de tabela que indica o armazenamento e o método de acesso primário. O valor padrão é Tabela padrão. Outros valores são:
- Tabela ordenada
- O conteúdo da tabela interna é ordenado por sua chave primária a qualquer momento. O tempo de execução ABAP otimiza o acesso usando pesquisas binárias, sempre que possível. As restrições se aplicam a acessos de escrita.
- Tabela hash
- O conteúdo da tabela interna é administrado por meio de uma tabela hash. O tempo de execução ABAP otimiza o acesso utilizando um algoritmo hash sempre que possível. As restrições se aplicam a acessos de leitura e escrita.
- Tabela de índices e não especificada
- Com estas opções, o tipo de tabela não está completamente indicado. Esses tipos genéricos não podem ser usados para digitar objetos de dados. A sua utilização está restringida a parâmetros e símbolos de campo. Para trabalhar com tipos de dados genéricos, é necessário ter técnicas de programação dinâmica que não abordem neste treinamento de habilidades centrais do ABAP. Para obter detalhes, consulte a documentação ABAP.
Para definir a chave primária de um tipo de tabela, existem as seguintes opções:
- Chave padrão
A chave padrão (também conhecida como chave padrão) é composta por todos os componentes não numéricos do tipo de linha.
- Tipo de linha
Com esta opção, a chave primária é composta por todos os componentes do tipo de linha. Se o tipo de linha não estiver estruturado, a coluna é a coluna-chave.
- Não especificado
Com esta opção, não está definida nenhuma chave primária. O tipo de tabela é genérico e não pode ser usado para objetos de dados ABAP.
- Componentes-chave
A chave primária é composta pelos componentes indicados explicitamente. Quando você escolhe essa opção, o editor exibe uma nova seção abaixo da seção Detalhes da chave primária. Nesta seção, você deve inserir os componentes-chave.
Nota
Pressione Ctrl + espaço para selecionar a partir dos componentes do tipo de linha.
Nota
Considere que a chave primária de tabelas internas não é necessariamente única. Para tabelas padrão e tabelas ordenadas, também são suportadas chaves primárias não exclusivas. Para tabelas padrão, é realmente a única opção. Isso se opõe às tabelas de banco de dados em que a chave primária é sempre uma chave única.
Definição de chave secundária
Assista ao vídeo para saber mais sobre a definição de chave secundária.
Como definir um tipo de tabela Dictionary
Reproduza o vídeo para ver como definir um tipo de tabela Dictionary.
Tipos de tabela aninhados
Você pode usar um tipo de tabela para digitar o componente de um tipo de estrutura. No exemplo, os endereços de componente são digitados com o tipo de tabela zs4d430T_address. O código ABAP no lado direito ilustra como você define exatamente o mesmo tipo de estrutura no ABAP.
Nota
Uma estrutura com um componente em forma de tabela é frequentemente referida como uma estrutura profunda. O oposto é uma estrutura plana. Isso tem a ver com o layout de memória de um objeto de dados desse tipo no ABAP. Para obter detalhes sobre estruturas profundas e planas, consulte a documentação ABAP.
Quando você usa uma estrutura com um componente em forma de tabela como tipo de linha de outro tipo de tabela, esse tipo de tabela se torna aninhado. No exemplo, a estrutura ZS4D430S_PERSON_DEEP é utilizada como tipo de linha do tipo de tabela ZS4D430T_NESTED. Os endereços de coluna da tabela interna resultante contêm uma tabela interna em cada linha.
Nota
Em cada linha da tabela externa, a tabela interna pode ter um número diferente de linhas.
Definir e utilizar tipos de tabela Dictionary
Você precisa de alguns tipos de tabela que pode acessar em várias classes globais. Você decide definir tipos de tabela no ABAP Dictionary.
Dica
Antes de definir tipos de tabela no ABAP Dictionary, você deve investigar a opção de definir tipos de tabela públicos em uma das classes globais ou em uma interface global.
Tarefa 1: Definir um tipo de tabela
Crie uma cópia da classe global /LRN/CL_S4D430_TYT_TABLE_TYPE (nome sugerido: ZCL_##_TABLE_TYPE, em que ## é seu número de grupo). Substitua o tipo de tabela pública tt_address por um tipo de tabela de dicionário (nome sugerido: Z##T_ADDRESSES).
Etapas
Copie a classe /LRN/CL_S4D430_TYT_TABLE_TYPE para uma classe em seu próprio pacote (nome sugerido: ZCL_##_TABLE_TYPE, onde ## representa seu número de grupo).
Na visão Explorador de projetos, clique com o botão direito do mouse na classe /LRN/CL_S4D430_TYT_TABLE_TYPE para abrir o menu de contexto.
No menu de contexto, selecione Duplicar ....
Insira o nome do seu pacote no campo Pacote. No campo Nome, insira o nome ZCL_##_TABLE_TYPE, onde ## representa seu número de grupo.
Ajuste a descrição e selecione Seguinte.
Confirme a ordem de transporte e selecione Concluir.
Na PUBLIC SECTION da definição de classe, analise a definição do tipo tt_address.
Execute esta etapa como anteriormente.
Crie um novo objeto Dictionary do tipo Tipo de tabela (nome sugerido: Z##T_ADDRESSES).
Na visão Explorador de projetos, expanda seu pacote e abra o menu de contexto no subnó Dicionário.
Selecione Novo→tipo de tabela.
Confirme o pacote, insira o nome Z##T_ADDRESSES e a descrição Endereços e, em seguida, selecione Seguinte.
Atribua o novo objeto a uma ordem de transporte e selecione Concluir.
Indique seu tipo de estrutura Z##S_ADDRESS como tipo de linha.
Nota
Se você não tiver concluído o exercício anterior, pode utilizar o tipo de estrutura /LRN/S_ADDRESS.
Na seção Tipo de linha, altere a Categoria de Tipo predefinido para Dicionário.
No campo Nome do tipo, insira /LRN/S_ADDRESS ou Z##S_ADDRESS.
Indique o mesmo tipo de tabela e definição de chave que no tipo de tabela tt_address.
Na seção Inicialização e acesso, modifique o tipo de tabela de Tabela padrão para Tabela ordenada.
Na seção Síntese de chave, selecione <chave primária>.
Na seção Detalhes da chave primária, altere a Definição de chave de Chave padrão para Componentes de chave.
Na seção Componentes chave, use code completion para inserir COUNTRY e CITY como campos-chave.
Ative o tipo de tabela.
Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.
Retorne à fonte ode de sua classe global. Na implementação do método IF_OO_ADT_CLASSRUN~MAIN, substitua tt_address pelo seu novo tipo de estrutura Dictionary. Certifique-se de que não existem erros de sintaxe.
Ajuste o código da seguinte forma:
12345678910111213141516171819
* Task 1
**********************************************************************
* DATA addresses TYPE tt_addresses.
DATA addresses TYPE z##t_addresses.
addresses =
VALUE #(
( street = 'Dietmar-Hopp-Allee 16'
postal_code = '69190'
city = 'Walldorf'
country = 'DE'
)
( street = '3999 West Chester Pike'
postal_code = '19073'
city = 'Newtown Square, PA'
country = 'US'
)
).
Tarefa 2: Definir uma estrutura profunda
Em sua classe global, remova ou comente o tipo de estrutura pública st_person_deep e substitua-o por uma estrutura de dicionário (nome sugerido: Z##S_PERSON_DEEP). Para os endereços, reutilize o tipo de tabela que você já criou.
Etapas
Crie um novo objeto Dictionary do tipo Estrutura.
Na visão Explorador de projetos, expanda seu pacote e abra o menu de contexto no subnó Dicionário.
Selecione Nova→estrutura.
Confirme o pacote, insira o nome Z##S_PERSON_DEEP e a descrição Pessoa (nome e vários endereços) e, em seguida, selecione Seguinte.
Atribua o novo objeto a uma ordem de transporte e selecione Concluir.
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 first_name (nome sugerido:first_name), o sobrenome (nome sugerido: last_name).
Ajuste o código da seguinte forma:
1234567
define structure z##s_person_deep {
first_name : /dmo/first_name;
last_name : /dmo/last_name;
}
Adicione outro componente para os endereços da pessoa (nome sugerido: endereços). Como tipo, utilize o tipo de tabela que você criou na tarefa anterior.
Ajuste o código da seguinte forma:
12345678
define structure z##s_person_deep {
first_name : /dmo/first_name;
last_name : /dmo/last_name;
addresses : z##t_addresses;
}
Ative o tipo de estrutura.
Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.
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_deep.
Execute esta etapa como anteriormente.
Na implementação do método IF_OO_ADT_CLASSRUN~MAIN, substitua st_person_deep pelo seu novo tipo de estrutura Dictionary. Certifique-se de que não existem erros de sintaxe.
Ajuste o código da seguinte forma:
12345678910
* Task 2
**********************************************************************
* DATA person TYPE st_person_deep.
DATA person TYPE /lrn/s_person_deep.
person-first_name = 'Dictionary'.
person-last_name = 'ABAP'.
person-addresses = addresses.
Tarefa 3: Definir um tipo de tabela aninhada
Em sua classe global, remova ou comente o tipo de tabela pública tt_people e substitua-o por um tipo de tabela de dicionário (nome sugerido: Z##T_PERSONS). Como tipo de linha, utilize o tipo de estrutura profunda que você criou na tarefa anterior.
Etapas
Crie um novo objeto Dictionary do tipo Tipo de tabela.
Na visão Explorador de projetos, expanda seu pacote e abra o menu de contexto no subnó Dicionário.
Selecione Novo→tipo de tabela.
Confirme o pacote, insira o nome Z##T_PERSONS e a descrição Pessoas (com nome e endereços) e, em seguida, selecione Seguinte.
Atribua o novo objeto a uma ordem de transporte e selecione Concluir.
Indique seu tipo de estrutura Z##S_PERSON_DEEP como tipo de linha.
Na seção Tipo de linha, altere a Categoria de Tipo predefinido para Dicionário.
No campo Nome do tipo, insira Z##S_PERSON_DEEP.
Indique o mesmo tipo de tabela e definição de chave que no tipo de tabela tt_people.
Na seção Inicialização e acesso, modifique o tipo de tabela de Tabela padrão para Tabela hash.
Na seção Síntese de chave, selecione <chave primária>.
Na seção Detalhes da chave primária, altere a Definição de chave da chave padrão para Componentes de chave e a Categoria de chave de Não única para Única.
Na seção Componentes chave, indique os campos-chave LAST_NAME e FIRST_NAME.
Ative o tipo de tabela.
Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.
Retorne à fonte ode de sua classe global. Na PUBLIC SECTION da definição de classe, remova ou comente a definição do tipo tt_people.
Execute esta etapa como anteriormente.
Na implementação do método IF_OO_ADT_CLASSRUN~MAIN, substitua tt_people pelo seu novo tipo de tabela Dictionary. Certifique-se de que não existem erros de sintaxe.
Ajuste o código da seguinte forma:
123456789101112131415161718192021222324252627282930313233
* Task 3
**********************************************************************
* DATA persons TYPE tt_persons.
DATA persons TYPE /lrn/t_persons.
persons =
VALUE #(
( person )
(
first_name = 'CDS'
last_name = 'ABAP'
addresses =
VALUE #(
( street = 'SAP-Allee 29'
postal_code = '68789'
city = 'St.Leon-Rot'
country = 'DE'
)
( street = '35 rue d''Alsace'
postal_code = '92300'
city = 'Levallois-Perret'
country = 'FR'
)
( street = 'Bedfont Road'
postal_code = 'TW14 8HD'
city = 'Feltham'
country = 'GB'
)
)
)
).
Ative e depure a classe como um aplicativo de console. Analisar o conteúdo dos objetos de dados endereços, pessoa e pessoas.
Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.
Pressione F9 para executar a classe como aplicativo de console.