Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Panels und Buttons mit sql generieren (https://www.delphipraxis.net/110572-panels-und-buttons-mit-sql-generieren.html)

Privateer3000 20. Mär 2008 10:31

Datenbank: dbf • Zugriff über: bde

Panels und Buttons mit sql generieren
 
Hiho Gemeinde,

für mein folgendes Problem habe ich keine Lösung
gefunden oder nicht als solche für mich erkannt.

Mittels zwei Tabellen sollen Panels und Buttons generiert werden.
Aus Tabelle A Spalte Gruppenname werden Panels erstellt.
Zugehörig dazu ein oder mehrere Buttons aus Tabelle B mit
Spalte Name - Spalte Gruppenname(analog Tabelle A Spalte Gruppenname)
in beiden Tabellen sind die Gruppennamen vorhanden damit die Buttons den
Panels zugeordnet werden können.

wie muss eine sql-abfrage aussehen?

Viele Grüße und laßt die Osterhasen leben !

mkinzler 20. Mär 2008 10:44

Re: Panels und Buttons mit sql generieren
 
Ich würde das mit 2 schleifen lösen.
Äußere Schleife für Panels über die Abfrage:
SQL-Code:
select id, gruppenname from tabellea;
Dann ein Detaildataset für den äußeren Master.

oldmax 20. Mär 2008 12:02

Re: Panels und Buttons mit sql generieren
 
Hi
Nun ja, ich weiß jetzt nicht so recht, was du sehen willst, daher mal meinen Ansatz:
Ich habe eine Tabelle, in denen Panels beschrieben sind
also
ID - Für die eindeutige Zuordnnung in der DB
PN_Name - PanelName
PN_Top - y-Position auf der Form
PN_Left -x-Position auf der Form
PN_Width - Weite
PN_Heigth- Höhe
PN_Color - Farbe
usw. also alles, was über das Panel wichtig ist....

Nun kommt die Tabelle der Buttons
ID- für die eindeutige Zuordnung in der DB
BT_Name - ButtonName
BT_Top - y-Position auf dem Panel !!
BT_Left - x-Position auf dem Panel !!
usw... auch wieder alles, was zum Button gehört
zusätzlich einen Zeiger auf den ID des Panels
Bt_Parent_Id vom Typ Integer oder LongInt

Nun die Installation
Ich schreibe mir immer einen SQLString, den ich dann per Add der Query zuweise

Delphi-Quellcode:
MySQLStr:='Select * From PanelTabelle';
  MyPanelQuery. Close;
  MyPanelQuery.SQL.Clear;
  MyPanelQuery.SQL.Add(MySQLStr);// ist mit Haltepunkt immer leicht zu kontrollieren
  MyPanelQuery.Open;            // auch wenns eine richtig umfangreiche SQL -Abfrage ist
  If MyPanelQuery.RecordCount>0 then
  Begin
    MyPanelQuery.First;

    For i:=MyPanelQuery.RecordCount-1 do
    Begin
     ...... // Installation der Panels
     MySQLStr:='Select * From ButtonTabelle';
     MySQLStr:=MySQLStr+' Where (Bt_Parent_Id=+'''+IntToStr(MyPanelQuery['Ident'])+''')';
     MyButtonQuery. Close;
     MyButtonQuery.SQL.Clear;
     MyButtonQuery.SQL.Add(MySQLStr);
     MyButtonQuery.Open;
     If MyButtonQuery.RecordCount>0 then
     begin
       MyButtonQuery.First;
       For j :=0 to MyButtonQuery.RecordCount-1 do
       begin
         ...... // Installation der Buttons
         MyButtonQuery.Next;// nicht vergessen
       end;
     end;
     MyPanelQuery.Next;
   end;
 end;
Natürlich kannst du auch auf MyPanel['Panel_Name'] suchen und den BT_Parent_Id entsprechend mit dem Panelnamen belegen. Kann aber leicht ins Auge gehen, wenn die Zugriffe mal per Hand eingegeben werden und bspw. Leerzeichen im Namen stehen...
Hoffe, es hilft dir
Gruß oldmax

Privateer3000 20. Mär 2008 12:29

Re: Panels und Buttons mit sql generieren
 
Hallo und Danke ersteinmal,
im Moment sieht es so aus wie im folgenden Code.
Da steuer ich dies mit bde, also t1.first usw.
da ich nun auf ADO umstelle muss dies mit sql erfolgen.
Kann man mit einem und dem selben query in einer Schleife
abfragen? Wird dieser nicht jedesmal mit "clear" gesäubert?
Oder sollten dafür 2 Querys benutzt werden?!
Delphi-Quellcode:
t2.First;
while not t2.Eof do begin
  tpa:=TsPanel.Create(Self);
  grunam:=t2.FieldByName('NAME').AsString;
  tpa.Parent:=mainpanel;
  tpa.Visible:=true;
  tpa.Left:=316;
  tpa.Top:=260;
  tpa.Height:=393;
  tpa.Width:=694;
  tpa.Name:='panb'+IntToStr(ianz);
  tpa.Caption:='';
  (Findcomponent('panb0') as Tpanel).bringtofront;
  i:=0;
  t1.Filter:='GRUPPE='+QuotedStr(grunam);
  t1.Filtered:=True;
  t1.First;
while not t1.eof do begin
  Spalte := i mod 6;
  Zeile := i div 6;
  butsleft:=t1.fieldByName('SETLEFT').AsInteger;
  butstop:=t1.fieldByName('SETTOP').AsInteger;
  aLabel:=TXiButton.Create(Self);
  aLabel.Parent:=findcomponent('panb'+Inttostr(ianz))as TPanel;
  aLabel.Visible:=True;
  if (butsleft = 0) AND (butstop = 0) then begin
  aLabel.Left:=Spalte*115; aLabel.Top:=Zeile*45; end else begin
  aLabel.Left:=butsleft; aLabel.Top:=butstop; end;
  alabel.Width:=113;
  alabel.Height:=43;
  aLabel.ShowHint:=True;
  aLabel.Font.Size:=t1.fieldbyname('FOGR').AsInteger;
  aLabel.Font.Style:=[fsbold];
  aLabel.Hint:=t1.fieldbyname('ANAME').asString;
  aLabel.ColorScheme:=GetColorScheme(t1.fieldbyname('FARBE').AsString);
  aLabel.Caption:=t1.fieldbyname('kurz').AsString;
  aLabel.Tag:=t1.FieldByName('anr').AsInteger;
  aLabel.OnClick:=kassbutclick;
  //aLabel.OnMouseDown:=FormMouseDown;
  //aLabel.OnMouseUp:=FormMouseUp;
  //aLabel.OnMouseMove:=FormMouseMove;
  t1.Next;
  inc(i);
end;
t1.Filtered:=False;
t2.Next;
inc(ianz);
end;

angos 20. Mär 2008 13:57

Re: Panels und Buttons mit sql generieren
 
SQL-Code:
select * from t2 left outer join t1 on t2.name=t1.gruppe

Privateer3000 20. Mär 2008 14:29

Re: Panels und Buttons mit sql generieren
 
Danke,
jetzt kann ich mir nicht vorstellen wie nach dieser
sql-anweisung erst die Panel dann die Buttons gezeichnet
werden sollen. Denn die muss ja so sein, da die Buttons
parent zu den Panels sind!

Danke und Grüße!

angos 20. Mär 2008 15:21

Re: Panels und Buttons mit sql generieren
 
ok,

da muss die SQL-Anweisung noch ein bisschen angepasst werden:

SQL-Code:
select * from t2 left outer join t1 on t2.name=t1.gruppe
Order by t2.name
Nun kannst du die Datenquelle ja einfach nacheinander abarbeiten, jedesmal wenn sich t2.name ändert erstellst du das panel und den Button ansonsten nur den Button.

so in der Art sollte das dann gehen
Delphi-Quellcode:
  sPnl := '';
 
  Query.First;
  while not Query1.eof do
  begin
    if sPnL <> Query.FieldByName('NAME').asString then
    begin
      sPnl := Query.FieldByName('NAME').asString;
      ErezugePanel;
    end;
     
    ErzeugeButton;

    Query.Next; // EDIT: Query.Next sollte nicht fehlen :)
  end;

Privateer3000 20. Mär 2008 15:47

Re: Panels und Buttons mit sql generieren
 
Danke

also doch zwei verschiedene Querys,
seh ich das richtig?

@mkinzler
was ist mit Detaildataset gemeint?

mkinzler 20. Mär 2008 15:55

Re: Panels und Buttons mit sql generieren
 
Ein Detaildataset wird über die Eigenschaft MasterSource mit einem Master-DataSet (wäre in deinem Fall die Panels) verknüpft. beim Wechseln des aktuellen Datensatzes des Masters, reagiert dieses dann mit der Filterung der zugeordneten Buttons.

Privateer3000 20. Mär 2008 17:57

Re: Panels und Buttons mit sql generieren
 
Danke mkinzler
aber das soll einer verstehen...
ich jedenfalls nicht :-(


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr.
Seite 1 von 2  1 2      

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