ABAP 7.40
-
- Posty: 192
- Rejestracja: śr cze 11, 2014 3:10 pm
- Has thanked: 58 times
- Been thanked: 27 times
ABAP 7.40
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
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
-
- Posty: 116
- Rejestracja: pt lip 15, 2016 5:31 pm
- Has thanked: 2 times
- Been thanked: 46 times
Re: ABAP 7.40
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
NW7.40 jest dostepne od ERP EHP7. EHP8 jest juz chyba na 7.50.
Pozdrawiam
Bartosz
-
- 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
Używam:
Bardzo przyjemny ten nowy ABAP
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.
-
- Posty: 192
- Rejestracja: śr cze 11, 2014 3:10 pm
- Has thanked: 58 times
- Been thanked: 27 times
Re: ABAP 7.40
Takbjarkowski pisze: ↑czw lut 21, 2019 10:59 am Czy dobrze rozumiem ze piszesz o skladni ABAP w NW 7.40?
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ę?
-
- Posty: 1062
- Rejestracja: pt mar 14, 2008 12:51 pm
- Has thanked: 71 times
- Been thanked: 315 times
Re: ABAP 7.40
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ę?
A BTW macie może jakieś dobre PDFy/artykuły wyjaśniające nową składnię?
-
- Posty: 116
- Rejestracja: pt lip 15, 2016 5:31 pm
- Has thanked: 2 times
- Been thanked: 46 times
Re: ABAP 7.40
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 ABAPkarol.dabrowski pisze: ↑czw lut 21, 2019 3:13 pm
Czy jako abaper jestem już skazany na zawodową porażkę?
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
-
- 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
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 :
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.
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) ).
(...)
Pozdrawiam,
Jacek Witczak
http://novertio.pl
Jacek Witczak
http://novertio.pl
-
- Posty: 192
- Rejestracja: śr cze 11, 2014 3:10 pm
- Has thanked: 58 times
- Been thanked: 27 times
Re: ABAP 7.40
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
-
- 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
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.
-
- Posty: 8356
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1924 times
- Been thanked: 1478 times
- Kontakt:
Re: ABAP 7.40
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: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>).
Kod: Zaznacz cały
LOOP AT lt_tab1 ASSIGNING FIELD-SYMBOL(<wa>).
ENDLOOP.
LOOP AT lt_tab2 ASSIGNING FIELD-SYMBOL(<wa>).
ENDLOOP.
-
- 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
Nie wiem czy nazwałbym to niedoróbką, w końcu loop...endloop to nie jest modularization unit...dominik.tylczynski pisze: ↑pt lut 22, 2019 3:31 pm Moim zdaniem to jest lekka niedoróbka w ABAP 7.40.
-
- Posty: 8356
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1924 times
- Been thanked: 1478 times
- Kontakt:
Re: ABAP 7.40
Owszem, masz rację, pętla nie jest modularization unit, a jednak w np. Javie następujący kod przejdzie bez problemu:aszymanski pisze: ↑pt lut 22, 2019 7:11 pmNie wiem czy nazwałbym to niedoróbką, w końcu loop...endloop to nie jest modularization unit...dominik.tylczynski pisze: ↑pt lut 22, 2019 3:31 pm Moim zdaniem to jest lekka niedoróbka w ABAP 7.40.
Kod: Zaznacz cały
for (int i = 0; i < 4; i++) {}
for (int i = 0; i < 4; i++) {}
To są naturalnie tylko takie akademickie dywagacje podstarzałego programisty
-
- 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
Dominik "dotknął" ważnego tematu - jak naprawdę są definiowane/inicjowane zmienne w ABAPie.
Przykładowo, jaki będzie rezultat poniższego, prostego, kodu:
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:
Jak uzyskać spodziewane wartości 11, 12, 13, ... ?
Teraz już jest prosto:
choć teraz wygląda to trochę nielogicznie - można to oczywiście bezpiecznie skrócić do:
Teraz wracając do przykładu Dominika - deklaracja field-symbolu inline w pętli loop:
jest de facto tym samym co:
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
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.
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.
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.
Kod: Zaznacz cały
program ...
perform something.
form something.
data k type i.
do 10 times.
k = 10 + sy-index.
write k.
enddo.
endform.
Kod: Zaznacz cały
loop at itab assigning field-symbol(<wa>).
endloop.
Kod: Zaznacz cały
field-symbols <wa> type ...
loop at itab assigning <wa>.
endloop.
Pozdrawiam,
Jacek Witczak
http://novertio.pl
Jacek Witczak
http://novertio.pl
-
- Posty: 8356
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1924 times
- Been thanked: 1478 times
- Kontakt:
Re: ABAP 7.40
Super odpowiedź. Jak już coś Jacek opiszesz, to jaśniej i przejrzyściej nie można
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.
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.
-
- Posty: 72
- Rejestracja: czw lis 04, 2010 10:49 pm
- Has thanked: 1 time
- Been thanked: 72 times
- Kontakt:
Re: ABAP 7.40
W ABAP'ie też przejdzie, jeśli zastosujemy zmienne lokalne pętli w konstruktorach (np. VALUE) deklarowane za pomocą FOR czy LET.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++) {}
Pozdrawiam,
Krzysiek
Krzysiek