Einzelnen Beitrag anzeigen

Benmik

Registriert seit: 11. Apr 2009
542 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Häufigkeiten und Kreuztabellen aus zweidimensionalem Array errechnen

  Alt 30. Aug 2017, 14:48
Ich finde es jetzt auch schwer, einen Weg von mensch72s Vorschlägen zu einer praktischen Implementierung zu finden.
Einen VIEW kannte ich noch nicht. Er würde aber nicht das Problem der wechselnden Feld- und Wertbezeichnungen lösen, die dem Anwender angezeigt werden müssen.

Nochmal: Auf die Struktur der DB habe ich keinen Einfluss. Wenn V01 im ersten Jahr das Alter ist, im zweiten die Größe und im dritten die PLZ, dann ist das so. Der Anwender hat 1 - 3 Klapplisten, in die in der Reihenfolge des Auftritts in der DB alle Felder (mit ihren Feldbezeichnungen) eingetragen sind. Aus diesen Listen wählt er dann die Felder für die einfache Häufigkeit oder eine Kreuztabelle mit 2 oder 3 Feldern aus. Das Programm muss dann immer wissen, ob V01 im gegebenen Jahr als "Alter", "Größe" oder "PLZ" als erster Eintrag in der Klappliste erscheinen muss.

Die von mir im stillen Hirnkästlein ersonnene Lösung, die noch der Bestätigung durch eine praktische Implementierung harrt, sieht so aus:

1. Für das erste Jahr erstelle ich eine Enumeration, also ungefähr so: type TFeldpos = (fAlter01,fGröße01,fGeschlecht01,fPLZ01,fPersImHHE01,fPersImHHK01) .

2. Ich definiere eine Klasse TFeld mit allen Informationen, die ich über ein Feld brauche; also z.B. die laufende Nummer (die Enumeration), Typ, Bezeichnung, mögliche Werte, Wertbezeichungen und Weiteres.

3. Ich definiere eine hardkodierte Liste type TFeldListe = class(TObjectList<TFeld>) , in die die bisher vorhandenen 6 Felder aufnommen werden. Dabei erstelle ich die 6 bisher vorhandenen TFeld .

4. Zur Laufzeit erstelle ich eine weitere Liste type TDBListe = class(TObjectList<TFeld>) und füge per Add die Objekte der FeldListe hinzu. Im ersten Jahr ist das natürlich einfach.

5. Im Betrieb gilt: Listindex Klappliste = Pos Feld in DB = Pos Feldobjekt in der DBListe. Damit sollte die Handhabung leicht funktionieren. An die Eigenschaften des Feldes in der DBListe komme ich über FeldListe[DBListe[xx].LfdNr] (= TFeldPos ) heran.

6. Die Berechnung der Altersgruppen läuft über den Eintrag in der DBListe, der FeldListe[fAlter01] entspricht.

Jetzt kommt das zweite Jahr und es wird spannend.

Das Feld "Geschlecht" hat sich geändert. An die 7. Stelle der Enumeration kommt jetzt fGeschlecht02 , der FeldListe wird ein 7. Objekt hinzugefügt. Die Erstellung der DBListe beginnt mit DBListe.Add(FeldListe[fGeschlecht02]); .

In allen folgenden Jahren geht es analog. Für jede neue oder geänderte Variable wird ein neues TFeld erstellt und an FeldListe angehängt. Die jährliche Arbeit besteht dann darin, eine neue, jahresspezifische DBListe zu erstellen. Wenn sich jetzt aber zwischen V04 und V82 nichts ändert, dann kann ich die Add von V05 - V81 einfach kopieren. Wird ein geändertes Feld für eine Berechnung verwendet, dann kommt eben eine If..Then - Konstruktion zum Einsatz.

In Betrachtung dessen, was sich in den letzten über 10 Jahren wie oft und in welcher Form geändert hat, sagt mein Hirnkästlein, das müsste funktionieren. Was Delphi dazu sagt, das könnte leider was ganz anderes sein...

Geändert von Benmik (30. Aug 2017 um 15:09 Uhr)
  Mit Zitat antworten Zitat