Ustawienia > Firma > Parametry pracy > Wykonywanie procedur > Obsługa zdarzeń w języku raportów

Drukuj

Obsługa zdarzeń w języku raportów

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

hmtoggle_plus1Dokumenty sprzedaży

hmtoggle_plus1Płatności

hmtoggle_plus1Dokumenty zakupu

hmtoggle_plus1Dokumenty magazynowe

 

 

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 języku szablonów programu Symfonia Handel 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.