Wie kann ich eine Datenbank über ein TGrid updaten?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von af0815 »

ZEOS kann ein paar Sachen mehr zB. auch ein Dataset von der DB "detachen". In die Klasse gehört auch, das es das Dataset lokal umsortieren kann. Ja es geht scheinbar, ich habe es bisher nicht gebraucht, deswegen ist es mir nicht abgegangen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von Sieben »

Hm, wie sortiert man bei SQLdb ohne die Daten neu vom SQL Server ab zu fragen?
Das geht über TSQLQuery.IndexFieldNames - Feldnamen kommagetrennt angeben, für absteigende Sortierung zusätzlich ein DESC hinter dem Feldnamen, damit wird ad hoc ein 'Custom Index' erzeugt. Ein leerer String entfernt ihn wieder.

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

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von MmVisual »

Das geht über TSQLQuery.IndexFieldNames ...
Dankeschön für die Info!

Gibt es für "TZUpdateSQL" auch eine Lösung im SQLDB? Das brauche ich ständig, da ich viele Tabellenansichten mit JOIN abfrage habe und man damit die "Haupt-Tabelle" updaten kann und die Felder der JOIN Abfrage sind Read Only. Ich mache das zwar ungern, bietet jedoch eine supereinfache Möglichkeit komplexe Daten darstellen zu können.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von Sieben »

Ich nehme auch meistens Views zur Anzeige, für Update oder Insert dann entsprechende Statements in TSQLQuery.UpdateSQL bzw InsertSQL.

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

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von MmVisual »

Hm, in der View sind die Datensätze dann ja ReadOnly, dann kann man diese ja nicht direkt editieren (TDBEdit/TDBMemo/TDBGrid...)?
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von af0815 »

Das geht über die Query und den verschiedenen SQL-Statements. Damit ist es egal ob die die View editierbar ist oder nicht. Wie sieben schon geschrieben hat sind dafür die TSQLQuery.UpdateSQL und Konsorten zuständig. Das vergessen die meisten. Damit ist es egal wie das select statement funktioniert.

Und damit sind wir wieder beim Thread. Der Threadersteller hat das ganze ausgelagert, anstatt das alles über die Query zu spielen. Die Query kennt ihre internen Zustände, bei einer Änderung des Zustandes wird auch die entsprechende Aktion ausgeführt. Daher ist es für den Threadersteller am besten, er stellt alles auf einen Betrieb über die Query ein und nicht an der Query vorbei. DIe Statement für das Update, Delete, Insert kann man ja mit wenigen Änderungen in die Query übernehmen.
Zuletzt geändert von af0815 am So 8. Jan 2023, 20:56, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von MmVisual »

TSQLQuery.UpdateSQL und Konsorten zuständig
Das kannte ich auch noch nicht, gut dass ich gefragt habe. :D
Thx.
EleLa - Elektronik Lagerverwaltung - www.elela.de

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von alfware17 »

Ich konnte das Beispiel mit ZEOS jetzt ausführen, naja fast...
Wenn ich mein (bevorzugtes) 32bit Lazarus nehme, sagt er mir nach dem Compilieren, daß sqlite3-64.dll fehlen würde, was nicht stimmt denn du hast sie mir dankenswerterweise ins Verzeichnis gepackt.
Wenn ich auch noch im 64bit Lazarus das ZEOS installiere, kann ich es wieder compilieren aber nicht (in der IDE) ausführen. Irgendeine Abhängigkeit auf einen Debugger erfülle ich nicht, bzw die EXE hätte nicht das richtige Format. Im Betriebssystem kann ich die EXE dann ausführen und das Speichern klappt auch, vielen Dank.

Nur weiß ich immer noch nicht, was ich genau bei meinen Methoden, wo ich das SQLDB aufrufe, falsch gemacht habe bzw vergessen habe. Wenn die Komponenten ähnlich sind, müßte es doch auch ähnlich gehen, oder? Mir ist auch nicht klar, woher ZEOS weiß, wie der geänderte Spruch aus dem MEMO wieder zurück in die Datenbank kommt, denn die Tabelle ist doch erstmal nur mit dem DBGrid verbunden? Na mal sehen, vielleicht verstehe ich deins noch. Ginge das auch über meine Variante mit dem Popup-Fenster, wahrscheinlich nicht. Und was wenn ich auch noch das Feld "letzter-Zugriff" updaten möchte, d.h auf aktuelles Datum setzen?

Kann ich das ZEOS nur von Online installieren? Ich habe zwar die Möglichkeit "download" gefunden, nicht jedoch, wie man das ZIP dann installiert? Ich fürchte, ich habe mir möglicherweise beide Lazarus zerschossen und muß sie neu aufsetzen, wenn ich meine alten Projekte weiter compilieren will. Bzw ich habe noch mehr Rechner Linux und WIndows, und in den meisten davon ein (Standard-)Lazarus, meistens 2.0.6, zu Testzwecken auch das neuere 2.2.4 wobei ich da bei mir keinen Unterschied merke und wohl auch keiner da ist aber vielleicht beim ZEOS und/oder in einem halben Jahr oder so. Wenn ich dann wieder online installieren muß.... Ich hoffe du siehst mein Dilemma und warum ich gerne auch mit einem sicher einfachen SQLDB Verfahren mit einer ähnlichen Query arbeiten würde. Weil ich wirklich keine komplizierten Dinge vor habe, sondern nur Update des Spruch-Feldes und Setzen des Änderungsdatums.

Trotzdem danke für dein Beispiel. Daß ich dafür meine beiden Lazarusse verbogen und vielleicht abgeschossen habe, war es mir wert, denn ich wollte wenigstens einmal dieses Update sehen...

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von alfware17 »

af0815 hat geschrieben:
So 8. Jan 2023, 20:52
Das geht über die Query und den verschiedenen SQL-Statements. Damit ist es egal ob die die View editierbar ist oder nicht. Wie sieben schon geschrieben hat sind dafür die TSQLQuery.UpdateSQL und Konsorten zuständig. Das vergessen die meisten. Damit ist es egal wie das select statement funktioniert.

Und damit sind wir wieder beim Thread. Der Threadersteller hat das ganze ausgelagert, anstatt das alles über die Query zu spielen. Die Query kennt ihre internen Zustände, bei einer Änderung des Zustandes wird auch die entsprechende Aktion ausgeführt. Daher ist es für den Threadersteller am besten, er stellt alles auf einen Betrieb über die Query ein und nicht an der Query vorbei. DIe Statement für das Update, Delete, Insert kann man ja mit wenigen Änderungen in die Query übernehmen.
Leider redet Ihr für mich Chinesisch bzw zu kompliziert. Ich verstehe bzw kenne die genannten Methoden der Query nicht. Was bzw wie meint Ihr das, wie genau sollte ich es machen? Ich rede jetzt nicht vom Connect oder von den anderen SQL-Statements, die ich in der Unit gar nicht brauche für das Online-Update Programm. Die sind wie gesagt größtenteils für zwei andere Programme. Ich würde nur gerne mal die Query mit dem Update probieren und weiß aber nicht wie. Euch ist das alles klar und Ihr sprecht über Varianten und was besser oder schlechter ist. Warum ZEOS für mich nicht gut war, habe ich schon geschrieben. WIe mache ich es mit der SQLDB?

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

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von MmVisual »

In der TZConnection ändere den Dateiname im Parameter "LibraryLocation" von "sqlite3-64.dll" auf "sqlite3.dll".
Dann sollte es auch mit dem 32 Bit Lazarus klappen.

So kann man zwischen 32 Bit und 64 Bit umschalten, da man dann entsprechend die andere DLL braucht. Von www.sqlite.org kann man die DLL's direkt laden.
EleLa - Elektronik Lagerverwaltung - www.elela.de

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

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von MmVisual »

Das Zeos lade ich mir immer direkt vom SVN, dieser Link führt zur letzten Version:
svn://svn.code.sf.net/p/zeoslib/code-0/branches/7.2-patches

Im Unterordner "\packages\lazarus" kann das Package "zcomponent.lpk" installiert werden, danach Lazarus neu kompilieren und Zeos ist dann mit in der Komponenten-Leiste.

Der Ordner "\src" beinhaltet den Quellcode zum Zeos. Die anderen Ordner sind nicht wichtig.

Hier der aktuell geladene Code, dann brauchst du es nicht selbst laden.
7.2-patches.zip
(1.5 MiB) 41-mal heruntergeladen
EleLa - Elektronik Lagerverwaltung - www.elela.de

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von alfware17 »

Hallo, ich bin es noch mal. Ich komme leider nicht weiter. Ich habe versucht, das Beispiel mit dem ZEOS von mmvisual nachzustellen ohne ZEOS also mit dem Lazarus-eigenen SQLDB. (siehe meinen letzten Code). Leider klappt das mit dem Updaten überhaupt nicht, wenn ich mit dem Debugger durchgehe, würde ich sagen meine SQLQUERY3 hat diese Stati gar nicht oder sie sind nicht gesetzt. Kann mir bitte jemand helfen - nur das Update... Warum ist das so kompliziert? Euch mag das ja alles klar sein und ihr habt da viel Erfahrung, aber für mich war der Tip mit dem neuen System ZEOS leider nicht gut.

Ich habe meinen ersten Versuch von damals mit dem EditCursor und dem UpdateWhereAll jetzt rausgenommen aus der Unit (ZIP im ersten Beitrag), vielleicht war das ja aber doch richtig und es fehlte nur etwas, aber Update ging damals nicht und leider geht es jetzt auch noch nicht. Vielen Dank für eure Geduld
Dateianhänge
ZitateOnline.zip
(493.81 KiB) 42-mal heruntergeladen

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von charlytango »

hab kurz in deinen Code gesehen, fand eine recht umfangreiche und (für mich) nicht klar strukturierte Codebasis.

ich kann dir nur sagen wie ich so etwas strukturiere ohn Anspruch auf die absolute Wahrheit.

Ich packe die Komponenten die dazu nötig sind Verbindung mit der DB aufzunehmen entweder in eine Klasse oder ein Datenmodul.
In deinem Fall würde ich ein Datenmodul empfehlen. Nur eine SQLQuery kommt mit in dieses Datenmodul für Administrative Jobs und etwa Zähl- oder Summierungsjobs. Der Code dazu wird in einem eigenen File gehalten.
Meinen Beitrag/Vorschlag findest du hier
Feel free to use.
Damit wäre einmal der Bereich DB-Zugriff abgedeckt.

Die für ein Formular nötigen TSQLQueries kommen bei mir direkt aufs Formular oder werden im Code des Formulars erstellt und zerstört.
Ebenso die nötigen DataSources und datensensitiven Controls.
Bei sehr umfangreichen Formularen kommt das aus Übersichtsgründen in ein extra Datamodule.
Somit ist alles was nötig ist in einem Formular übersichtlich beisammen und kann als einzelnes Formular auch mal in eine Beispielapp ausgegliedert werden.

Hier im Forum versuchen viele zu helfen, doch sich durch ein unbekanntes Programm zu arbeiten bedeutet einen hohen Aufwand.
Bau ein möglichst kompaktes Beispielprogramm das den Aspekt deiner Frage auf ein Formular mit Minimalcode beschränkt und das auch grundsätzlich kompilierbar ist und läuft.

Dann wirst du auch Antworten bekommen

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von alfware17 »

Hm, vielleicht war ich mit dem Thread-Titel ein wenig über's Ziel hinausgeschossen. Ich möchte ja eigentlich gar nicht die ganze DB updaten sondern nur die Sprüche.
Und das ist mir jetzt gelungen. Ich bin noch einmal den Weg zurück zu dem Ansatz von vor paar Jahren und dann in mich gegangen: ich brauche ja gar kein EditCursor und UpdateWhereAll, wenn ich nicht mehrere Änderungen zulasse sondern immer nur eins und das steuere ich, indem ich einfach den Speichern Knopf auf das Popup-Fenster lege und nicht ins Hauptfenster.
Ich benutze jetzt meine vorhandenen SQL und davon habe ich ja schon viele in der Unit ZitateDB, wie gesagt, die Unit versorgt auch noch andere Programme u.a. Konsolen-Programme.

Ich habe das Beispiel angepaßt (gekürzt) - ich hoffe jetzt ist die angemahnte Übersicht und Struktur drin. Die ZitateDB habe ich allerdings so vollständig gelassen, da wollte ich jetzt nicht alles löschen und dann fehlt wieder was.

Der Ansatz mit dem zweiten Memo unten und den 3 Buttons Add, Speichern und Abbruch kann eigentlich weg, ich habe es aber noch drin gelassen, weil ich hoffte, jemand kann mir erklären, was ich genau falsch mache oder wie ich es richtig machen müsste. Okay, die Query sollte in die Form. Das Connect auch? Kann ich nicht weiter das Connect benutzen, welches mir bereits die Units ZitateDB und ZitateServerDB (ja die habe ich auch gekürzt, das ganze Zeugs mit dem Pfad suchen braucht DIESES Programm hier nicht) liefern? Wenn ja wie bekomme ich da eine Query drauf, die die von mmvisual benutzen Stati hat?

Und noch ein praktisches Problem: Mein Update so wie ich es jetzt benutze und vor 8 Jahren konzipiert hatte, macht ein Commit. Damit geht mir das Datagrid kaputt, Ich kam schon damals auf die Idee, es einfach per bShowClick wieder einzulesen, so groß ist meine DB nicht (alle Zeilen ca 15.000, hier ist eh nur ein Bruchteil im Beispiel). Wie komme ich aber wieder an die Stelle, wo ich beim Update war. Es gibt vielleicht einen einfachen Befehl, wie ich im Datagrid genau an die Stelle focussieren kann (die ID habe ich ja) - nur kenne ich mich damit nicht aus, so ein Anfänger bin ich.... Kann mir jemand einen Tip geben, gegoogelt habe ich schon, es fiel das Zauberwort Locate auf die Datasource, nur leider nicht genau wie? Danke
Dateianhänge
ZitateOnlineUpdateID.zip
(2.22 MiB) 41-mal heruntergeladen

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Wie kann ich eine Datenbank über ein TGrid updaten?

Beitrag von charlytango »

alfware17 hat geschrieben:
Fr 3. Feb 2023, 11:24
Ich kam schon damals auf die Idee, es einfach per bShowClick wieder einzulesen, so groß ist meine DB nicht (alle Zeilen ca 15.000, hier ist eh nur ein Bruchteil im Beispiel).
Wenn ich deinen Post lese beschleicht mich das Gefühl eines konzeptionellen Problems oder eines Verständnisproblems.
In einer SQL-Applikation würde mir nie einfallen 15.000 Datensätze auf einmal abzufragen.
Das kann doch kein Mensch irgendwie überblicken und ist von Performanz meilenweit entfernt.
In meinen Applikationen bekommt der Benutzer ein idealerweise recht ausgeklügeltes System von Abfragemöglichkeiten (und Möglichkeiten zur Einschränkung) um aus sagen wir mal 5-10 erhaltenen Datensätzen "analog" den herauszupicken den er wirklich braucht.
Bei Abfragen über den gesamten Datenbestand ist meistens sogar eine Warnung mit eingebaut.

alfware17 hat geschrieben:
Fr 3. Feb 2023, 11:24
Wie komme ich aber wieder an die Stelle, wo ich beim Update war. Es gibt vielleicht einen einfachen Befehl, wie ich im Datagrid genau an die Stelle focussieren kann (die ID habe ich ja) - nur kenne ich mich damit nicht aus, so ein Anfänger bin ich.... Kann mir jemand einen Tip geben, gegoogelt habe ich schon, es fiel das Zauberwort Locate auf die Datasource, nur leider nicht genau wie?
Die Zauberworte sind einerseits Locate (vielleicht besser hier) und andererseits vielleicht auch Bookmark.

Deine Strategie alle SQL-Queries in eine Unit zu packen ist verständlich aber wenig Flexibel wenn man in "Formularen" denkt. Das selbe Formular könnte man mehrmals verwenden/anzeigen und damit unterschiedliche teilbereiche der Daten gleichzeitig und parallel bearbeiten wenn die Queries gemeinsam mit dem TDatasource auf dem Forular zu finden sind. Wären sie nur an einer Stelle würden alle derartigen Formulare das gleiche anzeigen.

Ich hab auch nicht verstanden wozu für eine noch so komplexe Zitatesammlung in einer SQL Datenbank ein Objekt zitat.TZitat oder ein Fancy Generic TZitateGeneric oder eine TZitateliste nötig ist wenn das alle eigentlich eh die DB macht.

Antworten