Interní messaging - ABRA vzkazy a automatické generování zpráv
V kap. Interní messaging, e-mailová komunikace a naplánované úlohy byl popsán vnitřní systém předávání zpráv - tzv. interní messaging, s tím, že vznikají tzv. ABRA vzkazy a odeslané a doručené e-maily. Zde popíšeme podrobněji pravidla práce s ABRA vzkazy a princip generování automatických zpráv na základě splnění nějaké události specifikované kontrolním bodem (viz dále).
Dále je uvedeno:
Jak bylo zmíněno již v kap. Interní messaging, e-mailová komunikace a naplánované úlohy, vzkazy mohou vznikat různým způsobem ručně či automaticky. Viz též možnosti vytvoření nového vzkazu. Jako adresát nechť je zadán např. uživatel (např. "JOVO-Josef Vomáčka"), role (např. "Obchodníci") a externí e-mailová adresa (např. bobo@email.cz). Ve chvíli, kdy je zpráva zadána a uložena, se vygeneruje sada pomocných záznamů o vzkazech k přečtení s odkazem na právě uloženou zprávu a to pro uživatele JOVO a pro všechny uživatele s rolí "Obchodníci" (např. uživatelé Obchodník1 a Obchodník2). Zároveň se vygeneruje záznam do agendy Odeslané e-maily s adresátem bobo@email.cz.
Zda bude e-mail v agendě Odeslané e-maily vytvořený na základě vzkazu (s adresátem typu "e-mail") ve stavu "K odeslání" nebo zda bude rovnou okamžitě i odeslán, závisí na tom, odkud a jak daný vzkaz vznikl. Viz možnosti vytvoření nového vzkazu a viz možnosti odeslání e-mailů.
Každý uživatel ABRA Gen pak může v agendě Vzkazy vidět:
- vzkazy, které odeslal, jako seznam všech existujících záznamů odeslaných vzkazů filtrovaný za uživatele - odesílatele (sebe sama)
- vzkazy, které má přečíst, jako seznam všech existujících záznamů vzkazů ke čtení filtrovaný za uživatele - adresáta
Mezi záznamem odeslaného vzkazu a záznamy vzkazů ke čtení je jednoznačná vazba, která dovoluje k odeslanému vzkazu sledovat stav přečtení tohoto vzkazu všemi adresáty.
Při tvorbě záznamů vzkazů ke čtení se kontroluje duplicita. Tj. pokud je uživatel současně ve více rolích nebo je současně jako adresát vyjmenován i jmenovitě, záznam se pro něj vygeneruje jen jeden.
Pokud přijde nový vzkaz:
- Objeví se v tray oblasti ikonka nového vzkazu . Lze na ni dvakrát kliknout (dvojitým kliknutím myši) a skočit tak hned do agendy Vzkazy.
- Navíc se objeví na dobu několika sekund okno s informací, že přišel nový vzkaz. V okně lze kliknout na odkaz "Vzkazy" a skočit tak hned do agendy Vzkazy:
Příklad zobrazeného okna s informací o nových doručených vzkazech, počtu dosud nepřečtených vzkazů včetně informace o jméně uživatele a názvu spojení na databázi
Okno se defaultně zobrazuje cca 10s. Prodloužení doby zobrazení lze nastavit v konfiguračním souboru Nexus.cfgv sekci [Client] v parametru ABRAMsgNewInfoDisplayTime. Pokud si okna uživatel nevšimne, stále mu zůstává ikonka v tray oblasti, která má obdobnou funkčnost.
Více viz kap. Konfigurační soubor Nexus.cfg - oddíly a parametry.
- Pokud při spuštění ABRA Gen existují nepřečtené vzkazy pro aktuálně přihlášeného uživatele, ABRA Gen o tom zobrazí okno s informací obdobně jako v předchozím případě.
Možnosti označení doručeného vzkazu jako přečtený:
- automaticky, jakmile si uživatel-adresát na daném vzkazu zobrazí záložku Detail
- automaticky, pokud v seznamu vzkazů na daném vzkazu stojí kurzor po dobu cca 3s (dáno z programu, nelze uživatelsky nastavovat) a v agendě je zatrženo Automatické označování
- ručně pomocí funkce Označit vzkazy
Stav přečtení je viditelný v záložce Detail, subzáložce Stav. V seznamu vzkazů jsou nepřečtené graficky zvýrazněny (viz Vzkazy - záložka Seznam). Jakmile je doručený vzkaz označen u adresáta jako přečtený, promítne se tato informace zpětně i do subzáložky Stav u daného odeslaného vzkazu. Odesílatel se tedy může informovat, jestli adresát už vzkaz přečetl.
Výše uvedené neplatí pro vzkazy adresované na externí e-mailové adresy, kde nelze zajistit zpětnou informaci o přečtení.
Aby se databáze zbytečně nehltila již starými a vyřízenými vzkazy a přitom mazání vzkazů bylo řízené, je možné na vzkazu nastavit příznak po smazání všemi adresáty smazat. Ten způsobí, že jakmile vzkaz smažou všichni adresáti, vzkaz se automaticky vymaže (a to jak samotný odeslaný vzkaz, tak všechny záznamy vzkazů ke čtení, které z něj vyplynuly). Uživatel může jemu doručené vzkazy mazat bez omezení. (Když adresát doručený vzkaz smaže, záznam tohoto vzkazu ke čtení se označí příznakem Smazáno, ale fyzicky se vymaže až najednou spolu s mazáním zdrojového odeslaného vzkazu). Zprávy na externí e-mailové adresy se z agendy Odeslané e-maily již nesmažou, ale budou odeslány.
Smazat odeslaný vzkaz lze rovněž ručně. Smazat ručně vzkaz může pouze ten, kdo daný vzkaz vytvořil (odesílatel vzkazu) - což plyne automaticky už z toho, že pouze jemu se zobrazí v odeslaných vzkazech. Viz strom vzkazů a "zafiltrování" zobrazených odeslaných vzkazů jen za přihlášeného uživatele. Pokud uživatel odeslaný vzkaz vymaže, bude zároveň odstraněn i všem uživatelům z doručených vzkazů bez ohledu na to, zda ho už přečetli, či nikoliv (toto smazání je nevratné).
Omezení automatického mazání: Pokud mezi adresáty vzkazu byla externí e-mailová adresa, pak se automatické smazání neuplatní, protože nelze zajistit, aby se systém dozvěděl, zda a kdy si uživatel daný e-mail vzniklý ze vzkazu na externí e-mailovou adresu přečetl.
Další možností, jak řídit množství vzkazů zobrazovaných uživateli, je nastavení časové platnosti vzkazu v položce Platnost do. Vzkazy, které mají prošlou platnost, již adresát neuvidí, a po zavření a znovuotevření agendy jsou automaticky smazány (bez ohledu na stav přečtení všemi adresáty). Objasníme na příkladu:
Správce pošle všem uživatelům zprávu "Do deseti minut opusťte systém, bude provedena údržba databáze" a protože ví, že údržba bude trvat asi 2 hodiny, dá vzkazu časovou platnost 2 hodiny. Uživatelé, kteří jsou v systému, vzkaz obdrží a přečtou. Ti, co ale v systému v této době nejsou a přihlásí se třeba až další den, tak tuto zprávu už v doručených vzkazech mít nebudou, protože vzkaz bude mít prošlou dobu platnosti. Nebudou tedy tímto vzkazem zbytečně otravováni. Správce systému ve své agendě vzkazů tento vzkaz uvidí i po dvou hodinách. Nicméně, jakmile zavře a znovuotevře agendu Vzkazů, už jej neuvidí, vzkaz se automaticky vymaže (a to jak samotný odeslaný vzkaz, tak všechny záznamy vzkazů ke čtení, které z něj vyplynuly).
Zprávy v elektronické komunikaci mohou mít přílohy. Přílohou může obecně být cokoliv (typicky soubor - binární data). ABRA Gen ale navíc umožňuje zadávat extra přílohy, které dovolují vzkaz svázat:
- s odkazy na ABRA doklady
- s odkazy na objekty agend systému ABRA (např. firma z Adresáře)
- s klasickým odkazem na web (url)
- s odkazy na naplánované úlohy
Tyto odkazy mají tu výhodu, že uživatel, kterému je zpráva určena, si může rovnou ze vzkazu daný odkaz prohlédnout, tj. např. pouhým kliknutím na odkaz na doklad otevřít příslušnou dokladovou agendu a daný doklad a objekt v ní zobrazit.
Možnosti vložení odkazů:
- Ručně - odkazy na doklad, objekt a www adresu - Vložení tohoto odkazu se provede pomocí funkce Vložit odkaz v editaci vzkazu.
Odkaz na doklad nelze zadat pro všechny typy dokladů, ale jen na některé. Stejně tak je i seznam agend, na jejichž objekt je možné vytvořit odkaz, omezen na agendy, u nichž to má význam. Dále viz Průvodce vytvořením přílohy, odkaz na doklad.
- Automaticky - odkazy na doklad - Vložení odkazu na doklad se provede také automaticky v případě, že se jedná o vzkaz generovaný automaticky na základě definice automatického vzkazu typu ID (což je jedna z možností vytvoření nového vzkazu). Viz též dále Generování automatických zpráv.
- Automaticky - odkazy na naplán. úlohy - Vložení tohoto odkazu na napl. úlohu se provede automaticky v případě, že se jedná o vzkaz generovaný automaticky v rámci provádění naplánované úlohy (což je jedna z možností vytvoření nového vzkazu). Ručně jej vložit nelze. Viz též dále Generování automatických zpráv. Po kliknutí na odkaz funkce vyvolá agendu Naplánované úlohy a otevře ji "přes" agendu Vzkazy. Zde jsou k dispozici všechny funkce dané agendy. Takto odtud vyvolaná agenda se otevře rovnou s přednastaveným omezením, tzv. červeným omezením, a to za naplánovanou úlohu, která zaslání vzkazu způsobila. Toto červené omezení však můžete v záložce Omezení vyvolané agendy standardně zrušit (vyčistit) a získat záznamy podle libovolného jiného omezení nebo zcela bez omezení (a mít pak k dispozici seznam všech existujících záznamů daného typu apod.).
Objasníme na příkladech:
Příklad 1: Je tedy možné vygenerovat automatickou zprávu "Faktura FV-1250/2008 byla právě zaplacena", přičemž kliknutím na odkaz s číslem dokladu se otevře agenda vydaných faktur a zmíněná faktura se v ní zobrazí.
Příklad 2: Uživateli XY pošleme vzkaz "Prosím, zkontroluj navrhované ceny v nabídce NV-198/2008". Adresátovi se kliknutím na číslo NV otevře agenda Nabídek a daná NV se v ní zobrazí.
Příklad 3: V definici naplánovaných úloh má uživatel nastaveno, že se mu má po dokončení úlohy poslat vzkaz v případě, že dojde při jejím zpracování k chybě. Pokud mu takový vzkaz dojde, může si rychlým kliknutím na odkaz ihned zobrazit, o kterou úlohu se jedná a zkontrolovat ji.
Dále je uvedeno:
Generování automatických vzkazů zajišťuje automatizační server. Automatizační server požadavky generuje v rámci spuštění naplánované úlohytypu Automatické vzkazy, která je pro tento účel určena. Automatické vzkazy generuje podle interního "seznamu požadavků". Tento seznam požadavků vzniká následovně:
Definování jednotlivých kontrolních bodů v systému ABRA Gen a implementace ve skriptování
Na konkrétní místa systému ABRA lze rozmístit tzv. kontrolní body (WatchDogPoints), typicky do místa před okamžik "uložení business objektu" (např. uložení faktury). Kontrolní bod zajišťuje "hlídání" daného místa programu. Pokud se stane to, co je "hlídáno" (tj. např. dojde právě k uložení daného business objektu, tedy program projde daným kontrolním bodem), může být vygenerován "požadavek na vzkaz". Zda se tak stane a zda na základě tohoto požadavku vznikne později konkrétní vzkaz, závisí na tom, zda k danému kontrolnímu bodu existuje definice automatických vzkazů a jak je nadefinována, viz dále. Je třeba brát také v úvahu, že kontrolní bod, který byl přesunut do skrytých (tj. vymazán s možností obnovení) nemá nadále na generování vzkazů vliv.
Kontrolní body se evidují a zadávají v agendě Kontrolní body. Může se jednat o systémové kontrolní body dodávané výrobcem nebo o uživatelské. V kontrolním bodu se mj. udává seznam agend, kde se má kontrolní bod zaregistrovat. "Hlídání" daného místa uživatelským kontrolním bodem se implementuje pomocí skriptování. Implementací se rozumí, že každý uživatelský kontrolní bod má jednoznačnou vazbu na odpovídající balíček skriptů téhož jména, jako bylo zadáno v sekci Konfigurace skriptování v definici kontrolního bodu, přičemž v tomto balíčku je jednak dáno, kde v programu budou kontrolní body umístěny a jaké místo programu bude tedy "hlídáno" (typicky do místa před okamžik "uložení business objektu", ale mohou být i v jiné metodě) a dále, jaké možnosti se budou uživateli nabízet v nástroji pro tvorbu definic automatických vzkazů z daných agend. Vlastní seznam agend zadaných v definici kontrolního bodu je tedy vlastně definice toho, kde a jak se vytvoří uživatelům nástroj (funkce Autom. vzkazy) pro tvorbu definic autom. vzkazů a jak se vygeneruje šablona pro balíček skriptů, viz dále.
Balíček skriptů navázaný na kontrolní bod tedy obsahuje:
- skripty druhu Business objekt pro Business objekty, které odpovídají agendám uvedeným v seznamu agend v definici kontrolního bodu. Tyto skripty musí obsahovat metodu CFxWDRHelper.CheckWatchDog. (Tj. musí být zaregistrován WatchDogPoint v dané agendě).
- skript druhu Knihovna téhož jména, jako bylo zadáno v sekci Konfigurace skriptování v definici aktuálního kontrolního bodu. Ten obsahuje metody, pomocí nichž lze implementovat funkcionalitu, která se pak bude nabízet v Průvodci tvorbou definice automatického vzkazu volaném z funkce Autom. vzkazy. Jedná se o následující metody (jsou dány pevně z programu):
- GetHelperCaption
- GetHelperDescription
- GetWDPInternalName
- IsConditionHelper
- GetRequestDescription
- GetRequestCondition
- GetRequestSubject
- GetRequestMessage
- CreateWizardFrame
- ValidateWizardFrame
- GetValuesFromControls
Význam metod viz Praktické příklady, zejména Příklad 3 - uživatelský kontrolní bod, výrazová definice autom. vzkazu.
Výše uvedené je možné nechat si vytvořit automaticky a to funkcí Generovat knihovnu z agendy Kontrolního bodu (tj. vytvoří šablonu knihovny (metody je samozřejmě třeba doimplementovat) a podle agend zadaných v definici kontrolního bodu vytvoří skripty druhu Business objekt a umístí do nich funkci CFxWDRHelper.CheckWatchDog).
Je třeba, aby zde byly skripty druhu Business objekt (nikoli druhu Agenda). Jinak by se požadavky na vzkazy generovaly, jen pokud by došlo k uložení sledovaného objektu skrze agendu. Např. pokud by došlo k uložení dodacího listu v agendě dodacích listů. Pokud by ale dodací list byl uložen díky uložení faktury se skladovými řádky, tak by se vzkaz negeneroval. Také by nedošlo ke generování vzkazu, pokud by dodací list byl ukládán z OLE, nebo ze skriptování. Proto volání metody s generováním vzkazu musí být "pověšené" na business objekt.
Příklad skriptu knihovny:
Příklad části skriptu knihovny vygenerovaného automaticky k zadanému kontrolnímu bodu
Procedura CheckWatchDog a příklad skriptu pro agendu:
Nabídka procedury CheckWatchDog v Class exploreru ve skriptování
Ukázka jednoduché implementace operace, která zaháčkuje kontrolní bod před uložení dokladu v agendě Faktury vydané.
Definice automatických vzkazů a požadavky na vzkazy:
K jednotlivým kontrolním bodům lze poté nadefinovat Definice automatických vzkazů.
Typy definic - Definice jsou dvojího typu:
- ID-čkové - odkazuje se na konkrétní ID sledovaného objektu (např. na jeden konkrétní doklad), vloží do vzkazu odkaz na daný doklad, viz Speciální odkazy na ABRA doklady, objekty agend systému ABRA, www adresy a naplánované úlohy
- Výrazové - je dána nějaká podmínka výrazem (např. "částka faktury je větší než ...").
Definice autom. vzkazů určují, "co se má poslat" (předmět a text vzkazu), "komu" (seznam adresátů) a dále za jakých podmínek (ID odpovídá ukládanému dokladu nebo je splněna podmínka zadaná ve výrazu) se má poslat vzkaz, pokud nastane to, co je kontrolním bodem "hlídáno", tj. program projde kontrolním bodem. Pokud pro kontrolní bod existuje definice autom. vzkazu pro nějakou agendu, tak se při každém průchodu programu kontrolním bodem, např. při uložení sledovaného objektu v dané agendě (např. uložení faktury) vygeneruje do pomocné interní tabulky cosi jako "požadavek na vzkazy" s údaji potřebnými pro vyhodnocení podmínky zadané v definici autom. vzkazu.
Když pak automatizační server spustí naplánovanou úlohu typu Automatické vzkazy, tak projde záznamy v této tabulce, vyhodnotí, je-li podmínka v definici autom. vzkazu splněna a pokud ano, zajistí vygenerování odpovídajícího vzkazu.
- Je třeba zajistit běh automatizačního serveru, viz Co je třeba k provozu e-mailů a interních vzkazů.
- Musí být zadána alespoň jedna Naplánovaná úlohatypu Automatické vzkazy - interval spouštění by měl být rozumně krátký (aby vzkazy "chodily" adresátům včas).
- Musí existovat Kontrolní bod(y) (WatchDogPoints) pro místa, která chce uživatel sledovat. Uživatel může využít dodávané systémové kontrolní body nebo si může nadefinovat vlastní uživatelské a implementovat požadovanou funkcionalitu ve skriptování, viz výše.
- Musí existovat Definice automatických vzkazů pro dané kontrolní body a příslušné agendy.
Zasílané zprávy generované dle kontrolních bodů nemusí mít předmět a text zadán zcela napevno, ale lze do nich vkládat tzv. makra. Tj. mohou obsahovat interaktivní hodnoty. Více viz popis položek Předmět a Text zprávy v definici automatického vzkazu.
Dále jsou uvedeny praktické příklady:
Příklad: Nechť obchodník vystavil fakturu a chce být informován, pokud dojde k jejímu zaplacení, jelikož poté bude sjednávat s klientem další kroky apod.
Na tomto příkladu si demonstrujeme použití systémového kontrolního bodu Zaplacení dokladu a vytvoření definice automatického vzkazu typu ID podle něj.
Detail kontrolního bodu Zaplacení dokladu. Tento bod nemá žádnou vazbu na skriptování (není potřeba, funkcionalita je dána v dodávaném programu) ani nemá zadané agendy, pro něž má platit (není potřeba, opět je to dáno programem a platí pro všechny, kde lze doklady platit).
Nadefinujeme si novou definici automatického vzkazu pro tento kontrolní bod. To lze nejjednodušeji takto:
- Otevřeme agendu faktur vydaných a dohledáme sledovanou fakturu. Nechť je to např. FV-8/2009. Postavíme kurzor na ni.
- Vyvoláme funkci Autom. vzkazy. Vyvolá se Průvodce tvorbou definice automatického vzkazu.
- V 1. kroku průvodce v položce Kontrolní bod vybereme "Zaplacení dokladu". V položce Typ průvodce vybereme volbu "Změna zaplacení dokladu":
Zadání hodnot v 1. kroku průvodce. ABRA vzhled modrý.
- V dalším kroku zadáme adresáty.
- Tento typ průvodce již další kroky nemá, po stisku Dokončit se uloží nová definice autom. vzkazu do agendy Definice automatických vzkazů obdobná následujícímu obrázku:
Detail definice automatického vzkazu. Údaje se předvyplnily automaticky jednak texty danými výrobcem (jelikož se jedná o systémový kontrolní bod) a jednak číslem a ID dokladu, pro který jsme funkci vyvolali. Jako adresát bude uveden přihlášený uživatel. Pokud byste chtěli definici změnit (např. přidat další adresáty, můžete tak učinit přímo v agendě Definice automatických vzkazů.
- Otevřeme agendu Naplánované úlohy a zadáme novou úlohu typu Automatické vzkazy s intervalem spouštění např. každých 5 minut:
Příklad definice naplánované úlohy.
- Zajistíme nastavení a spuštění Automatizačního serveru. Viz Co je třeba k provozu e-mailů a interních vzkazů.
Nyní bude platit: Jakmile dojde ke změně v zaplacení sledované faktury, zaznamená se interně požadavek na generování autom. vzkazu. Jakmile automatizační server spustí úlohu typu Automatické vzkazy, ti, co jsou uvedeni mezi adresáty výše vytvořené definice autom. vzkazu, dostanou vzkaz s předmětem a textem dle této definice.
Příklad: Nechť uživatel chce být informován, pokud dojde k zaplacení faktury vystavené na firmu ABC (s firmou byly problémy a uživatel chce být informován o probíhajících platbách dokladů, které na ni byly v minulosti vystaveny).
Na tomto příkladu si demonstrujeme využití systémového kontrolního bodu Zaplacení dokladu i pro výrazovou definici automatického vzkazu.
Nadefinujeme si novou definici automatického vzkazu pro tento kontrolní bod. To lze nejjednodušeji takto:
- Otevřeme agendu faktur vydaných. (Nyní nebudeme definovat definici typu ID (jako v příkladu 1), takže je jedno, na který záznam postavíme kurzor.)
- Vyvoláme funkci Autom. vzkazy. Vyvolá se Průvodce tvorbou definice automatického vzkazu.
- V 1. kroku průvodce v položce Kontrolní bod vybereme "Zaplacení dokladu" stejně jako v příkladu 1. V položce Typ průvodce ale vybereme volbu "Výraz".
- V dalším kroku zadáme adresáty.
- Tento typ průvodce má další krok, kde zadáme požadované údaje.
Zadání hodnot v 2. kroku průvodce
- Po stisku Dokončit se uloží nová definice autom. vzkazu do agendy Definice automatických vzkazů obdobná následujícímu obrázku:
Detail definice automatického vzkazu. Údaje se předvyplnily automaticky texty zadanými v průvodci. Na rozdíl od příkladu 1 se zde jedná o podmínky typu výraz. Pokud byste chtěli definici změnit (např. přidat další adresáty, můžete tak učinit přímo v agendě Definice automatických vzkazů.
- Dále musí existovat naplánovaná úloha a být zprovozněn automatizační server, jako u příkladu 1.
Nyní bude platit: Jakmile dojde ke změně v zaplacení nějaké faktury, zaznamená se interně požadavek na generování autom. vzkazu. Jakmile automatizační server spustí úlohu typu Automatické vzkazy, pak vyhodnotí podmínku (tj. zda daná faktura byla vystavena na firmu, jejíž ID bylo uvedeno ve výrazu). Pokud je podmínka splněna, pak ti, co jsou uvedeni mezi adresáty výše vytvořené definice autom. vzkazu, dostanou vzkaz s předmětem a textem dle této definice.
Příklad: Uživatel chce být upozorněn, pokud dojde k přijetí vybraného zboží.
Zde je třeba nejdříve zadat uživatelský kontrolní bod a pomocí skriptování zajistit umístění (zaháčkování) kontrolního bodu do sledované agendy. Přijetí zboží mění stavy na business objektu Dílčí skladová karta. Na příkladu budeme demonstrovat, že lze nastavit kontrolní bod i do jiné agendy (Skladové karty), než ze které je sledovaný objekt (Dílčí skladové karty). Dále zde budeme demonstrovat, jak si pomocí skriptování knihovny naprogramovat nový typ průvodce pro tento kontrolní bod a jeho chování (v našem příkladě bude sloužit pro výběr skladu).
Předpoklady příkladu:
- Musí existovat kontrolní bod, např. s názvem "Přijetí zboží". Musí mít interní název (např. WD5B2FMTMIB41CGVTMY4Z0HYXW) shodný s interním názvem uvedeným v balíčku skriptů téhož jména, jako je zadáno v konfiguraci skriptování (např. GoodsReceive) v definici kontrolního bodu a tento balíček musí obsahovat knihovnu téhož jména, jako je jméno knihovny v konfiguraci skirptování (např. rovněž GoodsReceive). Kontrolní bod je definován k agendě Skladové karty, tj. v seznamu agend je uvedena agenda Skladové karty.
- Existuje balíček skriptů s názvem GoodsReceive a knihovnou GoodsReceive. Dále obsahuje skript pro Business objekt Dílčí skladová karta pro "zaháčkování" kontrolního bodu. Balíček musí být zkompilován a mít nastaveno Používat. (Balíček skriptů bude vytvořen ke kontrolnímu bodu "Přijetí zboží" funkcí Vygenerovat knihovnu. Předvyplněná šablona skriptu bude následně doplněna).
Postup:
- Otevřeme agendu Kontrolní body a zadáme nový kontrolní bod s názvem "Přijetí zboží". Interní název nechť je např. WD5B2FMTMIB41CGVTMY4Z0HYXW. V konfiguraci skriptování zadáme název balíčku skriptů např. GoodsReceive a název knihovny GoodsReceive. V seznamu jeho agend vybereme agendu Skladové karty a uložíme.
Detail definice kontrolního bodu.
- Vytvoříme odpovídající balíček skriptů. To lze nejjednodušeji pomocí funkce Generovat knihovnu. Vygenerovaná šablona obsahuje předvyplněné metody uvedené výše, viz Metody skriptu Knihovna. Většina je prázdných, pouze GetHelperCaption, GetHelperDescriotion a GetWDPInternalName jsou předvyplněny podle údajů kontrolního bodu. Může vypadat např. takto:
Tento příklad odpovídá pouze verzi 9.02 a ve vyšších verzích se může lišit. Zde slouží pouze pro ilustrativní účely.
function GetHelperCaption(const SiteForm: TSiteForm): String; begin // Helper name in wizard form Result := 'Přijetí zboží'; end; function GetHelperDescription(const SiteForm: TSiteForm): String; begin // Helper description in wizard form Result := 'Sledování přijetí zboží'; end; function GetWDPInternalName(const SiteForm: TSiteForm): String; begin // Should return WatchDogPoint InternalName (packed GUID) // or Null packed GUID) Result := 'O1Q25DAREN3OHBMZPNMYQE3VV0'; end; function IsConditionHelper(const SiteForm: TSiteForm): Boolean; begin // Return True, if helper use expression. // Return False, if helper use business object ID. Result := True; end; function GetRequestDescription(const SiteForm: TSiteForm; const ObjId: String; Params: TNxParameters): String; begin // Should return short description about expression. // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. Result := ''; end; function GetRequestCondition(const SiteForm: TSiteForm; const ObjId: String; Params: TNxParameters): String; begin // if IsConditionHelper return False, return empty string. // if IsConditionHelper return True, return expression. // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. Result := ''; end;
- Otevřeme agendu Balíčky skriptů a doplníme knihovnu GoodsReceive. Balíček zkompilujeme a nastavíme mu Používat. V tomto příkladu např. byly upraveny popisy v metodách GetHelperCaption a GetHelperDescription, dále byl zadán druhý krok průvodce, kde uživatel může zvolit sklad, na němž chce přijetí sledovat, a dále byly doplněny texty, které se použijí pro předvyplnění názvu definice, předmětu a textu zprávy.
Úpravy provedené zde se zpětně neprojeví do definice kontrolního bodu. V každém případě musí odpovídat interní název kontrolního bodu tomu, který je uveden ve skriptu v metodě GetWDPInternalName.
Tento příklad odpovídá pouze verzi 9.02 a ve vyšších verzích se může lišit. Zde slouží pouze pro ilustrativní účely.
var StoreCardCode, StoreCardName, StoreCode, StoreName : String; const rSUBJECT = 'Naskladnění zboží'; // RequestSubject rMESSAGE = 'Skladové zásoby byly rozšířeny.' + #13#10 + '%DISPLAYNAME%'; // RequestMessage function GetHelperCaption(const SiteForm: TSiteForm): String; begin // Helper name in wizard form Result := 'Přijetí zboží - průvodce'; // Název nabízený jako Typ průvodce end; function GetHelperDescription(const SiteForm: TSiteForm): String; begin // Helper description in wizard form Result := 'Pošle vzkaz, když dojde k naskladnění zboží'; // Popis daného Typu průvodce end; function GetWDPInternalName(const SiteForm: TSiteForm): String; begin // Should return WatchDogPoint InternalName (packed GUID) // or Null packed GUID) Result := 'WD5B2FMTMIB41CGVTMY4Z0HYXW'; // Interní název svázaného kontrolního bodu WD5B2FMTMIB41CGVTMY4Z0HYXW end; function IsConditionHelper(const SiteForm: TSiteForm): Boolean; begin // Return True, if helper use expression. // Return False, if helper use business object ID. Result := True; // Nastavení, že se jedná o definici typu Výraz end; function GetRequestDescription(const SiteForm: TSiteForm; const ObjId: String; // Generování názvu pro definici autom. vzkazu Params: TNxParameters): String; begin // Should return short description about expression. // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. Result := 'Definice uživatele:' + NxGetUserName + ' [' + FormatDateTime('YYYYMMDD HH:MM',Now) + ']'; end; function GetRequestCondition(const SiteForm: TSiteForm; const ObjId: String; Params: TNxParameters): String; Var mParamItem1, mParamItem2: TNxParameter; begin // if IsConditionHelper return False, return empty string. // if IsConditionHelper return True, return expression. // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. mParamItem1 := Params.GetOrCreateParam(dtString,'StoreID',pkInputOutput); mParamItem2 := Params.GetOrCreateParam(dtString,'StoreCardID',pkInputOutput); Result := '(NEW.Quantity > OLD.Quantity) And'; Result := Result + '(NEW.Store_ID = ' + QuotedStr(mParamItem1.AsString) + ') And '; Result := Result + '(NEW.StoreCard_ID = ' + QuotedStr(mParamItem2.AsString) + ')'; end; function GetRequestSubject(const SiteForm: TSiteForm; const ObjId: String; // Generování předmětu zprávy pro definici autom. vzkazu Params: TNxParameters): String; begin // Define message subject which will be sent to user // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. Result := rSUBJECT; Result := Result + ' [ ' + StoreCardName + ' na ' +StoreName + ' ]' end; function GetRequestMessage(const SiteForm: TSiteForm; const ObjId: String; // Generování textu názvu pro definici autom. vzkazu Params: TNxParameters): String; begin // Define message body which will be sent to user // ObjId param is business object ID. // Params param contain values stored in GetValuesFromControls() function. Result := rMESSAGE; Result := Result + #13#10 + 'Skladová karta: ' + StoreCardCode + ' - ' + StoreCardName; Result := Result + #13#10 + 'Sklad: ' + StoreCode + ' - ' + StoreName; end; function CreateWizardFrame(const SiteForm: TSiteForm; const Panel: TPanel): Boolean; // Vytvoření kroku průvodce var mCombo: TComboBox; mListbox: TListBox; mLabel1, mLabel2: TLabel; OS: TNxCustomObjectSpace; BO: TNxCustomBusinessObject; mResult: TStringList; ii : Integer; begin // Create controls and place them to Panel // Return True if any control created. // Return False if no control created. OS:= SiteForm.BaseObjectSpace; BO:= TBusRollSiteForm(SiteForm).CurrentObject; StoreCardCode := BO.GetFieldValueAsString('Code'); StoreCardName := BO.GetFieldValueAsString('Name'); mLabel1 := TLabel.Create(SiteForm); mLabel1.Top := 40; mLabel1.Left := 50; mLabel1.Width := 300; mLabel1.Height := 15; mLabel1.Caption := 'Pro skladovou kartu: '; mLabel1.Caption := mLabel1.Caption + StoreCardCode + ' - ' + StoreCardName; mLabel1.Visible := True; mLabel1.Parent := Panel; mLabel2 := TLabel.Create(SiteForm); mLabel2.Top := 70; mLabel2.Left := 50; mLabel2.Width := 300; mLabel2.Height := 15; mLabel2.Caption := 'Pro sklad: '; mLabel2.Visible := True; mLabel2.Parent := Panel; mCombo := TComboBox.Create(SiteForm); mCombo.Top := 70; mCombo.Left := 150; mCombo.Width := 300; mCombo.Height := 15; mCombo.Text := 'Sklad'; mCombo.Visible := True; mCombo.Enabled := True; mCombo.Parent := Panel; mCombo.Name := 'mCombo'; mListBox := TListBox.Create(SiteForm); mListBox.Top := 0; mListBox.Left := 0; mListBox.Width := 300; mListBox.Height := 30; mListBox.Visible := False; mListBox.Enabled := True; mListBox.Parent := Panel; mListBox.Name := 'mListBox'; mResult:= TStringList.Create; OS.SQLSelect('Select ID, Code || '+QuotedStr(' - ')+' || Name From Stores', mResult); mCombo.Clear; mListBox.Clear; For ii := 0 To mResult.Count -1 Do begin mCombo.AddItem(copy(mResult.Strings[ii],13,Length(mResult.Strings[ii])-13),nil); mListBox.AddItem(copy(mResult.Strings[ii],1,10),nil); end; mCombo.ItemIndex := 0; Result := True; OS.free; BO.Free; mResult.free; end; function ValidateWizardFrame(const SiteForm: TSiteForm; const Panel: TPanel): Boolean; begin // Check control's values. // Return True if user fill the controls properly. // Return False if any control has an invalid value. Result := True; end; procedure GetValuesFromControls(const SiteForm: TSiteForm; const Panel: TPanel; Params: TNxParameters); var mCombo1: TComboBox; mListbox1: TListBox; mParamItem1,mParamItem2: TNxParameter; BOStore, BOCard: TNxCustomBusinessObject; OS: TNxCustomObjectSpace; begin // Get control's values and store them into Params. BOCard := TBusRollSiteForm(SiteForm).CurrentObject; mListBox1 := TListBox(NxFindChildControl(Panel, 'mListBox')); mCombo1 := TComboBox(NxFindChildControl(Panel, 'mCombo')); mParamItem1 := Params.GetOrCreateParam(dtString,'StoreID',pkInputOutput); mParamItem1.AsString := mListBox1.Items.Strings[mCombo1.ItemIndex]; mParamItem2 := Params.GetOrCreateParam(dtString,'StoreCardID',pkInputOutput); mParamItem2.AsString := BOCard.GetFieldValueAsString('ID'); OS := SiteForm.BaseObjectSpace; BOStore := OS.CreateObject('SFMSB5W15BDL3CL100C4RHECN0'); BOStore.Load(mListBox1.Items.Strings[mCombo1.ItemIndex],nil); StoreCode := BOStore.GetFieldValueAsString('Code'); StoreName := BOStore.GetFieldValueAsString('Name'); BOStore.Free; BOCard.FRee; OS.free; end; begin end.
- Nyní si nadefinujeme novou definici automatického vzkazu obdobně jako v příkladu 1. Tj.:
- Otevřeme agendu skladových karet. Postavíme se kurzorem na sklad. kartu, pro kterou chceme nastavit sledování příjmu.
- Vyvoláme funkci Autom. vzkazy. Tato funkce je zde dostupná, jelikož jsme si nadefinovali kontrolní bod "Přijetí zboží" pro tuto agendu, viz výše Předpoklady příkladu. Vyvolá se Průvodce tvorbou definice automatického vzkazu.
- V 1. kroku průvodce v položce Kontrolní bod se nyní nabízí náš kontrolní bod "Přijetí zboží". V položce Typ průvodce ale vybereme volbu "Výraz":
Typ průvodce se zde nabízí pod názvem s popisem uvedeným v metodách GetHelperCaption a GetHelperDescription ve skriptu
- V dalším kroku zadáme adresáty.
- Jelikož jsme si ve skriptu naprogramovali, že tento typ průvodce má mít další krok, tento se nabídne. V našem příkladu zde uživatel může zvolit sklad, na němž chce přijetí aktuálně sledovat.
- Po stisku Dokončit se uloží nová definice autom. vzkazu do agendy Definice automatických vzkazů obdobná následujícímu obrázku:
Detail definice automatického vzkazu. Údaje se předvyplnily automaticky texty zadanými tentokrát ve skriptování v průvodci (na rozdíl od příkladu 1 a příkladu 2), z průvodce se doplnilo akorát ID zvoleného skladu do konstrukce výrazu. Pokud byste chtěli definici změnit (např. přidat další adresáty), můžete tak učinit přímo v agendě Definice automatických vzkazů.
- Dále musí existovat naplánovaná úloha a být zprovozněn automatizační server, jako u příkladu 1.
Nyní bude platit: Jakmile dojde k nějaké změně na dílčích skladových kartách, zaznamená se interně požadavek na generování autom. vzkazu. Jakmile automatizační server spustí úlohu typu Automatické vzkazy, pak vyhodnotí podmínku (tj. zda došlo ke zvýšení počtu, zda dané zvýšení počtu bylo na skladovou kartu, jejíž ID bylo uvedeno ve výrazu a na sklad, jehož ID je ve výrazu). Pokud je podmínka splněna, pak ti, co jsou uvedeni mezi adresáty výše vytvořené definice autom. vzkazu, dostanou vzkaz s předmětem a textem dle této definice.