SAP Tabela interna ABAP: criar, ler, preencher, copiar e excluir
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.
O que é uma área de trabalho?
As áreas de trabalho são linhas únicas de dados. Elas devem ter o mesmo formato de qualquer uma das tabelas internas. É usado para processar os dados de uma tabela interna, uma linha por vez.
Diferença entre tabela interna e área de trabalho?
Uma imagem diz mil palavras
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.
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 o Instrução TIPO.
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 consultando uma tabela existente. A tabela existente poderia ser um 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 é criada uma tabela itab com uma estrutura igual à de 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
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'
Linhas iniciais adiciona à tabela uma linha inicializada com o valor correto para seu tipo. Aqui, col1 é um caractere e col2 é um número inteiro. Em seguida, APPEND linha inicial, adiciona uma linha inicializada em relação ao 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 INITIAL LINE é inserido na tabela interna no índice .
Copiando tabelas internas
O conteúdo de uma tabela interna pode ser copiado para outra usando a instrução APPEND LINES ou INSERT LINES. 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
Agora estamos familiarizados com a criação de tabelas internas e seu preenchimento com dados. Veremos agora como realmente usamos os dados ou recuperamos os 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 ou linha atual conforme especificado 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 em tempo de execução. Se o índice especificado exceder o tamanho da tabela, SY-SUBRC será definido como 4.
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.