Programowanie ABAP – pętla LOOP…ENDLOOP (1)
W poprzednim wpisie używaliśmy SELECT do pobierania danych z tabeli MARA do naszej wewnętrznej tabeli lt_mara – jeżeli chcielibyśmy wyświetlić dane z naszej tabeli wewnętrznej za pomocą WRITE to niestety system zwróci nam błąd syntetyczny, ponieważ może być więcej niż jeden rekord – do tego celu użyjemy pętli LOOP.
Pętla to jedna z tych konstrukcji bez której nie da się żyć w programowaniu, dzisiaj skupię się na pętli LOOP….ENDLOOP dzięki której możemy odczytać wszystkie rekordy z tabeli wewnętrznej.
Sama konstrukcja jest prosta, bo zaczyna się zawsze od LOOP AT później wstawiamy nazwę tabeli wewnętrznej i kończymy zawsze ENDLOOP. Jeżeli tabela wewnętzna nie ma w definicji nagłówka to musimy jeszcze wspomóc się obszarem roboczym do którego pętla będzie kopiować dane. Zrobię 2 przykłady żeby pokazać jak to będzie wyglądać:
Przykład 1 – tabela wewnętrzna bez definicji nagłówka:
DATA: wa_mara TYPE mara, ”Obszar roboczy
lt_mara TYPE TABLE OF mara. ”Tabela lokalnaSELECT-OPTIONS: material FOR wa_mara-matnr.
SELECT * FROM mara INTO TABLE lt_mara
WHERE matnr IN material.LOOP AT lt_mara INTO wa_mara.
WRITE:/ wa_mara-matnr, wa_mara-mtart.
ENDLOOP.
Czyli dla definicji tabeli bez nagłówka, musimy użyć dodatkowo INTO ‘obszar roboczy’, za pomocą którego wyświetlimy dane na ekranie. Zauważcie że do funkcji WRITE używamy obszaru roboczego wa_mara, do którego kopiowane są dane z pętli.
Przykład 2 – tabela wewnętrzna z definicją nagłówka:
TABLES: mara.
DATA: lt_mara TYPE TABLE OF mara WITH HEADER LINE. ”Tabela lokalna z nagłówkiemSELECT-OPTIONS: material FOR mara-matnr.
SELECT * FROM mara INTO TABLE lt_mara
WHERE matnr IN material.LOOP AT lt_mara.
WRITE:/ lt_mara-matnr, lt_mara-mtart.
ENDLOOP.
Dodaliśmy tylko do definicji tabeli nagłówek WITH HEADER LINE i na tym poziomie pętla może zapisywać sobie tymczasowe dane – dzięki temu zmienia nam się źródło danyc do funkcji WRITE – system korzysta z lt_mara
Zostaw komentarz