Objective
After completing this lesson, you will be able to declare uma tabela interna complexa.
Propriedades de tabelas internas complexas
As tabelas internas que usamos até agora tinham um tipo de dados escalar como tipo de linha. No exemplo mostrado nas figuras aqui, o tipo de linha dos números de tabela interna é o tipo de integração ABAP I.
Referimo-nos a esses tipos de tabelas internas como tabelas internas simples.
Falamos de uma tabela interna complexa se o tipo de linha for um tipo de dados estruturado.
Enquanto uma tabela interna simples só tem uma coluna sem nome, uma tabela interna complexa é composta por várias colunas, cada uma com o nome e o tipo do componente correspondente da categoria de linha estruturada. No exemplo, o tipo de linha da tabela interna connections é um tipo estruturado com cinco componentes: carrier_id, connection_id, airport_from_id, airport_to_id e carrier_name. Consequentemente, a tabela interna connections tem cinco colunas com esses nomes.
Nota
As colunas nos exemplos nas figuras Lembrete: Tabelas internas simples e Tabelas internas com tipo de linha estruturada têm tipos escalares. Geralmente, uma coluna de uma tabela interna também pode ser do tipo estruturado ou até ter um tipo de tabela. No último caso, falamos de uma tabela interna aninhada.
Até agora, abordamos as linhas de uma tabela interna pela respectiva posição. Isso é chamado de acesso por índice.
Com as colunas nomeadas de uma tabela interna complexa, o acesso por chave se torna mais importante. Acesso por chave significa abordar uma linha da tabela interna procurando valores específicos em colunas específicas. As colunas nas quais você pesquisa podem ser quaisquer colunas da tabela interna.
O acesso por índice a uma tabela interna é sempre muito rápido, mesmo que a tabela interna contenha muitas linhas. No entanto, o acesso por chave pode ficar muito lento se a tabela contiver muitas linhas. A seleção do tipo de acesso correto para a tabela interna pode melhorar a performance de um acesso por chave.
Toda tabela interna tem um dos três tipos de acesso. O tipo de acesso determina como os dados são armazenados na tabela e, com base nisso, como o sistema lê a tabela para recuperar os dados.
Os diferentes tipos de tabelas são os seguintes:
- Tabela padrão
- Em uma tabela padrão, o conteúdo não é armazenado em uma ordem de classificação específica. Por padrão, novos registros são acrescentados no fim da tabela. Para recuperar dados por chave, o sistema deve lê-los sequencialmente, o que pode levar a tempos de recuperação longos se a tabela for muito grande. As tabelas internas simples que usamos até o momento eram tabelas padrão.
- Tabela ordenada
- Em uma tabela ordenada, o conteúdo da tabela é sempre ordenado de acordo com os campos-chave em ordem crescente. Quando você insere um novo registro na tabela, o sistema garante que ele seja colocado na posição correta. Como os dados são sempre ordenados, o sistema pode recuperar registros de forma mais eficiente do que a partir de uma tabela padrão (desde que você siga determinadas regras).
- Tabela hash
- As tabelas hash são gerenciadas usando um algoritmo hash especial. Isso garante que o sistema possa recuperar registros muito rapidamente, mesmo se a tabela for extremamente grande. No entanto, esse ganho de performance só funciona em casos muito específicos.
Toda tabela interna tem uma chave. Em tabelas padrão, a chave não desempenha uma função particularmente significativa. Para tabelas hash e ordenadas, a chave é muito importante já que determina a forma como os dados serão gerenciados na tabela. Crucialmente, as tabelas ordenadas e hash só são mais rápidas para o acesso por chave que aborda todos ou pelo menos um subconjunto dos campos-chave.
Um outro atributo da chave de tabela é a sua unicidade. Em alguns momentos você pode querer permitir entradas duplicadas em uma tabela interna e, às vezes, você pode desejar que a chave seja exclusiva. Aqui, as seguintes regras se aplicam:
- Duplicados são sempre permitidos em tabelas padrão
- Duplicados nunca são permitidos em tabelas hash
- Para uma tabela ordenada, você seleciona na definição se a chave deve ser única ou não única.
Nota
Tabelas internas também podem ter chaves secundárias. As chaves secundárias são uma forma de melhorar a performance de acessos por chave a tabelas internas que usam diferentes combinações de campos. Você encontrará mais informações sobre chaves secundárias na documentação de sintaxe ABAP.
Tipos de tabela complexos
Assista a este vídeo para ver alguns exemplos para a declaração de tabelas internas complexas.
Além disso, é um bom estilo de programação definir o tipo de dados primeiro e, em seguida, criar uma variável que se refira ao tipo.
Em vez de indicar o tipo de acesso e a chave de uma tabela interna na instrução DATA, você deve usar um tipo de tabela nomeado. Se você precisar do tipo de tabela somente localmente em um método ou em conexão com uma determinada classe, pode definir o mesmo usando a instrução TYPES.
O exemplo define primeiro um tipo estruturado st_connection. Com este tipo estruturado como tipo de linha, ele define o tipo de tabela tt_connection. Por fim, a declaração da tabela interna connections_5 se refere ao tipo de tabela.
Se você precisar do tipo de tabela globalmente, pode utilizar um tipo de tabela global.
Um tipo de tabela global é um objeto do repositório que pode ser usado como tipo de dados em qualquer lugar no sistema. O ADT fornece um editor dedicado para esse tipo de objeto do repositório. A ferramenta consiste nos seguintes quadros:
O vídeo a seguir mostra como definir tipos de tabela localmente.
Testar: tipos de tabela complexos
- Como no primeiro exercício deste curso, crie uma nova classe global que implemente a interface IF_OO_ADT_CLASSRUN.
- Copie o seguinte snippet de código para a parte de implementação do método if_oo_adt_classrun~main( ):
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
TYPES: BEGIN OF st_connection,
carrier_id TYPE /dmo/carrier_id,
connection_id TYPE /dmo/connection_id,
airport_from_id TYPE /dmo/airport_from_id,
airport_to_id TYPE /dmo/airport_to_id,
carrier_name TYPE /dmo/carrier_name,
END OF st_connection.
* Example 1 : Simple and Complex Internal Table
**********************************************************************
" simple table (scalar row type)
DATA numbers TYPE TABLE OF i.
" complex table (structured row type)
DATA connections TYPE TABLE OF st_connection.
out->write( `--------------------------------------------` ).
out->write( `Example 1: Simple and Complex Internal Table` ).
out->write( data = numbers
name = `Simple Table NUMBERS:`).
out->write( data = connections
name = `Complex Table CONNECTIONS:`).
* Example 2 : Complex Internal Tables
**********************************************************************
" standard table with non-unique standard key (short form)
DATA connections_1 TYPE TABLE OF st_connection.
" standard table with non-unique standard key (explicit form)
DATA connections_2 TYPE STANDARD TABLE OF st_connection
WITH NON-UNIQUE DEFAULT KEY.
" sorted table with non-unique explicit key
DATA connections_3 TYPE SORTED TABLE OF st_connection
WITH NON-UNIQUE KEY airport_from_id
airport_to_id.
" sorted hashed with unique explicit key
DATA connections_4 TYPE HASHED TABLE OF st_connection
WITH UNIQUE KEY carrier_id
connection_id.
* Example 3 : Local Table Type
**********************************************************************
TYPES tt_connections TYPE SORTED TABLE OF st_connection
WITH UNIQUE KEY carrier_id
connection_id.
DATA connections_5 TYPE tt_connections.
* Example 4 : Global Table Type
**********************************************************************
DATA flights TYPE /dmo/t_flight.
out->write( `------------------------------------------` ).
out->write( `Example 4: Global Table TYpe /DMO/T_FLIGHT` ).
out->write( data = flights
name = `Internal Table FLIGHTS:` ).
- Pressione CTRL + F3 no teclado para ativar a classe e F9 para executar o aplicativo do console.
- Analise a saída do console. Depurar o programa, brincar com o código-fonte para se familiarizar com os conceitos.