Loop at z 2 warunkami

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

Loop at z 2 warunkami

Post autor: emil »

Chyba jestem zmęczony, nie potrafię wygooglać pomysłu na rozwiązanie poniższego problemu:

Lecę loopem po tabeli wewnętrznej.
Jeśli rekord spełnia dwa warunki - wykonuję jakieś działanie.
Warunek pierwszy: pole gmina ma mieć jakąś wartość.
Warunek kolejny: zawartość pola opst1 ma być różna niż trzy ciągi tekstowe (są to stringi o różnych długościach).

LOOP AT gt_pos_line INTO gs_pos_line WHERE gmina = wa_gmina-gmina AND opst1 not in ( 'txt1' , 'txt2' , 'txt3' ) .
"coś się dzieje na danych
endloop.

Próbowałem podawać txt1 2 i 3 jako treść, jako zmienne, całość jako tabelę wewnętrzną - cały czas mam błąd składni.

Jak to poprawnie ugryźć?
ZETKA
Posty: 69
Rejestracja: czw lis 04, 2010 10:49 pm
Has thanked: 1 time
Been thanked: 71 times
Kontakt:

Re: Loop at z 2 warunkami

Post autor: ZETKA »

Po IN trzeba użyć zmiennej typu RANGE - konstrukcja analogiczna jak SELECT-OPTIONS.
Pozdrawiam,
Krzysiek
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Re: Loop at z 2 warunkami

Post autor: emil »

Chyba coś mi nie pykło...

Kod: Zaznacz cały

"deklarujemy zakres danych RANGE żeby wrzucić go w warunek
DATA: s_stats TYPE RANGE OF T529U-TEXT1,
s_stats_wa LIKE LINE OF s_stats.

"wrzucam sobie 3 statusy, które mają być pominięte:
s_stats_wa-sign = 'I'.
s_stats_wa-option = 'EQ'.
s_stats_wa-low = 'Rencista'.
APPEND s_stats_wa TO s_stats.

s_stats_wa-sign = 'I'.
s_stats_wa-option = 'EQ'.
s_stats_wa-low = 'Osoby zewnętrzne'.
APPEND s_stats_wa TO s_stats.

s_stats_wa-sign = 'I'.
s_stats_wa-option = 'EQ'.
s_stats_wa-low = 'Emeryt'.
APPEND s_stats_wa TO s_stats.
Teraz chcę zrobić loop po tabeli wewnętrznej, a w przypadku gdy będzie wpis, którego status jest różny od mojego range, chcę zwiększyć lv_gmina_il o 1.

Kod: Zaznacz cały

  LOOP AT gt_pos_line INTO gs_pos_line WHERE gmina = wa_gmina-gmina AND opst1 not in s_stats .
    lv_gmina_il = lv_gmina_il + 1.
  ENDLOOP.
Niestety nadal zwiększa się licznik dla rekordów, w których są statusy (opst1) z zakresu ujętego w range.
ZETKA
Posty: 69
Rejestracja: czw lis 04, 2010 10:49 pm
Has thanked: 1 time
Been thanked: 71 times
Kontakt:

Re: Loop at z 2 warunkami

Post autor: ZETKA »

U mnie działa bez problemu, zmieniłem tylko miejsce negacji warunku :wink:

Kod: Zaznacz cały

DATA: itab TYPE TABLE OF text20,
      line TYPE text20.

itab = VALUE #( ( 'Rencista' )
                ( 'Out of range 1' )
                ( 'Osoby zewnętrzne' )
                ( 'Out of range 2' )
                ( 'Emeryt' ) ).

"deklarujemy zakres danych RANGE żeby wrzucić go w warunek
DATA: s_stats    TYPE RANGE OF text20,
      s_stats_wa LIKE LINE OF s_stats.

"wrzucam sobie 3 statusy, które mają być pominięte:
s_stats_wa-sign = 'E'.
s_stats_wa-option = 'EQ'.
s_stats_wa-low = 'Rencista'.
APPEND s_stats_wa TO s_stats.

s_stats_wa-sign = 'E'.
s_stats_wa-option = 'EQ'.
s_stats_wa-low = 'Osoby zewnętrzne'.
APPEND s_stats_wa TO s_stats.

s_stats_wa-sign = 'E'.
s_stats_wa-option = 'EQ'.
s_stats_wa-low = 'Emeryt'.
APPEND s_stats_wa TO s_stats.

LOOP AT itab INTO line.
  WRITE: / line.
ENDLOOP.

ULINE.

LOOP AT itab INTO line WHERE table_line IN s_stats.
  WRITE: / line.
ENDLOOP.
Wynika działania:
Clipboard01.jpg
Clipboard01.jpg (12.99 KiB) Przejrzano 2140 razy
Pozdrawiam,
Krzysiek
K602
Posty: 135
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 60 times
Been thanked: 86 times
Kontakt:

Re: Loop at z 2 warunkami

Post autor: K602 »

Kod: Zaznacz cały

AND opst1 not in ( 'txt1' , 'txt2' , 'txt3' )
Takiej konstrukcji możesz użyć tylko w warunku WHERE, ale w OpenSQL, a nie w LOOP. Jeśli chodzi o LOOP, to jedynie jak napisał Krzysztof z ZETKI - RANGE...
SAP ABAP Certified Developer
ODPOWIEDZ