Objective
After completing this lesson, you will be able to declarar um objeto de dados estruturado.
Objetos de dados estruturados
Até agora, você utilizou variáveis simples, cada uma das quais pode armazenar uma única unidade de informação. Aqui, por exemplo, existem duas variáveis, uma para o aeroporto de partida e outra para o aeroporto de chegada.
Quando você lê um registro do banco de dados, precisa reter todas essas informações juntas. As duas variáveis no exemplo são completamente independentes umas das outras e, por isso, não são adequadas para armazenar diferentes informações relacionadas.
No ABAP, a solução é utilizar uma variável estruturada, ou uma estrutura, para abreviar.
Uma estrutura é um objeto de dados ABAP variável com um nome e um tipo estruturado.
No exemplo, o objeto de dados connection_full é uma estrutura desse tipo. Ele é subdividido em oito componentes, cada um dos quais também tem um nome e um tipo. Você pode usar tanto a estrutura como um todo como os componentes individuais. É importante ressaltar que você pode usar cada componente exatamente da mesma forma que usaria uma variável simples independente.
Existem várias possibilidades para declarar uma estrutura. Você pode definir tipos estruturados com a palavra-chave TYPES ou utilizar um objeto do repositório do tipo Estrutura. As definições de visões e tabelas de banco de dados também podem servir como tipos estruturados. O exemplo utiliza a visão CDS /DMO/I_Connection como um tipo estruturado.
Na perspectiva do depurador, existem duas formas de analisar a estrutura e o conteúdo de uma variável estruturada:
- Visualização de variável (Mouse-Over)
Defina o foco no editor de código-fonte e coloque o ponteiro em um nome de variável. Após um momento, é aberta uma janela de diálogo com detalhes sobre a estrutura e o conteúdo do objeto de dados.
- Exibir na visão de variáveis (clique duplo)
Para exibir a variável na visão Variáveis, insira o nome da variável em <Inserir variável> ou clique duas vezes no nome da variável em algum lugar no editor do texto fonte. Expanda o nó com o nome da estrutura para ver a lista de componentes.
Como analisar objetos de dados estruturados usando a perspectiva de depuração
Tipos de dados estruturados
Um tipo de estrutura global é um objeto do repositório que pode ser utilizado como tipo de dados em qualquer lugar no sistema. No exemplo, o tipo estruturado SYMSG é usado para declarar mensagem variável.
Quando você pressiona a tecla F2 para exibir os detalhes desse tipo de dados, pode ver que este é um tipo de estrutura composto por sete componentes. Você também pode ver os nomes, tipos técnicos e descrições dos componentes.
Quando você pressiona a tecla F3 para navegar para a definição do tipo, é aberta uma nova visão com o editor ADT para tipos estruturados globais.
A definição de um tipo de estrutura global é muito semelhante à definição de uma tabela de banco de dados. A parte principal da definição é composta por uma instrução DEFINE STRUCTURE com o nome do tipo de estrutura. Isso é seguido pela lista de componentes de estrutura em um par de chaves ( { , } ); cada componente com um tipo de componente. Os tipos de componente são frequentemente descritos por elementos de dados, mas também é possível utilizar tipos de estrutura como tipos de componente. As estruturas com componentes estruturados são referidas como Estruturas embutidas.
As linhas de código adicionais antes da instrução DEFINE STRUCTURE indicam características adicionais do tipo de estrutura, entre elas uma etiqueta.
Também é possível definir tipos estruturados em um programa ABAP utilizando a instrução TYPES. A definição da estrutura começa com a instrução TYPES BEGIN OF <nome do tipo de estrutura> e termina com TYPES END OF <nome do tipo de estrutura>. No meio, você nomeia cada componente e indica o respectivo tipo em uma instrução TYPES adicional.
Uma forma compacta utiliza a palavra-chave TYPES somente uma vez, seguida por dois pontos ( : ). O suplemento BEGIN OF, o suplemento END OF e as definições de componente no meio são separados por vírgulas.
Isso é referido como instrução de cadeia.
Nota
No passado, as instruções de cadeia eram muito utilizadas no ABAP. Hoje em dia, eles só são recomendados para combinar declarações que pertencem estreitamente juntas.
Neste exemplo, uma instrução de cadeia TYPES: é utilizada para definir o tipo estruturado local st_connection que consiste nos três componentes airport_from_id, airport_to_id e carrier_name. Cada componente é tipificado com um elemento de dados que começa com /dmo/.
O tipo estruturado local st_connection é então utilizado em uma instrução DATA para digitar a conexão de variável estruturada.
Neste exemplo, a variável connection tem um tipo estruturado aninhado. O tipo st_nested define 4 componentes. Três são tipificados com elementos de dados, portanto, são componentes simples. No entanto, o componente message é tipificado com um tipo estruturado. Por isso, é um componente estruturado. Isso torna a variável connection uma estrutura embutida.
O ABAP suporta não só variáveis estruturadas, mas também constantes estruturadas. Para definir uma constante estruturada, utilize BEGIN OF e END OF como parte de uma instrução CONSTANTS. O exemplo exibe uma constante estruturada que é definida na seção pública da classe global CL_ABAP_BEHV. Todos os cinco componentes são tipificados com o elemento de dados SECKEYNAME. Lembre-se de que a adição VALUE é obrigatória ao definir constantes.
Testar: tipos de dados estruturados
- 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( ):
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
* Example 1 : Motivation for Structured Variables
**********************************************************************
DATA connection_full TYPE /DMO/I_Connection.
SELECT SINGLE
FROM /dmo/I_Connection
FIELDS AirlineID, ConnectionID, DepartureAirport, DestinationAirport,
DepartureTime, ArrivalTime, Distance, DistanceUnit
WHERE AirlineId = 'LH'
AND ConnectionId = '0400'
INTO @connection_full.
out->write( `--------------------------------------` ).
out->write( `Example 1: CDS View as Structured Type` ).
out->write( connection_full ).
* Example 2: Global Structured Type
**********************************************************************
DATA message TYPE symsg.
out->write( `---------------------------------` ).
out->write( `Example 2: Global Structured Type` ).
out->write( message ).
* Example 3 : Local Structured Type
**********************************************************************
TYPES: BEGIN OF st_connection,
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.
DATA connection TYPE st_connection.
SELECT SINGLE
FROM /DMO/I_Connection
FIELDS DepartureAirport, DestinationAirport, \_Airline-Name
WHERE AirlineID = 'LH'
AND ConnectionID = '0400'
INTO @connection.
out->write( `---------------------------------------` ).
out->write( `Example 3: Local Structured Type` ).
out->write( connection ).
* Example 4 : Nested Structured Type
**********************************************************************
TYPES: BEGIN OF st_nested,
airport_from_id TYPE /dmo/airport_from_id,
airport_to_id TYPE /dmo/airport_to_id,
message TYPE symsg,
carrier_name TYPE /dmo/carrier_name,
END OF st_nested.
DATA connection_nested TYPE st_nested.
out->write( `---------------------------------` ).
out->write( `Example 4: Nested Structured Type` ).
out->write( connection_nested ).
- Pressione CTRL + F3 para ativar a classe e F9 para executar o aplicativo de console.
- Analise a saída do console. Depurar o programa, brincar com o código-fonte para se familiarizar com os conceitos.