Príklady riešenia tlače niektorých vybraných úloh
V nasledovnom texte nájdete príklady možných riešení niektorých vybraných čiastkových úloh. Tieto príklady v žiadnom prípade neslúžia ako vyčerpávajúci prehľad všetkých možných riešení všetkých možných požiadaviek na tlač. Má slúžiť ako akýsi odrazový mostík začínajúcemu užívateľovi, ktorý sa rozhodol nadefinovať si vlastnú zostavu. V uvedených príkladoch môže nájsť prvotnú inšpiráciu na riešenie svojich požiadaviek inými spôsobmi. Ďalšiu inšpiráciu nájdete aj v definícii tlačových zostáv dodávaných dodávateľom (systémových zostáv).
Príklady slúžia tiež k lepšiemu pochopeniu ponúkania a použitia dátových položiek objektov ponúkaných editorom výrazov.
No upozorňujeme na to, že definícia zostáv je vec veľmi zložitá a s ohľadom na túto skutočnosť odporúčame obrátiť sa so svojimi požiadavkami na servisných konzultantov servisnej siete výrobcu.

Na jednotlivých dokladoch sa nepamätá meno užívateľa, ktorý doklad vystavil, ale len odkaz na jeho interný identifikátor (ID). Podľa tohto identifikátora je možné čerpať ďalšie údaje o užívateľovi z tabuľky užívateľov. Teda máme formulár dokladu, napr. faktúry vydanej a chceme do neho vytlačiť meno užívateľa. ID užívateľa, ktorý ju vystavil, je uvedený v hlavičke faktúry v položke CreateBy_ID.
Riešenie 1: Do zostavy vložíme výraz NxGetUserName(MAIN.CreateBy_ID), všeobecný popis funkcie viď kap. Popis niektorých vybraných funkcií. MAIN je název datasetu, který odpovídá hlavičce dokladu, tedy ze seznamu datových položek objektu vyberete tuto:
Riešenie 2: Položka "Vytvoril" je odkazom na objekt, takže sa rozvíja do ďalších (svojich) položiek. Medzi nimi je samozrejme opäť položka ID daného užívateľa, teda výraz by mohol mať aj podobu NxGetUserName(MAIN.CreateBy_ID.ID). Výsledok by bol rovnaký, len by mohol byť o niečo pomalšie vyhodnotený, nakoľko tu ide už o dva dotazy na ID užívateľa ("cez dve bodky" - bližšie viď popis Editora výrazov.)
Riešenie 3: Môžeme využiť i to, že meno daného užívateľa je uložené i v neperzistentnej položke DisplayName dátového objektu CreatedBy. Potom môžeme na požadované miesto tlačovej zostavy vložiť rovno túto položku, teda v našom príklade MAIN.CreatedBy_ID. DisplayName. Toto riešenie by oproti riešeniu 1 mohlo byť v niektorých prípadoch o niečo pomalšie, keďže funkcia z prvého riešenia čerpá údaje z pamäte, kde je cacheovaný zoznam užívateľov systému.
Riešenie 4: Na podobnej úrovni je riešenie vložiť priamo perzistentnú položku Name dátového objektu CreatedBy, teda v našom príklade MAIN.CreatedBy_ID. Name. Toto riešenie by v niektorých prípadoch mohlo byť o niečo rýchlejšie ako tretie riešenie, keďže neperzistentné položky obvykle nie sú cacheované a vyčíslujú, čo môže byť pomalšie ako priame načítanie položky z databázy.

Na jednotlivých dokladoch sa nepamätá číslo dokladu ako je napr. FV-112/2001, ale iba poradové číslo v danom rade, odkazy na daný zdrojový rad dokladov (ID daného radu) a obdobie (ID obdobia). Teda chceme na doklad vytlačiť číslo dokladu:
Riešenie 1: Do sestavy vložíme výraz NxGetDocumentNumber(MAIN.DocQueue_Code,MAIN.OrdNumber,MAIN.Period_Code), obecný popis funkce viz kap. Popis některých vybraných funkcí. MAIN je název datasetu, který odpovídá hlavičce dokladu. Teda zo zoznamu dátových položiek objektu pre rad vyberiete túto: , podobne pre obdobie. Ide o položky, ktoré sú k dispozícii vďaka definícii SQL dopytu z tabuliek zdrojových radov a období spojených s tabuľkou hlavičky dokladu, čo je naznačené pomlčkou v ich názve a sú k dispozícii priamo na prvej úrovni stromu položiek.
Riešenie 2: Položky "Zdrojový rad" a "Obdobie" sú odkazy na objekt, takže sa rozvíjajú do ďalších (svojich) položiek. Medzi nimi sú samozrejme znovu položky "Skratka" radu a obdobia. Teda výraz by mohol mať aj podobu: NxGetDocumentNumber(MAIN.DocQueue_ID.Code,MAIN.OrdNumber,MAIN.Period_ID.Code). Výsledok by bol rovnaký, len by mohol byť o niečo pomalšie vyhodnotený, keďže tu ide už o dve požiadavky na skratky ("cez dve bodky" - bližšie viď popis Editora výrazov.)
Riešenie 3: Môžeme využiť i to, že číslo dokladu je uložené tiež v neperzistentnej položke DisplayName dátového objektu hlavičky daného dokladu. Potom môžeme na požadované miesto tlačovej zostavy vložiť rovno túto položku, takže v našom príklade MAIN.ID. DisplayName.
Ďalej sa môže vyskytnúť potreba tlačiť číslo dokladu, u ktorého v momente definície tlačovej zostavy nie je známe, o aký doklad sa bude konkrétne jednať - môže ísť o nejaký businessobject (nejakú tabuľku). Na takúto položku sa môžeme odkazovať použitím PDocument_ID.
V prípade, že je do reportu vyberaná takáto položka s nejednoznačným určením dát a je zadaná hneď z prvej úrovne ponúkaného dátového stromu (editácie výrazu), tak je potrebné predradiť pred dátový popis prvku vlastné ID nadradeného objektu (napr. <Vlastné ID.PDocument_ID.DisplayName>), inak prvok nič nevytlačí.
V hlavičke pokladničnej príjemky budeme chcieť tlačiť číslo plateného dokladu. Potom v definícii tlačovej zostavy použijeme výraz MAIN.ID.PDocument_ID.DisplayName.

Na jednotlivých dokladoch sa nepamätá meno vlastnej (našej) firmy a ďalšie jej identifikačné údaje, keďže aká je vlastná firma sa rozpoznáva podľa toho, do akej firmy sa užívateľ prihlásil pri spustení agendy vyžadujúcej prihlásenie do firmy. Údaje o vlastnej firme, ako je jej meno, IČO, IČ DPH (okrem jej adresy) atď. sú uložené v tabuľke GlobData, ale po prihlásení do firmy sa cacheujú v pamäti a odtiaľ sa tiež čerpajú pre tlač. Na dokladoch sa pamätá iba odkaz na adresu vlastnej firmy, a to z toho dôvodu, že systém ABRA Gen umožňuje zásadné opravy vlastnej adresy a je teda potrebné zaistiť, aby si doklad pamätal, s akou adresou bol vystavený. Adresa vlastnej firmy (a jej prípadné opravy) je uložená v samostatnej tabuľke adries (Adresses).
Riešenie A: Meno vlastnej firmy: do zostavy vložíme výraz NxGetCompanyName. IČO vlastnej firmy: do zostavy vložíme výraz NxGetCompanyOrgIdentNumber atď. Ďalšie údaje o firme viď popis sady funkcií NxGetCompany..., ktoré vracajú údaje o vlastnej firme (viď kap. Popis niektorých vybraných funkcií). Iné riešenie sa tu neponúka, nakoľko pripájať tabuľku GlobData k tabuľke dokladov a čerpať údaje priamo z nej by nebolo zmysluplné.
Riešenie B1: Adresa vlastnej firmy: Ako bolo povedané vyššie, na doklade sa pamätá odkaz na adresu vlastnej firmy. Položka "Vlastná adresa" je štandardne odkazom na objekt, takže sa rozvíja do ďalších (svojich) položiek: . Medzi nimi sú k dispozícii položky ako ulica, mesto atď. Teda napr. pre tlač ulice: do zostavy vložíme položku MAIN.Address_ID.Street, teda zo zoznamu dátových položiek objektu pre rad vyberieme túto:
. Pre tlač mesta vložíme položku MAIN.Address_ID.City atď.
Riešenie B2: Pre údaje vlastnej adresy nie sú k dispozícii položky priamo v prvej úrovni stromu položiek (jednalo by sa o položky, ktoré sú k dispozícii vďaka definícii SQL dopytu z tabuľky adries spojenej s tabuľkou hlavičky dokladu, čo by bolo naznačené pomlčkou v ich názve). No existuje možnosť nechať si ponúkať aj tieto: Vysvetlíme napr. pre pokladničné príjmy: Pomocou nástroja DynSQL si vyhľadáme príslušný SQL dopyt pre pokladničné príjmy. Do SQL dopytu pridáme výraz, ktorý zabezpečil pripojenie tabuľky adries, teda napr.:
LEFT JOIN Addresses AD ON AD.ID=A.Address_ID
Ten pre všetky pokladničné príjemky podľa položky Address_ID dohľadá a pripojí z tabuľky adries tie záznamy, na ktoré sa pokladničné príjemky odkazujú. Dále definujeme odpovídající Alias na odpovídající Business objekt, tedy např. AD...TNxAddress, s prefixem např. Address a popiskou např. Vl.adresa. Po exporte do Repository nám pribudnú v prvej úrovni dátových položiek objektov položky: Vl.adresa-Ulica(Address_Street):, Vl.adresa-Mesto(Address_City) atď. Do tlačovej zostavy potom môžeme vybrať priamo tieto položky, teda v zostave bude napr.: MAIN.Address_Street.
Toto bol iba učebnicový príklad demonštrujúci možnosti systému. V praxi by bol samozrejme nezmysel upravovať všetky SQL dopyty nad dokladmi, keď sú rovnaké položky prístupné tiež cez objekt vlastnej adresy, viď Riešenie B1.

V databáze sa na jednotlivých dokladoch pamätá napr. čiastka bez dane celkom, ale už sa nepamätajú niektoré iné súčtové položky nutné pre tlač dokladu, napr. čiastka bez dane v základnej sadzbe DPH. Pokiaľ teda chceme vedieť, aká je čiastka celkom bez dane v sadzbe 22%, môžeme to riešiť nasledovne (objasníme na príklade faktúry vydanej):
Riešenie 1: Můžeme využít toho, že Business objekt faktury vydané obsahuje několik nepersistentních položek, do kterých nasčítává některé zásadní údaje z faktury. Medzi nimi je aj položka LocalAmountWithoutVATBasic, ktorá obsahuje čiastku celkom za základ v sadzbe 22%. Ako bolo povedané v kap. Dátové položky objektov, neperzistentné položky sú dostupné cez rozvinutú položku vlastné ID. Tedy položka MAIN.ID.LocalAmountWithoutVATBasic vložená do sestavy vytiskne částku celkem bez daně pro sazbu 22% v měně dokladu.
Riešenie 2: Súčty za rôzne položky môžeme riešiť pomocou premenných definovaných v zostave, do ktorých si priebežné súčty budeme ukladať. Teda v našom prípade: do inicializačného skriptu zostavy vložíme výraz NxValueCreate('CBEZ22'); ktorý spôsobí po spustení zostavy založenie premennej nami nazvanej CBEZ22 (celkom bez dane 22%). Do finalizačného skriptu zostavy vložíme výraz NxValueDestroy('CBEZ22'); nakoľko po ukončení zostavy je potrebné premennú z pamäte uvoľniť, aby tam zbytočne nezostávala a neblokovala miesto v pamäti. V pruhu riadkov faktúry vložíme do finalizačného skriptu výraz NxValueSet('CBEZ22',NxValueGet('CBEZ22')+If(Rows.VATRate=22, Rows.TAmountWithoutVAT),0); ktorý spôsobí, že ak je na riadku sadzba 22%, pričíta k súčasnej hodnote premennej CBEZ22 základ bez dane daného riadku pamätaný v položke Rows.TAmountWithoutVAT, inak ju nechá bez zmeny. Podobne by sme riešili sadzbu 5% a 0% a čiastky DPH celkom.
Iná možnosť je pridať si pruh pripojený k pruhu riadkov, sumarizačný výraz si vložiť do podmienky tlače tohto riadku a rozšíriť ho tak, aby sa podmienka vyhodnotila ako neplatná. Takže pruh bude slúžiť k sumarizácii hodnôt, ale tlačiť sa nebude. Takže napr. NxValueSet('CBEZ22',NxValueGet('CBEZ22')+If(Rows.VATRate=22, Rows.TAmountWithoutVAT),0) and False. Všeobecný popis použitých funkcií viď kap. Popis niektorých vybraných funkcií.
Na záver stačí pripojiť ďalší pruh vyhodnocovaný po spracovaní všetkých riadkov dokladu (môže to byť napr. pätička subdetailu, v ktorom sa spracovávajú riadky daného dokladu, podrobnejšie viď Pruhy v zostave) a vložiť do neho položku na tlač spočítanej sumy, teda v našom prípade NxValueGet('CBEZ22').
Toto bol znovu iba učebnicový príklad demonštrujúci možnosti systému. V praxi by bolo zbytočné definovať počítať súčty pomocou premenných, pokiaľ sú tieto súčty už k dispozícii priamo v databáze alebo ako neperzistentné položky daného objektu (viď Riešenie 1). No tento princíp môžete využiť k ľubovoľnému inému súčtovaniu.

Pokiaľ tvoríte zostavu, kde sa odkazujete na položky Business objektov (BO), môže byť následné zostavenie tlače pomerne pomalé. Napr. ak pre tlač čísla dokladu použijete výraz MAIN.ID.Displayname, znamená to, že sa naťahuje BO a je to pomalé. Ak nahradíte v takýchto zostavách MAIN.ID.Displayname za NxGetDocumentNumber(MAIN.DocQueue_Code, MAIN.OrdNumber, MAIN.Period_Code), bude vyhodnotenie rýchlejšie.
Podmienkou samozrejme je, aby sa v takýchto zostavách aj pre ďalšie položky nepoužívali ďalšie výrazy odvodené od MAIN.ID....

V niektorých tlačových zostavách je žiaduce, aby okrem bežne sa opakujúcich textov tlačili aj text variantne zadaný pred vlastným zostavením danej tlač. zostavy. V tom prípade je možné využiť funkciu NxTextInputDialog(<Str1>:String, <Str2>:String, <Num3>:Numeric):String. jedná sa o funkciu na užívateľské zadanie textu s pamäťou už vložených hodnôt, kde
- <Str1> identifikátor pre ukladanie vložených hodnôt
- <Str2> nadpis vstupného okna
- <Num3> šírka vstupného okna v bodoch
Vracia užívateľom vložený reťazec.
Príkladom môžu byť výplatné pásky, kedy mzdová účtovníčka chce dať zamestnancom na vedomie nejakú skutočnosť formou pozvánky na výplatnej páske napr. "Tento mesiac budú vydávané zálohy iba do 12:00". Tento text sa ale bude v čase meniť (každý mesiac bude chcieť podať inú informáciu, takže nie je možné daný text vložiť do zostavy napevno. Potom v definícii tlač. zostavy je možné využiť funkciu NxTextInputDialog. Napr.:
NxTextInputDialog('WageSlip','Zadejte text, který se má vytisknout na konci výplatní pásky',300)
V inicializačním skriptu tisk. sestavy je třeba nadefinovat:
- NxValueCreate('AdditionalTXT'); ... { vytvoření proměnné pomocí NxValueCreate()}
- NxValueSet('AdditionalTXT', NxTextInputDialog('WageSlip','Zadejte text, který se má vytisknout na konci výplatní pásky',300)) ... { uložení zadané hodnoty do proměnné pomocí NxValueSet()}
Proměnnou pak lze použít pomocí NxValueGet(). V mieste tlač. zostavy, kde chceme zadaný text tlačiť, stačí definovať funkciu NxValueGet('AdditionalTXT'). Potom, pri spustení tlače danej zostavy sa najskôr zobrazí dialóg, kam užívateľ vpíše aktuálne požadovaný text:
Zadaný text sa potom vytlačí na určené miesto v tlač. zostave. Raz zadaný text do sady už predtým zadaných textov a tie pri ďalšom vyvolaní ponúka v rámci skrytého zoznamu.
Na závěr je třeba do finalizačního skriptu nadefinovat:
- NxValueDestroy('AdditionalTXT') ... { zrušení proměnné pomocí NxValueDestroy()}

V niektorých tlačových zostavách je vhodné, aby pred zostavením tlače užívateľ zvolil jednu z dopredu daných volieb, ktoré ovplyvnia vzhľad výsledného výstupu. V tom prípade je možné využiť funkciu NxChoiceInputDialog(<Str1>:String, <Str2>:String, <Num3>:Numeric, <Num4>:Numeric):String, ktorá slúži na výber jednej z preddefinovaných hodnôt, ktoré sa zobrazia v skrytom zozname (combo box). Parametre funkcie:
- <Str1> zoznam jednotlivých hodnôt, tzn. obsah skrytého zoznamu s ohodnotením jednotlivých volieb: 'Popis hodnoty 1,ocenenie hodnoty 1|Popis hodnoty 2,ocenenie hodnoty 2|...atď.'
- <Str2> nadpis vstupného okna, tzn. text, ktorý sa zobrazí ako popis skrytého zoznamu
- <Num3> šírka vstupného okna v bodoch na zobrazenie dialógu
- <Num4> reprezentácia vracanej hodnoty. 0 popis hodnoty, 1 ocenenie hodnoty
Vracia reprezentáciu užívateľom vybranej hodnoty ako reťazec, tzn. ohodnotenie vybranej voľby.
Tlač prihlášky-odhlášky zamestnanca k nemocenskému poisteniu v agende Prac. pomerov, keď užívateľ len zvolí, či chce tlačiť prihlášku alebo odhlášku bez toho, aby bolo nutné mať tlač. zostavy 2.
Potom v definícii tlač. zostavy je možné využiť funkciu NxChoiceInputDialog. Tzn. v inicializačnom skripte tlač. zostavy nadefinujeme napr. : NxValueSet('Action', NxChoiceInputDialog('Prihláška zamestnanca,1|Odhláška zamestnanca,2', 'Vyberte, o aký druh dokladu ide:', 300,1)).
V mieste tlač. zostavy, kde sa tlačí alebo ide o prihlášku, stačí definovať podmienku if(NxValueGet('Action')='1','X',''). Podobne pre odhlášku.
Potom, pri spustení tlače danej zostavy sa najskôr zobrazí dialóg, kde užívateľ zvolí jednu z hodnôt:
Ak je vybraná prihláška, bude v záhlaví v príslušnej položke zostavy zatrhnuté, že sa jedná o prihlášku.