Warning: Cannot modify header information - headers already sent by (output started at /data/web/virtuals/285774/virtual/www/domains/abap.cz/index.php:1) in /data/web/virtuals/285774/virtual/www/domains/abap.cz/wp-includes/feed-rss2.php on line 8
ABAP https://abap.cz Místo pro programátory v jazyce ABAP Wed, 25 Oct 2023 19:45:52 +0000 cs hourly 1 Loop v ABAP https://abap.cz/loop-v-abap/loop-v-abap/ https://abap.cz/loop-v-abap/loop-v-abap/#respond Tue, 24 Oct 2023 18:16:01 +0000 https://abap.cz/?p=64 Pokud je potřeba procházet kolekce dat, tak konstrukce LOOP AT je jedna z nejlepších variant. Kolekcí dat v tomto případě jsou myšleny interní tabulky, které jsou naplněny z databázových tabulek, nebo data typu range.

Musíme si ovšem dát pozor, protože zanoření více, než dvou LOOP struktur do sebe je velmi nežádoucí zejména z hlediska časové složitosti. Pokud budeme přepokládat, že příkaz běží v konstantním čase a jsou do sebe vnořené pouze dvě LOOP kontrukce, tak doba běhu pro vykonání vnější kontrukce je kvadratická O(n2).

Z hlediska konkrétního příkladu: Dvě interní tabulky, které obě obsahují 100 prvků a jsou procházeny do sebe vnořenými konstrukcemi LOOPu. Počet průchodů prvního LOOPu bude 100×100 = 10 000 průchodů. Pokud přidáme další konstrukci LOOP, bude počet průchodů 100x100x100 = 1 000 0000 průchodů.

Ukázka konstrukce i s datovou definicí a vysvětlením:

  1. konstrukce

Inline deklarace INTO @DATA() umožňuje deklarovat datovou strukturu, která je stejná jako datový typ řádek tabulky a překopíruje z ní do struktury data.
Přístup na atribut datové struktury se provádí pomocí pomlčky ( ls_data-atribut ).


LOOP AT ... INTO @DATA(ls_data).

ENDLOOP.

2. konstrukce

Inline deklarace REFFERENCE INTO @DATA() umožňuje deklarovat referenci(odkaz) na datovou strukturu, která je stejná jako datový typ řádek tabulky, kterou procházíme. Umožňuje snadnější manipulaci s daty, bez nutnosti vytvoření kopie. Tzn., že pomocí reference můžeme měnit data v tabulce, přes kterou procházíme.

Přístup na atribut datové struktury se provádí pomocí pomlčky a šipky ( lr_data->atribut ), abychom mohli do datové struktury přiřadit proměnnou, tak je nutné strukturu dereferencovat pomocí ->* umožňuje to tedy přiřadit do atributu námi požadovanou hodnotu ( lr_data->* ).

LOOP AT ... REFFERENCE INTO @DATA(lr_data).

ENDLOOP.

Inline deklarace ASSIGNING FIELD-SYMBOL() umožňuje deklarovat ukazatel na datovou strukturu, která je stejná jako datový typ řádek tabulky. Obsahuje tedy adresu paměti, kde je daná struktura uložena a umožňuje k ní přístup. Pomocí ukazatele můžeme měnit data v tabulce, přes kterou procházíme.

Přístup na atribut datové struktury se provádí pomocí pomlčky ( <line>-atribut ).

LOOP AT ... ASSIGNING FIELD-SYMBOL(<line>).

ENDLOOP.
]]>
https://abap.cz/loop-v-abap/loop-v-abap/feed/ 0