Het rapport werkt inmiddels eea afgestemd met TS.
Aangezien het een open source topic is de belangrijkste elementen van het rapport:
Parameterveld datum, dit is een gewoon kort datumveld welke de gebruiker ingeeft. De maand en jaren worden afgevangen in volgende formules middels de month() en year() functies.
Record selectie formule
4.1 Record Selection Formula
((Month({?Datum})=Month({Vrije_Dagen.Van}) and
Year({?Datum})=Year({Vrije_Dagen.Van}) )Or
(Month({?Datum})=Month({Vrije_Dagen.Tot}) and
Year({?Datum})=Year({Vrije_Dagen.Tot})) or
(Month({?Datum})>Month({Vrije_Dagen.Van}) And Year({?Datum})=Year({Vrije_Dagen.Van}))
And (Month({?Datum})<Month({Vrije_Dagen.Tot}) And Year({?Datum})=Year({Vrije_Dagen.Tot}))) and
{Vrije_Dagen.Soort} like {?Type vrij}
1 GROUP = PERSNONEELSNUMMER ID
In de page header een samengestelde string, deze checkt maand en jaar voor bepalen van het aantal weer te geven dagen in de header.
Name: {@Header}
Formula: //Header met datum
//Einddatum wordt eenvoudig bepaald mbv de maand, deze wordt getoetst aan een array met de maanden
//met 31 dagen, vervolgens toetsing aan array met 30 dagen.Zit de datum niet in beide arrays
//dan kan het 28 of 29 dagen zijn. Schrikkeljaren (29 dagen febr.) zijn eens in de 4 jaren.
//Indien het jaartal gedeeld door 4 geen restwaarde oplevert is het een schrikkeljaar
Global Numbervar Einddatum:=
If month({?Datum}) in [1,3,5,7,8,10,12] Then
31
Else
If month({?Datum})=2 Then
(If remainder(year({?Datum})/4,1)<>0 Then
28
Else
29)
Else
30;
Numbervar teller;
Stringvar line:=" ";
for teller:= 1 to Einddatum step 1 do line:=line+" "+totext(teller,0)+chr(9)+" ";//chr(124);
line
In group header 1 (group header is hidden) de formule
Name: {@ResetArrayVrijedagen}
Formula: //Maakt lege array aan die gevuld wordt met de betreffende vrije dagen
Shared stringvar array snipperdag:=[" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "];
snipperdag[27]
In de detail sectie en in de group footer de formule die de vrije dagen in de array toevoegt. De vrije dagen code (snipperdag, bijzondere dag) is de eerste letter van het type geregistreerd in de database. De detailsectie staat op hidden.
Numbervar einddag:= If IsNull({Vrije_Dagen.Tot}) then 0 Else
If (month({Vrije_Dagen.van})<>month({?Datum})) And month({Vrije_Dagen.Tot})<>month({?Datum}) Then Einddatum Else
day({Vrije_Dagen.Tot});
//Indien er geen vrije dagen 'van' is, maar wel een 'tot datum' betekent het dat het een 'overloop' periode
//is van de ene maand naar de andere maand. De begindag is dan 1
Numbervar begindag:= If (IsNull({Vrije_Dagen.van}) And Not IsNull({Vrije_Dagen.Tot})) Then 1
Else
//Gehele maand is gevuld
If (month({Vrije_Dagen.van})<>month({?Datum})) And month({Vrije_Dagen.Tot})<>month({?Datum}) Then 1 Else
//geen vrije dag
If IsNull({Vrije_Dagen.Van}) then 0
//begindatum van de vrije dag
Else day({Vrije_Dagen.Van});
//In dit deel van de formule worden de vrije dagen uitgeprint. De For Next lijn koppelt 1
//voor 1 de waarden aan elkaar in een lange string waarde
Numbervar Teller:=0;
Stringvar Line:=" ";
Shared Stringvar array snipperdag:=snipperdag;
Stringvar Typevrij:= {Vrije_Dagen.Soort}[1];
numberVar range vrijedagen:=begindag to (If einddag=0 Then begindag
Else einddag);
For Teller:= minimum(vrijedagen) to maximum(vrijedagen) step 1 do snipperdag[Teller]:={Vrije_Dagen.Soort}[1]+" ";
//De uiteindelijk stringwaarde wordt weergegeven
chr(9)+chr(9)+join(snipperdag,chr(9)+" ")
In dit geval is zonder hulptabel en door goed gebruik van samengestelde strings het rapport effectief geprogrammeerd
In de page footer staat een eenvoudig subrapport met als groep type vrije dag. Deze is gebruikt voor de legenda.