Datenbank & Co

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
ulrich.goebel
Beiträge: 4
Registriert: Mi 13. Mär 2013, 23:22

Datenbank & Co

Beitrag von ulrich.goebel »

Hallo,

gut, dass es diese "Einsteigerfragen" gibt... :wink:

Ich habe ein Formular erstellt, mit dem ich auf eine bestehende Postgresql-Datenbank zugreifen möchte. Dafür habe mich an dem SqlDBHowto-Wiki und den SQLdb Tutorials 1 und 2 orientiert.

Jetzt schmiert mir aber das Formualr ab, wenn ich über den Navigator "Post" aufrufe und damit ein update in der DB auslöse. In der DB werden die Daten geändert. Aber das im Formular wird der Navigator (TDBNavigator) ausgegraut und im TDBGrid verschwinden nicht nur alle Daten, sondern auch die Spalten...

In dem TSQLQuery habe ich ausschließlich das SQL definiert (select id, name, vorname from table order by name, vorname;) definiert. InsertSQL, UpdateSQL und DeleteSQL habe ich leer gelassen - in der Hoffnung, dass das automatisch erzeugt wird.

Für das insert und update habe ich in der TSQLQuery an das Ereignis AfterPost die folgende Prozedur gebunden:

Code: Alles auswählen

procedure THauptformular.SQLQuery1AfterPost(DataSet: TDataSet);
begin
  sqlquery1.ApplyUpdates;
  SQLTransaction1.Commit
end;
Gibt es irgendwor ein ausführlicheres Tutorial? Oder eine genaue Beschreibung der unglaublich vielen Felder, die mir der Objektinspektor z.B. bei dem TSQLQuery anbietet? Oder sonst ein guter Tip?

Mit Dank und Gruß
Ulrich

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Datenbank & Co

Beitrag von mse »

ulrich.geobel hat geschrieben:

Code: Alles auswählen

procedure THauptformular.SQLQuery1AfterPost(DataSet: TDataSet);
begin
  sqlquery1.ApplyUpdates;
  SQLTransaction1.Commit
end;
Probiere mal

Code: Alles auswählen

 
  SQLTransaction1.Commitretaining;
 
Martin

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6780
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Datenbank & Co

Beitrag von af0815 »

Hast dein Code die Transaction eröffnet (gestartet) ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Datenbank & Co

Beitrag von mse »

af0815 hat geschrieben:Hast dein Code die Transaction eröffnet (gestartet) ?
Dies wird von tsqlquery beim Aktivieren automatisch durchgeführt. tsqltransaction.commit() schliesst die Transaktion und deaktiviert somit die verbundenen tsqlquery. tsqltransaction.commitretaining() schliesst die Transaktion nicht, falls die DB dies kann (Firebird), oder eröffnet unverzüglich eine neue.

ulrich.goebel
Beiträge: 4
Registriert: Mi 13. Mär 2013, 23:22

Re: Datenbank & Co

Beitrag von ulrich.goebel »

Nun habe ich eine ganz andere "Lösung" gefunden: Zeoslib. Da brauche ich mich um die Transaktionen offenbar nicht zu kümmern. Anfänglich scheint das auch zu funktionieren.

Allerdings wäre mir trotzdem ein ausführliches Tutorial hilfreich. Konkret bin ich gerade am verzweifeln bei Versuchen mit TDBLookupListBox.

Bevor ich jetzt das Problem genau beschreibe: Wo finde ich eine Erklärung, was dort die Eigenschaften
  • DataSource, DataField
  • KeyField
  • ListSource, ListField, ListFieldIndex
bedeuten? Und welche Eigenschaften müssen ggf. außerdem noch berücksichtigt werden? Was ist z.B. mit ScrollListDataset?

Etwas ähnliches bräuchte ich für ZQuery und die Eigenschaften MasterSoruce, MasterFields und LinkedFields.

Konkret habe ich in einer PostgreSQL-DB eine Tabelle (person) mit den Feldern id, name und wohnt_bei_id. Über wohnt_bei_id verknüpfe ich eine Person B mit einer Person A, falls A bei B wohnt.
Um im Formular die Erfassung von wohnt_bei_id zu erleichtern, habe ich eben an eine TDBLookupListBox gedacht. Die Idee: In dieser TDBLookupListBox soll eine Liste Personen (genauer: deren Namen) gezeigt werden, aus denen dann ausgewählt werden kann, bei wem B wohnt. Durch eine geschickte Verknüpfung müsste doch zu erreichen sein, dass dann nach der Auswahl das Feld wohnt_bei_id von B auf id von A gesetzt wird. Für die TDBLookupListBox habe ich folglich eine eigene ZQuery + Datasource eingerichtet, in der unter SQL die Abfrage auf die View steht, und bei MasterSource die Datasource eben der Personen-Tabelle, mit entsprechender Verknüpfung über MasterFields und LinkedFields. Aber irgendwie komme ich nicht zum Ziel.

Wie gesagt, mein Hauptproblem ist, dass ich das alles mehr oder weniger mit Ausprobieren baue, ohne die richtige, ausführliche Anleitung oder ein Tutorial gefunden zu haben.

Hat jemand eine Idee?

Viele Grüße
Ulrich

Antworten