SAP ABAP - Preenchendo Tabelas Internas

Em tabelas internas, o preenchimento inclui recursos como seleção, inserção e acréscimo. Este capítulo enfoca as instruções INSERT e APPEND.

Instrução INSERT

A instrução INSERT é usada para inserir uma única linha ou um grupo de linhas em uma tabela interna.

A seguir está a sintaxe para adicionar uma única linha a uma tabela interna -

INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.

Nesta sintaxe, a instrução INSERT insere uma nova linha na tabela interna internal_tab. Uma nova linha pode ser inserida usando a expressão work_area_itab INTO antes do parâmetro internal_tab. Quando a expressão work_area_itab INTO é usada, a nova linha é obtida da área de trabalho work_area_itab e inserida na tabela internal_tab. No entanto, quando a expressão work_area_itab INTO não é usada para inserir uma linha, a linha é retirada da linha de cabeçalho da tabela internal_tab.

Quando uma nova linha é inserida em uma tabela interna usando a cláusula INDEX, o número de índice das linhas após a linha inserida é incrementado em 1. Se uma tabela interna contém <index_num> -1 linhas, a nova linha é adicionada no fim da mesa. Quando o sistema SAP adiciona com sucesso uma linha a uma tabela interna, a variável SY-SUBRC é definida como 0.

Exemplo

A seguir está um programa de exemplo que usa a instrução insert.

REPORT  ZCUSLIST1. 
DATA: BEGIN OF itable1 OCCURS 4,
      F1 LIKE SY-INDEX,
      END OF itable1.
	
   DO 4 TIMES.
      itable1-F1 = sy-index.
      APPEND itable1.
   ENDDO.
	
itable1-F1 = -96.  
INSERT itable1 INDEX 2.  

LOOP AT itable1.
   Write / itable1-F1.  
ENDLOOP.  

LOOP AT itable1 Where F1 ≥ 3.
   itable1-F1 = -78.
   INSERT itable1.
ENDLOOP.

Skip.
LOOP AT itable1.
   Write / itable1-F1.
ENDLOOP.

O código acima produz o seguinte outp -

1 
96- 
		2 
		3 
 4  
		1 
96- 
		2 
78- 
 3 
78- 
 4

No exemplo acima, o loop DO anexa 4 linhas contendo os números de 1 a 4 a ele. O componente itable1-F1 da linha de cabeçalho recebeu o valor -96. A instrução Insert insere a linha de cabeçalho como uma nova linha no corpo antes da linha 3. A linha 3 existente torna-se a linha 4 após a inserção. A instrução LOOP AT recupera as linhas da tabela interna que têm um valor F1 maior ou igual a 3. Antes de cada linha, a instrução Insert insere uma nova linha da linha de cabeçalho dela. Antes da inserção, o componente F1 foi alterado para conter -78.

Depois que cada instrução de inserção é executada, o sistema reindexa todas as linhas abaixo da inserida. Isso introduz uma sobrecarga quando você insere linhas perto do topo de uma grande mesa interna. Se você precisar inserir um bloco de linhas em uma grande tabela interna, prepare outra tabela com as linhas a serem inseridas e use inserir linhas em seu lugar.

Ao inserir uma nova linha dentro de itable1 dentro de um loop em itable1, isso não afeta a tabela interna instantaneamente. Na verdade, torna-se efetivo na próxima passagem do loop. Ao inserir uma linha após a linha atual, a tabela é reindexada no ENDLOOP. O sy-tabix é incrementado e o próximo loop processa a linha apontada por sy-tabix. Por exemplo, se você estiver na segunda passagem de loop e inserir um registro antes da linha 3. Quando o endloop é executado, a nova linha se torna a linha 3 e a antiga linha 3 se torna a linha 4 e assim por diante. Sy-tabix é incrementado em 1, e a próxima passagem de loop processa o registro recém-inserido.

Declaração APPEND

A instrução APPEND é usada para adicionar uma única linha ou linha a uma tabela interna existente. Esta instrução copia uma única linha de uma área de trabalho e a insere após a última linha existente em uma tabela interna. A área de trabalho pode ser uma linha de cabeçalho ou qualquer outra string de campo com a mesma estrutura de uma linha de uma tabela interna. A seguir está a sintaxe da instrução APPEND que é usada para anexar uma única linha em uma tabela interna -

APPEND <record_for_itab> TO <internal_tab>.

Nesta sintaxe, a expressão <record_for_itab> pode ser representada pela área de trabalho <work_area_itab>, que pode ser convertida em um tipo de linha, ou pela cláusula INITIAL LINE. Se o usuário usar uma área de trabalho <work_area_itab>, o sistema SAP adiciona uma nova linha à tabela interna <internal_tab> e a preenche com o conteúdo da área de trabalho. A cláusula INITIAL LINE anexa uma linha em branco que contém o valor inicial para cada campo da estrutura da tabela. Após cada instrução APPEND, a variável SY-TABIX contém o número do índice da linha anexada.

Anexar linhas a tabelas padrão e classificadas com uma chave não exclusiva funciona independentemente de as linhas com a mesma chave já existirem na tabela. Em outras palavras, podem ocorrer entradas duplicadas. No entanto, um erro de tempo de execução ocorre se o usuário tentar adicionar uma entrada duplicada a uma tabela classificada com uma chave exclusiva ou se o usuário violar a ordem de classificação de uma tabela classificada anexando as linhas a ela.

Exemplo

REPORT  ZCUSLIST1. 
DATA: BEGIN OF linv Occurs 0,
      Name(20) TYPE C,
      ID_Number TYPE I,
END OF linv. 

DATA table1 LIKE TABLE OF linv. 
linv-Name = 'Melissa'. 
linv-ID_Number = 105467. 
APPEND linv TO table1. 
LOOP AT table1 INTO linv. 

Write: / linv-name, linv-ID_Number. 
ENDLOOP.

O código acima produz a seguinte saída -

Melissa		105467