Ustawienia > Firma > Parametry pracy > Wykonywanie procedur > Obsługa zdarzeń w języku raportów | | Drukuj |
Włączenie ustawień w grupie parametrów pracy Wykonywanie procedur, uaktywnia uruchamianie procedur AmBasic przy wystąpieniu określonego zdarzenia. W katalogu Procedury kartoteki raportów znajdują się raporty definiujące akcje dla zdarzeń przy pracy z poszczególnymi dokumentami i elementami kartotek:
Nazwa raportu |
Procedury uruchamiane przy pracy z |
Procedury dokumentu sprzedaży |
dokumentem sprzedaży |
Procedury dokumentu zakupu |
dokumentem zakupu |
Procedury dokumentu magazynowego |
dokumentem magazynowym |
Procedury dokumentu płatności |
dokumentem płatności |
Procedury kontrahenta |
kontrahentem |
Procedury pracownika |
pracownikiem |
Procedury urzędu |
urzędem |
Procedury towaru |
towarem |
Procedury rezerwacji |
rezerwacją towaru |
Procedury receptury |
recepturą |
Procedury zlecenia |
zleceniem |
Procedury zamówienia obcego |
zamówieniem obcym |
Procedury zamówienia własnego |
zamówieniem własnym |
Aby procedury były uruchamiane przez program muszą być włączone (domyślnie nie są).
Zakres obsługi zdarzeń jest różny dla okien w widoku nowym i klasycznym. Więcej informacji >>
Zdarzenia dla: dokumentów sprzedaży, zakupu, magazynowych, zamówień obcych, zamówień własnych
Procedura |
Moment wywołania |
int OnAddNewDokument(long lId) |
Procedura wywoływana tuż po utworzeniu nowego dokumentu w buforze (po naciśnięcie guzika ‘Nowy’ w kartotece dokumentów), jako argument przekazywany jest id dokumentu. |
int OnKhChanged(long lId) |
Procedura wywoływana po zmianie kontrahenta na dokumencie znajdującym się w buforze, jako argument przekazywany jest id dokumentu, jeśli procedura zwróci wartość -6000 program nie pozwoli użytkownikowi na opuszczenie pola kod na formatce dokumentu. |
int OnBeforeInsert(long lId) |
Procedura wywoływana tuż przed wystawieniem dokumentu (po wciśnięciu guzika wystaw), jako argument przekazywany jest id dokumentu, jeśli procedura zwróci wartość -6000 to wystawianie dokumentu zostanie przerwane. |
int OnAfterInsert(long lId) |
procedura wywoływana tuż po udanym wystawieniu dokumentu, jako argument przekazywany jest id dokumentu |
int OnBeforeEdit(long lId) |
Procedura wywoływana tuż przed próbą edycji wystawionego dokumentu, jako argument przekazywany jest id dokumentu, jeśli procedura zwróci wartość -6000 to edycja dokumentu nie będzie możliwa. |
int OnBeforeBuforEdit(long lId) |
Procedura wywoływana tuż przed próbą edycji dokumentu w buforze, jako argument przekazywany jest id dokumentu, jeśli procedura zwróci wartość -6000 to edycja dokumentu nie będzie możliwa. |
int OnAfterUpdate(long lId) |
Procedura wywoływana po zapisaniu edytowanego wystawionego dokumentu, jako argument przekazywany jest id dokumentu.
|
int OnAfterBuforUpdate(long lId) |
Procedura wywoływana po zapisaniu dokumentu w buforze, jako argument przekazywany jest id dokumentu. |
int OnBeforeDelete(long lId) |
Procedura wywoływana przed usunięciem wystawionego dokumentu, jako argument przekazywany jest id dokumentu, jeśli procedura zwróci wartość -6000 program nie usunie dokumentu. |
int OnBeforeBuforDelete(long lId) |
Procedura wywoływana przed usunięciem dokumentu z bufora (także wystawionego zamówienia), jako argument przekazywany jest id dokumentu, jeśli procedura zwróci wartość -6000 program nie usunie dokumentu. |
int OnAfterDelete(long lId) |
Procedura wywoływana po usunięciu wystawionego dokumentu, jako argument przekazywany jest id rekordu z bazy dokumentów. |
int OnAfterBuforDelete(long lId) |
Procedura wywoływana po usunięciu dokumentu z bufora (także wystawionego zamówienia), jako argument przekazywany jest id rekordu z bazy dokumentów. |
int OnBeforeAnuluj(long lId) |
Procedura wywoływana tuż przed próbą anulowania wystawionego dokumentu, jako argument przekazywany jest id dokumentu, jeśli procedura zwróci wartość -6000 to anulowanie dokumentu nie będzie możliwe. |
int OnTwChanged(long lId) |
Procedura wywoływana jest tuż po dodaniu nowej lub zmianie istniejącej, kartotekowej pozycji dokumentu znajdującego się w buforze; jako argument przekazywany jest id pozycji dokumentu; po wybraniu towaru typu ‘komplet’ procedura wywoływana jest tylko dla dodawanego elementu typu komplet (a nie dla jego pozycji) i tylko dla dokumentów sprzedaży; po wybraniu towaru typu ‘zestaw’ nie jest wywoływana w ogóle. |
Zdarzenia dla: dokumentów płatności, kontrahentów, pracowników, urzędów, towarów, rezerwacji towarów
Procedura |
Moment wywołania |
int OnAfterInsert(long lId) |
Procedura wywoływana po utworzeniu nowego kontrahenta lub towaru, jako argument przekazywany jest id rekordu z odpowiedniej bazy (PN, KH, TW, ZZ). |
int OnBeforeDelete(long lId) |
Procedura wywoływana przed usunięciem elementu, jako argument przekazywany jest id rekordu z odpowiedniej bazy (PN, KH, TW, ZZ), jeśli procedura zwróci wartość -6000 program nie usunie elementu. |
int OnAfterDelete(long lId) |
Procedura wywoływana po usunięciu elementu, jako argument przekazywany jest id rekordu z odpowiedniej bazy (PN, KH, TW, ZZ). |
int OnAfterUpdate(long lId) |
Procedura wywoływana po zapisaniu edytowanego elementu, jako argument przekazywany jest id rekordu z odpowiedniej bazy (PN, KH, TW, ZZ). |
int OnBeforeEdit(long lId) |
Procedura wywoływana tuż przed próbą edycji elementu, jako argument przekazywany jest id rekordu z odpowiedniej bazy (PN, KH, TW, ZZ), jeśli procedura zwróci wartość -6000 to edycja elementu nie będzie możliwa. |
W przypadku procedur wywoływanych dla dokumentów można tworzyć procedury o nazwie nazwa_procedury+charakter_dokumentu, gdzie:
nazwa_procedury – jest nazwą procedur opisywanych wcześniej
charakter_dokumentu – kilkuliterowy symbol odpowiadający charakterowi dokumentu
Dzięki tej właściwości można np. utworzyć dwie procedury OnBeforeInsertFVS i OnBeforeInsertDEX, z których jedna będzie wywoływana dla faktur a druga dla dokumentów eksportowych. W przypadku braku procedury z charakterem dokumentu w nazwie, wywoływana jest standardowa procedura OnBeforeInsert.
Lista symboli
|
|
|
|
Interpretacja wartości zwracanej z procedurami
Niektóre wartości zwracane z procedur są traktowane specjalnie.
-6000 |
Traktowana jest jako błąd. Szczegółowe zachowanie programu w tym przypadku podano w opisie poszczególnych procedur. |
-7100 |
Używane w celu optymalizacji pracy z programem. Jeśli wykonanie raportu nie zmodyfikowało danych dokumentu, dane w oknie edytowanego dokumentu NIE wymagają ponownego doczytania. Jeśli raport zwróci tę wartość program nie będzie niepotrzebnie czytał z bazy danych edytowanego dokumentu. |
Procedura OnTimer
Procedura OnTimer jest wołana co stały odstęp czasowy (domyślnie co 5s) podczas pracy użytkownika w firmie. Dodatkowo przy wejściu do firmy wołana jest procedura OnOpen a przy wyjściu z firmy OnClose. Procedury są bezparametrowe a wartość zwracana jest typu int i ma znaczenie jedynie przy procedurze OnOpen – jeśli jest różna od zera program nie pozwoli na wejście do firmy. Procedury są umieszczone w katalogu raportów Procedury w raporcie Procedura OnTimer. Aby procedury były uruchamiane musi być włączony (domyślnie nie jest) odpowiedni parametr pracy: Wykonywanie procedur\OnTimer.
Interwał czasowy w jakim wykonywana jest procedura OnTimer definiowany jest:
•globalnie dla firmy w ustawieniach parametrów pracy,
•dla stanowiska przez dodanie w pliku ini programu ( %AppData%\Sage\Config\AMHMSQL.INI ) sekcji:
[Symfonia]
timeout = 10000
W pliku ini wartość przedziału podawana jest w milisekundach.
Dzięki temu można skonfigurować częste wykonywanie procedury OnTimer tylko na wybranym stanowisku (długi interwał globalny oraz krótki interwał zdefiniowany w pliku ini na wybranym stanowisku).
Istotną cechą raportu jest to że jest on ładowany do pamięci tylko raz przy wejściu do firmy, a następnie cały czas wykorzystywany. Dzięki temu między kolejnymi wywołaniami procedur pamiętane są wartości zmiennych globalnych zadeklarowanych w tym raporcie.
Polecenie Print służące do wypisania na ekranie nie zadziała w procedurze OnTimer. Należy skorzystać z polecenia Print z argumentami, które pozwolą zapisać informacje do pliku.
Procedura OnGetUpust
Procedura OnGetUpust jest wykorzystywana przy ustalaniu cen pozycji dokumentów sprzedaży i zamówień obcych. Należy ją zdefiniować z raporcie Raporty > Procedury > Procedura OnTimer, w następujący sposób:
int sub OnGetUpust(string strParam, dispatch dispParam)
//treść procedury
Endsub
Aby móc wykorzystać tę procedurę należy w parametrach pracy włączyć wykonywanie procedury OnTimer.
Argument strParams zawiera parametry wejściowe w postaci odpowiednio sformatowanego tekstu, postaci:
nazwa_parametru1 = wartosc_parametru1 nazwa_parametru2 = wartosc_parametru2 …
W celu łatwego dostępu do parametrów wejściowych należy wykorzystać odpowiedni obiekt typu XStrRW.
Poniższy przykład pokazuje sposób wykorzystania obiektu XStrRW wraz z nazwami wszystkich dostępnych parametrów wejściowych:
dispatch xt = xFactory.NewObject("XStrRW")
xt.kod = strParam
message xt.GetField("idTowar") // id towaru
message xt.GetField("idNabywca") // id nabywcy
message xt.GetField("idOdbiorca") // id odbiorcy
message xt.GetField("idDzial") // id działu
message xt.GetField("dataSprzedaz") // data sprzedaży
message xt.GetField("rejestrPlatn") // id rejestru płatności
message xt.GetField("formaPlatn") // id formy płatności
message xt.GetField("terminPlatn") // termin płatności (data)
message xt.GetField("waluta") // waluta dokumentu
message xt.GetField("komplet") //0-zwykła pozycja,
//1-pozycja kompletu
//2-nagłówek kompletu
message xt.GetField("typDk") // identyfikator typu dokumentu
message xt.GetField("seria") // nazwa serii dokumentu
Drugi argument dispParam jest obiektem typu XParams wykorzystywanym do przekazania parametrów wyjściowych. Jako dispParam.kod należy podać cenę, zaś jako dispParam.nazwa symbol waluty (pusty dla PLN), lub „%” jeśli ma to być upust, a nie cena.
Zasady traktowania zwracanej przez procedurę ceny są identyczne jak w przypadku istnienia ceny indywidualnej lub upustu indywidualnego - tam też podaje się symbol waluty lub znak %. W przypadku jednoczesnego istnienia ceny indywidualnej i ceny w procedurze ważniejsza jest ta z procedury.
Podobnie jak w cenach indywidualnych podana cena zostanie potraktowana jako cena netto w jednostce ewidencyjnej.
Procedura wykonuje się zarówno dla elementów kompletu jak i dla nagłówka kompletu, ale bardziej sensowne jest zwracanie odpowiedniej ceny albo dla elementów lub nagłówka.
Program weźmie pod uwagę wypełnioną cenę tylko i wyłącznie w przypadku gdy funkcja zwróci wartość -6000.
Prosty przykład prostego cennika generowanego na podstawie waluty dokumentu:
dispatch xt = xFactory.NewObject("XStrRW")
int sub OnGetUpust(string strParam, dispatch dispParam)
xt.kod = strParam
dispParam.kod = 5
dispParam.nazwa = "%"
if xt.GetField("komplet")!="1" && xt.GetField(“waluta”)!=”” then
OnGetUpust = -6000
endif
endsub
Raporty wywoływane z menu kontekstowego w oknach kartotek i formatkach dokumentów
Symfonia Handel umożliwia uruchamianie własnych raportów z poziomu menu kontekstowego (prawy klawisz myszy lub Shift+F10) dla okien
•formatek dokumentów w widoku klasycznym,
•kartotek w widoku nowym oraz klasycznym.
Aby raporty pojawiły się menu kontekstowym, raport należy umieścić katalogu w kartotece raportów:
•w Raporty\Procedury\Raporty z menu kartotek znajdują się podkatalogi odpowiadające poszczególnym kartotekom programu,
•w Raporty\Procedury\Raporty z menu formatek znajdują się podkatalogi odpowiadające poszczególnym formatkom obiektów kartotekowych.
Umieszczenie raportu w jednym z tych podkatalogów spowoduje, że nazwa raportu będzie widoczna w menu kontekstowym odpowiadającej mu kartoteki lub formatki i po wybraniu tej pozycji raport uruchomi się. Dodatkowo w nazwie raportu można dodać na końcu sekwencję {K} gdzie K może być znakiem z zakresu 0-1, A-Z, F1-F12. Dzięki temu raport będzie dostępny z kartoteki lub formatki również poprzez skrót klawiszowy Alt+K.
Dodatkowo istnieje prawo użytkownika Inne\Wywoływanie raportów z menu kartotek i formatek które zezwala bądź nie na wykonywanie tych procedur użytkownikowi.
Kartoteki z których mogą być wołane raporty (takie też są nazwy podkatalogów w których należy umieszczać raporty):
•Sprzedaż
•Zakupu
•Magazyn
•Zamówienia obce
•Zamówienia własne
•Pieniądze
•Raporty płatności
•Kontrahenci
•Pracownicy
•Urzędy
•Towary
•Dostawy
•Rezerwacje
•Zlecenia
Okna z których mogą być wołane raporty (takie też są nazwy podkatalogów w których należy umieszczać raporty):
•Dokument sprzedaży
•Dokument zakupu
•Dokument magazynowy
•Zamówienie obce
•Zamówienie własne
•Dokument płatności
•Kontrahent
•Pracownik
•Urząd
•Towar
•Dostawa
•Rezerwacja
•Receptura
•Zlecenie
Przykład raportu wywoływanego z kartoteki dokumentów sprzedaży (skrót klawiszowy Alt+F).
Dzięki poniższemu nagłówkowi podczas aktualizacji raportów zostaną dodane odpowiednie podkatalogi raportów jak i sam raport doda się automatycznie do właściwego podkatalogu.
---------------------------------------------------------
//"rapmenu{F}.sc","raport z menu{F}","\Procedury\Raporty z menu kartotek\Sprzedaż\",0,1.0.0,SYSTEM
////////////////////////////////
// raport z menu{F}
// rapmenu{F}.sc
/////////////////////////////
int err
long idObiektu
err = SetTaggedPos(FS)
while err
idObiektu = GetLineId()
print idObiektu
print "\n"
err = SetTaggedPos(NX)
wend
---------------------------------------------------------
Przykład raportu wywoływanego z okna towaru (skrót klawiszowy Alt+2).
Dzięki poniższemu nagłówkowi podczas aktualizacji raportów zostaną dodane odpowiednie podkatalogi raportów jak i sam raport doda się automatycznie do właściwego podkatalogu.
---------------------------------------------------------
//"rapmenu{2}.sc","raport z menu{2}","\Procedury\Raporty z menu formatek\Towar\",0,1.0.0,SYSTEM
////////////////////////////////
// raport z menu{2}
// rapmenu{2}.sc
/////////////////////////////
long idObiektu = GetLineId()
print idObiektu
---------------------------------------------------------
Funkcja int GetLineId() zwraca identyfikator (id) obiektu (dokumentu, kontrahenta, …) z formatki (okna) którego wywołany został raport. Dodatkowo, jeśli raport wywołany został z formatki dokumentu (handlowego, magazynowego lub zamówienia), a kursor znajdował się w jakiejś pozycji, identyfikator tej pozycji możemy uzyskać przy pomocy funkcji int GetLinePosId().
Procedury wywoływane z poziomu szablonu podczas importu w formacie 3.0
Program Symfonia Handel umożliwia uruchamianie własnych procedur (napisanych w języku raportów) z poziomu szablonu podczas importu danych w formacie 3.0. Dzięki temu możliwości języka szablonów zostaną poszerzone o możliwości języka raportów.
Procedura języka raportów, którą chcemy wywołać przykładowo może wyglądać jak poniżej:
String Sub NazwaProcedury (String parametr1, String parametr2)
NazwaProcedury = parametr2
EndSub
Ogólnie, zdefiniowana funkcja powinna zwracać wartość typu String. Parametrami są zmienne typu String. Dozwolone użycie maksymalnie 30 zmiennych w liście parametrów.
Przykład wywołania takiej procedury w kodzie szablonu:
Section( "INFO", "INFO")
{
LoadReport("Nazwa raportu")
@ret = RunReportProc("NazwaProcedury", "A", "B")
Info(@ret)
}
Efekt działania podanego przykładu: w oknie komunikatów związanych z importem pojawi się "B".
W programie Symfonia Handel w języku szablonów są dostępne dwa polecenia służące do tego celu:
•Polecenie LoadReport służy do załadowania do pamięci odpowiedniego raportu. Raport taki od tej chwili jest dostępny do końca procesu importu (ważne jeśli chce się w procedurach używać zmiennych globalnych).
Podczas procesu importu można załadować tylko jeden raport.
•Polecenie RunReportProc służy do wywołania procedury języka raportów. Procedura ta musi znajdować się w raporcie który został załadowany do pamięci poleceniem LoadReport. Liczba parametrów funkcji RunReportProc musi być taka sama jak wywoływanej procedury. Funkcja zwraca ciąg znaków, którego znaczenie jest zdefiniowane w procedurze wywoływanej. Może to być pojedyncza wartość, jak i lista wartości dowolnie sformatowana w zwracanym ciągu znaków, np. wartości oddzielone przecinkami.