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:
Der Code funktioniert.. nur wie mache ich das jetzt, dass es in der DBGrid der Inhalt einer Tableunterpunktes angezeigt wird?
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; Ich würde mich über eure Hilfe freuen. Mit freundlichen Grüßen Justin |
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; |
AW: MainMenü+combobox in dbgrid öffnen
Delphi-Quellcode:
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.
// 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; 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 |
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:
) etc. sind für Justin erstmal Aufgabe genug. Und solange wir nicht wissen, um welche DB es sich handelt .. :|
ADOconnection1.GetTableNames
|
AW: MainMenü+combobox in dbgrid öffnen
Zitat:
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:
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 ... ))
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; Aber mit einer anderen OnClick-Methode wird das recht schnell durchaus sinnvoll. |
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 |
AW: MainMenü+combobox in dbgrid öffnen
Zitat:
Gruß K-H |
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. |
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:
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 * of all_all_tables
SQL-Code:
bzw. das Equivalent auf anderen Datenbanken.
select table_name from all_all_tables where owner=xxxx
Gruß K-H |
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