User-exit wywołany po zapisie faktury (w VBRK)

A tu dla odmiany podyskutować możesz na tematy logistyczne SAP. Jeśli pojawią się jakieś pytania, nie zwlekaj, zadaj je natychmiast.
zuser
Posty: 5
Rejestracja: sob paź 19, 2019 11:50 am
Has thanked: 7 times
Been thanked: 3 times

User-exit wywołany po zapisie faktury (w VBRK)

Post autor: zuser »

Witam Wszystkich,

Szukam rozwiązania, które umożliwiłoby mi uruchomienie kodu po zapisie
faktury sprzedażowej w tabelach VBRK oraz VBRP a także VBUP oraz VBUK.
Ważne jest przy tym aby było to możliwe nie tylko dla VF01 ale również
gdy storno faktury sprzedażowej (VF11)

Dla zleceń sprzedaży i dostaw nie ma problemu aby uruchomić z-towy moduł
funkcyjny w trybie UPDATE TASK.

Przeszedłem już chyba wszystkie możliwe fora - bez rezultatu. Niektórzy wskazują
na interfejsy w księgowości ale według mnie uruchamiane są przed zapisaniem
faktur do tabel (np. SDVFX008). Nigdzie nie natrafiłem na jedną sensowną,
konkretną odpowiedź.

Zawsze przy takich pytaniach pada pytanie o powód poszukiwań. Więc chcę opracować swoją
własną logikę wypełniania dodatkowych statusów dla dokumentów (VBUK).
Wiem, że jest do tego user-exit ale on nie wchodzi w rachubę z racji tego, że ja chcę
aktualizować statusy zleceń sprzedaży na podstawie statusu faktury i statusu
dostawy.

Pozdrawiam,
Marek
dominik.tylczynski
Posty: 8465
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1991 times
Been thanked: 1501 times

Re: User-exit wywołany po zapisie faktury (w VBRK)

Post autor: dominik.tylczynski »

W takich przypadkach niezawodnym rozwiązaniem jest uruchomienie własnego kodu z poziomu informacji wyjściowej. Informacje wyjściowe mogą być wykorzystane nie tylko do generowania wydruków, ale również do uruchomienia własnego kodu / dodatkowego przetwarzania po zaksięgowaniu dokumentu.

Robisz to generalnie następująco:
  1. Konfigurujesz w NACE nowy rodzaj informacji wyjściowej dla aplikacji V3 "Billing", bo chcesz własny kod uruchomić po zaksięgowaniu faktury SD. To samo podejście działa naturalnie dla innych aplikacji, np. ME "Inventory Management", jeślibyś chciał uruchomić kod po zaksięgowaniu dokumentu materiałowego.
  2. Konfigurujesz ustalanie tej informacji wyjściowej tj. sekwencja dostępu, dostępy, tablice warunków wg własnego uznania i potrzeb.
  3. Rodzaj informacji wyjściowej ustawiasz jako niezależny od partnera.
  4. W sekcji "Processing routines" dajesz "transmission medium" = A "special function" oraz podajesz program, który ma być uruchomiony po zaksięgowaniu faktury.
Popatrz jak jest skonfigurowana standardowa informacja wyjściowa WMTA dla aplikacji V2 "shipping" (dostawy). Tak informacja wyjściowa tworzy automatycznie zlecenie przeniesienia dla dostawy wychodzącej.

Jeśli Twoja informacja wyjściowa będzie przetwarzana natychmiast po zaksięgowaniu faktury, to zostanie wywołana w update task'u. Zatem na fakturze będą jeszcze założone blokady. Jeśli Twój program ma modyfikować np. fakturę, czy jakikolwiek inny obiekt, który jest blokowany podczas księgowania faktury, musisz te blokady uwzględnić w swoim kodzie. Bardzo fajnie jest to rozwiązane w implementacji przetwarzania standardowej informacji wyjściowej SPED dla dostaw wychodzących, aplikacja V2 "Shipping". Ten kawałek kodu:

Kod: Zaznacz cały

  DATA: lf_leave           TYPE xfeld.

* (0) Redirect this NAST processing to separate LUW - in case it is
*     called with processing time 4 (Immediate) in the update task
  CALL FUNCTION '/SPE/CALL_PROC_IN_NEW_LUW'
    EXPORTING
      is_nast  = nast
    IMPORTING
      ef_leave = lf_leave.

  IF NOT lf_leave IS INITIAL.
* Per default we set the status on error, so that it can be reprocessed
* in error processing (RSNAST0F) if there is any syntax error / update
* termination / ... in the decoupled NAST processing.
    rc = 4.
    EXIT.
  ENDIF.
sprawdza czy przetwarzanie informacji wyjściowej odbywa się w update task'u i przenosi przetwarzanie do oddzielnej transakcji (LUW - logical unit of work). Działa to niezwodnie.

Podsumowując, polecam to podejście i trik z implementacji SPED. Stosowałem wielokrotnie, sprawdza się na 100%
wojtas7
Posty: 1087
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 72 times
Been thanked: 325 times

Re: User-exit wywołany po zapisie faktury (w VBRK)

Post autor: wojtas7 »

Czyli jeśli kod w informacji wyjściowej potrzebuje zmieniać dokument, który przy Immediate będzie zawsze zablokowany, to informacja wyjściowa będzie zawsze na początku w błędzie na czerwono i job z tym programem do postowania informacji wyjściowych uruchomi to po jakimś czasie?

Tak to ma działać?

Widziałem wiele kadłubków np. WAIT UP TO 10 S w pętli ...
dominik.tylczynski
Posty: 8465
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1991 times
Been thanked: 1501 times

Re: User-exit wywołany po zapisie faktury (w VBRK)

Post autor: dominik.tylczynski »

Standardowe rozwiązanie z implementacji przetwarzania informacji wyjściowej SPED nie wymaga żadnych dodatkowych zadań w tle.
Przyjrzyj się dokładnie implementacji początku procedury STO_ID_CREATION w programie /SPE/STO_ID_PROCESSING:
  1. Funkcja /SPE/CALL_PROC_IN_NEW_LUW sprawdza czy przetwarzanie odbywa się w update task'u.
  2. Jeśli nie to ta funkcja nie robi nic i przetwarzanie informacji wyjściowej odbywa się normalnie - parametr wyjściowy EF_LEAVE z funkcji /SPE/CALL_PROC_IN_NEW_LUW ma wartość początkową
  3. Jeśli przetwarzanie odbywa się update task'u to funkcja /SPE/CALL_PROC_IN_NEW_LUW rejestruje informację wyjściową do przetworzenia w oddzielnej LUW (robi to funkcja /SPE/CALL_PROC_NAST) i w logu informacji wyjściowej zapisuje komunikat /SPE/VL 300 "Output processing has been triggered in a new task"
  4. Informacja wyjściowa jest przetwarzana w oddzielnej transakcji LUW już po zdjęciu blokad. Przez krótki czas pomiędzy zarejestrowaniem informacji wyjściowej do przetworzenia w oddzielnej LUW, a faktycznym jej przetworzeniem, informacja wyjściowa ma status "błąd" - odpowiada za to ten kawałek kodu:

    Kod: Zaznacz cały

      IF NOT lf_leave IS INITIAL.
    * Per default we set the status on error, so that it can be reprocessed
    * in error processing (RSNAST0F) if there is any syntax error / update
    * termination / ... in the decoupled NAST processing.
        rc = 4.
        EXIT.
      ENDIF.
Co prawda funkcja /SPE/CALL_PROC_IN_NEW_LUW została przygotowana do przetwarzania informacji wyjściowych z dostaw wychodzących, ale bez problemu stosowałem ją do m.in. informacji wyjściowych z dokumentów materiałowych.

Innym podejściem jest ustawienie czasu przetwarzania informacji wyjściowej na 3 i przetwarzania ich przy pomocy zadania w tle.
zuser
Posty: 5
Rejestracja: sob paź 19, 2019 11:50 am
Has thanked: 7 times
Been thanked: 3 times

Re: User-exit wywołany po zapisie faktury (w VBRK)

Post autor: zuser »

Przede wszystkim bardzo dziękuję za pomoc, za czas, który mi został poświęcony.

Istotnie można to rozwiązać za pomocą kodu w informacji wyjściowej ale osobiście
chciałbym taki sposób rezerwować jako ostatni. Wolę aby informacja wyjściowa
była związana z opracowaniem obiektów (wydruk, Idoc, dostawa międzyzakładowa)
niż z wykonaniem dowolnego kodu. Niemniej bardzo dziękuję za ten pomysł bo
w wielu przypadkach może to być ostatnia deska ratunku.

Postanowiłem nie poddawać się i znaleźć sposób na wywołanie kodu po
zapisie faktury.

Rozwiązanie

Rozwiązaniem okazało się uruchomienie własnego modułu funkcyjnego w trybie
"UPDATE TASK" w pierwszym lepszym exicie służącym do transferu SD > FI
(SDVFX001 / EXIT_SAPLV60B_001). To co spowodowało, że moje wcześniejsze
próby kończyły się niepowodzeniem był brak precyzyjnego oznaczenia rodzaju przebiegu
w definicji modułu funkcyjnego. Ważne okazało się nie tylko oznaczenie modułu jako
modułu aktualizacji ale zaznaczenie opóźnionego rozpoczęcia).

Po zaznaczeniu odpowiednich opcji aktualizacji i wywołaniu modułu funkcyjnego w trybie
"UPDATE TASK" będzie on uruchomiony PO opracowaniu faktury (VF01) oraz PO wykonaniu storna (VF11).
Umieszczenie modułu funkcyjnego w EXIT_SAPLV60B_001 umożliwia ponadto dostęp do struktury VBRK,
która jest w całości wypełniona. W tej strukturze będzie również dostępny numer faktury
(VBRK-VBELN)

Jedyne jeszcze nad czym muszę się zastanowić to sprawdzić, czy kod nie będzie przypadkiem
uruchamiany zawsze gdy będzie naczytywana CO-PA (KE4S). Jeżeli tak to warto zawiesić
wykonywanie jeżeli nadrzędnym programem będzie KE4S.

Jeszcze raz bardzo dziękuję Wszystkim za pomoc,
Marek

PS. Umieszczę jeszcze dodatkowo opis po angielsku, żeby kolejna osoba nie musiała się
męczyć.
Ostatnio zmieniony pn lut 17, 2020 10:10 pm przez zuser, łącznie zmieniany 3 razy.
zuser
Posty: 5
Rejestracja: sob paź 19, 2019 11:50 am
Has thanked: 7 times
Been thanked: 3 times

Re: User-exit wywołany po zapisie faktury (w VBRK)

Post autor: zuser »

If you are searching for a user-exit that is triggered AFTER the billing document is saved
use the following solution (as there is no USEREXIT_SAVE_DOCUMENT for the billing document)

1. create your own z function module with processing type "Update Module" and
"Start delayed" (very important). Define wa_vbrk as the function module
input parameter and add your code you want to be run AFTER the billing document is saved.

2. call your function module from user-exit that is used for transfering data
from SD billing header to FI account header - SDVFX001 / EXIT_SAPLV60B_001

Remember to call your function module in UPDATE TASK. Pass to your
function module vbrk structure that is filled by EXIT_SAPLV60B_001 (billing
document is ALSO AVAILABLE)

3. Your function module will be called AFTER the invoice creation (VF01) as well
as AFTER the invoice cancellation (VF11). Your code will have access to the updated VBRK
and VBRP tables.
arktus
Posty: 2
Rejestracja: czw lip 23, 2020 6:56 pm
Been thanked: 1 time

Re: User-exit wywołany po zapisie faktury (w VBRK)

Post autor: arktus »

EDIT
Odkopałem temat, bo miałem wymóg automatycznego uzupełniania tekstów w nagłówku i pozycjach faktury. Po kilku godzinach w debuggerze rozwiązanie zaproponowane przez zuser okazało się najlepsze :) .
dominik.tylczynski
Posty: 8465
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1991 times
Been thanked: 1501 times

Re: User-exit wywołany po zapisie faktury (w VBRK)

Post autor: dominik.tylczynski »

arktus pisze: pt mar 29, 2024 10:27 am EDIT
Odkopałem temat, bo miałem wymóg automatycznego uzupełniania tekstów w nagłówku i pozycjach faktury. Po kilku godzinach w debuggerze rozwiązanie zaproponowane przez zuser okazało się najlepsze :) .
Przemyśl jeszcze czy faktycznie używanie tego generycznego rozszerzenia po zapisie faktury jest najlepszym rozwiązaniem do ustalania tekstów.
Procedurę ustalania tekstów dla faktur SD możesz bardzo elastycznie skonfigurować. W sekwencji dostępu dla danego text ID możesz przypisać procedurę transfer danych - transakcja VOTXN:
20240402_110945.png

Ta procedura jest implementowana w ABAPie wg szablonu:

Kod: Zaznacz cały

*---------------------------------------------------------------------*
*       FORM DATEN_KOPIEREN_01                                        *
*---------------------------------------------------------------------*
*       The following work areas are available:                       *
*                                                                     *
*         FTVCOM   - Communications block                             *
*         FXTHEAD  - Text header                                      *
*         FXVBPA   - Partner                                          *
*         REFERENZ - Work area for text module                        *
*                                                                     *
*       In order to reference a text, the work area REFERENCE is to be*
*       filled.  The language of the text is derived from TTXVR       *
*                                                                     *
*       The messages are stored in table 100 with message ID 'VX'.    *
*
*---------------------------------------------------------------------*
*       Example:                                                      *
*       In order to use the standard text,  RV_USER_EXIT_01 the       *
*       following entries in the Workarea REFERENZ need to be made:   *
*          REFERENZ-TDID     = 'ST  '.                                *
*          REFERENZ-TDOBJECT = 'TEXT      '.                          *
*          REFERENZ-TDNAME   = 'RV_USER_EXIT_01'.                     *
*       In TTXVR, the reference language is listed, for example       *
*       TTXVR-SPRAS = 'D'.                                            *
*---------------------------------------------------------------------*

FORM DATEN_KOPIEREN_01.

ENDFORM.
Możesz tutaj zaimplementować własną logikę, która wstawi do tekstu faktury dowolny tekst standardowy.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
arktus
Posty: 2
Rejestracja: czw lip 23, 2020 6:56 pm
Been thanked: 1 time

Re: User-exit wywołany po zapisie faktury (w VBRK)

Post autor: arktus »

Rozpoznałem propozycję Dominika i niestety w moim przypadku się nie sprawdzi. Teksty tworzone są dynamicznie na podstawie danych ustalanych przez system w trakcie tworzenia faktury. User exit dla tekstów wywoływany jest zbyt wcześnie, zanim te dane zostaną stworzone.