[Crystal Reports] Hoe voorbeeld om te zetten?

Pagina: 1
Acties:
  • 198 views sinds 30-01-2008
  • Reageer

  • R.A.
  • Registratie: Januari 2004
  • Niet online
Mogge iedereen.

Wat ik probeer te realiseren is het volgende.
Ik heb een tabel met de volgende layout:

Tabelnaam VRIJE_DAGEN

Veldnaam gegevenstype
___________________________________
|ID__________________ | AutoNummering |
|USR_ID______________ | Nummeriek____|
|Van_________________ | Datum________|
|Tot__________________| Datum________|
|Soort________________| Tekst_________|
|divuren_______________| Nummeriek____|
|Opmerking____________| Tekst_________|


Nou moet de output er uit komen te zien als


Afbeeldingslocatie: http://www.autorijschooltienkamp.nl/roybende/voorbeeldreport.png

Maar nu dus in Crystal Reports. Ik ben al een hele tijd bezig om dit te realiseren en het lukt me maar niet. Hoop dat iemand het weet.

groeten,

Roy

[ Voor 3% gewijzigd door R.A. op 05-02-2004 11:56 ]


Verwijderd

Om het in dezelfde weergave te krijgen is undone, want je kan die kalenderdagen niet in de kolommen krijgen (of je moet daar allemaal formules gebruiken).

ik zou het simpel houden en de kruistabel functionaliteit gebruiken in crystal (weet niet welke versie je hebt), maar het heet cross-tab.

In de row zet je de gebruikersnaam en in de kolom zet je de kalenderdag. In de value van de cross-tab zet je een formule die bepaalt of die user die dag vrij is.

Als je nog in het functionele stadium zit zou ik eerst de cross-tab uitwerken, dan de layout bijwerken en dan de functionaliteit afstemmen met de gebruikers. Want je vastleggen op een format is bijzonder link.

Verwijderd

Probleem is in de cross-tab dat je alleen vrije dagen hebt geregistreerd, kortom er zijn geen kalenderwaarden. Je kan de kolommen in de cross-tab alleen vullen adhv waarden in de database (je kunt geen array gebruiken om elke kalendercel te vullen).

Betekent dus dat je een rapportagetabel toe moet voegen (kalender) met enkele jaren aan kalenderdata. Deze is op eerste gezicht niet te joinen met de tabel vrije dagen omdat je een range gebruikt (van/tot) en niet op datum kunt linken.

  • R.A.
  • Registratie: Januari 2004
  • Niet online
Bedankt voor je snelle reply.
Ik wilde het ook in een cross-tab gaan zetten. Maar ik heb geen idee hoe :'( .

ik weet wel hoe je een cross-tab maakt en hoe je dan usr_id bij rows zet en hem laat groupen. Maar de rest weet ik niet. Maar je bedoeld dus bij kolommen gewoon 1 t/m 31 doen en dan bij de value het laten bepalen. Maar welke formule moet ik daar neerzetten dan?

Alvast harstikke bedankt _/-\o_ _/-\o_ _/-\o_

Verwijderd

R.A. schreef op 05 februari 2004 @ 12:07:

ik weet wel hoe je een cross-tab maakt en hoe je dan usr_id bij rows zet en hem laat groupen. Maar de rest weet ik niet. Maar je bedoeld dus bij kolommen gewoon 1 t/m 31 doen en dan bij de value het laten bepalen. Maar welke formule moet ik daar neerzetten dan?

Alvast harstikke bedankt _/-\o_ _/-\o_ _/-\o_
Bij de kolommen 1 t/m 31 zetten mbv een formule is alleen mogelijk zonder cross-tab.
Maar je hebt dan 31 formules nodig in de header en 31 formules in de detail, lijkt me niet aanbevelenswaardig.

In geval van je cross-tab zet je de waarden van de kalendertabel in het 'column' veld. Probleem blijft vooralsnog hoe je die kalendertabel gaat linken met je vrije dagen tabel aangezien je bij die vrije dagen geen concrete datum gebruikt.

  • R.A.
  • Registratie: Januari 2004
  • Niet online
Hoe zou ik dan mn tabellen moeten inrichten voor het gemak van crystal reports. Ik kan alles aanpassen (aangezien ik het programma die het wegschrijft ook heb gemaakt). Het probleem is alleen dat mensen moeten kunnen opgeven of de werknemer 1 of meerdere dagen afwezig is. Zeg maar hoe ik het moet doen _/-\o_

Verwijderd

R.A. schreef op 05 februari 2004 @ 12:18:
Zeg maar hoe ik het moet doen _/-\o_
geef je me dadelijk nog met de zweep?

E-mailadres staat in mijn profiel, voor 3 euro mag je tabel opsturen en dan fiks ik het.
Development platform, SQLserver 2000 of acces, crystal 8.5 of 9.
Graag erbij vertellen welke crystal distruibutie je gebruikt.

Fundamentele vraag: is deze layout dwingend of is er een alternatief mogelijk?

  • R.A.
  • Registratie: Januari 2004
  • Niet online
En ik toch denken dat dit een forum is om mensen elkaar gratis te helpen. :P

Layout mag alle kanten op gaan zolang er maar een beetje overzicht in is.

ps. ik gebruik crystal reports 8.5 developer edition en access 2000

[ Voor 21% gewijzigd door R.A. op 05-02-2004 12:35 ]


Verwijderd

Je kan ook excel gebruiken als reporting tool, je kunt met odbc linken en querien.
Is ook een optie!

Verwijderd

R.A. schreef op 05 februari 2004 @ 12:30:
En ik toch denken dat dit een forum is om mensen elkaar gratis te helpen. :P

Layout mag alle kanten op gaan zolang er maar een beetje overzicht in is.

gr. Roy
wat is je developersplatform (database die je gebruikt en crystal versie)? want dat is belangrijk om te weten.

  • R.A.
  • Registratie: Januari 2004
  • Niet online
Ik had al geedit. Maar je was te snel

Verwijderd

R.A. schreef op 05 februari 2004 @ 12:36:
Ik had al geedit. Maar je was te snel
Ok heb het gezien, wat is je connectie met de database?
heb het tabelletje hier nu staan

  • R.A.
  • Registratie: Januari 2004
  • Niet online
Ik deed gewoon select database. Dus hij maakt connectie via DAO

Verwijderd

Roy, 3 opties:
1). 31 lijnen trekken en 31 row formules en 31 detail formules maken. Je kunt de gebruiker een parameter in laten geven adhv welke maand, jaar de kalender gegenereerd moet worden. Met crystal datumformule kun je dan in de rij aangeven tot hoe ver die moet gaan! (conditionele suppress)
2). een query maken in access en op een of andere manier de volledige kalender genereren in een kolom voor de geselecteerde maand. Het is mij onbekend hoe je een kalender genereert met een acces query, zeker als je een onderliggende tabel gebruikt. (wellicht jouw expertise)
3. een kalendertabel linken, alleen heb je geen tabelveld om op te linken.

Ik ga voor optie 1 omdat ik onvoldoende kennis heb van optie 2.

Optie 3 is onderhoudsgevoelig (kalendertabel) en genereert redundante data (je hebt dan een tabel in je database staan die niet nodig is voor transacties)

[ Voor 3% gewijzigd door Verwijderd op 05-02-2004 12:55 ]


  • R.A.
  • Registratie: Januari 2004
  • Niet online
Kheb je gemaild ;-)

Verwijderd

De 31 headerwaarden genereer je met:

Numbervar Einddatum:=31;
Numbervar teller;
Stringvar line;
for teller:= 1 to Einddatum step 1 do line:=line+" "+totext(teller,0);
line


Als je dit in een formule kopieert en in de header plaatst dan heb je netjes 31 dagen naast elkaar. De einddatum moeten we variabel laten bepalen (adhv de ingegeven maand)

Verwijderd

Ok roy, heb je terug gemaild.
Duidelijke note voor de moderator, dit is geen betaalde dienst geworden ;-)

[ Voor 59% gewijzigd door Verwijderd op 05-02-2004 13:28 ]


Verwijderd

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.
Pagina: 1