AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MainMenü+combobox in dbgrid öffnen

Ein Thema von Justin · begonnen am 25. Jan 2017 · letzter Beitrag vom 26. Jan 2017
Antwort Antwort
Justin

Registriert seit: 23. Jan 2017
6 Beiträge
 
#1

MainMenü+combobox in dbgrid öffnen

  Alt 25. Jan 2017, 11:00
Delphi-Version: 2007
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

Geändert von Justin (25. Jan 2017 um 11:25 Uhr)
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
297 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: MainMenü+combobox in dbgrid öffnen

  Alt 25. Jan 2017, 14:52
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;
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: MainMenü+combobox in dbgrid öffnen

  Alt 25. Jan 2017, 15:32
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (25. Jan 2017 um 15:40 Uhr)
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
297 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: MainMenü+combobox in dbgrid öffnen

  Alt 25. Jan 2017, 15:59
Oder über

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

in MS SQL ... aber ich denke, der Weg über die Delphi Möglichkeiten (ADOconnection1.GetTableNames ) etc. sind für Justin erstmal Aufgabe genug. Und solange wir nicht wissen, um welche DB es sich handelt ..
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: MainMenü+combobox in dbgrid öffnen

  Alt 25. Jan 2017, 16:13
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.
  Mit Zitat antworten Zitat
Justin

Registriert seit: 23. Jan 2017
6 Beiträge
 
#6

AW: MainMenü+combobox in dbgrid öffnen

  Alt 25. Jan 2017, 16:27
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: MainMenü+combobox in dbgrid öffnen

  Alt 25. Jan 2017, 21:24
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: MainMenü+combobox in dbgrid öffnen

  Alt 26. Jan 2017, 10:33
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: MainMenü+combobox in dbgrid öffnen

  Alt 26. Jan 2017, 15:30
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 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  select table_name from all_all_tables where owner=xxxx bzw. das Equivalent auf anderen Datenbanken.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (26. Jan 2017 um 15:53 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: MainMenü+combobox in dbgrid öffnen

  Alt 26. Jan 2017, 16:38
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.)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:48 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