Datenbankproblem mit TQuery!
-
Hallo zusammen,
also ich hab ein kleines Adressbuch erstellt, dass auf einer MS-Access-Datenbank beruht (ist für die Schule für n Referat).
Die Datenbank hat 2 Tabellen, eine Namens "Person", in der eben der Name, Vorname, Tel-Nr, Plz,.. usw. stehen und eine Tabelle namens Plz, in der zu jeder Plz der Ort zugeordnet ist (die Plz ist hier der Primärschlüssel).Auf meinem Formular sind nun DBEdit-Felder, in denen eben der Name, Vorname usw. angezeigt wird und mit dem DBNavigator schalt ich durch die Einträge (Datenbankverbindung über TDatabase, TTable, TDataSource). Da nun in dem Feld "Ort" der zur Plz zugehörige Ort stehen muss, hab ich ein TQuery in dem folgende SQL-Anweisungen stehen:
SELECT Person.Plz, Plz.Ort FROM Person, Plz WHERE Person.Plz = Plz.Plz;Funktioniert soweit alles einwandfrei, nur wenn ich zur Laufzeit dann einen Eintrag weitergehe, wird der Wert im "Ort-DBEdit" nicht aktualisiert, sondern es bleibt einfach der Ort vom Anfang stehen. Wie bekomme ich das hin, dass die Query-Komponente nochmals den Equi-Join überprüft und den Ort aktualisiert wenn sich die Plz ändert???
Vielen Dank schon mal im voraus!
-
ist der Navigator (über das DataSource) mit dem Query verbunden oder mit einer anderen Komponente? sind die DBEdits mit dem Query verbunden?
wenn nicht kannst du z.B. im OnClick-Ereignis des Navigators des Query nochmals ausführen lassen, dazu gibts auch ein Beispiel in der BCB-Hilfe
-
Es handelt sich um zwei, oder mehr TQueries?
Dann Du mußt eine Master-Detail Beziehung einrichten. Unter DataSource des abhängigen Queries trägst Du die DataSource der führenden Query eintragen (die auf die Tabelle Person) und den SQL-Code entsprechend anpassen:SELECT Ort FROM Plz WHERE (Plz = :Plz)Oder eben, wie Linnea schon gesagt hat, die zweite Query manuell aktualisieren.
Die von Dir gezeigte SQL-Anweisung ist dazu allerdings ungeeignet, da Du keinen Parameter verwendest, um vorzugeben, welche Postleitzahl ausgewählt ist. Das kann so nicht funktionieren.
Grüße Joe_M.
-
Also erstmal Danke für die schnellen Antworten!
Zu Linnea:
Nein, der Navigator ist nicht über ein DataSource mit dem Query verbunden. Wenn dies so wäre, dann könnte ich ja nur die Einträge der Plz-Tabelle durchblättern.
Mit dem OnClick-Ereignis des Navigators habe ich es auch nicht hinbekommen das Query nochmals auszuführen.Zu zulaufzumeinloggen:
Vielen Dank, mit dem von dir gezeigten SQL-Code hat es geklappt!!

Aber was genau bedeutet dieser Doppelpunkt vor Plz bei
WHERE (Plz = :Plz);????
Achja, ich habe nur ein Query, bei dem die DataSource der PersonenTabelle eingetragen ist. Aber funktioniert ja jetzt!
-
Hallo
Der Doppelpunkt bedeutet das das dahinterstehende Plz ein Parameter ist, an den bei der Ausführung noch ein konkreter Wert übergeben wird. Siehe TQuery::Params.
bis bald
akari
-
Ja, das das Plz hinter dem : ein Parameter ist, dachte ich mir schon fast.
Aber wie kommt es jetzt dazu, dass als Wert die Plz des aktuellen Eintrags der Personen-Tabelle übertragen wird??
-
Hallo
akari schrieb:
Siehe TQuery::Params
bis bald
akari
-
Wenn ich in der BCB-Hilfe nach TQuery::Params nachschaue hilft mir das allerdings aber auch nicht weiter (hab die Hilfe auch nur auf Englisch
)
-
Hallo
schau dir einfach das Beispiel zu TQuery::Params in der Builder-Hilfe an, das ist doch aussagekräftig genug.
Und Englisch solltest du beim Programmieren halbwegs beherschen.bis bald
akari
-
Natürlich beherrsche ich Englisch.
In der Hilfe steht als Beispiel:
Query2->SQL->Clear(); Query2->SQL->Add("INSERT INTO COUNTRY (NAME, CAPITAL, POPULATION) "); Query2->SQL->Add("VALUES (:Name, :Capital, :Population) "); Query2->Params->Items[0]->AsString = "Liechtenstein"; Query2->Params->Items[1]->AsString = "Vaduz"; Query2->Params->Items[2]->AsInteger = 420000; Query2->ExecSQL();Aber das erklärt mir jetzt immer noch nicht woher mein Programm nun durch die SQL-Anweisung
WHERE (Plz = :Plz);die Plz des aktuellen Eintrags der Personen-Tabelle bekommt!?!? Ich sag dem Programm ja nirgends das der Wert für :Plz z.B. aus dem DBEdit-Feld, dass die aktuelle Plz anzeigt, genommen werden soll!?
-
zufaulzumeinloggen schrieb:
Unter DataSource des abhängigen Queries trägst Du die DataSource der führenden Query eintragen.
Wenn Du die obige Zuseisung durchgeführt hast, wird der Wert für den Parameter dorther genommen. Wenn nicht, hast Du irgendwo einen Fehler und es funktioniert bestimmt nicht wie gewünscht.
-
Hallo
Ich sag dem Programm ja nirgends das der Wert für :Plz z.B. aus dem DBEdit-Feld, dass die aktuelle Plz anzeigt, genommen werden soll!?
Query2->Params->Items[0]->AsString = "Liechtenstein";Was glaubst du passiert hier?
Du könntest also auch das so schreiben
Query2->Params->Items[0]->AsString = DBEdit->Text;bis bald
akari
-
zu akari:
Das ist mir schon klar, aber genau das habe ich ja NICHT(!!!) gemacht und es funktioniert!!!!zu Joe_M.:
Ja, die Zuweisung habe ich durchgeführt. Ich weiß jetzt auch das der Parameterwert über die DataSource, die über ein Table mit der Personen-Tabelle verbunden ist, herkommt.
Alles klar

Danke nochmal an alle!!
