loop po itabie, gdzie wartość pola będzie częścią nazwy pola innego itaba

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
emil
Posty: 137
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 43 times

loop po itabie, gdzie wartość pola będzie częścią nazwy pola innego itaba

Post autor: emil »

Patrząc na temat - pokręcone, ale już tłumaczę:

Przez FM PYXX_READ_PAYROLL_RESULT dla kolejnych pernr zbieram sobie dane dotyczące kwot na wybranych składnikach płacowych.

Kod: Zaznacz cały

IF ls_result-inter-rt IS NOT INITIAL.
*SK_1000
    LOOP AT ls_result-inter-rt INTO ls_rt WHERE lgart = '1000'.
     wa_da23-sk_1000 = wa_da23-sk_1000 + ls_rt-betrg.
     CLEAR ls_rt.
   ENDLOOP.
endif.
Program leci przez płatności dla całego roku, więc powyższy kod wykonuje się odpowiednią ilość razy.
Wydaje się to proste w przypadku, gdy badamy tylko jeden składnik płacowy, ale tych składników do sprawdzenia mam... prawie 50.
Wydaje mi się bezsensowne, by 50x tworzyć kod z loopem jak wyżej, sensowniej by było zrobić konstrukcję w stylu:

1) listę składników wrzucić do tabeli it_skladniki
2) loopnąć po tabeli it_skladniki
3) powyższy kod przemianować na coś w stylu

Kod: Zaznacz cały

loop at it_skladniki into wa_skladniki.

    LOOP AT ls_result-inter-rt INTO ls_rt WHERE lgart = '<wa_skladniki-skladnik>'.
     wa_da23-sk_<wa_skladniki-skladnik> = wa_da23-sk_<wa_skladniki-skladnik> + ls_rt-betrg.
     CLEAR ls_rt.
   ENDLOOP.

endloop.
Wiem, że za loopa w loopie należy mi się kara chłosty, ale na ten moment innego pomysłu nie mam.
Idąc dalej z tematem: o ile dobrze kojarzę, mógłbym wykorzystać składnię w stylu:

FIELD-SYMBOLS <fs> TYPE lgart.

Tylko jak to dalej przekuć?

Kod: Zaznacz cały



TYPES: BEGIN OF ls_lgarts,
         lgart TYPE lgart,
       END OF ls_lgarts.

DATA: it_lgarts TYPE TABLE OF ls_lgarts.
DATA: wa_lgarts TYPE ls_lgarts.

wa_lgarts-lgart = 1000.
APPEND wa_lgarts TO it_lgarts.
clear wa_lgarts.

wa_lgarts-lgart = 1002.
APPEND wa_lgarts TO it_lgarts.
clear wa_lgarts.

wa_lgarts-lgart = 1003.
APPEND wa_lgarts TO it_lgarts.
clear wa_lgarts.

FIELD-SYMBOLS <fs> TYPE lgart.

loop at it_lgarts  into wa_lgarts.
<fs> = wa_lgarts-lgart.

    LOOP AT ls_result-inter-rt INTO ls_rt WHERE lgart = <fs>.
     wa_da23-sk_<fs> = wa_da23-sk_<fs> + ls_rt-betrg.
     CLEAR ls_rt.
   ENDLOOP.

endloop.
Coś w ten deseń? Czy ma to sens?
dominik.tylczynski
Posty: 8384
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1950 times
Been thanked: 1482 times

Re: loop po itabie, gdzie wartość pola będzie częścią nazwy pola innego itaba

Post autor: dominik.tylczynski »

emil pisze: pt lis 17, 2023 10:19 am Wiem, że za loopa w loopie należy mi się kara chłosty
:D Nie koniecznie i nie zawsze - czasami tak trzeba.
K602
Posty: 140
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 65 times
Been thanked: 90 times

Re: loop po itabie, gdzie wartość pola będzie częścią nazwy pola innego itaba

Post autor: K602 »

Z pętlą w pętli, jest wszystko okej, jeśli użyjesz technikę optymalizacji. Dla LOOP, najlepiej metodę równoległych kursorów (złożoność O(nlogn)). Google: parallel cursors

Musisz tylko czasem model danych zmienić. W skrócie korki do wykonania:

1. Znaleźć to samo pole w obu tabelach, po którym wyszukujemy w drugiej tabeli.
2. Posortować po nim obie tabele, w tym samym kierunku.
3. Podczas LOOP drugiej tabeli, używamy klauzuli FROM wartość_ostatniego_znalezionego_w_niej_indeksu.

Efekt jest taki, że gdy jesteśmy np. w połowie pierwszej tabeli, to wyszukiwanie od początku drugiej, nie ma sensu, bo tam wyszukiwanych danych już nie ma, a są dalej :)
SAP ABAP Certified Developer
RysiekB
Posty: 77
Rejestracja: pt kwie 16, 2010 9:58 am
Been thanked: 12 times

Re: loop po itabie, gdzie wartość pola będzie częścią nazwy pola innego itaba

Post autor: RysiekB »

cześć
4. gdy tabele są duże, to warto samemu ustawić wyjście z pętli zamiast klauzuli where.