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
User-exit wywołany po zapisie faktury (w VBRK)
-
- 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)
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:
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: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%
Robisz to generalnie następująco:
- 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.
- Konfigurujesz ustalanie tej informacji wyjściowej tj. sekwencja dostępu, dostępy, tablice warunków wg własnego uznania i potrzeb.
- Rodzaj informacji wyjściowej ustawiasz jako niezależny od partnera.
- W sekcji "Processing routines" dajesz "transmission medium" = A "special function" oraz podajesz program, który ma być uruchomiony po zaksięgowaniu faktury.
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.
Podsumowując, polecam to podejście i trik z implementacji SPED. Stosowałem wielokrotnie, sprawdza się na 100%
-
- 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)
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 ...
Tak to ma działać?
Widziałem wiele kadłubków np. WAIT UP TO 10 S w pętli ...
-
- 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)
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:
Innym podejściem jest ustawienie czasu przetwarzania informacji wyjściowej na 3 i przetwarzania ich przy pomocy zadania w tle.
Przyjrzyj się dokładnie implementacji początku procedury STO_ID_CREATION w programie /SPE/STO_ID_PROCESSING:
- Funkcja /SPE/CALL_PROC_IN_NEW_LUW sprawdza czy przetwarzanie odbywa się w update task'u.
- 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ą
- 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"
- 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.
Innym podejściem jest ustawienie czasu przetwarzania informacji wyjściowej na 3 i przetwarzania ich przy pomocy zadania w tle.
Re: User-exit wywołany po zapisie faktury (w VBRK)
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ć.
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.
Re: User-exit wywołany po zapisie faktury (w VBRK)
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.
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.
-
- Posty: 2
- Rejestracja: czw lip 23, 2020 6:56 pm
- Been thanked: 1 time
Re: User-exit wywołany po zapisie faktury (w VBRK)
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 .
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 .
-
- 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)
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:
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.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
-
- Posty: 2
- Rejestracja: czw lip 23, 2020 6:56 pm
- Been thanked: 1 time
Re: User-exit wywołany po zapisie faktury (w VBRK)
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.