Příklady využití skriptování
Tato kapitola doplňuje obecný úvod do problematiky skriptování v systému ABRA Gen o ukázky praktických příkladů. Naleznete zde:
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 ABRA Gen.
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.
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ží.
Automatické založení svázaného záznamu po uložení dokladu - Např. automatické založení aktivity po uložení faktury vydané.
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á.
Ú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ředvyplňování hodnot položek, validace hodnot položek, aktualizace položky při změně jiné položky apod.
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.
Do agendy Adresář můžeme přidat řadu vlastních funkcí a umístit je např. na formulář záložky Detail:
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.
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 DL). Přičemž tu unikátnost záznamu si přeje přes více tříd objektů. (Vlastní ID k tomu využít nelze, jelikož např. v Gx může existovat OP i DL s ID=1000000101). Řešením může být přidání položky, do níž se bude pomocí skriptování předvyplňovat unikátní GUID (to zajistí že OP a DL bude mít vždy jinou identifikaci), případně která se bude přebírat při vzájemných importech dokladů. Řešení: Nadefinovat si vlastní uživatelskou položku pro GUID o délce 26-ti znaků, např. U_GUID na všech dokladech/řádcích dokladů, mezi kterými se má GUID přenášet. Položka musí mít z důvodu importu vždy stejný název a v definici nastaveno Import (viz podmínky pro vzájemný import hodnot uživatelsky definovatelných položek). Pro doklady/řádky dokladů, které mají takový GUID generovat, se pak vytvoří ve skriptování objektový skript v Prefill_Hook s využitím funkce CFxGUID.CreateNew.
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).
Ú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í.
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.
Ú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 a přejmenování funkce Občerstvit na Aktualizovat.
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).
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ři zadávání řádků dokladu (např. OP) automaticky vyplnit nějakou položku (např. obchodní případ) na základě vložené skladové karty apod. Případně jiná alternativa: dle definovatelných položek na záznamu firmy (pro obchodního zástupce a skupinu produktů) v adresáři dohledat a vložit do řádku objednávky obchodní případ obchodního zástupce apod.
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.
Možnost přidat nějakou hromadnou akci, která se má provést pro všechny označené záznamy. Např. v agendě Dodacích listů vytvořit funkční tlačítko "Oprava označených" a po jeho stisknutí doplnit nějakou položku, např. poznámku na označené dodací listy. (Seznam označených se ve skriptování zjistí pomocí metody FillListFromSelectedRows_1 na Gridu.)
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í).
Ú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é. ABRA vzhled modrý.
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é - syntaxe platná k verzi 14.51. Poslední verze, k níž byla prověřena funkčnost příkladu: v.15.03
{
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.
Možnost předvyplňování hodnot v dialogovém okně importovacího manageru. Níže uvedená procedura způsobí vynucené předvyplňování hodnoty Neuzavírat nově otevřenou agendu, bez ohledu na nastavení parametru Výchozí hodnota pro položku Neuzavírat nově otevřenou agendu při tvorbě nového dokladu a případného pamatování naposledy vyplněné hodnoty na uživatele (zatrhávací pole Uložit nastavení). Při definici je zapotřebí vybrat druh skriptu Importovací manager a následně konkrétní importovací manager, ve kterém chceme úpravu chování aplikovat (např. Import objednávky přijaté do dodacího listu).
procedure AfterInitializeWizard_Hook(Self: TNxDocumentImportManager; AForm: TForm);
begin
TCheckBox(AForm.FindComponent('chkDoNotCloseFormAfterImport')).Checked := True;
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.
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í.
-
Název volané skriptovací funkce:
-
Volání z tiskových sestav:
- se buď musí uvést jako plně kvalifivané, 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.
-
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ů).
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í
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 ABRA Gen 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.
Funkce jsou dostupné od verze 19.1.
TNxMainInvProtocol
- Positions_Add
- Positions_Find
- StoreCards_Add
- StoreCards_Find
TNxMainInvProtocolPosition
- StoreCards_Add
- StoreCards_Find
TNxMainInvProtocolRow
- StoreBatches_Add
- StoreBatches_Find
TNxPartialInvProtocol:
- Positions_Add
- Positions_Find
- StoreCards_Add
- StoreCards_Find
- StoreCards_GetOrAdd
- StoreCards_GetOrAddStoreBatch
TNxPartialInvProtocolPosition:
- StoreCards_Add
- StoreCards_Find
- StoreCards_GetOrAdd
- StoreCards_GetOrAddStoreBatch
TNxPartialInvProtocolRow:
- StoreBatches_Add
- StoreBatches_Find
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) - ABRASiteCommands. Obdobným způsobem lze tam popsané SiteCommandy využít i zde ve skriptování.
Po uložení dokladu dodací list se vyvolá rovnou tvorba následné faktury s importem daného DL - příklad volání funkce NxShowSite s ABRA SireCommand "DoNewOnlyWithoutPromt" v definici skriptu pro agendu Dodací listy:
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;
Pokud v příkladech níže nenajdete, co jste hledali, podívejte se ještě na Pokročilé příklady skriptování.
Vytvoří xml dokument s elementem TEST a komentářem a uloží ho do souboru.
Syntaxe platná k verzi 16.03:
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;
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.
Syntaxe platná k verzi 16.03:
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;
Pomocí skriptů je možné také pracovat s přechody mezi procesními stavy skladových dokladů. Skript z tohoto příkladu přidá do agendy Příjemky dvě tlačítka. První umožňuje přímo převést doklad do cílového procesního stavu. Protože není využit přechod, nedějí se žádné akce na přechodu definované, pouze se změní stav. Druhé tlačítko také převádí doklad do cílového stavu, ale využívá k tomu nadefinovaný přechod mezi stavy.
Syntaxe platná k verzi 18.03:
Druh skriptu: Agenda, Agenda: Příjemky.
procedure FormCreate_Hook(Self: TSiteForm);
var
mAction, mAction2: TBasicAction;
begin
mAction := Self.GetNewAction;
mAction.ShowControl := True;
mAction.ShowMenuItem := True;
mAction.Caption := 'Změna stavu (PMChangeState)';
mAction.Category := 'tabList';
mAction.OnExecute := @PMChangeState;
mAction := Self.GetNewAction;
mAction.ShowControl := True;
mAction.ShowMenuItem := True;
mAction.Caption := 'Změna stavu (PMChangeStateByTransition)';
mAction.Category := 'tabList';
mAction. OnExecute := @PMChangeStateByTransition;
end;
procedure Done(const ASite: TDynSiteForm);
begin
ASite.ActiveDataSet.CurrentItem.Selected := True;
ASite.ActiveDataSet.CurrentItem.Refresh;
ASite.ActiveDataSet.UpdateFields;
NxShowSimpleMessage('Změna stavu dokončena', ASite.GetSiteAppForm);
end;
procedure PMChangeState(Sender : TObject);
var
mSite: TDynSiteForm;
mBO : TNxCustomBusinessObject;
begin
mSite := TDynSiteForm(TComponent(Sender).Site);
mBO := mSite.CurrentObject;
mBO.PMChangeState('SDDEF00000'); // změnit dle hodnot PMStates.ID v konkrétní instalaci
Done(mSite);
end;
procedure PMChangeStateByTransition(Sender : TObject);
var
mSite: TDynSiteForm;
mBO : TNxCustomBusinessObject;
begin
mSite := TDynSiteForm(TComponent(Sender).Site);
mBO := mSite.CurrentObject;
mBO.PMChangeStateByTransition('2000000101'); // změnit dle hodnot PMStatesTransitions.ID v konkrétní instalaci
Done(mSite);
end;
begin
end.
Pokud by daný přechod nebyl definován, ABRA zahlásí chybu.
Pro založení řádku dílčího inventárního protokolu bylo před založením potřeba dohledat příslušný řádek hlavního inventárního protokolu, a ten vyplnit do pole MIPRow_ID. Pokud na hlavním inventárním protokolu takový řádek neexistoval, museli jsme jej nejdřív založit a teprve pak jeho ID zapsat do pole MIPRow_ID.
Nově stačí použít TNxPartialInvProtocol.StoreCards_Add a zadat přidávanou skladovou kartu, případně jednotku. (mPartialInvProtocol.StoreCards_Add(‘21000000101‘, ‘ks‘) Výsledkem je založení řádku dílčího inventárního protokolu, jeho navázání na příslušný řádek hlavního inventárního protokolu a v případě, že takový neexistuje, je rovnou založen.
Syntaxe platná k verzi 19.1: