Funkcije
Primeri uporabe funkcij
V tem poglavju so predstavljeni primeri uporabe agregatnih funkcij, primer uporabe funkcije GetForValue, SQLEXP ter IIF. Primere uporabe funkcij, ki so napisane posebej za PANTHEON 5.5 in jih ni v standardnem FastReport-u pa smo razložili posebej v kategoriji Datalab Funkcije.
Podrobno razlago funkcij si lahko preberete v Vodiču po Datalab PANTHEON-u 5.5, v kategoriji Funkcije.
Primer uporabe funkcije IIF
Naslednji primer uporabe funkcije IIF je narejen na izpisu 22G, ki ga najdemo v programu v meniju Blago | DDV samo za hrvaško zakonodajo. Izraz izpiše najprej naziv subjekta. Če je vpisana tudi davčna številka, izpiše tudi to, in sicer v novo vrstico. Za prehod v novo vrstico smo uporabili zaporedje znakov LF (št. 13) in CR (št. 10).
[IIF(<qReportIzpis."acCode"> = '', <qReportIzpis."acSubject">,
<qReportIzpis."acSubject"> + Chr(13) + Chr(10)+ <qReportIzpis."acCode">)]
Če funkcijo IIF gnezdimo, hitro postane nepregledna, zato jo je bolje zamenjati s stavkom if v kodi. Koda, enakovredna zgornjemu izrazu, je
procedure Memo19OnBeforePrint(Sender: TfrxComponent);
begin
if (<qReportIzpis."acCode"> = '' then
Memo19.Text := <qReportIzpis."acSubject">
else
Memo4.Text := <qReportIzpis."acSubject"> + Chr(13) + Chr(10)+ <qReportIzpis."acCode">;
end;
Primer uporabe funkcije GetFormValue
Za primer uporabe funkcije GetFormValue zapišimo izraz, ki vrne skladišče na obračunu izdanih računov, ki je v programu v meniju Blago | Obračun izdanih računov | Obračun računov in razlike v ceni. Ime okna je PrometObracunIzdRac, ime vnosnega polja, v katerem izberemo skladišče, je fSkladisce.
[GetFormValue('PrometObracunIzdRac.fSkladisce')]
Imena nekaterih oken z dokumenti, so sestavljena iz osnove in končnice, ki predstavlja vrsto dokumenta. Če hočemo na izdaji blaga izpisati referenta, zapišemo izraz
[GetFormValue('PrometIzdDob3000.fReferentZap')]
Izpisoval se bo samo za vrsto dokumenta 3000, ne pa tudi za vse druge. Da se bo izpisoval za vse vrste dokumentov, ga moramo zapisati tako
[GetFormValue('PrometIzdDob'+<tbLookPoslDog."acDocType">+'.fReferentZap')]
Kjer dataseta tbLookPoslDog ni na voljo, lahko dobimo naziv okna iz številke dokumenta. Na naročilih kupcev zapišemo takole
[IIF(Copy(<qReportIzpisD."acKeyView">,Pos('-',
<qReportIzpisD."acKeyView">)+4,1) ='-',
GetFormValue('Naroc'+Copy(<qReportIzpisD."acKeyView">,Pos('-',
<qReportIzpisD."acKeyView">)+1,3)+'0.fReferentZap'),
GetFormValue('Naroc'+Copy(<qReportIzpisD."acKeyView">,Pos('-',
<qReportIzpisD."acKeyView">)+1,4)+'.fReferentZap'))]
Primer uporabe funkcije GetFormValue z datumom
Funkcija GetFormValue vrne datum v formatu yyyy/mm/dd, običajno pa ga želimo imeti v formatu dd.mm.yyyy ali d.m.yyyy.
Najbolj znan primer, ko v datasetu ni podatkov, ki bi jih potrebovali, so obvestila o neporavnanih obveznostih, ki so v programu v meniju Denar | Obračuni | Odprte postavke.
Naslednji izraz vrne datum stanja v formatu yyyy/mm/dd:
[GetFormValue('GKOdprtePostavke.fDatumStanja')]
Izraz ima še pomanjkljivost, da v primeru, ko datum ni vpisan, izpiše 1900/01/01.
Pomagamo si tako, da pred izpisom s funkcijo IIF preverimo, ali je datum vnesen:
[IIF(GetFormValue('GKOdprtePostavke.fDatumStanja')= '1900/01/01','',
GetFormValue('GKOdprtePostavke.fDatumStanja'))]
Če hočemo izpisati datum v formatu dd.mm.yyyy, moramo spremeniti vrstni red številk v izpisu:
[IIF(GetFormValue('GKOdprtePostavke.fDatumStanja') ='1900/01/01','',
Copy(GetFormValue('GKOdprtePostavke.fDatumStanja'),9,2)+'.'+
Copy(GetFormValue('GKOdprtePostavke.fDatumStanja'),6,2)+'.'+
Copy(GetFormValue('GKOdprtePostavke.fDatumStanja'),1,4))]
Datum stanja v formatu d.m.yyyy pa dobimo tako, da dan v mesecu in mesec še pretvorimo v številko in potem nazaj v besedilo:
[IIF(GetFormValue('GKOdprtePostavke.fDatumStanja') ='1900/01/01','',
IntToStr(StrToInt(Copy(GetFormValue('GKOdprtePostavke.fDatumStanja'),9,2)))
+'.'+IntToStr(StrToInt(Copy(GetFormValue('GKOdprtePostavke.fDatumStanja'),6,2)))
+'.'+Copy(GetFormValue('GKOdprtePostavke.fDatumStanja'),1,4))]
Primer uporabe funkcije GetFormValue - primer dela z objektom, ki ne predstavlja besedila
Funkcijo GetFormValue lahko uporabimo tudi za objekte, ki ne predstavljajo besedila. V tem primeru nam vrne najpomembnejšo lastnost tega objekta. Vrnjena vrednost običajno ni primerna za neposreden izpis, lahko pa jo uporabljamo na samem izpisu. Lahko npr. izpišemo besedilo, ki je v oknu izpisano pri tej vrednosti.
Kot primer vzemimo skupino radijskih gumbov z imenom grpGroupBy na novi konto kartici. Naziv okna je GLAccountCard. Za to vrsto objekta funkcija vrne lastnost ItemIndex, ki določa, kateri gumb je izbran. V našem primeru ta lastnost določa, kako naj se združujejo podatki in skrivajo pasovi na izpisu. Vrednost, ki jo vrne funkcija, zapišemo v spremenljivko nGroupBy in potem glede na njeno vrednost skrivamo pasove na izpisu, kot npr. v proceduri SubjektFooterOnBeforePrint.
var nGroupBy: Integer;
...
procedure SubjektFooterOnBeforePrint(Sender: TfrxComponent);
begin
if nGroupBy <= 1 then
SubjektFooter.Visible := False;
end;
...
nGroupBy := GetFormValue('GLAccountCard.grpGroupBy');
Enostaven primer uporabe funkcije SQLExp
Naziv našega podjetja
[SQLexp('select S.acSubject from tHE_SetSubj S, tPA_SysParam P where S.acSubject = P.acOurCompany')]
Naslov subjekta Podjetje d.o.o.
[SQLexp('select acAddress from tHE_SetSubj where acSubject =''Podjetje d.o.o.''')]
Primer klica funkcije SQLExp
Kraj pošte našega podjetja
[SQLexp('select dbo.fHE_GetOurCompanyCity()')]
Nekaj bolj zapletenih primerov je na izpisu 04C, ki je v programu v meniju Blago | ECL/Intrastat | ECL – uvoz in na izpisu 3AR na izpisu personalne mape. V programu pridemo do njega tako, da v personalnih mapah, ki so v meniju Kadri | Personalne mape, kliknemo na gumb Izpisi.
Primer uporabe funkcije SQLExp - delo z datumskimi polji
Na kopijo izpisa 241, ki je v programu v meniju Blago | Izdaja | Dokument (npr. 3000 – Veleprodaja) dodamo saldo prejemnika računa na kontu 2200 na dan izstavitve računa. Pri tem je pomembno, da je datum formatiran v obliki yyyymmdd.
[SQLExp('SELECT SUM(anValDebit-anValCredit) from tHE_AcctTransItem where acAcct = 2200 and acSubject=''' + <qReportIzpisD."acReceiver"> + ''' and adDateDoc <= ''' + FormatDateTime('yyyymmdd',<qReportIzpisD."adDateInv">) + '''')]
Primer uporabe funkcije SQLExp - delo s števili
V tem primeru želimo na izpisu 156, ki je v programu v meniju Blago | Obračun materialnih prometov izpisati količino v alternativni merski enoti (EM2).
Ker nimamo na voljo faktorja za pretvorbo količine v primarni merski enoti (EM) v EM2, ga moramo dobiti iz šifranta merskih enot s pomočjo funkcije SQLExp.
To naredimo z naslednjim izrazom:
[SQLExp('SELECT anUMToUM2 from tHE_SetItem where acIdent = '''+ <qReportIzpis."acIdent">+'''')]
Zgornji izraz vrne število kot besedilo. Sedaj želimo izpisati količino, izpisano v EM2, zato moramo vrednost, ki smo jo dobili, s funkcijo dlStrToFloatDef pretvoriti v število. Potem še delimo količino v EM z dobljenim faktorjem, pri čemer zaradi preverjanja deljenja z nič, raje kot navadno deljenje, uporabimo funkcijo dlDiv. Na koncu dobimo:
[dlDiv(<qReportIzpis."anBegState">, dlStrToFloatDef(SQLExp('SELECT anUMToUM2 from tHE_SetItem where acIdent = '''+ <qReportIzpis."acIdent"> +''''), 1))]
Primer uporabe funkcije SQLExp - branje podatkov iz okna v programu
Naslednji primer lahko naredimo na kopijo izpisa 16B, ki je v programu v meniju Blago | Obračun izdanih računov | Obračun računov in razlike v ceni. Če je v oknu izbrano skladišče, izraz izpiše celotno zalogo identa, sicer izpiše zalogo samo v izbranem skladišču.
Okno v programu, iz katerega se zažene izpis, se imenuje PrometObracunIzdRac, vnosno polje, v katerem izberemo skladišče, pa ima naziv fSkladisce. Izraz, ki vrne besedilo v tem objektu, smo že spoznali:
[GetFormValue('PrometObracunIzdRac.fSkladisce')]
Najprej pogledamo, ali je izbrano kako skladišče. Če ni, se izvede prvi izraz SQLExp, ki vrne celotno zalogo izbranega identa v vseh skladiščih, sicer pa drugi, ki vrne zalogo identa samo v izbranem skladišču.
[IIF (GetFormValue('PrometObracunIzdRac.fSkladisce') = '',
SQLExp('select SUM (anStock) from tHE_Stock where acIdent = ''' +
<qReportIzpis."acIdent"> + ''''),
SQLExp('select anStock from tHE_Stock where acIdent = ''' +
<qReportIzpis."acIdent"> + ''' and acWarehouse = ''' +
GetFormValue('PrometObracunIzdRac.fSkladisce') + ''''))]
Primer uporabe funkcije SQLExp s kompleksnim stavkom select
Posebno obravnavo si zasluži izraz na izpisu 3AR, ki vrne ali je delavec invalid ali ne.
Ta podatek ni neposredno zapisan v bazi, ampak je v njej zapisana kategorija invalidnosti, in sicer v polju acDisabilityCode v tabeli tHR_PrsnHealth. Ker se kategorija invalidnosti posameznega delavca lahko spreminja, moramo dobiti tisto, ki je bila vpisana nazadnje. Datum spremembe invalidnosti je zapisan v polju adCreationDate v isti tabeli. Z naslednjim izrazom dobimo zadnji datum, ko se je spremenila kategorija invalidnosti za izbranega delavca.
[SQLExp('select max(adCreatonDate) from tHR_PrsnHealth where acWorker = ''' + <qryDelavec."acWorker"> + '''')]
Potem s spodnjim izrazom dobimo kategorijo invalidnosti delavca
[SQLExp('select acDisabilityCode from tHR_PrsnHealth where acWorker = ''' + <qryDelavec."acWorker"> + ''' and adCreatonDate = (select max(adCreatonDate) from tHR_PrsnHealth where acWorker = ''' + <qryDelavec."acWorker"> + ''')')]
Če v zgornjem izrazu polje acDisabilityCode zamenjamo z 'DA', izraz vrne 'DA', če je delavec invalid, sicer vrne prazen niz. Ker hočemo, da v primeru, ko delavec ni invalid, izraz vrne 'NE', damo izraz v pogojni stavek IIF in končno dobimo
[IIF(SQLExp('select ''DA'' from tHR_PrsnHealth where acWorker = ''' + <qryDelavec."acWorker"> + ''' and adCreatonDate = (select max(adCreatonDate) from tHR_PrsnHealth where acWorker = ''' + <qryDelavec."acWorker"> + ''' and acDisabilityCode > ''0'')') = 'DA','DA','NE')]
Primer uporabe funkcije SQLExp - prevajanje stavka iz MS-SQL v ORACLE
V kolikor konverter ne zna pravilno prevesti vsega si lahko pomagamo s funkcijo dlIsORA, kot naprimer;
Prve tri pozicije računa na izdaji blaga izpiše naslednji izraz
[IIF(dlIsORA(
SQLExp('select * from (select acIdent from tHE_MoveItem where acKey = ''' + <tbIzpisPrometPoz."acKey"> + ''' order by acKey, anNo') where rownum <=3'),
SQLExp('select top 3 acIdent from tHE_MoveItem where acKey = ''' + <tbIzpisPrometPoz."acKey"> + ''' order by acKey, anNo'))]
Primer uporabe funkcije SQLExp - prevajanje stavka iz MS-SQL v ORACLE
Zelo neobičajna in koristna je uporaba funkcije SQLExp za sortiranje in grupiranje po polju, ki je ni v datasetu.
Za osnovo bomo vzeli izpis 164, ki je v programu v meniju Blago | Obračun izdanih računov | Obračun računov in razlike v ceni. Najprej ustvarimo kopijo, na kateri bomo delali. Podatke bomo grupirali po izdajatelju računa in sortirali po izdajatelju in številki računa.
Lastnosti Condition GroupHeaderja priredimo vrednost
SQLExp('select G.acIssuer from tHE_Move G where G.acKey = ''' + <qReportIzpis."acKey"> + ''''),
zamenjamo napis, ki opisuje podatek, po katerem grupiramo, za sam podatek pa vnesemo isto kot zgoraj, le da damo vse skupaj še v oglate oklepaje (kot je prikazano na sliki). Za razvrščanje v šifrantu izpisov napišemo:
(select G.acIssuer from tHE_Move G where G.acKey = P.acKey), G.acKey

