Also ich würde das Problem mit einem
Memory-Dataset lösen.
Schritt 1:
man benötigt eine Abfrage gruppiert und sortiert nach ArtikelNr, Jahr und Monat:
Code:
ArtikelNr | Jahr | Monat | Summe | MaxWert | Anzahl
=============================================================
100 | 2011 | 1 | 6785.70 | 559.00 | 44
100 | 2011 | 3 | 2782.50 | 120.0 | 17
....
Zusätzlich zur Summe des Preises habe ich noch den Max. Artikelbetrag und die Anzahl aufgenommen.
Die weiteren Felder bekommt man quasi zum Nulltarif und kann damit später interessante statische Daten anzeigen.
Schritt 2:
Man erzeugt dynamisch zur Laufzeit die Felder für das Memory-Dataset.
Das Memory-Dataset stellt dann die Pivot-Tabelle dar.
Dazu muss man in einer Schleife über alle Datensätze der obigen Abfrage laufen und ein neues Feld vom Typ Currency erzeugen.
Man erzeugt z.B. beim Datensatz für Jahr=2011 und Monat=3 das Feld "J2011M03" oder man macht es so wie man es eben benötigt.
Es muss aber geprüft werden, ob das Feld schon angelegt ist.
Im Event AfterOpen des Memory-Datasets kann man den Feldern über das Property DisplayLabel lesbare Bezeichnungen geben.
Schritt 3:
In einer weiteren Schleife (2. Durchlauf) über alle Datensätze wird das Memory-Dataset befüllt.
Dabei muss man prüfen, ob schon ein Datensatz zum Artikel existiert.
Falls nein mit Append einen neuen Dataset anlegen; falls ja Datensatz mit Edit verändern.
Man hat jetzt die Möglichkeit die Summe, MaxWert, Anzahl oder Durchschnitt in das Memory-Dataset zu schreiben.
Vorteile:
* maximale Flexibilität (kein Problem die Daten quartalsweise oder je Kalenderwoche zu präsentieren)
* Unabhängigkeit von der Datenbank
* wesentlich einfachere
SQL-Abfrage (schneller und einfacher zu verstehen)
*
SQL-Abfrage kann leichter mit einer einschränkenden WHERE-Bedingung erweitert werden
* Grundprinzip ist leicht auf andere Tabellen (Bestellungen, Rückläufer,...) umsetzbar
Nachteil:
* man benötigt ein Memory-Dataset und geschätzte 50 bis 100 Zeilen Sourcecode zur Umsetzung
Man könnte eine Klasse schreiben, die die Schritte 2 und 3 konfigurierbar und allgemeingültig umsetzt.