ABAP 7.40

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
ODPOWIEDZ
karol.dabrowski
Posty: 192
Rejestracja: śr cze 11, 2014 3:10 pm
Has thanked: 58 times
Been thanked: 27 times

ABAP 7.40

Post autor: karol.dabrowski »

Cześć - pytanie statystyczne - czy używacie ABAP 7.40 czy "starej" wersji?
Czy 7.40 jest dostępny w ECC czy dopiero w HANA?

Zadaję to pytanie bo nie wiem czy jestem już na abapowej emeryturze czy jeszcze nie jest tak źle :)
Pozdrawiam
bjarkowski
Posty: 116
Rejestracja: pt lip 15, 2016 5:31 pm
Has thanked: 2 times
Been thanked: 46 times

Re: ABAP 7.40

Post autor: bjarkowski »

Czy dobrze rozumiem ze piszesz o skladni ABAP w NW 7.40? :)

NW7.40 jest dostepne od ERP EHP7. EHP8 jest juz chyba na 7.50.

Pozdrawiam
Bartosz
aszymanski
Posty: 72
Rejestracja: pt lip 11, 2014 1:01 pm
Lokalizacja: Kraków
Has thanked: 11 times
Been thanked: 28 times

Re: ABAP 7.40

Post autor: aszymanski »

Używam:

Kod: Zaznacz cały

* zamiast loopa na tabeli źródłowej, move-corresponding i append na docelowej
lt_fieldnames = CORRESPONDING #( lt_compdescr ).

Kod: Zaznacz cały

* zamiast read table ... transporting no fields
IF line_exists( lt_itabs[ sel_order = ps_itabs-sel_order + 1 ] ).

Kod: Zaznacz cały

* zamiast read table i przypisania do zmiennej
ls_mappings-order = VALUE #( lt_itabs[ itab_name = <ls_out_fields>-itab_from ]-sel_order DEFAULT 0 )

Bardzo przyjemny ten nowy ABAP :)
Ostatnio zmieniony pt lut 22, 2019 7:09 pm przez aszymanski, łącznie zmieniany 1 raz.
karol.dabrowski
Posty: 192
Rejestracja: śr cze 11, 2014 3:10 pm
Has thanked: 58 times
Been thanked: 27 times

Re: ABAP 7.40

Post autor: karol.dabrowski »

bjarkowski pisze: czw lut 21, 2019 10:59 am Czy dobrze rozumiem ze piszesz o skladni ABAP w NW 7.40? :)
Tak :)
Stąd zrodziło się to filozoficzne pytanie - nie mamy jeszcze EHP7, więc nie programuję jeszcze w nowej składni.

Czy jako abaper jestem już skazany na zawodową porażkę? :)
wojtas7
Posty: 1058
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 71 times
Been thanked: 313 times

Re: ABAP 7.40

Post autor: wojtas7 »

Przykre by było jeśli ktoś ma być skazany na porażkę bo używa LOOP zamiast nowej składni, myślałem że praca programisty to wiele wiele więcej ;-)

A BTW macie może jakieś dobre PDFy/artykuły wyjaśniające nową składnię? :-)
bjarkowski
Posty: 116
Rejestracja: pt lip 15, 2016 5:31 pm
Has thanked: 2 times
Been thanked: 46 times

Re: ABAP 7.40

Post autor: bjarkowski »

karol.dabrowski pisze: czw lut 21, 2019 3:13 pm
Czy jako abaper jestem już skazany na zawodową porażkę? :)
Haha, nie wydaje mi się :-) co prawda w ABAP nie siedzę za bardzo, ale nigdy nie spotkałem się żeby ktoś miał problem z przesiadka na nowy ABAP :-)
To już chyba gorzej z HANA, bo tu się trochę koncept zmienił i trzeba zrewidowac najlepsze praktyki. I nauczyć się o CDS oraz AMDP :)

Pozdrawiam
Bartosz
yacol
Posty: 561
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 9 times
Been thanked: 165 times
Kontakt:

Re: ABAP 7.40

Post autor: yacol »

Używam nowej składni odkąd tylko się pojawiła. Zdecydowanie umożliwia ona zmniejszenie ilości kodu - choć może również wpływać na jego zaciemnienie - poniżej przykładzik dla tych, którzy lubią liczyć nawiasy :) :

Kod: Zaznacz cały

parameters:
  p_lifnr type lifnr obligatory,
  p_bukrs type bukrs obligatory,
  p_zsabe type dzsabe_k obligatory.

vmd_ei_api=>maintain_direct_input(
  exporting
    is_master_data = value #( vendors = value #( ( header = value #( object_task = 'U' object_instance = value #( lifnr = p_lifnr ) )
                                                   company_data = value #( company = value #( ( task = 'U'
                                                                                                data_key = value #( bukrs = p_bukrs )
                                                                                                data = value #( zsabe = p_zsabe )
                                                                                                datax = value #( zsabe = abap_true ) ) ) ) ) )
                            )
  importing
    es_message_defective = data(ls_error_msg) ).
 
 (...)
Spotkałem się również z osobami, które mają problem z czytaniem/interpretacją nowej składni. SAP z każdą kolejną iteracją wersji dodaje coś ciekawego. Sporo ciekawych rzeczy zostało dodanych w 7.50. Generalnie warto trochę nad tym przysiedzieć i "obtrzaskać" z tematem bo podejście związane z programowaniem funkcyjnym wygląda na przyszłość ABAPa.
Pozdrawiam,

Jacek Witczak
http://novertio.pl
karol.dabrowski
Posty: 192
Rejestracja: śr cze 11, 2014 3:10 pm
Has thanked: 58 times
Been thanked: 27 times

Re: ABAP 7.40

Post autor: karol.dabrowski »

wojtas7 pisze: czw lut 21, 2019 3:30 pm
A BTW macie może jakieś dobre PDFy/artykuły wyjaśniające nową składnię? :-)
Ja korzystałem z tego https://blogs.sap.com/2015/10/25/abap-7 ... reference/ ale jedynie jako ciekawostkę na razie, nie "obtrzaskałem się" jeszcze :)
aszymanski
Posty: 72
Rejestracja: pt lip 11, 2014 1:01 pm
Lokalizacja: Kraków
Has thanked: 11 times
Been thanked: 28 times

Re: ABAP 7.40

Post autor: aszymanski »

Fajna jest też definicja field-symbol on-the-fly:

Kod: Zaznacz cały

loop at lt_items ASSIGNING FIELD-SYMBOL(<ls_items>).
Ostatnio zmieniony pt lut 22, 2019 7:09 pm przez aszymanski, łącznie zmieniany 1 raz.
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: ABAP 7.40

Post autor: dominik.tylczynski »

aszymanski pisze: pt lut 22, 2019 2:47 pm Fajna jest też definicja field-symbol on-the-fly:
loop at lt_items ASSIGNING FIELD-SYMBOL(<ls_items>).
Istotnie fajna jest ta konstrukcja, choć mam z nią jeden problem. Na zdrowy rozum i prostą logikę field-symbol zadeklarowany w taki sposób powinien być widoczny i ważny tylko w obrębie pętli, w której został zadeklarowany. Tak jednak nie jest. Następujący kod jest błędny:

Kod: Zaznacz cały

LOOP AT lt_tab1 ASSIGNING FIELD-SYMBOL(<wa>).
ENDLOOP.

LOOP AT lt_tab2 ASSIGNING FIELD-SYMBOL(<wa>).
ENDLOOP.
Moim zdaniem to jest lekka niedoróbka w ABAP 7.40.
aszymanski
Posty: 72
Rejestracja: pt lip 11, 2014 1:01 pm
Lokalizacja: Kraków
Has thanked: 11 times
Been thanked: 28 times

Re: ABAP 7.40

Post autor: aszymanski »

dominik.tylczynski pisze: pt lut 22, 2019 3:31 pm Moim zdaniem to jest lekka niedoróbka w ABAP 7.40.
Nie wiem czy nazwałbym to niedoróbką, w końcu loop...endloop to nie jest modularization unit...
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: ABAP 7.40

Post autor: dominik.tylczynski »

aszymanski pisze: pt lut 22, 2019 7:11 pm
dominik.tylczynski pisze: pt lut 22, 2019 3:31 pm Moim zdaniem to jest lekka niedoróbka w ABAP 7.40.
Nie wiem czy nazwałbym to niedoróbką, w końcu loop...endloop to nie jest modularization unit...
Owszem, masz rację, pętla nie jest modularization unit, a jednak w np. Javie następujący kod przejdzie bez problemu:

Kod: Zaznacz cały

for (int i = 0; i < 4; i++) {}

for (int i = 0; i < 4; i++) {}
W Javie zmienna i (licznik pętli) jest widoczny tylko wewnątrz pętli co moim zdaniem ma sens. Dlatego napisałem o zdrowym rozumie i prostej logice.

To są naturalnie tylko takie akademickie dywagacje podstarzałego programisty :wink:
yacol
Posty: 561
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 9 times
Been thanked: 165 times
Kontakt:

Re: ABAP 7.40

Post autor: yacol »

Dominik "dotknął" ważnego tematu - jak naprawdę są definiowane/inicjowane zmienne w ABAPie.

Przykładowo, jaki będzie rezultat poniższego, prostego, kodu:

Kod: Zaznacz cały

program ...

perform something.


form something.
  do 10 times.
    data k type i value 10.
    k = k + sy-index.
    write k.
  enddo.
endform.
Przy pierwszym spojrzeniu wydaje się, że k będzie miało wartości 11, 12, 13, 14, ...
Czy aby na pewno? Chwila na wklepanie kodu i... zdziwienie - 11, 13, 16, 20, 25, 31, 38, ... ???

Jak wszyscy wiemy, w ABAPie zmienne moga być definiowane w wielu miejscach: procedurach, metodach, modułach funkcyjnych, sekcjach klas, programach, itd. - zmienne można definiować niemalże w dowolnym miejscu zasięgu tych jednostek modularyzacji (w naszym konkretnym przypadku - w procedurze, w pętli do...enddo). Problem leży w tym gdzie (kiedy) zmienne te są inicjalizowane?? Odpowiedź jeśli chodzi o ABAPa jest jedna: zawsze na początku bieżącego zasięgu. Oznacza to, że zmienna k już przed wejściem do pętli do ... enddo istnieje i ma wartość 10 - można się o tym przekonać umieszczając break-point przed pętlą i wyświetlając w debuggerze zmieną k. Żebyśmy się dobrze zrozumieli - choć zmienna k istnieje już przed pętlą - nie możemy przed pętlą do tej zmiennej się odwoływać - nie pozwoli nam na to kompilator ale to już jest inna para kaloszy.
Skoro zmienna k została zainicjalizowana na początku procedury somehting wartością 10, nie jest ona już nigdzie potem w tej procedurze inicjalizowana ponownie. Idąc dalej tym tropem - przy pierwszym przejściu pętli wartość k to będzie 10 + sy-index (1) czyli 11. Przy drukim przejściu będzie to już 11 + sy-index (2) czyli 13. Przy trzecim przejściu pętli będzie to 13 + sy-index (3) czyli 16. I tak dalej. Wiedząc to możemy nieco przepisać ten kod w sposób mniej mylący:

Kod: Zaznacz cały

program ...

perform something.

form something.
  data k type i value 10.

  do 10 times.
    k = k + sy-index.
    write k.
  enddo.

endform.
Jak uzyskać spodziewane wartości 11, 12, 13, ... ?

Teraz już jest prosto:

Kod: Zaznacz cały

program ...

perform something.

form something.
  data k type i.

  do 10 times.
    k = 10.
    k = k + sy-index.
    write k.
  enddo.

endform.
choć teraz wygląda to trochę nielogicznie - można to oczywiście bezpiecznie skrócić do:

Kod: Zaznacz cały

program ...

perform something.

form something.
  data k type i.

  do 10 times.
    k = 10 + sy-index.
    write k.
  enddo.

endform.
Teraz wracając do przykładu Dominika - deklaracja field-symbolu inline w pętli loop:

Kod: Zaznacz cały

loop at itab assigning field-symbol(<wa>).
endloop.
jest de facto tym samym co:

Kod: Zaznacz cały

field-symbols <wa> type ...

loop at itab assigning <wa>.
endloop.
i dlatego przy drugiej pętli dostajemy błąd mówiący o tym, że <wa> zostało już wcześniej zadeklarowane. Teraz przynajmniej już wiemy dlaczego :)
Pozdrawiam,

Jacek Witczak
http://novertio.pl
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: ABAP 7.40

Post autor: dominik.tylczynski »

Super odpowiedź. Jak już coś Jacek opiszesz, to jaśniej i przejrzyściej nie można :D
Naturalnie Twój post wyjaśnia dlaczego nie można dwukrotnie zadeklarować tego samego field-symbol w dwóch pętlach.
Przyznam, że sposób definiowania i inicjowania zmiennych w ABAP, zwłaszcza tych deklarowanych inline jest nieco mylący - niby w kodzie jest deklaracja w pętli, ale w istocie ABAP deklaruje zmienną na początku procedury.
ZETKA
Posty: 69
Rejestracja: czw lis 04, 2010 10:49 pm
Has thanked: 1 time
Been thanked: 71 times
Kontakt:

Re: ABAP 7.40

Post autor: ZETKA »

dominik.tylczynski pisze: pt lut 22, 2019 8:52 pm Owszem, masz rację, pętla nie jest modularization unit, a jednak w np. Javie następujący kod przejdzie bez problemu:

Kod: Zaznacz cały

for (int i = 0; i < 4; i++) {}

for (int i = 0; i < 4; i++) {}
W ABAP'ie też przejdzie, jeśli zastosujemy zmienne lokalne pętli w konstruktorach (np. VALUE) deklarowane za pomocą FOR czy LET.
Pozdrawiam,
Krzysiek
ODPOWIEDZ