SELECT z dodatkową logiką

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
wojtas7
Posty: 1113
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 72 times
Been thanked: 336 times

SELECT z dodatkową logiką

Post autor: wojtas7 »

Hej,

wymaganie jest takie, żeby zwrócić wszystkie wpisy z tabeli, które mają nieprzetworzony komunikat wyjściowy. Możliwe sytuacje takie, że jeden wpis z błędem (status=2), ale też może być kolejny wpis z status=1, co oznacza że jest OK i taki wpis nie powinien się pokazać na wyniku. W tabeli mam kilka wpisów ze statusem=2, select nic nie zwraca bo nie ma żadnego wpisu z status=1:

Kod: Zaznacz cały

SELECT ekbe~ebeln, ekbe~belnr, nast~vstat FROM ekbe
  JOIN nast ON ekbe~belnr = nast~objky
  WHERE ekbe~ebeln IN @s_ebeln AND
        nast~kappl = 'V2' AND
        nast~kschl = 'SPED' AND
        nast~vstat = '2'  AND
            ( ekbe~ebeln NOT IN
                   ( SELECT ekbe~ebeln FROM ekbe
                       JOIN nast ON ekbe~belnr = nast~objky
                       WHERE ekbe~ebeln IN @s_ebeln AND
                             nast~kappl = 'V2' AND
                             nast~kschl = 'SPED' AND
                             nast~vstat = '1' ) )
  INTO TABLE @lt_data.
da się to zrobić w jednym select?
dominik.tylczynski
Posty: 8677
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 2074 times
Been thanked: 1550 times

Re: SELECT z dodatkową logiką

Post autor: dominik.tylczynski »

Na oko ten select wygląda ok. Natomiast nie napinałbym się, aby to obsłużyć jednym select'em. Może to nie jest super optymalne, ale wolę prostsze select'y i przetwarzanie w tablicach wewnętrznych. Jakoś łatwiej mi się tak debuguje.
wojtas7
Posty: 1113
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 72 times
Been thanked: 336 times

Re: SELECT z dodatkową logiką

Post autor: wojtas7 »

to kwestia honoru ;-)

Niestety jak są trzy wpisy tylko z status = "2" to nic nie zwraca. Tak jakby ta druga część blokowała.
K602
Posty: 163
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 74 times
Been thanked: 95 times

Re: SELECT z dodatkową logiką

Post autor: K602 »

A w jakim celu robisz dodatkowego INNER JOIN, jeśli łączysz po tym samym kluczu (ON) i w warunkach WHERE jest to samo?
Dlaczego nie napiszesz po prostu:

Kod: Zaznacz cały

NOT nast~vstat EQ '1'
?

Chyba, że czegoś nie widzę...
SAP ABAP Certified Developer
wojtas7
Posty: 1113
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 72 times
Been thanked: 336 times

Re: SELECT z dodatkową logiką

Post autor: wojtas7 »

Pierwszy : nast~vstat EQ '1'
Drugi: nast~vstat EQ '2'


Cel jest taki: zwrócić takie zamówienia, które nie mają poprawnie wygenerowanego komunikatu SPED. Wpisy w NAST mogą być różne, które powinny być odczytane: kilka wpisów tylko z błędem 1, albo kilka wpisów z błędem 1, a jeden wpis z '2' (stąd cały ambaras żeby ich nie pokazywać).
K602
Posty: 163
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 74 times
Been thanked: 95 times

Re: SELECT z dodatkową logiką

Post autor: K602 »

No to LEFT OUTER JOIN przy pierwszym łączeniu... bo nie dajesz szansy wykonać się następnemu JOINowi...

Na przyszłość warto pisać explicite INNER JOIN i LEFT OUTER JOIN mimo, że implicite się to wykonuje (INNER)...

A tak w ogóle, to podpowiedź Dominika jak najbardziej słuszna, bo to łatwo wykonać z tabelami wewnętrznymi i do razu wszystko widać w debuggerze...
SAP ABAP Certified Developer
wojtas7
Posty: 1113
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 72 times
Been thanked: 336 times

Re: SELECT z dodatkową logiką

Post autor: wojtas7 »

Taka jest Twoja propozycja z LEFT OUTER JOIN przy pierwszym łączeniu?

Kod: Zaznacz cały

SELECT ekbe~ebeln, ekbe~belnr, nast~vstat FROM ekbe
  left outer JOIN nast ON ekbe~belnr = nast~objky
  WHERE ekbe~ebeln IN @s_ebeln AND
        nast~kappl = 'V2' AND
        nast~kschl = 'SPED' AND
        nast~vstat = '2'  AND
            ( ekbe~ebeln NOT IN
                   ( SELECT ekbe~ebeln FROM ekbe
                       JOIN nast ON ekbe~belnr = nast~objky
                       WHERE ekbe~ebeln IN @s_ebeln AND
                             nast~kappl = 'V2' AND
                             nast~kschl = 'SPED' AND
                             nast~vstat = '1' ) )
  INTO TABLE @lt_data.
nadal nic nie zwraca mimo że są tylko 3 wpisy z STATUS = "2"
dominik.tylczynski
Posty: 8677
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 2074 times
Been thanked: 1550 times

Re: SELECT z dodatkową logiką

Post autor: dominik.tylczynski »

Rozbij może testowo to zapytanie na dwa tj.

Kod: Zaznacz cały

SELECT ekbe~ebeln, ekbe~belnr, nast~vstat FROM ekbe
  left outer JOIN nast ON ekbe~belnr = nast~objky
  WHERE ekbe~ebeln IN @s_ebeln AND
        nast~kappl = 'V2' AND
        nast~kschl = 'SPED' AND
        nast~vstat = '2'  AND
oraz

Kod: Zaznacz cały

                 SELECT ekbe~ebeln FROM ekbe
                       JOIN nast ON ekbe~belnr = nast~objky
                       WHERE ekbe~ebeln IN @s_ebeln AND
                             nast~kappl = 'V2' AND
                             nast~kschl = 'SPED' AND
                             nast~vstat = '1'
Może tak dojdziemy do tego co się dzieje.
wojtas7
Posty: 1113
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 72 times
Been thanked: 336 times

Re: SELECT z dodatkową logiką

Post autor: wojtas7 »

Robiłem oczywiście na samym początku. Pierwszy select zwraca normalnie trzy wpisy zgodnie z oczekiwaniami.

Drugi select nic nie zwraca i dobrze.

Więc dlaczego drugi select, pusty, kasuje też wpisy pierwszego, skoro jest NOT IN ....
K602
Posty: 163
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 74 times
Been thanked: 95 times

Re: SELECT z dodatkową logiką

Post autor: K602 »

wojtas7 pisze: pt kwie 11, 2025 6:39 pm Więc dlaczego drugi select, pusty, kasuje też wpisy pierwszego, skoro jest NOT IN ....
To drugie zapytanie zwraca NULL listę, dlatego zapewne całe wyrażenie jest FALSE...
Ostatnio zmieniony pt kwie 11, 2025 10:18 pm przez K602, łącznie zmieniany 1 raz.
SAP ABAP Certified Developer
yacol
Posty: 575
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 10 times
Been thanked: 183 times

Re: SELECT z dodatkową logiką

Post autor: yacol »

Kod: Zaznacz cały

with +exclude as (
  select distinct ebeln
    from ekbe join nast
      on ekbe~belnr = nast~objky
    where ebeln in @s_ebeln and
          kappl = 'V2' and
          kschl = 'SPED' and
          vstat = '1'
) select ebeln, belnr, vstat
    from ekbe join nast
      on ekbe~belnr = nast~objky
    where ebeln in @s_ebeln and
          ebeln not in ( select ebeln from +exclude ) and
          kappl = 'V2' and
          kschl = 'SPED' and          
          vstat = '2'
  into table @data(stats).
Pozdrawiam,

Jacek Witczak
http://novertio.pl
K602
Posty: 163
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 74 times
Been thanked: 95 times

Re: SELECT z dodatkową logiką

Post autor: K602 »

yacol pisze: pt kwie 11, 2025 8:31 pm

Kod: Zaznacz cały

with +exclude as (
  select distinct ebeln
    from ekbe join nast
      on ekbe~belnr = nast~objky
    where ebeln in @s_ebeln and
          kappl = 'V2' and
          kschl = 'SPED' and
          vstat = '1'
) select ebeln, belnr, vstat
    from ekbe join nast
      on ekbe~belnr = nast~objky
    where ebeln in @s_ebeln and
          ebeln not in ( select ebeln from +exclude ) and
          kappl = 'V2' and
          kschl = 'SPED' and          
          vstat = '2'
  into table @data(stats).
Pytanie. Co to zmieni, jeśli zapytanie w IN jest NULL, więc cała wartość wyrażenia będzie zapewne FALSE... ale mówię z głowy, bez testów...

Podobny temat jest opisany tutaj: https://community.sap.com/t5/applicatio ... p/11025690
Ostatnio zmieniony pn kwie 14, 2025 12:20 pm przez K602, łącznie zmieniany 1 raz.
SAP ABAP Certified Developer
wojtas7
Posty: 1113
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 72 times
Been thanked: 336 times

Re: SELECT z dodatkową logiką

Post autor: wojtas7 »

yacol pisze: pt kwie 11, 2025 8:31 pm

Kod: Zaznacz cały

with +exclude as (
  select distinct ebeln
    from ekbe join nast
      on ekbe~belnr = nast~objky
    where ebeln in @s_ebeln and
          kappl = 'V2' and
          kschl = 'SPED' and
          vstat = '1'
) select ebeln, belnr, vstat
    from ekbe join nast
      on ekbe~belnr = nast~objky
    where ebeln in @s_ebeln and
          ebeln not in ( select ebeln from +exclude ) and
          kappl = 'V2' and
          kschl = 'SPED' and          
          vstat = '2'
  into table @data(stats).
ooo mega, super. Pytanie dodatkowe, potrzebuję wykluczać po wartościach z dwóch pol EKBE-EBELN i EKBE-EBELP (pozycja). Jak w drugim select wykluczyć wartości obu pól jednoczesnie?
dominik.tylczynski
Posty: 8677
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 2074 times
Been thanked: 1550 times

Re: SELECT z dodatkową logiką

Post autor: dominik.tylczynski »

Czy mógłby ktoś objaśnić jakie są istotne różnice między zapytaniem zaproponowanym przez Yacola, a tym z pierwotnego posta?
K602
Posty: 163
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 74 times
Been thanked: 95 times

Re: SELECT z dodatkową logiką

Post autor: K602 »

Ten temat wydaje się prosty. W mojej ocenie, tu coś nie do końca jest dobrze z tymi JOINami... ich wewnętrznymi warunkami...

Sam nawet niedawno na HANA pisałem zbliżone zapytanie i działa jak trzeba:

Kod: Zaznacz cały

-- Jedynie rola Z_NIEZBEDNIK
SELECT uname FROM sapprd.agr_users WHERE agr_name = 'Z_NIEZBEDNIK' AND uname NOT IN ( SELECT uname FROM sapprd.agr_users WHERE agr_name != 'Z_NIEZBEDNIK' );
Nie mam takich danych aby poeksperymentować, ale jak pisałem, warto używać aliasów i explicite deklaracji JOINów...
SAP ABAP Certified Developer