SQLQuery schreibt nicht in Datenbank

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

SQLQuery schreibt nicht in Datenbank

Beitrag von Matze »

Hallo,

mit diesem Problem komme ich nicht weiter, vielleicht weiss ja jemand hier die Lösung.

Datenbank MySQL 5.5 unter Windows
Lazarus 1.0.10 unter Windows

Zum Schreiben der Daten in die Datenbank benutze ich:
- MySQL55Connection,
- SQLTransaction,
- SQLQuery,
- Datasource
- DBEdit, DBLookupComboBox und DBGrid
- DBNavigator

Die Eigenschaft vom UpdateMode ist auf upWhereKeyOnly gestellt.
Unter SQL steht: SELECT * FROM tabellenname ORDER BY Feld
Beim AfterPost Ereignis mache ich ein SQLQuery.ApplyUpdates und schliesse/öffne die SQLQuery kurz.
Das läuft auch alles so ganz gut. Ich kann wahlweise die DBEdit Felder oder das DBGrid benutzen um Daten einzufügen, zu löschen oder zu ändern. Bei und bei den Fremdschlüsselfeldern natürlich nur die DBLookupComboBoxen und nicht das DBGrid.

Wenn ich aber im DBGrid zusätzlich ein Feld aus einer anderen Tabelle anzeigen will, also zwei Tabellen ungefähr so abfrage:

Code: Alles auswählen

SELECT
 tabelle1.Feld1,
 tabelle1.Feld2,
 tabelle2.Feld1,
 tabelle2.Feld2
FROM
 tabelle1
INNER JOIN
 tabelle2 ON tabelle1.Feld1 = tabelle2.Feld1
ORDER BY 
  tabelle1.Feld1 ASC   


Verhält sich alles wie schreibgeschützt. Ich kann alles sehen und scrollen, aber keine Änderungen vornehmen. Weiss jemand woran das liegt? Die beiden Tabellen stehen in Beziehung zueinander (1:n). Aber ich will in der Detailtabelle ja nicht den PK der Elterntabelle sehen, sondern das "richtige" Feld.
Eine Idee war, zwei SQLQuery zu benutzen. Dann könnte ich eine mit den DBEdit und DBLookupComboBoxen zum Ändern verbinden und die andere nur zum anzeigen im DBGrrid.
Aber vielleicht gibt es ja eine ganz einfache Lösung. Auch läuft der Cursor im DBGrid dann nicht mit.

Gruss Matze
Zuletzt geändert von Lori am Mi 17. Jul 2013, 09:09, insgesamt 1-mal geändert.
Grund: Highlighter

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SQLQuery schreibt nicht in Datenbank

Beitrag von MmVisual »

Ja, das ist immer so.

Mit der Zeos Komponente kann man mittels TZUpdateSQL dennoch solche verknüpfte Tabelle speichern. Dazu muss die Komponente mit der TZQuery verknüpft werden und dann kann man im UpdateSQL Script den Update auf die Haupt-Tabelle (nicht der verknüpften Tabelle) machen und die Datenbank meckert nicht.

Ich habe das auch im Einsatz und es funktioniert gut.
EleLa - Elektronik Lagerverwaltung - www.elela.de

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: SQLQuery schreibt nicht in Datenbank

Beitrag von hde »

Die Sprachregeln von SQL sagen deutlich:

SELECT liest Daten aber schreibt keine. Zum Schreiben gibt es INSERT/APPEND bzw. UPDATE für Änderungen.

Eine Query kann bei einem Select auf eine einfache Tabelle das Update automatisch generieren, aber jeder join betrifft zwei Tabellen und deshalb erfolgt durch die Query auch keine Generierung eines Updatestatements. Das musst du dann selbst formulieren. (Es geht nicht alles automatisch,manchmal muss man auch heute noch wirklich programmieren) :wink:

Oder nutz wie MmVisual vorgeschlagen hat das TZupdateSQl von Zeos.

hde

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: SQLQuery schreibt nicht in Datenbank

Beitrag von mse »

hde hat geschrieben: Oder nutz wie MmVisual vorgeschlagen hat das TZupdateSQl von Zeos.
Oder TSQLQuery.UpdateSQL, InsertSQL, DeleteSQL. tmsesqlquery von MSEgui hat auch noch die Methoden-properties
beforeapplyupdate, onapplyrecupdate, onapplyrecupdate2, afterapplyrecupdate, afterapplyupdate, onupdateerror.

Martin

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: SQLQuery schreibt nicht in Datenbank

Beitrag von Matze »

Hallo,
Danke für die Antworten.
hde hat geschrieben:
Die Sprachregeln von SQL sagen deutlich:
SELECT liest Daten aber schreibt keine. Zum Schreiben gibt es INSERT/APPEND bzw. UPDATE für Änderungen.
Eine Query kann bei einem Select auf eine einfache Tabelle das Update automatisch generieren, aber jeder join betrifft zwei Tabellen und deshalb erfolgt durch die Query auch keine Generierung eines Updatestatements. Das musst du dann selbst formulieren. (Es geht nicht alles automatisch,manchmal muss man auch heute noch wirklich programmieren)
Das man mit SELECT liest weiss ich schon, aber der DBNavigator bekommt ja die INSERT Anweisung trotzdem hin. So dachte ich eben das es mit zwei Tabellen auch geht.
Wenn ich diese Zeos Komponenten nicht nehme und z.B. die INSERT Anweisung selbst programmiere, kann ich dann noch den DBNavigator bentzen?
Also die Werte aus denn Feldern auslesen und sie dann einer SQL Anweisung im Quelltext zuweisen. Mit welchem Ereignis starte ich das dann am besten? TSQLQuery / Before Post?
Aber geht ja eigentlich auch nicht, weil sich die Felder nicht mal editieren lassen.
MmVisual hat geschrieben:
Ja, das ist immer so.
Mit der Zeos Komponente kann man mittels TZUpdateSQL dennoch solche verknüpfte Tabelle speichern. Dazu muss die Komponente mit der TZQuery verknüpft werden und dann kann man im UpdateSQL Script den Update auf die Haupt-Tabelle (nicht der verknüpften Tabelle) machen und die Datenbank meckert nicht.
Ich habe das auch im Einsatz und es funktioniert gut.
Ich weiss nicht wie ich die Zeos Komponenten installiere. So wie ich das gelesen habe muss da erst ein SVN Client installiert werden. Und der benötigt eine ständige Onlineverbindung. Das verstehe ich nicht was das soll. Muss der vorher sein?

Gruss Matze

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: SQLQuery schreibt nicht in Datenbank

Beitrag von hde »

Wenn du Daten in 2 Tabellen speichern willst, braucht SQL auch 2 Anweisungen (INSERT oder UPDATE). Wenn du 2 Tabellen ändern willst braucht es 2 Anweisungen.
Auch TZUpdateSQL (oder UpdateSQl in Delphi) ändert nur 1 Tabelle, wenn das reicht kann man es nehmen. Ich splitte jedoch meist zwischen Anzeige(-Query) und Edit-(Query) und synchonisiere beides. Ein wenig mehr Aufwand dafür aber sicher.
Matze hat geschrieben:So wie ich das gelesen habe muss da erst ein SVN Client installiert werden. Und der benötigt eine ständige Onlineverbindung.
Dann hast du was falsches oder was altes gelesen. Einfach das aktuelle Package downloaden und in Lazarus installieren. Dann lässt es sich genau so benutzen wie die Standard-Lazarus-Komponenten. Ich nutze unter Lazarus für Datenbankanbindung nur Zeos, kann ich nur empfehlen.

hde

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: SQLQuery schreibt nicht in Datenbank

Beitrag von Matze »

hde hat geschrieben:
Ich splitte jedoch meist zwischen Anzeige(-Query) und Edit-(Query) und synchonisiere beides. Ein wenig mehr Aufwand dafür aber sicher.
Ja das war auch mein Versuch. Ich habe zwei Querys benutzt. Eines für die DBEdit und DBLookupComboBoxen und eines für das DBGrid. Der DBNavigator war mit der Query verbunden, welche ich auch für die Edit und DBLookupComboBoxen benutze. Aber leider lief das DBGrid nicht mit. Wie synchonisiere ich das DBGrid bzw. das Query dafür?
Bei jedem Ereignis xyz die Cursorposition (ID des aktuellen Datensatzes) lesen und die andere Query auf diesen Datensatz einstellen?

Ich habe mir vor Jahren mal eine DB mit Delphi 6 und Access Tabellen geschrieben. Da habe ich das immer so gemacht:

Code: Alles auswählen

DM.ADOQueryXY.Requery;
DM.ADOQueryXY.Locate('PJID',VarPJID,[ ]);
PJID war das Feld und VarPJID war die Variable zum reinschreiben.
Ich glaube so bin ich immer auf den aktuellen Datensatz gekommen.
hde hat geschrieben:
Dann hast du was falsches oder was altes gelesen. Einfach das aktuelle Package downloaden und in Lazarus installieren. Dann lässt es sich genau so benutzen wie die Standard-Lazarus-Komponenten. Ich nutze unter Lazarus für Datenbankanbindung nur Zeos, kann ich nur empfehlen.
Na ja, ich habe das hier gelesen:
http://wiki.freepascal.org/Zeos_tutorial/de
"..... Besorgen Sie sich einen SVN Client (z.B.TortoiseSVN) und installieren Sie diesen."

Kann ich diesen Schritt weglassen und direkt hier anfangen?

"..... Starten Sie eine Instanz von Lazarus.
1.Benutzen Sie Package -> Packagedatei (.lpk) öffnen im Hauptmenü.
2.Gehen Sie in das \packages\lazarus\ Unterverzeichnis von Zeoslib und öffnen Sie zcomponent.lpk
3.Drücken Sie Kompilieren, um (vor allem) die Abhängigkeiten des Packages zu kompilieren
4.Drücken Sie Nutzung... -> Installieren
5.Sie werden gefragt, ob Sie Lazarus rekompileren wollen.
6.Antworten Sie diesmal mit Ja .
7.Warten Sie bis die Kompilierung beendet ist. Lazarus sollte sich danach selbst neu starten.
8.Wenn alles ok ist, sollten Sie jetzt den Zeos Access Tab in der Komponentenpalette sehen. "


Gruss Matze

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: SQLQuery schreibt nicht in Datenbank

Beitrag von Matze »

Das Installieren der Zeos Komponenten hat ja wirklich ohne SVN Client funktioniert :) Ich habe mir dieses Archiv (ZEOSDBO-7.0.3-stable.zip) runtergeladen.
Unter ....\lazarus\components habe ich das Verzeichnis zeos angelegt. Dorthin habe ich die zwei Ordner packages und src aus dem Archiv kopiert. Die Pfade musste ich genau einhalten, sonst hat es nicht funktioniert.
Jetzt werde ich damit mal etwas versuchen, aber irgendwie scheue ich mich davor, alle Komponenten durch diese zu ersetzen.
Falls doch jemand weiss wie man den DBNavigator und eine handgeschiebene INSERT bzw. UPDATE Anweisung zusammen einsetzen kann würde ich mich freuen.

Gruss Matze

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: SQLQuery schreibt nicht in Datenbank

Beitrag von Matze »

Ach ich muss ja gar nicht alles ersetzen! Die ganzen sichtbaren Komponenten wie DBEdit usw. können ja bleiben. Es ist ja nur die eine Connection und alle SQLQuerys. Etwas ist mir sofort aufgefallen, ich muss ja in der Query gar kein AfterPost Ereignis aufrufen (ApplyUpdates) Die Daten werden ja auch so in die DB übernommen.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SQLQuery schreibt nicht in Datenbank

Beitrag von MmVisual »

Man kann die Komponenten auch relativ leicht ersetzen:
- Lazarus zu machen und Projekt sichern /Zippen
- die .lfm Datei mit einem Texteditor öffnen und Suchen nach z.B. "TQuery" Ersetzen auf "TZQuery"
- die .pas Datei mit einem Texteditor öffnen und Suchen nach z.B. "TQuery" Ersetzen auf "TZQuery"
- Lazarus auf machen und die restlichen Mecker-Meldungen bearbeiten, falls was kommt.
- Ferig

Das geht so leicht, weil die TQuery und TZQuery von den Parametern und Events fast identisch sind.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten