Pomoc w optymalizacji programu.

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
natanielg
Posty: 16
Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times

Pomoc w optymalizacji programu.

Post autor: natanielg »

Witam wszystkich, po raz kolejny przychodzę po pomoc. Tym razem mam problem z optymalizacją programu. Sprawa wygląda następująco :

Pobieram wszystkich dostawców dla danej jednostki gospodarczej z tabeli LFB1. Tych rekordów jest ponad 15 tys. Następnie muszę każdy pojedyńczy rekord wrzucić w MF [BAPI_AP_ACC_GETOPENITEMS], ponieważ na podstawie danych zwracanych przez niego robię dalsze wyliczenia. Ogólnie chodzi o to że potrzebuję dostać niezapłacone faktury. Transakcja FBL1N zwraca niezapłacone faktury (robiąc to błyskawicznie) ale nie zwraca wszystkich danych których potrzebuję.

To co robię w poniższym kodzie zajmuje bardzo dużo czasu. Czy da się jakoś przyśpieszyć proces otrzymywania niezapłaconych faktur dla danej jednostki gospodarczej?

Kod: Zaznacz cały

    
    SELECT lifnr
      FROM lfb1
      INTO CORRESPONDING FIELDS OF TABLE gt_lifnr
      WHERE bukrs = pa_bukrs
      AND lifnr IN so_lifnr. 
    
    
    LOOP AT gt_lifnr INTO DATA(ls_lifnr).
    
      CALL FUNCTION 'BAPI_AP_ACC_GETOPENITEMS'
        EXPORTING
          companycode = pa_bukrs
          vendor      = ls_lifnr-lifnr
          keydate     = pa_datum
*         NOTEDITEMS  = ' '
*     IMPORTING
*         RETURN      =
        TABLES
          lineitems   = gt_bapi_temp. 
                
          MOVE-CORRESPONDING gt_bapi_temp TO gt_bapi KEEPING TARGET LINES.
    ENDLOOP. 
K602
Posty: 133
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 60 times
Been thanked: 86 times

Re: Pomoc w optymalizacji programu.

Post autor: K602 »

A w jaki sposób FBL1N nie pokazuje tego, co trzeba?
SAP ABAP Certified Developer
dominik.tylczynski
Posty: 8293
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1906 times
Been thanked: 1470 times

Re: Pomoc w optymalizacji programu.

Post autor: dominik.tylczynski »

K602 pisze: wt mar 14, 2023 2:26 pm A w jaki sposób FBL1N nie pokazuje tego, co trzeba?
Faktycznie to chyba najlepsze podejście - skoro FBL1N działa ok, tylko brakuje tam jakichś informacji to może warto je dodać do tej transakcji, zamiast pisać coś od zera.
dominik.tylczynski
Posty: 8293
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1906 times
Been thanked: 1470 times

Re: Pomoc w optymalizacji programu.

Post autor: dominik.tylczynski »

Jeśli musisz napisać własny raport na wzór i podobieństwo FBL1N to zamiast używać BAPI odczytaj dokumenty księgowe dostawców (faktury) z BSIK i odejmij od nich dokumenty z BSAK (dokumenty rozliczone). To jest +/- logika BAPI_AP_ACC_GETOPENITEMS tyle, że BAPI robi to tylko dla jednego dostawy na raz, a Ty możesz odczytać dane dla wszystkich od razu.
K602
Posty: 133
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 60 times
Been thanked: 86 times

Re: Pomoc w optymalizacji programu.

Post autor: K602 »

Nie idź drogą, aby tworzyć coś na wzór raportów FBL*N... Je się fajnie wykorzystuje w programach, a nie tracisz czasu na uzgadnianie sald i całego UI...
SAP ABAP Certified Developer
dominik.tylczynski
Posty: 8293
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1906 times
Been thanked: 1470 times

Re: Pomoc w optymalizacji programu.

Post autor: dominik.tylczynski »

K602 pisze: śr mar 15, 2023 10:12 am Nie idź drogą, aby tworzyć coś na wzór raportów FBL*N... Je się fajnie wykorzystuje w programach, a nie tracisz czasu na uzgadnianie sald i całego UI...
Pełna zgoda :!:


Tutaj 5 Easy Steps to Add New Line Item Fields to FBL1N jest opisane jak dodać własne pola do FBL1N
natanielg
Posty: 16
Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times

Re: Pomoc w optymalizacji programu.

Post autor: natanielg »

Dostałem zlecenie, aby wykonać program z zapisem do bazy danych na którym będą prowadzone dalsze operacje. FBL1N było tylko przykładem, że tam wyszukiwanie dostawców trwało bardzo szybko, a ja musiałem pobierać wszystkich i każdego z nich po kolei sprawdzać. Zrobiłem jednak tak że wykorzystałem trochę raport FBL1N, robiąc do niego submita i już nie mam 15 tys dostawców do sprawdzenia ale może z 500.
marek.turczynski
Posty: 213
Rejestracja: czw lip 10, 2014 7:53 pm
Has thanked: 21 times
Been thanked: 257 times

Re: Pomoc w optymalizacji programu.

Post autor: marek.turczynski »

Jesteś na systemie ECC czy S/4? Macie dostęp do FBL1H? Bo jak tak to tam jest jedna mocna opcja, która pozwala dodać jakąkolwiek akcję dodatkową dla zaznaczonych linii - np. księgowanie itp.
Marek Turczyński
K602
Posty: 133
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 60 times
Been thanked: 86 times

Re: Pomoc w optymalizacji programu.

Post autor: K602 »

Aaa... i jeszcze jedno, jak chcesz rozszerzać ten raport, to tak jak wskazał Dominik, przez BAdI, a nie przez BTE, bo tam nie ma optymalizacji, tylko cały kod per każda linia i to zabija wydajność...
SAP ABAP Certified Developer
RKISIEL
Posty: 579
Rejestracja: pn lut 14, 2011 9:10 pm
Has thanked: 420 times
Been thanked: 260 times

Re: Pomoc w optymalizacji programu.

Post autor: RKISIEL »

Cześć,
1. Prawdą jest, że jeśli używasz w FBL1/3/5N BTE 1650 to nie masz dostępu do implementacji BADI FAGL_ITEMS_CH_DATA.
2. Prawdą jest, że implementacja BADI FAGL_ITEMS_CH_DATA korzysta z całej tabeli zapisów a BTE 1650 tylko z pojedynczych zapisów.
3. Nieprawdą jest, że rozwiązanie dla implementacji BADI FAGL_ITEMS_CH_DATA działa szybciej niż rozwiązanie dla BTE 1650 - wszystko zależy od zakresu i sposobu wydłubywania danych dla pozycji RFPOS - to co jest niemożliwe do realizacji w CLASS-METHOD jest możliwe w FM więc można przyspieszyć tam w FM gdzie jest ułomna(?!) implementacja BADI.
4.Oczywiście mamy spowolnienie dla działania w pętli i wywoływania FM (BTE 1650) dla pozycji w porównaniu z wywołaniem metody BADI dla całej tabeli ale zgodnie z punktem 3 można nadrobić - tu opis takiego przypadku:
- dostałem do analizy i optymalizacji działanie BTE 1650 dla FBL1/3/5N a także dla FAGLL03 działania implementacji BADI FAGL_ITEMS_CH_DATA;
- po optymalizacji (tu dziękuję za wiedzę otrzymaną dzięki prowadzącemu dla mnie/nas szkolenie BC490- chyba yacol) udało się zoptymalizować działanie, które nie odbiega od tego, które zastosowałbym z użyciem prawidłowych/optymalnych rozwiązań w implementacji BADI FAGL_ITEMS_CH_DATA.
Wyniki w załączniku - złe rozwiązanie dla poprzedniej wersji BTE 1650 i niestety również dla źle napisanej implementacji BADI FAGL_ITEMS_CH_DATA.
FAGL_Delta.png
Czyli nie jest ważne co tylko ważne jest jak to robisz... :D
Reasumując - przydatne są szkolenia BC425 i BC490.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony czw mar 23, 2023 9:34 am przez RKISIEL, łącznie zmieniany 1 raz.
Rafał Kisiel
K602
Posty: 133
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 60 times
Been thanked: 86 times

Re: Pomoc w optymalizacji programu.

Post autor: K602 »

RKISIEL pisze: czw mar 23, 2023 1:22 am 4.Oczywiście mamy spowolnienie dla działania w pętli i wywoływania FM (BTE 1650) dla pozycji w porównaniu z wywołaniem metody BADI dla całej tabeli ale zgodnie z punktem 3 można nadrobić - tu opis takiego przypadku:
- dostałem do analizy i optymalizacji działanie BTE 1650 dla FBL1/3/5N a także dla FAGLL03 działania implementacji BADI FAGL_ITEMS_CH_DATA;
- po optymalizacji (tu dziękuję za wiedzę otrzymaną dzięki prowadzącemu dla mnie/nas szkolenie BC490- chyba yacol) udało się zoptymalizować działanie, które nie odbiega od tego, które zastosowałbym z użyciem prawidłowych/optymalnych rozwiązań w implementacji BADI FAGL_ITEMS_CH_DATA.
Wyniki w załączniku - złe rozwiązanie dla poprzedniej wersji BTE 1650 i niestety również dla źle napisanej implementacji BADI FAGL_ITEMS_CH_DATA.
FAGL_Delta.png

Czyli nie jest ważne co tylko ważne jest jak to robisz... :D
Reasumując - przydatne są szkolenia BC425 i BC490.
A w jaki sposób jesteś w stanie zoptymalizować to BTE, w porównaniu z BAdI FI_ITEMS_CH_DATA, biorąc pod uwagę dane, jakie masz dostarczone do poszczególnych technik? Jak chcesz optymalizować dostęp do danych, który jest na zasadzie 'row by row' i setki tysięcy razy wywoływanie tego kodu (przy dużej ilości danych), zamiast jednorazowego wywołania BTE dla całego wolumenu danych i użycia choćby BST, nie wspominając o możliwości zrównoleglenia opracowania paczki danych w np. SPT Framework? Możesz podrzucić jakiś kod lub opisać rozwiązanie? Nie planuję tego używać, bo swoje zdanie już mam wyrobione na ten temat, ale ciekawi mnie to.
SAP ABAP Certified Developer
marek.turczynski
Posty: 213
Rejestracja: czw lip 10, 2014 7:53 pm
Has thanked: 21 times
Been thanked: 257 times

Re: Pomoc w optymalizacji programu.

Post autor: marek.turczynski »

RKISIEL pisze: czw mar 23, 2023 1:22 am 4.Oczywiście mamy spowolnienie dla działania w pętli i wywoływania FM (BTE 1650) dla pozycji w porównaniu z wywołaniem metody BADI dla całej tabeli ale zgodnie z punktem 3 można nadrobić - tu opis takiego przypadku:
- dostałem do analizy i optymalizacji działanie BTE 1650 dla FBL1/3/5N a także dla FAGLL03 działania implementacji BADI FAGL_ITEMS_CH_DATA;
- po optymalizacji (tu dziękuję za wiedzę otrzymaną dzięki prowadzącemu dla mnie/nas szkolenie BC490- chyba yacol) udało się zoptymalizować działanie, które nie odbiega od tego, które zastosowałbym z użyciem prawidłowych/optymalnych rozwiązań w implementacji BADI FAGL_ITEMS_CH_DATA.
Wyniki w załączniku - złe rozwiązanie dla poprzedniej wersji BTE 1650 i niestety również dla źle napisanej implementacji BADI FAGL_ITEMS_CH_DATA.
FAGL_Delta.png

Czyli nie jest ważne co tylko ważne jest jak to robisz... :D
Reasumując - przydatne są szkolenia BC425 i BC490.
Robiłem również optymalizację wyświetlania danych w FBLxN u jednego klienta i też wyciąłem ich implementacje BTE1650. Wszystko przeniosłem do FI_ITEMS_CH_DAT, które ustrukturyzowałem w następujący sposób:

Dla wszystkich pozycji pobieram jednorazowo dane z BSEG. Pobieram tylko te pola, jakie są zdefiniowane w moim typie danych. Te dane są przechowywane w Sorted Table z kluczem jak w BSEG.
Potem, osobnymi metodami, wypełniam dodatkowe pola (nazwa kontrahenta itp) operując zawsze na Sorted table.

Jako, że ten system u klienta jest na Hanie to jeszcze usunąłem wszystkie stare For-all-entries i zastąpiłem je joinem z tabelki wewnętrznej.

Działa szybko, sprawnie i kilkaset % szybciej niż stary kod.

Głównym problemem tego BADI i BTE 1650 jest to, że pracuje nad nim wiele osób w wielu latach i zamiast sterować wszystko jednym selectem z BSEG czy ACDOCA, to mnożą się kolejne IFy i selecty tych samych danych. Problemem jest również, że BADI i BTE są używane równolegle - przez to muszą być wywoływane dwukrotnie. Po ograniczeniu wszystkiego do tylko BADI i naniesionych zmianach szybkość bardzo się podniosła.
Marek Turczyński
K602
Posty: 133
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 60 times
Been thanked: 86 times

Re: Pomoc w optymalizacji programu.

Post autor: K602 »

Jako, że ten system u klienta jest na Hanie to jeszcze usunąłem wszystkie stare For-all-entries i zastąpiłem je joinem z tabelki wewnętrznej.
Dobra koncepcja, ale nie każdy ma ABAP 7.52. Za to na Hanie, jest coś takiego jak FDA (Fast Data Access) do włączenia i to powinno wyrównać szanse względem takiego INNER JOIN... specjalnie właśnie pod FAE...
SAP ABAP Certified Developer