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.

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
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.
- Tabelas internas com linha HEADER
- 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.

