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 Case I: topwaarden

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 Case IV: categoriseren

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 Case V: opleuken

5.1 Om de vijf regels een lijn; paginanummering wisselend links en rechts

6 Case VI: kruistabellen

6.1 Kruistabel: som van de bruto omzet per categorie per jaar per maand

6.2 Nog een kruistabel

7 Case VII: complexe formules

7.1 Bijhouden hoogste orderregelsbedrag, datum en klant

7.2 Meerdere parameterwaarden tonen

7.3 Meerdere parameterwaarden tonen met de Join functie

8 Case VIII: subrapporten

8.1 Hoofdrapport-subrapport

8.2 Hoofdrapport-subrapport met parameter

9 Case IX: Hierarchie

9.1 Hierarchie

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: