Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MainMenü+combobox in dbgrid öffnen (https://www.delphipraxis.net/191533-mainmenue-combobox-dbgrid-oeffnen.html)

Justin 25. Jan 2017 11:00

Delphi-Version: 2007

MainMenü+combobox in dbgrid öffnen
 
Sehr geehrter Community.

Ich habe mal wieder ein Problem.
Und zwar :
Wir sollen aus einer combo box und aus dem MainMenü die Tabellen in einem Db Grid anzeigen lassen.
Dabei hab ich pbers main Menü die Tabellen aktiviert.

Da ich grad nicht an den pc komme, daher die Frage:
Wie kann man die Tabellen aus der combobox + MainMenü in diese dbgrid öffnen?

Per Click.
Ich Frage deshalb, weil wir sollen sowas erstellen, aber ich wüsste nicht wie.

Für die Erstellung des Unterpunktes der Tabellen aus der Combobox.
Delphi-Quellcode:
procedure TForm2.erra1Click(Sender: TObject);
var tab:TMenuItem;
i:integer;

begin
MainMenu1.items[2].clear;
combobox1.items.Clear;
ADOtable1.active:=true;
ADOConnection1.connected:=true;
ADOConnection2.connected:=false;
ADOConnection3.connected:=false;
ADOQuery1.Connection:=ADOconnection1;
DBGrid1.DataSource.DataSet:=Adotable1;
if ADOconnection1.Connected=true then ADOconnection1.GetTableNames(combobox1.Items,false);
y:=combobox1.Items.count;
for i := 0 to y-1  do begin
  tab:=TMenuItem.create(MainMenu1);
MainMenu1.items[2].add(tab);
tab.caption:=combobox1.items[i];
tab.tag:=i;
tab.OnClick:=erra1click;
Der Code funktioniert.. nur wie mache ich das jetzt, dass es in der DBGrid der Inhalt einer Tableunterpunktes angezeigt wird?

Ich würde mich über eure Hilfe freuen.

Mit freundlichen Grüßen
Justin

rokli 25. Jan 2017 14:52

AW: MainMenü+combobox in dbgrid öffnen
 
Hallo Justin,

da hat Du noch einiges vor Dir :!:

Hier mal ein überarbeiteter Code, der wirklich läuft:

Delphi-Quellcode:
procedure TForm2.erra1Click(Sender: TObject);
var
   tab:TMenuItem;
   i:integer;
   y:Integer;
begin
   MainMenu1.items.Clear;               // alle Menüeinträge weg
   combobox1.items.Clear;               // Combobox leer

   ADOConnection1.connected   :=true;   // Datenbankverbindung öffenen (vielleicht noch prüfen, obs geklappt hat?)

//   ADOtable1.active:=true;               // das setzt auch die ADOConnection mit der Du verbunden hast auf true
//   ADOConnection2.connected:=false;
//   ADOConnection3.connected:=false;

   // hier verwendest Du eine Query ...
   ADOQuery1.Connection         :=ADOconnection1;   // wie sieht denn der SQL aus? Benutzt Du die eigentlich? ist hier erst mal überflüssig!

   // Tabelle vorbereiten
   ADOTable1.Connection       := ADOConnection1;
   DataSource1.DataSet          := ADOTable1;
   // Grid vorbereiten
   DBGrid1.DataSource          := DataSource1;
   // und nun werden die Daten im Grid angezeigt
   ADOTable1.Open;

// den folgenden Teil verstehe ich garnicht

//   if ADOconnection1.Connected=true then
//      ADOconnection1.GetTableNames(combobox1.Items,false);
//   y:=combobox1.Items.count;
//   for i := 0 to y-1 do begin
//     tab:=TMenuItem.create(MainMenu1);
//      MainMenu1.items[2].add(tab);
//      tab.caption:=combobox1.items[i];
//      tab.tag:=i;
//      tab.OnClick:=erra1click;            // Rekursion?
//   end;

end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   // Programm Ende:
   // Tabelle schließen
   ADOTable1.Close;
   // falls benutzt auch Query schließen
   ADOQuery1.Close;
   // Datenbank abhängen
   ADOConnection1.Connected      := false;
end;

p80286 25. Jan 2017 15:32

AW: MainMenü+combobox in dbgrid öffnen
 
Delphi-Quellcode:
// den folgenden Teil verstehe ich garnicht

//   if ADOconnection1.Connected=true then
//      ADOconnection1.GetTableNames(combobox1.Items,false);
//   y:=combobox1.Items.count;
//   for i := 0 to y-1 do begin
//    tab:=TMenuItem.create(MainMenu1);
//      MainMenu1.items[2].add(tab);
//      tab.caption:=combobox1.items[i];
//      tab.tag:=i;
//      tab.OnClick:=erra1click;           // Rekursion?
//   end;
Wenn ich mich richtig erinnere gibt es bei ado eine Standardfunktion um die Tabellen zu erhalten "GetTableNames". Damit bastelt er jetzt die Combobox und das Hauptmenue zusammen.

Gruß
K-H

P.S.
ich empfehle in solchen Fällen immer die Abfrage der entsprechenden System-Views oder Aliasse z.B. ALL_TABLES in Oracle
http://www.java2s.com/Tutorial/Oracl...Dictionary.htm

rokli 25. Jan 2017 15:59

AW: MainMenü+combobox in dbgrid öffnen
 
Oder über

Code:
SELECT
   *
FROM
   SysObjects
WHERE
   xType IN ('V', 'U')

in MS SQL ... aber ich denke, der Weg über die Delphi Möglichkeiten (
Delphi-Quellcode:
ADOconnection1.GetTableNames
) etc. sind für Justin erstmal Aufgabe genug. Und solange wir nicht wissen, um welche DB es sich handelt .. :|

nahpets 25. Jan 2017 16:13

AW: MainMenü+combobox in dbgrid öffnen
 
Zitat:

Zitat von p80286 (Beitrag 1359948)
P.S.
ich empfehle in solchen Fällen immer die Abfrage der entsprechenden System-Views oder Aliasse z.B. ALL_TABLES in Oracle
http://www.java2s.com/Tutorial/Oracl...Dictionary.htm

Das sehe ich nicht so, wenn ich mit ADO arbeite, dann bekomme ich mit GetTableNames die Tabellennamen aus der Datenbank. Dabei ist es egal, ob es nun Oracle, Firebird, MSSQL, Postgres, Ingres, Access ... oder was weiß ich ist.

Durch das Ändern der Datenbankverbindung funktioniert das mit jeder Datenbank, auf die ich über ADO zugreifen kann.
Andernfalls brauch' ich für jede Datenbank 'ne "Sonderlocke" und eine Datenbankunabhängigkeit geht recht schnell "den Bach runter".

@rokli
Delphi-Quellcode:
if ADOconnection1.Connected then // ist die Datenbankverbindung aktiv?
   ADOconnection1.GetTableNames(combobox1.Items,false); // Dann die Tabellennamen (ohne die Systemtabellen) holen.
   // Sie befinden sich dann in der Combobox.
   y:=combobox1.Items.count; // Wieviel Tabellen haben wir bekommen?
for i := 0 to y-1 do begin // Einmal für jede Tabelle:
  tab:=TMenuItem.create(MainMenu1); // Neuen Menüeintrag anlegen.
  MainMenu1.items[2].add(tab); // Den den Menüeintrag 2 des Hauptmenüs als untergeorneten Menüpunkt zuordnen.
  tab.caption:=combobox1.items[i]; // Der gerade erstellte Menüunterpunkt bekommt den TAbellennamen als Beschriftung
  tab.tag:=i; // Dem Tag weisen wir die Index der Tabelle in der Combobox zu.
  tab.OnClick:=erra1click; // Der neue Menüeintag bekommt eine Ereignisroutine zugewiesen.
  // Ob hier die Zuweisung des Ereignisses, mit dem die Erstellung des Menüeintrages erfolgt, sinnvoll ist, darf allerdings bezweifelt werden ;-)
end;
Es wird also schlicht ein Untermenü erstellt, dass für jede Tabelle der Datenbank einen Menüeintrag enthält. Und die Menüeinträge bekommen halt auch eine OnClick-Ereignis zugewiesen. (Mit dem ein Untermenü erstellt wird, dass für ... zugewiesen. (Mit dem ... ))

Aber mit einer anderen OnClick-Methode wird das recht schnell durchaus sinnvoll.

Justin 25. Jan 2017 16:27

AW: MainMenü+combobox in dbgrid öffnen
 
Hey, das was k-h grün markierte ist eine Aufstellung der schleife, um die einträge der combobox in das mainmenu einzutragen.

An sich erfüllt der Quellcode seine Aufgaben.

Ebenso werde ich mir mal eure Ideen zu Genüge führen, sobald ich wieder Info habe.
Ich bedanke mich aufjedenfall, dass ihr mal drüber geschaut habt, und mir ein paar Tipps gegeben habt.
Ihr beweist grad, dass unser Lehrer recht grobe und das beibringt.

Ich melde mich mal wieder bei euch, sobald ich mal wieder eure Hilfe benötigt.

Lg Justin

p80286 25. Jan 2017 21:24

AW: MainMenü+combobox in dbgrid öffnen
 
Zitat:

Zitat von nahpets (Beitrag 1359959)
Das sehe ich nicht so, wenn ich mit ADO arbeite, dann bekomme ich mit GetTableNames die Tabellennamen aus der Datenbank. Dabei ist es egal, ob es nun Oracle, Firebird, MSSQL, Postgres, Ingres, Access ... oder was weiß ich ist.

So sollte es sein. Wenn ich mich richtig erinnere werden Views allerdings als Tabellen ausgegeben, darum setze ich das nicht mehr ein. Ich check das Morgen mal.

Gruß
K-H

nahpets 26. Jan 2017 10:33

AW: MainMenü+combobox in dbgrid öffnen
 
Stimmt, je nach DB kann man nicht zwischen Views und Tabellen unterscheiden. (Oder müsste über irgendwelche Namenskonventionen gehen :-()

Nimmt man statt ADO die ZeosLib, so habt man, in Bezug auf die Datenbankauswahl, die gleichen Möglichkeiten (sprich: Neben vielen Datenbanken auf jeden Fall auch ADO). Man kann beim Auslesen der Datenbankstruktur zwischen Tabellen und Views unterscheiden. Das Auslesen scheint aber nur einmalig nach dem Herstellen der Verbindung zu funktionieren. Ändert man Tabellen ... oder erstellt neue, so kann man diese Änderungen erst nach dem Schließen und erneuten Öffnen der Datenbankverbindung auslesen. Das finde ich suboptimal.

p80286 26. Jan 2017 15:30

AW: MainMenü+combobox in dbgrid öffnen
 
Es hat etwas gedauert, aber Ja zumindest bei Oracle werden Views mitgeliefert.
Und da die reine Anzahl 1104<>1101 beinahe gleich ist, muß es da noch andere Abweichungen geben Ado liefert z.B. ach APEX..... D.H. die numerische Abweichung müßte noch größer sein, mal schauen ob ich da die Unterschiede richtig fest machen kann.

Gruß
K-H

Edith:
Also es kommt darauf an, ein
SQL-Code:
select * of all_all_tables
liefert keine Views! dafür aber alle Tabellen die der angemeldete User sehen darf, während ADO da eine für mich unerklärliche Vorauswahl trifft. Wahrscheinlich ist die beste Wahl ein
SQL-Code:
 select table_name from all_all_tables where owner=xxxx
bzw. das Equivalent auf anderen Datenbanken.

Gruß
K-H

nahpets 26. Jan 2017 16:38

AW: MainMenü+combobox in dbgrid öffnen
 
Hast Du den Toad? (Oder auch ein anderes Werkzeug mit ähnlicher Funktionalität?)

Wenn ich mich recht erinnere kann man da doch in (war es V$Sessions oder sowas in der Richtung) sehen, wer wann welches Statement abgesetzt hat. Man kann ja auch Laufzeit, Kosten, Ausführungsplan ... sehen.
Dort müsstest Du doch eigentlich mitbekommen können, welches Statement (oder mehrere) von Deinem ADO-nutzenden Programm abgesetzt werden.

Schaust Du mit der gleichen Anmeldung in die Datenbank, die auch das Programm nutzt? Wenn nicht, könnten sich die Unterschiede auch aus den unterschiedlichen Rechten ableiten lassen.

Wenn ich das in der msdaora.dll richtig sehe, nutzt die all_tables und all_views. (Hab' da aber nur etwas ältere Version auf'm Laptop.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:51 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