Definiční a vývojové prostředí - skriptování
Zde naleznete:
Při nasazení IS FLORES u větších klientů je mnohdy nutné dodávaný produkt upravit dle specifických potřeb, které jdou nad rámec běžných uživatelských úprav a nastavení. Kromě možnosti definovat si definovatelné číselníky, možnosti různým způsobem do existujících objektů, agend a číselníků doplňovat další položky, možnost si pomocí definovatelných SQL skriptů doplňovat/rozšiřovat strukturu databáze, je mnohdy potřeba určité chování i doprogramovat. Proto je v systému k dispozici možnost skriptování – tedy možnost do existujících objektů (Business objektů, agend a nevizuálních číselníků) zařadit vlastní programový kód, který se bude vykonávat spolu s pevným kódem daným výrobcem. Tímto způsobem je tedy možné vytvořit nové chování případně upravit stávající přesně na míru uživateli. Jedná se o jednu z možností zákaznické modifikovatelnosti systému.
Uživatel/implementátor potřebuje upravit nebo rozšířit funkčnost stávajícího Business objektu Faktura vydaná tak, aby se při vytvoření nové faktury do popisu vyplnil nějaký text. Otevře si agendu Balíčky skriptů, zadefinuje nový balíček (nebo se rozhodne, že přidá svoje skripty do nějakého existujícího balíčku) a v rámci tohoto balíčku si vybere typ Business objekt. V rámci typu Business objekt si vybere třídu Business objektu Faktura vydaná. V ní pak zadefinuje vlastní skript pro událost AfterPrefill. V této události je mu k dispozici samotný Business objekt (předaný pomocí parametru) a případně další parametry. Zadefinovaný skript uloží – po uložení se skript zkompiluje pro pozdější použití (kompilace skriptu je časově nezanedbatelná, proto je lepší je mít už předkompilované).
Na balíčku, ve kterém je umístěný popisovaný skript, nastaví programátor příznak Používat. Pak už jen stačí spustit agendu Faktur vydaných nebo OLE aplikaci, která s Business objektem Faktura vydaná pracuje, a implementované řešení vyzkoušet.
Skriptování je také nezbytné pro některé jiné části systému. Viz příklady Využití skriptování v jiných modulech systému IS FLORES.
POZOR!!! Skriptování značně rozšiřuje možnosti systému, jak plyne mj. i z několika základních příkladů Příklady možností využití skriptování. Nicméně z toho mohou plynout i možné negativní důsledky:
- Může do značné míry změnit vzhled systému a chování systému a to bohužel i negativním způsobem - Např.:
- Skrytí či přejmenování některých funkčních tlačítek, položek apod., což může vést i ke zmatení uživatele (nebude odpovídat této příručce, která popisuje stav dodávaný defaultně výrobcem).
- Změna umístění některých prvků, která může vést ke kolizi (např. nechtěnému překrytí) s jinými položkami (např. nově dodanými výrobcem v dalších verzích apod.).
- Neočekávané chování (např. nabízení záznamů z číselníku v závislosti na hodnotě jiné položky řešené skriptováním) může vést třeba i k tomu, že se nenabídne nic, pokud daná položka není zadána (pokud to není ve skriptu řádně ošetřeno apod.).
- Systém je navržen tak, aby v případě, že nejsou žádné skripty definovány, nedocházelo k výraznějšímu zpomalení, nicméně nepatrné zpomalení je možné.
- Možný výskyt zavlečených chyb, zejména v případě použití nezkušených uživatelem.
Proto si v případě pochybností o nějaké funkčnosti systému nejdříve zjistěte, zda se vám nespouští nějaké skripty, které by daný stav mohly způsobit, viz Informace o spouštěných skriptech.
Jako skriptovací engine byl na základě testů rychlosti vybrán FastScript. Ačkoliv FastScript podporuje více skriptovacích jazyků, je ve skriptování IS FLORES pro jednotnost použitý pouze PascalScript. Toto omezení souvisí mimo jiné i s tím, že ve skriptování jsou dostupné třídy, které jsou k dispozici pouze v Delphi/Pascalu – tudíž implementátor, který chce realizovat skriptování v IS FLORES, musí být s Delphi/Pascalem tak jako tak obeznámen.
FastScript byl podstatně rozšířen, aby více vyhovoval potřebám IS FLORES. Jedná se např. o podporu dokumentace na všech entitách, zprovoznění enumeračních typů a množin, podporu dokumentace pro události, podporu statických (class) metod. Nicméně i přesto má určitá omezení, se kterými nutno při tvorbě skriptů počítat. Viz Pokyny k tvorbě skriptů.
K dispozici je agenda Balíčky skriptů, pro vytváření, ladění a správu existujících skriptů.
Pojem "balíček" zavedený v agendě balíčky skriptů, umožňuje rozumnou organizaci (uspořádání) vytvořeného programového kódu včetně vzájemných závislostí. Neznamená snadnou distribuci všech součástí potřebných pro implementaci uživatelem požadované funkčnosti (skripty, definovatelné číselníky, definovatelné položky, definovatelné formuláře, definice reportů, definice exportů, definovatelné SQL skripty, …).
Aby bylo možné v definici skriptů (a i jinde) vědět, jaké BO, agendy a nevizuální číselníky podporují skriptování a jaké metody (události) nabízejí ke skriptování, je interně zajištěna registrace těchto objektů a v rámci objektu je k dispozici seznam podporovaných událostí včetně popisu (vysvětlivek). Skriptování je typicky dostupné pro Business objekty, které mají možnost definovat uživatelsky definovatelné položky (ale mohou nastat i výjimky) a pro většinu agend a nevizuálních číselníků. Možnost doplnit si vlastní skripty je pouze do vybraných míst (událostí) v Business objektech (BO), agendách a nevizuálních číselnících. Jaká místa pro skriptování, tzv. háčky (hooks), jsou pro daný objekt k dispozici, je dáno výrobcem a uživatel toto nemůže nijak měnit.
Seznam objektů/tříd a procedur/funkcí, které jsou dostupné ve skriptování, je k dispozici v agendě Balíčky skriptů v Class Exploreru.
Seznam dostupných háčků pro daný objekt je k dispozici v agendě Balíčky skriptů v záložce Zdrojový kód v položce Metoda.
Názvy metod (háčků) pokud možno co nejvíce vystihují místo, kde dochází k jejich volání. Dále jsou seznamy háčků rozděleny na základní a pokročilé. Pokročilé se liší od základních tím, že začínají znakem "_".
Dále může být odlišeno, zda se daný háček volá před nebo po určité akci. To je řešeno pomocí sufixů PreHook a PostHook v názvu. Pokud to nemá význam, končí název háčku pouze slovem Hook.
Příklady existujících háčků:
- _DeleteObject_PreHook
- _DeleteObject_PostHook
- AfterSiteOpen_Hook
- Validate_Hook(var AResult: Boolean)
- aj.
Nezbytnou podmínkou pro provoz skriptování je, aby byla tato část systému nainstalována a licencována.
- Skriptování je instalováno samostatně - viz Instalovatelné součásti.
- Skriptování je licencováno samostatně - viz Licencované celky (licencované moduly a vlastnosti). Licencována je tvorba a kompilace skriptů. Samotné vykonávání již zkompilovaných skriptů nijak licencováno není.
Zda je licence dostupná k zakoupení pro všechny produkty IS FLORES, viz aktuální obchodní podmínky výrobce.
U skriptování však neplatí, že nepřítomnost licence skriptování "vypíná" jeho použití. Licence na modul Skriptování je potřebná pouze pro operaci Kompilace z agendy Balíčky skriptů. Tzn., že i v instalaci bez licence k tomuto modulu je možné naimportovat již zkompilovaný balíček bez zdrojových textů a je možné provádění zkompilovaných skriptů (např. vytvořených na zakázku výrobcem).
Pokud potřebujete skriptování vypnout (myšleno vypnout provádění skriptů), je třeba tak učinit jiným způsobem, viz Vypnutí skriptování.
Naopak pokud není skriptování nainstalováno, není k dispozici agenda Balíčky skriptů a nebude možné v systému plnohodnotně používat agendy a funkce, které jsou na skriptování navázány. Např. Funkce pro zajištění v SCM, Operace u Web. služeb, Kontrolní body u modulu E-maily a interní vzkazy apod.
Pokud chcete potlačit provádění skriptů z nějakého konkrétního balíčku skriptů, můžete v jeho položce Stav nastavit, že se nemá používat.
Pokud je třeba skriptování zcela vypnout (např. z důvodu, že je v nějakém skriptu chyba, která brání v provozu), můžete tak učinit spuštěním systému IS FLORES bez skriptování. To lze provést spuštěním systému IS FLORES s parametrem -noscripting. Toto vypnutí se provede pouze tehdy, pokud uživatel, který se do systému přihlásí, má současně nastaveno privilegium Obcházet skriptování. (Z toho důvodu, aby si běžný uživatel nemohl vypínat skriptování bezdůvodně).
Příklad syntaxe viz popis parametru spuštění -noscripting.
Doporučujeme si prověřit, že se skriptování skutečně podařilo vypnout a že je vypnuté, např. tak, že se nezobrazuje volba Skriptování v menu Nápověda. Viz dále Informace o spouštěných skriptech.
Aktuálně přihlášenému uživateli se budou spouštět skripty, pokud jsou splněny následující podmínky:
- skript je z balíčku, který je zkompilován (viz příznak Zkompilováno)
- skript je z balíčku, který má nastaveno Používat (viz příznak Stav) nebo má nastaveno Ladit a současně má daný uživatel privilegium Ladit skripty
- daný uživatel nemá skriptování zcela vypnuto
Dále pozor na to, jaká je hodnota u daného skriptu v položce Verze kompilace skriptu.
Pokud ve skriptování implementujete nějakou požadovanou dynamickou změnu chování číselníku v nějaké vlastní číselníkové položce, je třeba pro ni použít prvek Číselník objektový (nikoli Číselník neobjektový). Prvek Číselník neobjektový není schopen implementovat dynamickou změnu chování danou skripty k danému objektu.
Jak bylo řečeno výše, skriptování značně rozšiřuje možnosti systému, nicméně mohou z něho plynout i možné negativní důsledky. Proto je potřeba mít možnost rychle uživatelsky (i bez existence práv pro přístup do agendy Balíčků skriptů) zjistit, zda aktuálně přihlášenému uživateli mohou být vykonány nějaké skripty.
Seznam všech skriptů, které si lze zobrazit, vytisknout, případně odeslat e-mailem (odeslání skriptů e-mailem je však již vázáno na patřičné právo):
- v libovolné agendě z menu Nápověda volbou Skriptování (kdy je k dispozici a jak funguje, viz popis volby v menu Nápověda):

Příklad vyvolaného menu Nápověda s dostupnou položkou Skriptování
Ve skriptu je možné odkazovat se na jiné skripty. Pro odkazování na skripty mezi balíčky slouží druh skriptu Knihovna. Je tedy možné odkazovat se na skripty knihoven (nikoli Business objektů, agend a nevizuálních číselníků). Přehled závislých balíčků viz záložka Závislosti. Při volání funkcí nebo procedur z jiného skriptu je nutno používat frázi uses s následující konvencí:
uses
'nazev_balicku.nazev_knihovny','nazev_balicku.nazev_knihovny';
Pozor, volání přes název balíčku a knihovny není citlivé na velká/malá písmena.
Mějme balíček skriptů s názvem např. flores.cz.vyvoj.ukazka1, v němž je mj. zaveden skript druhu Knihovna s názvem Knihovna1. Chceme se na něj odkázat z jiného skriptu. Pak musíme použít syntaxi uses 'flores.cz.vyvoj.ukazka1.Knihovna1'.
Díky tomu, že je možné ve skriptování vytvářet vlastní instance (i vizuálních) objektů a těmto objektům nastavovat události, není možné po opravě zdrojových kódů skriptů a jejich překompilaci provést automaticky náhradu načtených skriptů v cash paměti. Tzn., že pokud editujete skript např. pro agendu a již jste ji měli alespoň jednou otevřenu v rámci daného spuštění IS FLORES, pak se změna ve skriptu pro danou agendu projeví až po znovunačtení skriptu do paměti.
Možnosti, jak vyvolat znovunačtení skriptů do paměti:
- Zavřením a znovuspuštěním systému IS FLORES.
- Pomocí funkce Znovu načíst skripty.
- Při uložení skriptu, je-li zatrženo Znovu načíst skripty.
Každý háček dostává minimálně jeden parametr "Self", ve kterém je mu předávána instance objektu, na kterém došlo k vyvolání háčku.
Aby bylo možné zjistit jména existujících vizuálních prvků (pro snazší zakomponování skriptů do vybraných objektů), je možno si spustit tzv. Show Inspector. Lze vyvolat z menu Nápověda volbou Zobrazit/Potlačit okno inspektoru nebo provést spuštěním systémuIS FLORES s parametrem -showinspector.
Příklad syntaxe viz parametr spuštění -showinspector.
V obou případech se zobrazí speciální okno (Inspektor), které ukazuje za běhu IS FLORES informace o komponentě/prvku, nad kterým se nachází kurzor myši. Zobrazená data o vybrané komponentě je možno zmrazit pomocí klávesy Pause.
Příklad zobrazení informací v Show Inspektoru pro prvek období.
FastScript neumožňuje vytváření (ve skriptu) vlastních tříd, typů a recordů.
Z této skutečnosti vyplývají i omezení skriptování v IS FLORES. Na místech, kde je nutné pracovat s existujícími recordy (např. TRect a TPoint), se v obálkách objektů (tj. to, co je dostupné ve skriptování) tyto záležitosti převádějí na více hodnot (např. souřadnice x a y).
Dále FastScript nepodporuje práci s tzv. třídami tříd. Tudíž v případě potřeby této funkčnosti v obálkách, by bylo potřeba toto implementovat konkrétně pro jednotlivé třídy.
FastScript dále nepodporuje Interface. Tudíž na všech místech, kde se interně v IS FLORES pracuje s rozhraními (proměnné typu interface s odkazy na příslušné objekty), se ve skriptování toto vždy musí převést na instance objektů. Z toho plyne ovšem ten důsledek, že pokud si uživatel pomocí nějaké metody vytvoří nové instance objektů, musí se postarat i o jejich zrušení (kdežto pokud je objekt "držen za interface", je zrušen automaticky po zrušení všech odkazů na daný objekt přes nějaký interface).
Jak bylo řečeno výše, skriptování značně rozšiřuje možnosti systému. Součástí instalace je řada dodávaných příkladů již hotových skriptů, z nichž si lze udělat představu o možnostech a využití skriptování a čerpat inspiraci pro tvorbu vlastních skriptů. Viz podadresář Examples v adresáři s vaší instalací systému IS FLORES.
Příklady zde jsou:
- ve formě *.xml souborů samotných balíčků skriptů, které si můžete přímo načíst do agendy Balíčky skriptů pomocí funkce Import z XML. Zde si je můžete prohlédnout. Pokud si je chcete vyzkoušet, je třeba je zkompilovat pomocí funkce Zkompilovat a případně si dle pokynů v popisu skriptů i založit požadované definovatelné položky a naimportovat si požadované definovatelné formuláře.
- ve formě *.ais souborů instalačních sad, které si můžete načíst do agendy Instalační sady pomocí funkce Importovat sadu. V tomto případě se balíčky skriptů obsažené v dané sadě přidají do agendy Balíčky skriptů automaticky v rámci importu sady. Zde si je můžete prohlédnout, příp. si je po zkompilování vyzkoušet shodně, jak bylo psáno v předchozím bodě.
O možnostech rozšíření a úprav systému pomocí skriptování si můžete udělat představu i na základě popisu uvedeného zde. Většinou se jedná o stručný slovní popis některého z dodávaných příkladů. V takovém případě si pak konkrétní skript, který danou úlohu řeší, můžete prohlédnout v agendě Balíčky skriptů po importu daného příkladu.
Číslování, pořadí a obsah příkladů zde v helpu nemusí zcela odpovídat aktuálnímu číslování, pořadí a obsahu příkladů dodávaných v rámci instalace.
Příklad 1: Automatické založení účtu do účetní osnovy po uložení firmy podle účtu zadaného k firmě, pokud tento v účetní osnově dosud neexistuje. Tj. k firmě z adresáře firem mějme založenu definovatelnou extra položku pro zadávání účtu a nadefinován definovatelný formulář pro její editaci. Pomocí skriptování se provede validace, zda zadaný účet již existuje v účetní osnově a pokud ne, tak se automaticky založí.
Příklad 2: Automatické založení svázaného záznamu po uložení dokladu - Např. automatické založení aktivity po uložení faktury vydané.
Příklad 3: Předvyplňování hodnot podle nějaké podmínky, tj. filtrování číselníku podle hodnoty např. uživatelské položky - Např. k osobě z adresáře osob mějme založenu definovatelnou extra položku s editací typu číselník pro zadávání zakázky k dané osobě výběrem z číselníku zakázek. Nechceme ale, aby se zde nabízely všechny zakázky, ale např. jen ty, které mají ve svém názvu obsažené první písmeno ze jména Osoby, na níž se zakázka zadává.
Příklad 4: Úprava vzhledu agendy - Např. ve vizuálnu číselníku středisek chceme upravit editační položku, v níž se edituje název střediska. Např. posunout ji doprava, prodloužit ji, změnit jí font včetně barvy apod.
![]()
Příklad úpravy vzhledu agendy. V tomto případě byla upravena barva fontu v položce Název číselníku středisek.
Příklad 5: Předvyplňování hodnot položek, validace hodnot položek, aktualizace položky při změně jiné položky apod.
Příklad 6: Doplnění vlastních funkcí a funkčních tlačítek do agendy, potlačení existujících funkcí, přejmenování existujících apod.
Např. do agendy
Vytvořit FV = otevře agendu faktur vydaných v režimu zadání nové faktury a nastaví firmu Aktis a.s.
Vytvořit OP = otevře agendu faktur objednávek přijatých v režimu zadání nové objednávky a nastaví firmu Aktis a.s.
Závazky = zobrazí tiskovou sestavu se seznamem všech závazků.
Pohledávky = zobrazí tiskovou sestavu se seznamem všech pohledávek.
A jiné.....
![]()
Příklad úpravy vzhledu agendy. Doplnění vlastních funkčních tlačítek přímo na formulář záložky Detail.
Příklad 7: Generování GUID pro vybrané objekty - Uživatel si přeje svou vlastní jednoznačnou identifikaci mezi navzájem importovatelnými doklady, např. OP a
Příklad 8: Možnost doplnit validaci a předvyplnění do stávajících objektů pro existující položky - Např. Doplnění validace a předvyplnění položky (např. Název) na business objektu Středisko např. textovou variantou unikátního identifikátoru (GUID).
Příklad 9: Úprava menu agendy, tj. např. doplnění a úprava panelu funkčních tlačítek
- Např. přidání tlačítka a funkce na hromadnou kopii záznamu a další multiakce:
Příklad úpravy vzhledu agendy. Přidání vlastních funkcí.
Příklad 10: Validace řádkových objektů - Při zadávání řádků dokladu (např. Řádek interního dokladu) kontrolovat povinné vyplnění nějaké přidané uživatelské položky.
Příklad 11: Úprava menu agendy, tj. např. doplnění a úprava
- Např. potlačení funkce, která je v dané agendě standardně dodávána a přejmenování jiné funkce podle vlastních požadavků:
Příklad úpravy vzhledu agendy. Potlačení funkce Vymazat .
Příklad 12: Aktualizace položky při změně jiné položky - Např. na základě změny v jedné položce (např. Název zakázky) lze automaticky měnit jinou položku (např. Poznámka u zakázky).
Příklad 13: Doplnění příznaku v objektu - Doplněk do modulu Sledování změn. - Tj. např. při ukládání záznamu o změně automatické nastavení příznaků, které pak jednoduše identifikují změny určitého charakteru, např. zjištění, zda došlo ke změně množství nebo ceny, aby bylo možno za tyto příznaky snadno omezovat seznam v agendě Provedené změny apod.
Příklad 14: Při zadávání řádků dokladu (např. OP) automaticky vyplnit nějakou položku (např. obchodní případ) na základě vložené
Příklad 15: Možnost tisknout v rámci skriptování přímo do souboru, mailu apod. (Viz např. procedura EmailPDF apod.) Např. přidání vlastních funkčních tlačítek do agendy faktur pro výtisk formuláře aktuální FV rovnou do souboru v PDF formátu a odeslání jakožto přílohy mailem na adresu uvedenou v údajích firmy z hlavičky faktury.
Příklad úpravy vzhledu agendy. Přidání funkcí pro tisk záznamu do souboru a odeslání emailem.
Příklad 16: Možnost provést i změnu struktury BO (viz např. funkce NxStructureManagerSetFieldSize, která umožní za běhu nastavit velikost položky). Např. rozšířit kód zakázky z 20-ti znaků (délka defaultně dodávaná výrobcem) na 30 znaků apod.
Příklad 17: Možnost přidat nějakou hromadnou akci, která se má provést pro všechny označené záznamy. Např. v agendě
Příklad 18: Možnost získat název aktuálního spojení na databázi. Lze použít funkci GetConnectionName, která vrací jméno aktuálního spojení. Např.
self.GetObjectSpace.GetConnectionName vrátí např. "Demodata". Využijete tehdy, pokud ve své implementaci potřebujete identifikaci spojení, ale GUID spojení se nehodí (ten se mezi jednotlivými update mění).
Příklad 19: Úprava předyplňovaných podmínek v průvodci výběrem dokladu - Využívá se háčku SetSelectionWizardParams_Hook, který lze volat v dokladových agendách, z kterých se volá Průvodce výběrem dokladu. Umožňuje rozšířit seznam podmínek v sekci Předvyplnit podmínky.
Příklad úpravy nabízených podmínek v sekci Předvyplnit podmínky v průvodci vyvolaném z agendy Objednávek přijatých v rámci funkce Nová podle nabídky vydané.
Skript, který zajistí přidání vlastních omezujících podmínek, které se mají předvyplňovat, dle obrázku výše:
Druh skriptu: Agenda, Agenda: Objednávky přijaté
{
Vyvolává se před spuštěním výběrového průvodce(SelectionWizard)
}
procedure SetSelectionWizardParams_Hook(Self: TDynSiteForm; ADocumentTypes: String; AIsImport: Boolean; AParams: TNxParameters);
var
mSingleCond, mValues: TNxParameters;
begin
if not AIsImport then
begin
// Nastavení podmínky DocQueue_ID (Řada dokladu)
mSingleCond := AParams.GetOrCreateParam(dtList, 'DocQueue_ID').AsList;
mSingleCond.GetOrCreateParam(dtInteger, 'USEDKIND').AsInteger := ckSingle;
mSingleCond.NewFromDataType(dtString, 'Caption').AsString := 'Řada dokladu (NV - Nabídky vydané)';
mValues := mSingleCond.NewFromDataType(dtList, 'Values').AsList;
mValues.NewFromDataType(dtString, '{:VALUE}').AsString := '''1800000101''';
// Nastavení podmínky UserDynSQLCondition (Výraz)
mSingleCond := AParams.GetOrCreateParam(dtList, 'UserDynSQLCondition').AsList;
mSingleCond.GetOrCreateParam(dtInteger, 'USEDKIND').AsInteger := ckSingle;
mSingleCond.NewFromDataType(dtString, 'Caption').AsString := 'Popisek obsahuje "4"';
mValues := mSingleCond.NewFromDataType(dtList, 'VALUEBAG').AsList;
mValues.NewFromDataType(dtString, 'DYNUSERSQL').AsString := 'Description like ''%4%''';
end;
end;
begin
end.
Příkladů využití skriptování v praxi však může být daleko více. Pomocí skriptování lze řešit dále např.:
- automatické nabízení provozoven k výběru po zadání firmy do hlavičky dokladu (viz též Tip pro vás v popisu parametru Předvyplňovat firemní provozovny)
- automatické nabízení osob patřících k firmě k výběru po zadání firmy do hlavičky dokladu
- vyvolání tisku, exportu či B2B exportu přímo ze skriptování (viz procedury NxPrintByIDs, NxExportByIDs, NXB2BExportByIDs)
- tisk více tiskových sestav najednou (viz též Často kladené otázky - Tisk více tiskových sestav najednou)
- možnost vyexportovat Business object do XML a následně ho za naimportovat (procedure NxFillBOFromXML, procedure NxFillXMLNodeWithBO, ...).Tato možnost je vhodná např. pro přenos dat z uživatelsky definovatelného číselníku do jiné instalace systému apod.
V jedné instalaci je připraven definovatelný číselník a naplněn nějakými výchozími daty. Číselník je přenesen pomocí instalační sady k uživateli do jiné instalace, výchozí data pak pomocí skriptování.
- možnost volat funkce na práci s externími DLL (viz LoadLibrary (nahraje DLL do paměti a vrátí ukazatel na ni), FreeLibrary (uvolní DLL z paměti), GetProcAddress, ...)
- apod.
Práce s komentářem - Vytvoří xml dokument s elementem TEST a komentářem a uloží ho do souboru.
const
cComment =
'Toto je sekce Comment se znaky ><"& a žluťoučkým koníčkem.';
var
mEncoding: TEncoding;
mXml: TNxScriptingXMLWrapper;
begin
mEncoding := TEncoding.NewEncoding(Encoding_cp1250);
try
mXml := TNxScriptingXMLWrapper.Create;
try
mXml.CreateEmpty('TEST');
mXml.AddCData(cComment);
mXml.SaveToFile('test.xml', 'windows-1250');
finally
mXml.Free;
end;
finally
mEncoding.Free;
end;
end;
Práce s CDATA - Vytvoří xml dokument s elementem TEST a vloží do něj sekci CDATA i s obsahem. Dále dokument uloží do TBytes a převede na řetězec a ten porovná s referenčními daty. Dále porovná s referenčními daty řetězec získaný z xml metodou getElementAsString. V případě neshody vyvolá výjimku.
const
cCDATA =
'Toto je sekce CDATA se znaky ><"& a žluťoučkým koníčkem.';
cXML =
'<?xml version="1.0" encoding="windows-1250"?>' + Chr(13) + Chr(10) + '<TEST><![CDATA[Toto je sekce CDATA se znaky ><"& a žluťoučkým koníčkem.]]></TEST>' + Chr(13) + Chr(10);
var
mEncoding: TEncoding;
mXml: TNxScriptingXMLWrapper;
mXmlBytes: TBytes;
mXmlString: string;
begin
mEncoding := TEncoding.NewEncoding(Encoding_cp1250);
try
mXml := TNxScriptingXMLWrapper.Create;
try
mXml.CreateEmpty('TEST');
mXml.AddCData(cCDATA);
mXml.SaveToBytes(mXmlBytes, 'windows-1250');
mXmlString := mEncoding.GetString(mXmlBytes);
if mXmlString <> cXML then // chyba
RaiseException('Nepodařilo se zapsat CDATA. Zapsáno: ' + Chr(13) + Chr(10) + mXmlString);
mXmlString := mXML.getElementAsString('TEST');
if mXmlString <> cCDATA then // chyba
RaiseException('Nepodařilo se přečíst CDATA. Přečteno: ' + Chr(13) + Chr(10) + mXmlString);
finally
mXml.Free;
end;
finally
mEncoding.Free;
end;
end;
V tiskových sestavách, definovatelných exportech, B2B exportech, ale obecně všude, kde lze využívat QR funkce (např. v panelech definovatelných údajů apod.), je k dispozici možnost spouštět přímo z reportů skripty a to pomocí funkce QR funkce NxScript. To výrazně rozšiřuje možnosti definic tiskových sestav, jelikož kromě QR funkcí dodávaných výrobcem lze volat i libovolnou jinou funkci, kterou si uživatel nadefinuje ve skriptování.
Skriptovací funkce musí být deklarována ve správné syntaxi v nějakém balíčku skriptů, ve skriptu druhu Knihovna. Jednotlivé procedury nebo metody musí mít jako první parametr AReportHelper:TNxQRScriptHelper. Jinak samozřejmě lze volat i funkci, která přímo vrátí výsledek, viz dále Příklad deklarace funkce.
TNxQRScriptHelper je objekt, speciálně navržený pro předávání potřebných informací o reportu do skriptování. Má na sobě ObjectSpace a TNxParameters. TNxParameters je objekt pro uživatelské parametry v reportech. Touto cestou je možné předávat do "reportingu" ze skriptování větší množství návratových hodnot.
Hlavičku funkce ve správném formátu si lze nechat vygenerovat v agendě Balíčky skriptů pomocí funkce Vygenerovat hlavičku - Volání QR funkce resp. volby Hlavička metody z panelu nástrojů.
Volání:
- Při volání se první parametr neuvádí, je doplněn automaticky, viz dále Příklady volání.
- Jméno volané skriptovací funkce:
- Volání z tiskových sestav:
- se buď musí uvést jako plně kvalifikované, tj. včetně identifikace balíčku skriptů a knihovny, která obsahuje požadovanou funkci v syntaxi JmenoBalicku.JmenoKnihovny.JmenoFunkce
- nebo se může uvést zkráceně (jen jméno skriptovací funkce, bez jména balíčku a knihovny). V tom případě ale musí být v definici dané tiskové sestavy vyplněna položka Výchozí balíček pro skriptování.
- Při volání z jiných míst programu, kde není k dispozici možnost specifikovat výchozí balíček pro skriptování, je třeba zadat plně kvalifikované jméno skriptovací funkce.
- Volání z tiskových sestav:
Příklad 1:Deklarace funkce se jménem "MojeFunkce" ve skriptování v balíčku "MujBalicek" s knihovnou "MojeKnihovna":
function MojeFunkce(AReportHelper:TNxQRScriptHelper;Value: Boolean): string;
begin
if Value then Result := 'OK' else Result := 'Chyba';
end;
Volání:
NxScript(Jméno_funkce, parametry). Parametrů může být libovolný počet, ale musí souhlasit s deklarací funkce ve skriptování (parametr AUserParams resp. AReportHelper se neuvádí, je obsluhován automaticky).
Tedy např.:
NxScript('MujBalicek.MojeKnihovna.MojeFunkce', MAIN.Amount=MAIN.PaidAmount)
nebo
NxScript('MojeFunkce', MAIN.Amount=MAIN.PaidAmount) .... pokud půjde o volání z reportů a v definici tiskové sestavy bude v položce Výchozí balíček pro skriptování hodnota MujBalicek.MojeKnihovna (bez apostrofů).
Příklad 2: Deklarace funkce s více parametry se jménem "MojeFunkce" ve skriptování v balíčku "MujBalicek" s knihovnou "MojeKnihovna":
function SectiCisla(AReportHelper:TNxQRScriptHelper;ACislo1:Integer;ACislo2:Integer):Integer;
begin
Result := ACislo1 + ACislo2
end;
Volání:
SectiCisla('MujBalicek.MojeKnihovna.SectiCisla', 10, 20)
nebo
SectiCisla('SectiCisla', 10, 20) .... pokud pokud půjde o volání z reportů a v definici tiskové sestavy bude vyplněna položka Výchozí balíček pro skriptování
Příklad 3: Deklarace funkce se jménem "Test" ve skriptování v balíčku "QRFunc" s knihovnou "QRFunc1":
function Test(AReportHelper:TNxQRScriptHelper;TEXT:String):Boolean;
begin
ShowMessage(TEXT);
Result := False;
end;
Volání:
if (NxScript('QRFunc.QRFunc1.Test', 'Pokusný text'), 'A', 'N')
nebo
if (NxScript('Test', 'Pokusný text'), 'A', 'N') .... pokud pokud půjde o volání z reportů a v definici tiskové sestavy bude vyplněna položka Výchozí balíček pro skriptování
Bezchybné vytváření skriptů vyžaduje hlubší znalost systému. Proto podrobnější popis aktuálně platných parametrů zmíněné funkce a jejího dalšího použití není předmětem tohoto helpu! V případě zájmu o tuto funkcionalitu kontaktujte servisní síť výrobce.
V uživatelsky definovatelných formulářích je rovněž k dispozici možnost přímo z formuláře volat skripty a to s využitím Pluginů neboli Doplňků a definice tlačítka, které daný skript vyvolá. Více viz Tlačítka s akcemi (ButtonsPlugin) - typ Run Script.
Skriptování je také nezbytné pro některé jiné části systému. Např.:
- pro možnost definice funkcí pro zajištění v SCM
- pro zpřístupnění systému IS FLORES pro webové služby (definice operací)
- pro možnost definice uživatelských kontrolních bodů v Komunikaci
- pro možnost definice naplánované úlohy typu Skript
- pro možnost definice pravidla zpracování doručené e-mailové pošty s akcí typu Spustit skript v Komunikaci
- pro možnost definice pravidla zpracování front souborů s akcí typu Spustit skript v Dokumentech
- pro možnost přizpůsobení chování Průvodce přeceněním resp. Průvodce kontrolou prodejních cen
- pro možnost upravit výpočet mezd pomocí skriptů výpočtového schématu
- pro možnost definice typu kampaně s akcí typu Spustit skript v CRM
- pro definici Skriptovacích ovladačů (driverů) pro provádění B2B importů, pokud chce uživatel tyto importy provádět svým vlastním driverem namísto B2B driverů dodávaných výrobcem
- apod.
Ve skriptování jsou mj. k dispozici funkce, které umožňují vyvolat standardní dialog na vytváření QR výrazů a "evaluator" na objektu, na kterém se aktuálně pracuje.
Pro editaci slouží funkce:
- NxEditObjectExpr - Zobrazí dialog pro editaci výrazu nad business objektem.
- NxEditParametersExpr - Zobrazí dialog pro editaci výrazu nad parametry.
Pro vyhodnocování slouží funkce:
- NxEvalObjectExprAsString - Vyhodnotí výraz nad business objektem a vrátí výsledek jako řetězec.
- NxEvalObjectExprAsInteger - Vyhodnotí výraz nad business objektem a vrátí výsledek jako celé číslo.
- NxEvalObjectExprAsFloat - Vyhodnotí výraz nad business objektem a vrátí výsledek jako reálné číslo.
- NxEvalObjectExprAsBoolean - Vyhodnotí výraz nad business objektem a vrátí výsledek jako logickou hodnotu.
- NxEvalObjectExprAsDateTime - Vyhodnotí výraz nad business objektem a vrátí výsledek jako datum a čas.
- NxEvalParametersExprAsString - Vyhodnotí výraz nad parametry a vrátí výsledek jako řetězec.
- NxEvalParametersExprAsInteger - Vyhodnotí výraz nad parametry a vrátí výsledek jako celé číslo.
- NxEvalParametersExprAsFloat - Vyhodnotí výraz nad parametry a vrátí výsledek jako reálné číslo.
- NxEvalParametersExprAsBoolean - Vyhodnotí výraz nad parametry a vrátí výsledek jako logickou hodnotu.
- NxEvalParametersExprAsDateTime - Vyhodnotí výraz nad parametry a vrátí výsledek jako datum a čas.
Funkce se slovem "Object" v názvu pracují s výrazem v kontextu předaného business objektu, funkce se slovem "Parameters" pracují v kontextu předaného objektu TNxParameters. Objekt TNxParameters může být libovolně strukturovaný, vnořené parametry se ve výrazu oddělují tečkou. Parametrový evaluátor je vytvořen speciálně k použití ve skriptování.
V univerzálním dodávaném balíčku např. na automatickou fakturaci tímto způsobem lze dát uživateli, který tento balíček dostane zkompilovaný, možnost naprogramovat si, co se má stát, když nový doklad vznikne, a co se má stát, když nový doklad nevznikne. Např. pokud vznikne faktura nebo zál. list, musí se změnit def. položka v adresáři, když naopak doklad nevznikne, zapíše se záznam do logu, proč daný doklad nevznikl.
Ve skriptování je možné mj. volat tzv. SiteCommands (např. prostřednictvím funkce NxShowSite). Více k nejtypičtějším "SiteCommandům", které jsou v systému k dispozici, je uvedeno v rámci popisu Doplňků (pluginů) uživatelsky definovatelných formulářů, viz Tlačítka s akcemi (ButtonsPlugin) - FLORESSiteCommands. Obdobným způsobem lze tam popsané SiteCommandy využít i zde ve skriptování.
Po uložení dokladu
procedure _AfterSave_PostHook(Self: TDynSiteForm);
begin
ShowMessage('Bude vytvořena FV');
NxShowSite('PLC2EX0BUJD13ACP03KIU0CLP4', Self.SiteContext, nil, nil, 0, False, 'DoNewOnlyWithoutPrompt;ImportDocuments;' + Self.ActiveDataset.BusinessObjectCLSID + ';' + Self.CurrentObject.OID + ';SelectedHeader=' + Self.CurrentObject.OID + ';DocQueue_ID=5600000101');
end;
V průběhu skriptování může dojít (vinou špatného skriptu) nejen k chybám ve vlastním průběhu skriptování, ale i k chybám následným, a je proto důležité vědět, že prvotní příčina může být např. právě v chybně napsaném uživatelském skriptu. Proto chyby, které vznikly v průběhu skriptování, se uživateli zobrazují s uvedením informace, že k chybě došlo během skriptování.
K ladění lze využívat nástroj ScriptDebugger.exe.
Podpora ladění nesmí být vypnuta parametrem v konfiguračním souboru nexus.cfg. Více viz kap. Konfigurační soubor Nexus.cfg - oddíly a parametry, Sekce [ScriptDebugger].
Implementátor skriptování může pro ladění využít též funkci ShowMessage(), pomocí níž je možné zobrazovat hlášení. Text chyby se také posílá pomocí funkce OutputDebugStr(). Texty předané funkci OutputDebugStr je možné "chytat" pomocí nějakého externího "zobrazovače" logů, např. pomocí Sysinternals DebugView nástroje.
Pokud potřebujete logovat průběh nějaké funkcionality řešené pomocí skriptování, můžete využít k tomu určenou třídu TNxScriptingLog a její metody, především metodu WriteEvent. V konfiguračním souboru nexus.cfg v sekci logování, musí být nastaveno logování třídy Scripting.