Crystal Reports CASES (24-3-2010)
Vragen beantwoord ik tegen betaling van een uurtarief van € 60,- met een minimum van 1 uur
I N H O U D S O P G A V E
Crystal Reports CASES (24-3-2010)
1.1 De 10 hoogste omzetten per orderregel met formula fields
1.2 De 10 hoogste omzetten per ordernummer met TopN
2 Case II: groepsgegevens vergelijken met detailgegevens
2.1 Bij welke facturen is er te veel of te weinig betaald?
3 Case III: groeperen, kolommen splitsen, parameter, kwartalen
3.1 Omzetbedragen uit één kolom splitsen over twee
3.2 Weer splitsen maar nu met gebruikersinput
3.3 Kwartalen als kwartalen weergeven
4.1 Categoriseren op bruto ordergrootte met Specified Order
4.2 Categoriseren op bruto omzet met complexe formule
4.3 Categoriseren met een formule en een parameter
5.1 Om de vijf regels een lijn; paginanummering wisselend links en rechts
6.1 Kruistabel: som van de bruto omzet per categorie per jaar per maand
7.1 Bijhouden hoogste orderregelsbedrag, datum en klant
7.2 Meerdere parameterwaarden tonen
7.3 Meerdere parameterwaarden tonen met de Join functie
8.2 Hoofdrapport-subrapport met parameter
10 Case X: linken van bestanden
10.1 De outer join: welke klanten hebben geen enkel product besteld?
10.2 Koppelen op basis van velden met verschillende inhoud
10.3 Koppelen op basis van deelsleutels
Case I: topwaarden
We kunnen het resultaat verder beperken door alleen topwaarden te tonen. Topwaarden kunnen we toepassen op twee niveaus: detailniveau en groepsniveau. Voor het groepsniveau kunnen we gebruik maken van de TopN/Sort Group Expert. Voor het detailnieveau moeten we zelf creatief zijn.

De 10 hoogste omzetten per orderregel met formula fields
Database: noordenwind.mdb
Tabellen: Orders en Orderinformatie
Opgave: stel we willen van alle orderregels alleen die regels zien met de 10 hoogste omzetten
Oplossing: we hebben een formula field nodig dat de bruto omzet uitrekent (prijs per een heid * hoeveelheid) en nog eentje dat uitrekent of de bruto omzet groter of gelijk is aan de op 10 na hoogste omzet: dat doen we met de functie NthLargest
het resultaat van de laatste formule is een True of False; met deze formule kunnen we de detailsectie desgewenst conditoneel laten onderdrukken
Voorbeeld:

De 10 hoogste omzetten per ordernummer met TopN
Database: noordenwind.mdb
Tabellen: Orders en Orderinformatie
Opgave: stel we willen van alle ordernummers alleen die nummers die tot de 10 hoogste behoren
Oplossing: we hebben weer een formula field nodig dat de bruto omzet uitrekent (prijs per een heid * hoeveelheid) en we moeten groeperen op Ordernummer; vervolgens gebruiken we de TopN expert
Voorbeeld:

Case II: groepsgegevens vergelijken met detailgegevens
Bij welke facturen is er te veel of te weinig betaald?
Database: cr2000.mdb
Tabellen: Facturenbestand en Betalingenbestand
Opgave: Bij een bedrijf kunnen de facturen in één of meer keren betaald worden. In één bestand wordt het factuurbedrag bijgehouden, in een ander de gedane betalingen. De vraag is nu: bij welke facturen is er te veel of te weinig betaald?
Oplossing: we moeten groeperen op factuurnummer; vervolgens plaatsen we het factuurbedrag en de som van de betalingen in de groepssectie; dan maken we een formula field dat uitrekent wat het verschil tussen die twee is; negatieve verschillen laten we rood kleuren
Voorbeeld:

Case III: groeperen, kolommen splitsen, parameter, kwartalen
Omzetbedragen uit één kolom splitsen over twee
Database: noordenwind.mdb
Tabellen: Orders en Orderinformatie
Opgave: Een of andere boekhouder wil de gesommeerde orderbedragen groeperen per kwartaal maar dan uitgesplitst naar orderbedragen boven en onder de 1000. (Zo gek is dit trouwens niet, want stel dat iemand positieve en negatieve bedragen op deze manier uit elkaar wil halen). Hij wil de nieuwe kolommen ook nog apart op kunnen tellen.
Oplossing: we moeten groeperen op orderdatum (per kwartaal); vervolgens maken we drie formula fields: de eerste die bruto omzet per orderregel uitrekent, de tweede die daar de bedragen boven de duizend en de derde die de bedragen beneden de duizend uit toont; van deze drie formula fields zetten gebruiken we de sommering
Voorbeeld:

Weer splitsen maar nu met gebruikersinput
Database: noordenwind.mdb
Tabellen: Orders en Orderinformatie
Opgave: Zijn we net klaar, wil die boekhouder zelf het splitsingsbedrag kunnen opgeven: 500, 1000, 2000 en 5000.
Oplossing: We hebben nu dus een parameter nodig; waar we in de vorige opgave de splitsingsgrens hard hebben ingevuld, moeten we die nu vervangen door de parameter; let ook op de kolomnamen en de titel
Voorbeeld:

Kwartalen als kwartalen weergeven
Database: noordenwind.mdb
Tabellen: Orders en Orderinformatie
Opgave: Is ie nog niet tevreden. 1996 7 is verwarrend. Daar moet komen te staan: 1996 1 ste kwartaal etc.
Oplossing: Dit kunnen we oplossen met een nieuw Formula field, de functie Month en een Select Case die het resultaat omzet naar de gewenste tekst. Probeer dit met de helpfunctie op te lossen.
Voorbeeld:

Case IV: categoriseren
Categoriseren op bruto ordergrootte met Specified Order
Database: noordenwind.mdb
Tabellen: Orders en Orderinformatie, Categorieën en Producten
Opgave: We kunnen de bruto omzet ook in categorieën onderverdelen en vervolgens bijvoorbeeld kijken wat de totale bruto omzet per kwartaal per categorie is geweest.
Oplossing: we hebben weer een formula field Bruto omzet nodig; vervolgens groeperen we op zelfgemaakte groepen Bruto Omzet met behulp van Specified Order; daar weer binnen groeperen we op orderdatum per kwartaal. Voor elk van deze niveaus willen we een telling van het aantal orderregels
Voorbeeld:

Categoriseren op bruto omzet met complexe formule
Database: noordenwind.mdb
Tabellen: Orders en Orderinformatie, Categorieën en Producten
Opgave: Specified Order is een heel mooie mogelijkeheid, maar duidelijk minder flexibel wanneer we categoriseren met behulp van een Formula field dat de bruto omzet verdeeld in categorieën van 1000. In een volgende stap kunnen we die verdeling zelfs parametriseren.
Oplossing: we hebben weer een formula field Bruto omzet nodig; vervolgens maken we een nieuwe dat met behulp van de Int (integer) functie een een deelwaarde bedragen indeeld in hun eigen categorie; op dit laatste formula field groeperen we dan; daar weer binnen groeperen we op orderdatum per kwartaal. Voor elk van deze niveaus willen we een telling van het aantal orderregels
Voorbeeld:

Categoriseren met een formule en een parameter
Database: noordenwind.mdb
Tabellen: Orders en Orderinformatie, Categorieën en Producten
Opgave: De vorige oplossing gaan we nu parametriseren
Oplossing: we hebben nu een parameter nodig; de inhoud daarvan gebruiken we vervolgens als deelwaarde in de formule
Voorbeeld:

Case V: opleuken
Om de vijf regels een lijn; paginanummering wisselend links en rechts
Database: noordenwind.mdb
Tabellen: Orderinformatie
Opgave: We willen een overzicht waarbij na elke vijfde regel een dikke streep getoond wordt
Oplossing: Van de detailsectie hebben we een a en een b variant nodig. In de b variant plaatsen we een dikke streep; vervolgens onderdrukken we b door een formule te maken die het recordnummer te delen door 5: elke keer als de rest 0 is niet onderdrukken, anders wel. De rest kunnen we vaststellen met behulp van de Remainder functie. Het zelfde verhaal geldt voor het paginanummer: alleen dan moeten we twee paginasecties maken en de pagenumber gebruiken
Voorbeeld:

en:

Case VI: kruistabellen
Kruistabel: som van de bruto omzet per categorie per jaar per maand
Database: noordenwind.mdb
Tabellen: Orderinformatie, Order, Categorieën en Produkten
Opgave: We willen een kruistabel waarbij de som van de omzet wordt afgezet tegen categorienaam (kolomkop) en kwartaal (orderdatum als rijkop)
Oplossing: we hebben weer het formula field Bruto omzet nodig; de rest kunnen we allemaal aanpakken via Insert -> crosstab; de kruistabel plaatsen we in de Report Header. Als we een groep maken op Categorienaam en we plaatsen de kruistabel eveneens daarin, dan krijgen we het tweede plaatje

Voorbeeld:

En in het zelfde rapport: de bruto omzet per aparte categorie:

Nog een kruistabel
Database: noordenwind.mdb
Tabellen: Orderinformatie, Order, Categorieën en Produkten
Opgave: We willen een kruistabel waarbij de som van de omzet wordt afgezet tegen categorienaam (kolomkop) en kwartaal (orderdatum als rijkop) maar dan willen we dezelfde maanden uit de verschillende jaren bij elkaar hebben
Oplossing: we hebben dan twee extra formula fields nodig; ééntje die eerst de maand en dan het jaar (met month en year ) uit de datum haalt en een tweede die het precies andersom doet; we groeperen dan op de eerste en tonen de tweede


Case VII: complexe formules
Bijhouden hoogste orderregelsbedrag, datum en klant
Database: noordenwind.mdb
Tabellen: Orderinformatie, Order en Klanten
Opgave: We willen een rapport dat laat zien welke klant op welke datum de orderegel met het hoogste bedrag heeft gehaald
Oplossing: we hebben hiervoor een wat complexer Formula field nodig; probeer het onderstaande maar eens uit
Voorbeeld:

currencyvar BonusAmount; // zorgt er voor dat BonusAmount ook afgebeeld wordt als bedrag!!!
stringvar HighestCustname;
Datetimevar DateBonusReached;
if {@bruto omzet}> BonusAmount then
(
HighestCustname := {Klanten.Bedrijf};
DateBonusReached := {Orders.Orderdatum};
BonusAmount := {@bruto omzet}
);
//let op de haakjes!!!!!
"Het hoogste bedrag is " & totext(BonusAmount) & " door " & HighestCustname & "op " &
totext(DateBonusReached,"d/M/yyyy")
Meerdere parameterwaarden tonen
Database: noordenwind.mdb
Tabellen: Produkten, orderinformatie, orders
Opgave: We kunnen een parameter zo instellen dat deze meerdere keuzen toelaat. We maken een rapport dat per product de tole omzet toont, met daarbij een parameter waarmee we meerdere producten kunnen selecteren. Vervolgens willen we de gemaakte keuzen voor de parameter in de Report Header laten afdrukken.
Oplossing: Dit vergt een Formula Field met de volgende inhoud:
numbervar teller;
stringvar boodschap;
boodschap:= "U hebt geselecteerd: ";
for teller := 1 to count({?Product}) step 1 do
(
boodschap:= boodschap & {?Product}[teller] + ", "
);
left(boodschap, length(boodschap)-2)
Voorbeeld:

Meerdere parameterwaarden tonen met de Join functie
Database: noordenwind.mdb
Tabellen: Produkten, orderinformatie, orders
Opgave: In plaats van deze uitgebreide formule te gebruiken, kan het ook korter met behulp van de Join functie. Probeer nu zelf uit te vinden met behulp van de helpfunctie hoe dat werkt.
Oplossing: Dit vergt een Formula Field met daarin de Join functie. Zoek zelf uit hoe met behulp van de helpfunctie.
Case VIII: subrapporten
Hoofdrapport-subrapport
Database: noordenwind.mdb
Tabellen: Produkten
Opgave: Stel we willen de volgende vraag beantwoorden. We willen van de producten die uit het assortiment genomen zijn, weten wie de klanten waren, wie de leverancier en de omzet over een bepaalde periode.
Oplossing: Deze vraag kunnen we alleen maar in één rapport beantwoorden door gebruik te maken van subrapporten. In feite maken we dan toch gebruik van meerdere rapporten: een hoofdrapport van producten en gekoppelde subrapporten van klanten, leveranciers en omzet.
We moeten dus vier rapporten maken. Een hoofdrapport met daarin alle producten. Een subrapport met daarin de klantnamen (een koppeling met producten moet mogelijk zijn: de tabellen orders, orderinformatie en producten moeten ook opgenomen worden). Een subrapport Leveranciers en een subrapport met de bruto omzetcijfers per jaar.
De drie laatste rapporten koppelen we aan het eerste:

Via het link-scherm geven we aan hoe ze gelijkt moeten worden:

Voorbeeld:

Hoofdrapport-subrapport met parameter
Database: noordenwind.mdb
Tabellen: Produkten
Opgave: We willen hetzelfde overzicht per product alleen dan met parameter jaar om te kunnen kiezen voor welk jaar.
Oplossing: Het verschil met de vorige opgave is dat het hoofdrapport een parameter jaar moet bevatten en het subrapport met de omzetcijfers een formula field jaar met als formule year({orders.orderdatum}). De link moet dan dubbel zijn: niet alleen op productnummer maar ook op de parameter jaar, gelijkt aan het formula field jaar
Voorbeeld:

Case IX: Hierarchie
Hierarchie
Database: noordenwind.mdb
Tabellen: Orderinformatie, orders, werknemers
Opgave: We willen een overzicht van de omzet per werknemer per
Oplossing: Zie uitwerking
Voorbeeld:
Het is in Crystal Reports aan te geven wat de hierarchische relaties zijn tussen werknemers. Voorwaarde is wel dat voor elke werknemer via een code is aangegeven wie zijn superieur is en dat deze code te linken is aan de werknemerscode. In de tabel Werknemers van de Noordenwind is dit het geval.
In het menu Report vinden we de optie Hierarchal grouping options:

In dit veld kunnen we aangeven hoe de link willen leggen.
Bij het maken van een summary krijgen we in dit geval een extra optie, Sum across hierarchy:

Het een en ander leidt tot het volgende resultaat:

En het zelfde rapport gekoppeld aan een hoofdrapport:

Case X: linken van bestanden
De outer join: welke klanten hebben geen enkel product besteld?
Database: noordenwind.mdb
Tabellen: Klanten, orders, orderinformatie, produkten
Opgave: We willen een overzicht van die klanten die in de gegeven periode geen enkel product besteld
Oplossing: We moeten dan alle relaties tussen de tabellen veranderen in outer joins
Voorbeeld:

Koppelen op basis van velden met verschillende inhoud
Database: voorbeeld.mdb
Tabellen: datum, periode
Opgave: we willen voor elke datum een periodekenmerk tonen
Oplossing: we moeten dan een link maken zodanig dat elke datum uit de tabel datum kleiner is dan de einddatum van een periode
Voorbeeld:
Tabel1 heeft alleen een datumveld, tabel2 een begindatum en een einddatum van een periode. Uit de tweede tabel moet vervolgens een referentiewaarde getoond worden. Hoe bepalen we in welke periode een datum uit tabel1 hoort en hoe tonen we de bijbehorende referentiewaarde?

Koppelen op basis van deelsleutels
Database: voorbeeld.mdb
Tabellen: deelsleutel
Opgave: we willen voor elke deelsleutel een beschrijving uit de tabel completesleutel
Oplossing: we moeten dan een link maken via een subrapport; in het subrapport kunnen we dan een formula field maken waaraan we het hoofdrapport kunnen linken; via een shared variabele kunnen we dan waarden doorgeven
Voorbeeld:

