Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi 20 Datasets verallgemeinern (https://www.delphipraxis.net/11023-20-datasets-verallgemeinern.html)

Hansa 29. Okt 2003 20:05


20 Datasets verallgemeinern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

folgendes Problem: ich habe 20 Tabellen mit statistischen Daten. Diese sollen grafisch aufbereitet werden. Z.B. Umsatz-Jahresübersicht, als Grafik, wo die Monate einzeln aufgeführt werden. Im Prinzip ist das immer dasselbe, nur die Tabellen sind halt unterschiedlich. Ich könnte jetzt das ganze 20mal abkupfern, glaube aber daß es besser irgendwie über Parameter gesteuert wird. Nur wie und wo ?

Delphi-Quellcode:
procedure TForm1.btnStartClick(Sender: TObject);
var i : byte;
    m : MonatsUmsatz;
    homepath : string;
begin
  Series1.Clear;
  Series1.Title := LabeledEdit1.Text;
  Series2.Clear;
  Series2.Title := LabeledEdit2.Text;
  FirmStat.Title.Text [0] := 'Firmen - Statistik '+LabeledEdit1.Text+'/'+LabeledEdit2.Text+' in 1000 €';
  FirmStat.Visible := true;
//  Button2.Visible := true;
  CASE Auswahl.ItemIndex OF
    1 : s := UmsatzListe;
    2 : s := RGliste;
    3 : s := MengenListe;
  END;
  WITH StatModul.FirmStatDS DO BEGIN
    close;
    SelectSQL.Text := 'SELECT * FROM FIRMSTAT8 WHERE JAHR =' + LabeledEdit1.text;
    open;
    IF NOT IsEmpty THEN BEGIN
      for i:= 1 to 12 do BEGIN
        StatUmsatz (m);
        Series1.AddXY(i,m [i]);
      END;
    end
    else
      ShowMessage ('Keine Daten für '+LabeledEdit1.Text+' gefunden !');
    close;
    StatModul.FirmStatDS.SelectSQL.Text :='SELECT * FROM FIRMSTAT8 WHERE JAHR = '+ LabeledEdit2.text;
    open;
    IF NOT IsEmpty THEN BEGIN
      for i:= 1 to 12 do begin
        StatUmsatz (m);
        Series2.AddXY(i,m [i]);
      end;
    end
    else
      ShowMessage ('Keine Daten für '+LabeledEdit2.Text+' gefunden !');
  END;
  FirmStat.visible := true;
  IF clbOptionen.Checked [0] THEN
    FirmStat.Print;
  IF clbOptionen.Checked [1] THEN BEGIN
    homePath:=ExtractFilePath(ParamStr(0));
    SaveDialog1.InitialDir:=homePath;
    SaveDialog1.Title := 'Bitmap - Grafik speichern';
    SaveDialog1.FileName := 'GRAFIK.BMP';
    if SaveDialog1.Execute then
      FirmStat.SaveToBitmapFile (SaveDialog1.FileName);
  END;
  IF clbOptionen.Checked [2] THEN BEGIN
  END;
end;

Vermute, an dieser Stelle müßte man irgendwie was ändern:

'SELECT * FROM FIRMSTAT8 WHERE JAHR ='

Im Anhang ist ein Screenshot, wie das ganze aussieht. Nur soll es eben 20 Tabellen berücksichtigen. Die Grafiken an sich wären fast gleich.

mschaefer 29. Okt 2003 20:50

Re: 20 Datasets verallgemeinern
 
Hallo Hansa,
na auch wieder mal in der Warenwirtschaft gelandet...

Du ich würde Deine Procedure als Parameter den SQL-String übergeben. Selbst mag ich keine Query-Parameter und neige dazu den SQL-String in einer seperaten Procedure Zusammenzusetzen.

'SELECT FROM ' + TABLE_STR + ' WHERE JAHR = " ' + trim(Edit.Text) + ' " ';

So kannst Du Dir auch noch den fertigen SQL-String mit Showmessage-Anzeigen lassen,
was bei Parametern immer etwas leidlich ist.

Grüße aus dem flachen Norden

// Martin





:coder: :coder: :coder:
Vorsicht: hier arbeitet ein Tricoder..

Hansa 29. Okt 2003 21:06

Re: 20 Datasets verallgemeinern
 
Soweit war ich auch schon, aber wo kommt dann der TABLE_STR her, bzw. wo muß der hin ?

mschaefer 29. Okt 2003 21:43

Re: 20 Datasets verallgemeinern
 
Hm ja Du schreibtst ja, dass Du 20 Tabellen hast, ich nehme an ,
das sich entscheidet welche Du nehmen mußt wenn Der Anwender seine
Wahl trifft.

Du machst den Unterscheid in der Case Strukur.
Soweit ich das bisher verstanden habe würde ich jetzt in den Case-Fallen
den Table_STR :='Tabellenname' zuweisen...

Melde mich Morgen wieder // Grüße //Martin

Hansa 30. Okt 2003 00:08

Re: 20 Datasets verallgemeinern
 
Wenn ich das global mache, dürfte das so schon gehen. Glaube aber nicht, daß das nötig ist. Das wiederspricht eigentlich auch dem Grundgedanken von Delphi mit Datenkapselung usw.

Ist es in der Formdeklaration mit drin, so geht es nur mit Hilfe des Repository. Dann schleppe ich aber auch viel Source Ballast mit. So was wäre u.a. sehr empfänglich für Tipfehler. Desweiteren tauchen doch noch einige Dinge auf, die berücksichtigt werden müssen. Um z.B. eine Kunden-Statistik zu erstellen, brauche ich noch auf der Form ein Feld um die Kunden-Nr. eingeben zu können. Also kann ich dazu die Vorlage aus der Kundenstatistik vergessen. Wie es aussieht wären dann die 20 Forms reduziert auf ca. 5 Repository Einträge. Das ists wohl auch nicht.

Das nächste wäre die Property 'Tag' zu benutzen. Die wollte ich mir aber für extreme Notfälle aufheben. Würde ich nur ungern machen.

Und last not least, eine eigene Form abzuleiten, die ein eigenes 'Statistik-Tag' besitzt. Das könnte man dann sogar im OI verändern. Aber u.a. durch die kluge Entscheidung von Borland, z.B. eine Unterscheidung in Runtime- und Designtime Packages und das aus 'wichtigen Lizenzgründen' :mrgreen: , Komponenten-Expert Typen usw., ist das arg kompliziert, vor allem weil mans nicht oft braucht. Alleine dafür bräuchte ich 2 Tage, um wieder zu wissen wie das war. Mit Motzi hatte ich das mal durchgezogen, sonst ist mir keiner bekannt, der überhaupt weiß was genau gemacht werden muß. Vermute, daß es nur wegen des OI so schwierig ist.

Für den Zweck hier brauche ich den aber nicht unbedingt.

Wieso geht das nicht einfach so zu schreiben:

Delphi-Quellcode:
TYPE StatTyp = (StatTyp1,StatTyp2...);

TStatistikForm=class(TForm)
  TStatTyp : Stattyp;
  procedure bla;
...
end;
oder muß das nur irgendwo bei private, public hin ? :gruebel:

MrSpock 30. Okt 2003 07:18

Re: 20 Datasets verallgemeinern
 
Hallo Hansa,

wenn du den TableStr Array an mehreren Stellen benötigst, aber nur in diesem Formular, kannst du ihn die Privat Section des Objektes packen. Benötigst du ihn nur in der Prozedur, die du angezeigt hast, kannst du ihn auch in die Prozedur selbst packen:

Delphi-Quellcode:
procedure TForm1.btnStartClick(Sender: TObject);
const
   TableStr : array [1..20] of String =('FIRMSTAT8', 'DieZweiteTab', 'NochEine' ...);
var i : byte;
    m : MonatsUmsatz;
    homepath : string;
begin
Sind die Namen einfach nur durchnummeriert, tuts eine Schleife:

Delphi-Quellcode:
TabStr[i] := 'FIRMSTAT'+IntToStr(i);

Hansa 30. Okt 2003 09:31

Re: 20 Datasets verallgemeinern
 
Aber genau da liegt doch der Hund begraben. Nicht mal das Array brauche ich. Ein Aufzählungstyp genügt. Es geht darum, wie und wo ich den gewünschten Wert zur Laufzeit setze.

mschaefer 30. Okt 2003 13:44

Re: 20 Datasets verallgemeinern
 
Hallo Hansa,

So ganz habe ich Dein Projekt wohl nicht im Überblick, aber mit doch reichlich Wachzustand
würde ich Dir folgendes vorschlagen

1. Du nimmst zwei Forms
2. Das Statistikform enhält keine Schaltelemente, sondern nur die Anzeigeelemente für dieStatistik
3. Das Statistikform hat eine public-Funktion ShowMe( Table_No )
Die Funktion zeigt das Formular dann an
4. Du hast ein Eingabeform, das neben/ unter das Statistikform positioniert wird
Hier kann die Statistikauswahl liegen. Wird die Kundenstatitik gewählt schaltest
Du Dein Eingabefeld für Kunden auf visible und prüfst die Eingabe


Soweit zunächst. Ja - hm - Formulare ableiten ist machbar und ich gebe zu das mit sowas meine
Projekte bestreite, aber das ist ein Thema für die Zeit zwischen den Projekten. Man muß doch da einiges an Reihenfolge einhalten und die Delphi-Versionen reagieren da wohl auch nicht alle
gleich drauf. Der Aufwand für ein Tag wär dicke


Grüße aus Hannover // Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz