Funkcije
Primeri upotrebe funkcija
U ovom poglavlju su predstavljeni primeri upotrebe agregatnih funkcija, primer upotrebe funkcije GetForValue, SQLEXP i IIF. Ovi primeri su napisani samo za PANTHEON 5.5 i nisu u standardnom FastReport-u , i konkretno su objašnjeni u posebnoj kategoriji Datalab Funkcije.
Detaljna objašnjenja tumačenja funkcija, možete pogledati u Vodiču po Datalab PANTHEON-u 5.5, u kategoriji Funkcije.
Primer upotrebe funkcije IIF
Sledeći primer upotrebe funkcije IIF je napravljen na ispisu 22G, kojeg nalazimo u meniju Roba | PDV samo za hrvatsko zakonodavstvo. Izraz ispiše najpre naziv subjekta. Ako je upisan i PIB, ispiše i njega u novi red. Za prelazak u novi red smo upotrebili niz znakova LF (br. 13) i CR (br. 10).
[IIF(<qReportIzpis."acCode"> = '', <qReportIzpis."acSubject">,
<qReportIzpis."acSubject"> + Chr(13) + Chr(10)+ <qReportIzpis."acCode">)]
Ako funkciju IIF ugnezdimo, brzo postane nepregledna, zato ju je bolje zameniti sa postavkom if u kodu. Kod, ekvivalent za gornji izraz, 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 upotrebe funkcije GetFormValue
Za primer upotrebe funkcije GetFormValue zapišemo izraz, koji vrati skladište na obračunu izdatih računa, koji se nalazi u programu u meniju Roba | Obračun izdatih računa | Obračun računa i razlike u ceni. Ime prozora je PrometObracunIzdRac, ime unosnog polja u kom izaberemo skladište, je fSkladisce.
[GetFormValue('PrometObracunIzdRac.fSkladisce')]
Imena nekih prozora sa dokumentima su sastavljena iz osnove i nastavaka, koji predstavljaju vrstu dokumenta. Ako želimo na izdavanju robe da ispišemo referenta, zapišemo izraz
[GetFormValue('PrometIzdDob3000.fReferentZap')]
Ispisaće se samo za vrstu dokumenta 300, ali ne i za druga dokumenta. Da bi se ispisalo za sve vrste dokumenta, moramo ga zapisati ovako
[GetFormValue('PrometIzdDob'+<tbLookPoslDog."acDocType">+'.fReferentZap')]
gde dataset tbLookPoslDog nije na raspolaganju, možemo dobiti naziv prozora iz broja dokumenta. Na narudžbinama kupaca zapišemo ovako
[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 upotrebe funkcije GetFormValue s datumom
Funkcija GetFormValue vrati datum u formatu yyyy/mm/dd, a obično ga želimo imati u formatu dd.mm.yyyy ili d.m.yyyy.
Najpoznatiji primer, kada u datasetu nema podataka koji bi nam trebao su obaveštenja o neizmirenim obavezama, koji se nalaze u meniju Novac | Obračuni | Otvorene stavke.
Sledeći izraz vrati datum stanja u formatu yyyy/mm/dd:
[GetFormValue('GKOdprtePostavke.fDatumStanja')]
Izraz ima još manu da u slučaju, kad datum nije upisan, ispiše 1900/01/01.
Pomažemo sebi da tako, da pre ispisa s funkcijom IIF proverimo, da li je datum unesen:
[IIF(GetFormValue('GKOdprtePostavke.fDatumStanja')= '1900/01/01','',
GetFormValue('GKOdprtePostavke.fDatumStanja'))]
Ako hoćemo ispisati datum u formatu dd.mm.yyyy, moramo promeniti redosled brojeva u ispisu:
[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 u formatu d.m.yyyy dobijemo tako, da dan u mesecu i mesec pretvorimo u broj i onda nazad na tekst:
[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 upotrebe funkcije GetFormValue - primer rada s objektom, koji ne predstavlja tekst
Funkciju GetFormValue možemo takođe koristiti za objekte, koji ne predstavljaju tekst. U tom slučaju nam vrati najznačajnije osobine tog objekta. Vraćena vrednost obično nije primerna za neposredan ispis, ali ga možemo koristiti na samom ispisu. Možemo npr. ispisati tekst, koji je u prozoru ispisan kod te vrednosti.
Kao primer uzmimo grupu radio tastera sa imenom grpGroupBy na novi konto kartice. Naziv prozora je GLAccountCard. Za tu vrstu objekta funkcija vrati osobinu ItemIndex, koji određuje koji je taster izabran. U našem slučaju ovu osobinu određuje, kako da se kombinuju podaci i sakriju bendovi na ispisu. Vrednost, koju vrati funkcija, zapišemo u promenljivu nGroupBy i onda u zavisnosti od njene vrednosti sakrijemo bendove na ispisu, kao npr. u proceduri SubjektFooterOnBeforePrint.
var nGroupBy: Integer;
...
procedure SubjektFooterOnBeforePrint(Sender: TfrxComponent);
begin
if nGroupBy <= 1 then
SubjektFooter.Visible := False;
end;
...
nGroupBy := GetFormValue('GLAccountCard.grpGroupBy');
Jednostavan primer upotrebe funkcije SQLExp
Naziv našeg preduzeća
[SQLexp('select S.acSubject from tHE_SetSubj S, tPA_SysParam P where S.acSubject = P.acOurCompany')]
Naziv subjekta Podjetje d.o.o.
[SQLexp('select acAddress from tHE_SetSubj where acSubject =''Podjetje d.o.o.''')]
Primer poziva funkcije SQLExp
Mesto pošte našeg preduzeća
[SQLexp('select dbo.fHE_GetOurCompanyCity()')]
Neki od komplikovanih primera je na ispisu 04C, koji je u programu u meniju Roba | JCI/Intrastat | JCI – uvoz i na ispisu 3AR na ispisu personalne mape, koji se nalazi u meniju Kadrovi | Personalne mape, kliknemo na taster Ispisi.
Primer upotrebe funkcije SQLExp - rad sa datumskim poljima
Na kopiji ispisa 241, koji je u programu u meniju Roba | Izdvanje | Dokument (npr. 300 – Veleprodaja) dodamo saldo primljenog računa na konto 2200 na dan idavanja računa. Važno je da se datum formatira u obliku yyyymmdd.
[SQLExp('SELECT SUM(anValDebit-anValCredit) from tHE_AcctTransItem where acAcct = 2200 and acSubject=''' + <qReportIzpisD."acReceiver"> + ''' and adDateDoc <= ''' + FormatDateTime('yyyymmdd',<qReportIzpisD."adDateInv">) + '''')]
Primer upotrebe funkcije SQLExp - rad sa brojevima
U ovom primeru želimo na ispisu 156, koji je u programu u meniju Roba | Obračun materijalnih prometa da ispišemo količinu u alternativnu jedinicu mere (JM2).
Jer nemamo na raspolaganju faktor za pretvaranje količine u primarnu jedinicu mere (JM) u JM2, i zato ga moramo dobiti iz šifarnika jedinica mere pomoću funkcije SQLExp.
To napravimo sledećim izrazom:
[SQLExp('SELECT anUMToUM2 from tHE_SetItem where acIdent = '''+ <qReportIzpis."acIdent">+'''')]
Gornji izraz vrati broj kao tekst. Sada želimo ispisati količinu, ispisanu u JM2. Zato moramo vrednost, koju smo dobili funkcijom dlStrToFloatDef pretvoriti u broj. Onda još delimo količinu u JM dobijenim faktorom u cilju provere deljenja sa nula, umesto jednostavne podele i upotrebimo funkciju dlDiv. Na kraju dobijemo:
[dlDiv(<qReportIzpis."anBegState">, dlStrToFloatDef(SQLExp('SELECT anUMToUM2 from tHE_SetItem where acIdent = '''+ <qReportIzpis."acIdent"> +''''), 1))]
Primer upotrebe funkcije SQLExp - čitanje podataka iz prozora u programu
Sledeći primer možemo napraviti na kopiji ispisa 16B, koji se nalazi u meniju Roba | Obračun izdatih računa | Obračun računa i razlike u ceni. Ako je u prozoru izabrano skladište, izraz ispiše celu zalihu identa, a onda ispiše zalihu samo u izabranom skladištu.
Prozor u programu, iz kog ispis počinje, imenuje se PrometObracunIzdRac, unosno polje, u kom izaberemo skladište, pa ima naziv fSkladisce. Izraz, koji vrati tekst u tom objektu, već znamo:
[GetFormValue('PrometObracunIzdRac.fSkladisce')]
Prvo pogledamo, da li je izabrano neko skladište. Ako nije, izvede se prvi izraz SQLExp, koji vrati celu zalihu izabranog identa u sva skladišta, onda drugi, koji vrati zalihu identa samo u izbaranom skladištu.
[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 upotrebe funkcije SQLExp sa složenim upitom select
Poseban postupak se koristi izraz na ispisu 3AR, koji vraća da li je radnik invalid ili ne.
Ovaj podatak nije direktno zapisan u bazi, ali je u njoj zapisana kategorija invalidnosti, i u polju acDisabilityCode u tabeli tHR_PrsnHealth. Pošto se kategorija invalidnosti određenog radnika može menjati, moramo dobiti onaj koji je bio upisan poslednji. Datum promene invalidnosti je zapisan u polju adCreationDate u istoj tabeli. Sa sledećim izrazom dobijemo poslednji datum, kada se promenila kategorija invalidnosti za izabranog radnika.
[SQLExp('select max(adCreatonDate) from tHR_PrsnHealth where acWorker = ''' + <qryDelavec."acWorker"> + '''')]
Zatim sa donjim izrazom dobijemo kategoriju invalidnosti radnika
[SQLExp('select acDisabilityCode from tHR_PrsnHealth where acWorker = ''' + <qryDelavec."acWorker"> + ''' and adCreatonDate = (select max(adCreatonDate) from tHR_PrsnHealth where acWorker = ''' + <qryDelavec."acWorker"> + ''')')]
Ako u gornjem izrazu polje acDisabilityCode zamenimo sa 'DA', izraz vrati 'DA', ako je radnik invalid, onda vrati prazan niz. Kad hoćemo, da u slučaju kad radnik nije invalid, izraz vrati 'NE', damo izraz u uslovnom upitu IIF i krajnje dobijemo
[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 upotrebe funkcije SQLExp - prevođenje upita iz MS-SQL u ORACLE
Ukoliko konvertor ne zna pravilno da prevede, možemo vam pomoći sa funkcijom dlIsORA, kao na primer;
Prve tri pozicije računa na izdavanju robe ispiše sledeći 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 upotrebe funkcije SQLExp - prevođenje upita iz MS-SQL u ORACLE
Veoma neobična i korisna upotreba funkcije je SQLExp za sortiranje i grupisanje po polju, koji nije u datasetu.
Za osnovu ćemo uzeti ispis 164, koji se nalazi u meniju Roba | Obračun izdatih računa | Obračun računa i razlike u ceni. Najpre uradimo kopiju, na kojoj ćemo raditi. Podatke ćemo grupisati po izdavaocu računa i sortirati po izdavaocu i broju računa.
Osobine Condition GroupHeaderja dodelimo vrednost
SQLExp('select G.acIssuer from tHE_Move G where G.acKey = ''' + <qReportIzpis."acKey"> + ''''),
zamenimo natpis koji opisuje podatak, po kom grupišemo za sam podatak pa unesemo isto kao gore, samo da zadamo sve zajedno u uglaste zagrade (kao što je prikazano na slici). Za razvrstavanje u šifarniku ispisa napišemo:
(select G.acIssuer from tHE_Move G where G.acKey = P.acKey), G.acKey

