SAP Tabela interna ABAP: criar, ler, preencher, copiar e excluir

โšก Resumo Inteligente

SAP Os objetos de tabela interna ABAP armazenam dados de uma estrutura fixa para uso dinรขmico dentro de um programa. Esta pรกgina explica รกreas de trabalho, linhas de cabeรงalho, os quatro mรฉtodos de criaรงรฃo e as instruรงรตes que preenchem, copiam, leem e excluem linhas da tabela.

  • ๐Ÿ“‹ Definiรงรฃo Essencial: Uma tabela interna armazena linhas de estrutura idรชntica na memรณria principal, geralmente para formatar dados lidos de uma tabela de banco de dados.
  • ๐Ÿงพ Funรงรฃo na รกrea de trabalho: Uma รกrea de trabalho รฉ uma รบnica linha com o mesmo formato da tabela e processa a tabela linha por linha.
  • ๐Ÿท๏ธ Linha de cabeรงalho: Uma tabela com uma linha de cabeรงalho recebe uma รกrea de trabalho implรญcita, permitindo que linhas sejam inseridas ou lidas diretamente sem a necessidade de nomeรก-la.
  • ๐Ÿ› ๏ธ Quatro mรฉtodos de criaรงรฃo: Declaraรงรฃo TYPES, referรชncia a uma tabela existente, referรชncia a uma estrutura existente ou uma nova estrutura declarada com OCCURS.
  • โž• Populaรงรฃo: APPEND adiciona uma linha, COLLECT agrega campos numรฉricos para uma chave duplicada e INSERT coloca uma linha em um รญndice escolhido.
  • ๐Ÿ” Leia e copie: LOOP AT lรช todas as linhas, READ TABLE lรช uma linha por รญndice e MOVE ou o sinal de igual copia a tabela inteira.
  • ๐Ÿ—‘๏ธ Excluir: DELETE dentro de um LOOP remove a linha atual, e DELETE โ€ฆ INDEX remove a linha em uma posiรงรฃo conhecida.

SAP Tabelas internas ABAP

O que รฉ uma tabela interna?

TABELA INTERNA sรฃo usados โ€‹โ€‹para obter dados de uma estrutura fixa para uso dinรขmico em ABAP. Cada linha da tabela interna possui a mesma estrutura de campos. O principal uso das tabelas internas รฉ armazenar e formatar dados de uma tabela de banco de dados dentro de um programa.

Uma mesa interna sempre funciona em conjunto com uma รกrea de trabalho, entรฃo esse conceito vem a seguir.

O que รฉ uma รกrea de trabalho?

As รกreas de trabalho sรฃo linhas individuais de dados. Elas devem ter o mesmo formato que as tabelas internas. Sรฃo usadas para processar os dados de uma tabela interna, uma linha por vez.

Qual a diferenรงa entre uma mesa interna e uma รกrea de trabalho?

Uma imagem diz mil palavras

Diferenรงa entre tabela interna e รกrea de trabalho

O diagrama mostra a tabela contendo vรกrias linhas, enquanto a รกrea de trabalho contรฉm apenas a linha que estรก sendo processada no momento. Se essa รกrea de trabalho รฉ criada pelo sistema ou pelo desenvolvedor depende do tipo de tabela descrito abaixo.

Tipos de tabelas internas

Existem dois tipos de tabelas internas.

  1. Tabelas internas com linha HEADER
  2. Tabelas internas sem linha HEADER.

Tabelas Internas com Linha de Cabeรงalho

  • Aqui o sistema cria automaticamente a รกrea de trabalho.
  • A รกrea de trabalho possui o mesmo tipo de dados da tabela interna.
  • Esta รกrea de trabalho รฉ chamada de linha HEADER.
  • ร‰ aqui que sรฃo feitas todas as alteraรงรตes ou qualquer aรงรฃo no conteรบdo da tabela. Como resultado disso, os registros podem ser inseridos diretamente na tabela ou acessados โ€‹โ€‹diretamente da tabela interna.

Tabelas Internas sem Linha de Cabeรงalho :

  • Aqui nรฃo hรก รกrea de trabalho associada ร  mesa.
  • A รกrea de trabalho deve ser especificada explicitamente quando precisarmos acessar tais tabelas.
  • Portanto, essas tabelas nรฃo podem ser acessadas diretamente.

๐Ÿ’ก Dica: Uma tabela com linha de cabeรงalho possui o mesmo nome tanto para a tabela quanto para sua รกrea de trabalho, o que torna o cรณdigo ambรญguo. Novos programas devem declarar uma tabela sem linha de cabeรงalho e passar uma รกrea de trabalho explรญcita.

Tabelas internas padrรฃo, classificadas e com hash

Alรฉm da distinรงรฃo na linha de cabeรงalho, cada tabela interna tambรฉm possui um tipo de tabela que define como uma linha รฉ encontrada. O tipo รฉ escolhido com a adiรงรฃo de TYPE STANDARD TABLE, TYPE SORTED TABLE ou TYPE HASHED TABLE, e tem um efeito direto no tempo de execuรงรฃo.

Tipo de mesa Mรฉtodo de acesso Chave Melhor usado para
Padrรฃo รndice e chave, com busca linear pela chave. Nรฃo รบnico Processamento sequencial e leitura de tabelas pequenas com รญndice.
Sorted รndice e chave, com busca binรกria na chave. รšnicos ou nรฃo รบnicos, mantidos classificados automaticamente Tabelas maiores sรฃo lidas repetidamente pelos campos principais.
Hashed Somente a chave, com um algoritmo de hash. รšnico Tabelas muito grandes que sรฃo sempre lidas pela chave completa, como um buffer de registros de banco de dados.

Uma tabela padrรฃo รฉ o padrรฃo e adequada para processamento sequencial. Uma tabela hash mantรฉm o tempo de acesso constante, independentemente do nรบmero de linhas armazenadas, razรฃo pela qual as regras de desempenho de Abra o SQL Recomendo para armazenamento temporรกrio de registros.

Criando tabelas internas

Existem muitas maneiras de criar uma tabela interna. Vamos examinรก-los um por um

1. Usando a instruรงรฃo de tipo

Vamos agora criar uma tabela interna, itab, usando a instruรงรฃo TYPE.

A sintaxe รฉ โ€“

Types : begin of line,

column1 type I,

column2 type I,

end of line.

Exemplo:

TYPES : begin of line,

empno		type I,

empname(20)   	type c	,

end of line.

A instruรงรฃo TYPES cria uma linha de estrutura conforme definido.

Para realmente criar um itab de tabela interna, use o seguinte comando-

Data itab type line occurs 10.

Uma tabela interna itab รฉ criada com a estrutura de linha. Alรฉm de declarar a estrutura de uma tabela interna, a clรกusula OCCURS tambรฉm define quantas entradas da tabela sรฃo mantidas no armazenamento principal (neste caso 10). Registros extras sรฃo gravados na รกrea de paginaรงรฃo e podem afetar o desempenho

2. Referindo-se a outra Tabela

Vocรช pode criar uma tabela interna fazendo referรชncia a uma tabela existente. A tabela existente pode ser uma tabela padrรฃo. SAP tabela, uma tabela Z ou outra tabela interna.

Sintaxe-

Data <f> <type> [with header line].

Exemplo-

DATA itab TYPE line OCCURS 10 with header line.

Aqui uma tabela interna itab รฉ criada do tipo line com uma linha de cabeรงalho. Observe que โ€œcom linha de cabeรงalhoโ€ รฉ opcional.

3. Referindo-se ร  estrutura existente

Sintaxe-

Data	<f> LIKE <struct> occurs n [with header line].

Exemplo-

DATA itab LIKE sline OCCURS 10.

Aqui, uma tabela itab รฉ criada com a mesma estrutura da tabela sline.

4.Ao criar uma nova estrutura

Vamos agora criar uma tabela interna com estrutura prรณpria. Aqui a tabela รฉ criada com uma linha de cabeรงalho, por padrรฃo.

Sintaxe -

Data : Begin of <f> occurs <n>,

<component declaration>,

................................,

End of <f>.

Exemplo -

Data : Begin of itab occurs 10,

column1       type I,

column2(4)  type C,

column3      like  mara-ernam,

End of itab.

A tabela interna itab รฉ criada

Uma tabela vazia รฉ de pouca utilidade, portanto, a prรณxima seรงรฃo a preenche com linhas.

Preenchendo tabelas internas

Agora que criamos com sucesso algumas tabelas internas, vamos ver como as preenchemos com alguns registros. Existem vรกrios mรฉtodos disponรญveis para preencher tabelas

1.Anexar dados linha por linha

O primeiro mรฉtodo disponรญvel รฉ o uso da instruรงรฃo APPEND.

Usando a instruรงรฃo APPEND podemos adicionar uma linha de outra รกrea de trabalho ร  tabela interna ou podemos adicionar uma linha inicial ร  tabela interna.

Sintaxe -

APPEND [<wa> TO / INITIAL LINE TO] <itable>.

Aqui รกrea de trabalho ou a linha inicial รฉ anexada ร  tabela interna .

A variรกvel de sistema SY-TABIX contรฉm o รญndice da linha anexada.

Exemplo:

Data: Begin of itab occurs 10,

col1 type C,

col2 type I,

end of itab.

Append initial line to itab.

Resultados: ' ' '0'

A instruรงรฃo `initial lines` adiciona uma linha inicializada com o valor correto para o tipo de dados da coluna ร  tabela. Aqui, `col1` รฉ um caractere e `col2` รฉ um inteiro. Em seguida, `APEND initial line` adiciona uma linha inicializada de acordo com o tipo de dados das colunas, ou seja, espaรงo para `col1` e 0 para `col2`.

2. Usando a instruรงรฃo COLLECT

COLLECT รฉ outra forma de instruรงรฃo usada para preencher as tabelas internas. Geralmente COLLECT รฉ usado ao inserir linhas em uma tabela interna com chave padrรฃo exclusiva.

Sintaxe-

COLLECT [<wa> INTO] <itable>.

No caso de tabelas com linha de cabeรงalho, a opรงรฃo INTO รฉ omitida. Suponha que jรก exista uma entrada com uma chave igual ร quela que vocรช estรก tentando anexar, entรฃo uma nova linha nรฃo รฉ adicionada ร  tabela, mas os campos numรฉricos de ambas as entradas sรฃo adicionados e apenas uma entrada correspondente ร  chave estรก presente . O valor de SY-TABIX รฉ alterado para a linha da entrada original. Caso contrรกrio, COLLECT age de forma semelhante a APPEND e SY-TABIX contรฉm o รญndice da linha processada.

3. Usando a instruรงรฃo INSERT

A instruรงรฃo INSERT adiciona uma linha/รกrea de trabalho ร  tabela interna. Vocรช pode especificar a posiรงรฃo na qual a nova linha serรก adicionada usando a clรกusula INDEX com a instruรงรฃo INSERT.

Sintaxe

INSERT [<wa> INTO / INITIAL LINE INTO] <itable> [index <idx>].

Aqui, a รกrea de trabalho ou INICIAL LINE รฉ inserido em uma tabela interna no รญndice .

Copiando tabelas internas

O conteรบdo de uma tabela interna pode ser copiado para outra usando o comando APPEND. LINES ou INSERIR LINEDeclaraรงรฃo S. Uma maneira mais simples รฉ usar qualquer uma das seguintes sintaxes.

MOVE  <itab1> To <itab2>.

OR

<itab1> = <itab2>.

Estes copiam o conteรบdo de ITAB1 para ITAB2. No caso de tabelas internas com linha de cabeรงalho temos que usar [] para distinguir da รกrea de trabalho. Entรฃo, para copiar o conteรบdo de tabelas internas com linha de cabeรงalho a sintaxe se torna,

itab1[] = itab2[].

Ler tabelas internas

Jรก estamos familiarizados com a criaรงรฃo de tabelas internas e com o preenchimento delas com dados. Agora veremos como usar ou recuperar dados das tabelas internas.

1. Usando Loop-Endloop

Uma das formas de acessar ou ler a tabela interna รฉ utilizando LOOP-ENDLOOP.

Sintaxe

LOOP AT <itable> [INTO <wa>]

...................................

ENDLOOP.

Aqui, quando vocรช diz LOOP AT ITABLE, a tabela interna ITABLE รฉ lida linha por linha. Vocรช pode acessar os valores das colunas dessa linha durante qualquer parte da estrutura LOOP-ENDLOOP. O valor do SY-SUBRC รฉ definido como 0, mesmo que apenas um registro seja lido.

2. Usando LER

O outro mรฉtodo de leitura da tabela interna รฉ usando a instruรงรฃo READ.

Sintaxe-

READ TABLE <itable> [INTO <wa>] INDEX <idx>.

Esta instruรงรฃo lรช a linha atual ou a linha especificada pelo รญndice. O valor de SY-TABIX รฉ o รญndice da linha lida. Se uma entrada com o รญndice especificado for encontrada, SY-SUBRC serรก definido como 0. Se o รญndice especificado for menor que 0, ocorrerรก um erro de tempo de execuรงรฃo. Se o รญndice especificado exceder o tamanho da tabela, SY-SUBRC serรก definido como 4.

โš ๏ธ Aviso: A instruรงรฃo READ TABLE โ€ฆ INDEX 0 gera um erro de tempo de execuรงรฃo, portanto, um รญndice calculado em tempo de execuรงรฃo deve ser verificado antes da execuรงรฃo da instruรงรฃo.

Excluindo tabelas internas

Existem muitas maneiras de excluir linhas de uma tabela interna.

1.Excluindo linhas em um loop.

Esta รฉ a maneira mais simples de excluir linhas.

Sintaxe

DELETE <ITABLE>.

Esta instruรงรฃo funciona apenas dentro de um loop. Exclui a linha atual. Vocรช pode excluir as linhas em um loop condicionalmente adicionando o Clรกusula WHERE.

2.Excluindo linhas usando o รญndice.

Isso รฉ usado para excluir uma linha da tabela interna em qualquer รญndice conhecido.

Sintaxe

DELETE <ITABLE> INDEX <IDX>.

A linha com o รญndice esta deletado. O รญndice da linha a seguir รฉ decrementado em 1.

3. Eliminar linhas duplicadas.

As linhas duplicadas sรฃo removidas apรณs a tabela ser classificada pelos campos-chave.

SORT itab BY col1.

DELETE ADJACENT DUPLICATES FROM itab COMPARING col1.

Apenas as linhas adjacentes sรฃo comparadas, por isso a instruรงรฃo SORT precisa ser executada primeiro. Para esvaziar completamente a tabela, use CLEAR itab[] ou REFRESH itab.

Perguntas Frequentes

CLEAR itab limpa apenas a linha de cabeรงalho, e CLEAR itab[] limpa o corpo. REFRESH sempre limpa o corpo, mas mantรฉm a memรณria reservada. FREE limpa o corpo e libera a memรณria tambรฉm.

SY-TABIX armazena o nรบmero da linha da tabela interna que estรก sendo processada no momento. SY-INDEX armazena o nรบmero da iteraรงรฃo de um loop DO ou WHILE. Uma tabela hash deixa SY-TABIX em zero, pois nรฃo possui รญndice.

O comando LOOP AT itab, ao atribuir um sรญmbolo de campo, evita copiar todas as linhas para uma รกrea de trabalho, o que acelera a execuรงรฃo em tabelas grandes e permite que a linha seja alterada diretamente, sem a necessidade de uma instruรงรฃo MODIFY.

Sim. Os assistentes de IA nas ferramentas de desenvolvimento ABAP reescrevem as declaraรงรตes OCCURS e de linha de cabeรงalho em TYPE STANDARD TABLE OF com uma รกrea de trabalho explรญcita e sinalizam as instruรงรตes que falham quando a linha de cabeรงalho desaparece.

Os consultores de desempenho de IA inspecionam como uma tabela รฉ preenchida e lida e, em seguida, recomendam uma tabela classificada ou com hash quando uma pesquisa linear domina o tempo de execuรงรฃo. A recomendaรงรฃo รฉ confirmada com um trace na transaรงรฃo SAT.

Resuma esta postagem com: