Datenbank-Zugriff auslagern in Datenmodul
- af0815
- Lazarusforum e. V.
- Beiträge: 6759
- 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-Zugriff auslagern in Datenmodul
Das hat aber absolut nichts mit dem Datenmodul zu tun. Es ist nur die Art zu arbeiten. Das Datenmodul ist ja nichts anderes wie ein Form ohne Sichtbarkeit.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 1058
- 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: Datenbank-Zugriff auslagern in Datenmodul
Da gibt es unterschiedliche Strategien dazu, auch ob für einzelne Themen (z.B. Rechnungserstellung) nicht doch eigene DB-Verbindungen mit eigene Transaktionen nötig sind, was aber auch wieder Einfluss auf die maximal möglichen offenen Verbindungen am SQL-Server bzw dessen damit verbundenen Speicherbedarf hat. So eine Strategie für Datenhandling geht weit über die Entscheidung hinaus ob datensensitive Controls verwendet werden sollen oder auch nicht. z.B. Locking in Mehrbenutzerumgebungen.
Da bin ich etwas anderer Meinung. Bei der Anlage eines "Dokuments" (also z.B. Auftrag, Rechnung, Gutschrift, Lieferscheine et al.) speichere ich jede Benutzereingabe sofort in der Datenbank, allerdings immer als "Entwurf". Damit kann ein Benutzer auch immer auf seine Arbeit zugreifen. Laufende Rechnungsnummern werden immer dann vergeben, wenn ein Benutzer einen Entwurf finalisiert, was eine getrennte Benutzeraktion ist, die dann nicht mehr rückgängig gemacht werden kanngladio hat geschrieben: Di 2. Jul 2024, 18:40 Ob die Rechnung in der Datenbank steht sollte die Entscheidung dessen sein, der eine Rechnung erstellt, heiß bei einer nicht fertige Rechnung muss es die Möglichkeit geben diese wieder zu verwerfen.
-
- Beiträge: 1058
- 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: Datenbank-Zugriff auslagern in Datenmodul
Wie groß ist diese Hand, die da voll Benutzer ist?Joh hat geschrieben: Di 2. Jul 2024, 21:58 Solange mit meinen Anwendungen nur max. eine Handvoll Benutzer im LAN arbeiten, sollten die paar Datenbankverbindungen nicht stören.
Wieviele Formulare mit eigener Connection existieren pro User gleichzeitig?
Wie klein ist der Server ?

Was ist sonst noch im Lan los?
Erlaubst du paralleles/gleichzeitiges Öffnen von Formularen? (Also Rechnungen von Huber, Stammdaten von Meier, die Artikelstammdaten, dazwischen noch die Telefonliste und eine Statistik weil der Chef sie gerade braucht.)
Fragen über Fragen, und noch keine einzige Codezeile geschrieben

Um so etwas halbwegs im Zaum zu halten, versuche ich ressourcenschonend zu arbeiten, ohne aber das letzte Quentchen rauszuholen.
Alleine die Frage der Benutzerverwaltung/Steuerung/Rechte und des Lockings im Mehrbenutzerbetrieb kann einem schonmal einige schlaflose Nächte bescheren

-
- Lazarusforum e. V.
- Beiträge: 280
- Registriert: Sa 26. Mai 2012, 17:31
- OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
- CPU-Target: 64Bit
Re: Datenbank-Zugriff auslagern in Datenmodul
Meine Klientel sind eher sowas wie Handwerksbetriebe.charlytango hat geschrieben: Di 2. Jul 2024, 22:25 Wie groß ist diese Hand, die da voll Benutzer ist?
meist 1-5; an den meisten Tagen eher 1-2.
10-15, davon meistens so 5-6 gleichzeitig geöffnet.charlytango hat geschrieben: Di 2. Jul 2024, 22:25 Wieviele Formulare mit eigener Connection existieren pro User gleichzeitig?
Ein Standard-PC; teilweise auch der Rechner im LAN, der eh am meisten läuft; also dann die Datenbank lokal
nix wildes; der allgemeine Wahnsinn: surfen, mailen, Telefonie, scannen, Windows-Updates...
genau so; Telefon klingelt, dann noch mal eben hier geguckt und geändert, Kommentare hinzugefügt. Dann da weitermachen...charlytango hat geschrieben: Di 2. Jul 2024, 22:25 Erlaubst du paralleles/gleichzeitiges Öffnen von Formularen? (Also Rechnungen von Huber, Stammdaten von Meier, die Artikelstammdaten, dazwischen noch die Telefonliste und eine Statistik weil der Chef sie gerade braucht.)
Und die Freude, wenn man endlich herausgefunden hat, wie der Kunde es alle 6 Wochen geschafft hat, den Artikel mit der ID 0 anzulegen.charlytango hat geschrieben: Di 2. Jul 2024, 22:25 Fragen über Fragen, und noch keine einzige Codezeile geschrieben
Um so etwas halbwegs im Zaum zu halten, versuche ich ressourcenschonend zu arbeiten, ohne aber das letzte Quentchen rauszuholen.
Alleine die Frage der Benutzerverwaltung/Steuerung/Rechte und des Lockings im Mehrbenutzerbetrieb kann einem schonmal einige schlaflose Nächte bescheren![]()
just my two Beer
-
- Lazarusforum e. V.
- Beiträge: 280
- Registriert: Sa 26. Mai 2012, 17:31
- OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
- CPU-Target: 64Bit
Re: Datenbank-Zugriff auslagern in Datenmodul
Ist aber eher ein Ansatz für Firmenstrukturen, bei denen die Arbeitsplätze gewechselt werden; nicht für Kleinbetriebecharlytango hat geschrieben: Di 2. Jul 2024, 22:09 Da bin ich etwas anderer Meinung. Bei der Anlage eines "Dokuments" (also z.B. Auftrag, Rechnung, Gutschrift, Lieferscheine et al.) speichere ich jede Benutzereingabe sofort in der Datenbank, allerdings immer als "Entwurf". Damit kann ein Benutzer auch immer auf seine Arbeit zugreifen. Laufende Rechnungsnummern werden immer dann vergeben, wenn ein Benutzer einen Entwurf finalisiert, was eine getrennte Benutzeraktion ist, die dann nicht mehr rückgängig gemacht werden kann
just my two Beer
-
- Beiträge: 1058
- 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: Datenbank-Zugriff auslagern in Datenmodul
Da bin ich anderer Meinung. Gerade Kleinbetriebe brauchen bessere und intelligentere Software, die hilft, Fehler zu vermeiden und trotzdem das Pensum eines Mittelbetriebs mit einer personellen Mindestausstattung leicht schaffen.Joh hat geschrieben: Mi 3. Jul 2024, 09:49 Ist aber eher ein Ansatz für Firmenstrukturen, bei denen die Arbeitsplätze gewechselt werden; nicht für Kleinbetriebe
Wenn so etwas möglich ist, dann stimmt das Design nicht oder das Programm ist fehlerhaft. Es darf einfach nicht passieren können, was lt. DB-Design nicht sein darf. Im allerschlimmsten Fall verhindern das Constraints in der DB (die ich übrigens zu vermeiden suche, wie weitgehend alle Sprach- und serverspezifischen Funktionen). IDs (also Primary Keys einer Tabelle) werden bei mir immer automatisiert vergeben und haben sprechende Namen (z.B ID_Rechnung, ID_Kunde, ID_Person oder so ähnlich) damit die Logik der DB auch ohne Doku schneller zu durchschauen ist.Joh hat geschrieben: Mi 3. Jul 2024, 09:31 wie der Kunde es alle 6 Wochen geschafft hat, den Artikel mit der ID 0 anzulegen
Der Vorteil von einer Entwurfslogik ist, dass du immer mit dem gleichen Formular gegen die DB kennst und musst keine Klimmzüge mit einfachen Edit-Feldern machen, sondern kannst DB-Sensitive Controls verwenden. Das hält dir schonmal einen Haufen Tipparbeit vom Hals.
Und wenn der Benutzer mit der Eingabe fertig ist wird der "Rechnungsentwurf" in eine echte Rechnung umgewandelt. Das ist bei mir einfach das entfernen des "Entwurfsmarkers" in der DB. Der besteht dann natürlich aus Datum/Zeit der Umwandlung und welcher User es war. Gleichzeitig werden dann alle Rechnungsnummern automatisch vergeben und alle Abschlussarbeiten für eine Rechnung erledigt.
So eine Strategie hat auch Vorteile wenn Lieferungen und Leistungen über einen Zeitraum in einer Rechnung (also dem Entwurf dazu) gesammelt und gebündelt werden sollen, bis die Rechnung ausgeschickt wird. -- wenn du das diskutieren möchtest, dann vielleicht als PM oder in einem eigenen Thread, das geht über das Thema hier weit hinaus
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1634
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Datenbank-Zugriff auslagern in Datenmodul
@CharlyTangocharlytango hat geschrieben: Do 30. Mai 2024, 10:44 Aufgrund meiner Erfahrungen mit ZEOS 8.0 empfehle ich erst einen Test mit Lazarus 3.4 zu machen.Machst du das manuell über über die Reihenfolge der Auto-Create-Forms ?ErnstVolker hat geschrieben: Do 30. Mai 2024, 09:16 Bei mir wird das Datenmodul vor allen Formularen und auch vor dem Hauptformular erzeugt
Der Befehl zur Verbindung mit der Datenbank istWenn du Interesse an einem Beispielframework hast, findest du es hierCode: Alles auswählen
TZConnection.Connect
Es ist so gebaut dass man sehr leicht eine Verschlüsselung beim Schreiben/Lesen des INI Files einbauen kann, dann hast du das Problem des Klartextpassworts vom Tisch.
Hier spielen einfach einige Strategien zusammen und oft auch gegeneinander.ErnstVolker hat geschrieben: Do 30. Mai 2024, 09:16 Kennt jemand das Problem? Was mache ich hier falsch?
Beginnend von Erstellungsreihenfolge von Objekten (automatisch oder manuell) über Art und Weise von Datenbankzugriff und Problemen mit unterschiedlichen Komponentenversionen.
Ohne mehr Einblick in die Applikation ist es schwer einen Tip zu geben
Zunächst einmal vielen Dank für das erstellen des Frameworks.
Ich habe bislang noch keine Datenbankanwendung mit Lazarus erstellt und war dabei mir Informationen einzusammeln, wie ich diese am besten aufbaue.
Wenn ich dein Repository clone, das Beispielprojekt öffne, dann lässt sich dieses auch compilieren.
Beim Start erscheinen aber Fehlermeldungen bezüglich einer fehlenden ini Datei ohne weitere Angaben, was jetzt zu tun ist.
Könntest du die Readme.txt um diese Anweisungen ergänzen?
Edit: Sorry, wer lesen kann ist klar im Vorteil. Das Programm meckert, daß es die sqlite3.dll nicht öffnen kann. Schande über mich.
-
- Beiträge: 1058
- 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: Datenbank-Zugriff auslagern in Datenmodul
kein Problem -- in dieser Falle steckten wir alle schon mindestens einmal
Falls du detaillierte Fragen hast kannst du dich gerne an mich wenden.
Vom Datenbankzugriffsmodul gibt es mittlerweile auch eine neuere Version die gar kein Datenmodul mehr benutzt sondern nur mehr in einer Unit daheim ist und alle Objekte selbst erstellt.
Die ist dann auch per Compileswitch zum Umschalten zwischen SQLDB und ZEOS fähig.
In dem Framework habe ich ein Datenmodul zu besseren Anschaulichkeit und Einsatzfähigkeit in Beispielprogrammen benutzt. Da ist imho deutlicher was passiert und es lässt sich für ein simples Beispiel leicht integrieren.
Real verwende ich keine Datenmodule für den DB-Zugriff weil ich damit immer wieder Probleme mit der Vererbung hatte (aber das lag sicherlich auch an mir)
Das ist lästig wenn man dem Zugrifsmodul für eine bestimmte Anwendung noch zusätzliche Fähigkeiten verleihen möchte. Außerdem mag ich es, wenn ich die Kontrolle habe, wann welches Objekt nun erstellt wird.
Und nachdem ich auch im Frontend keinen DB-Zugriff aktiv habe, ist das kein Problem

Falls du detaillierte Fragen hast kannst du dich gerne an mich wenden.
Vom Datenbankzugriffsmodul gibt es mittlerweile auch eine neuere Version die gar kein Datenmodul mehr benutzt sondern nur mehr in einer Unit daheim ist und alle Objekte selbst erstellt.
Die ist dann auch per Compileswitch zum Umschalten zwischen SQLDB und ZEOS fähig.
In dem Framework habe ich ein Datenmodul zu besseren Anschaulichkeit und Einsatzfähigkeit in Beispielprogrammen benutzt. Da ist imho deutlicher was passiert und es lässt sich für ein simples Beispiel leicht integrieren.
Real verwende ich keine Datenmodule für den DB-Zugriff weil ich damit immer wieder Probleme mit der Vererbung hatte (aber das lag sicherlich auch an mir)
Das ist lästig wenn man dem Zugrifsmodul für eine bestimmte Anwendung noch zusätzliche Fähigkeiten verleihen möchte. Außerdem mag ich es, wenn ich die Kontrolle habe, wann welches Objekt nun erstellt wird.
Und nachdem ich auch im Frontend keinen DB-Zugriff aktiv habe, ist das kein Problem
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1634
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Datenbank-Zugriff auslagern in Datenmodul
Ich hatte vor einigen Jahren mal eine Android App mit Android Studio erstellt.
Da gibt es eine Klasse SQLiteOpenHelper.
Diese hat einige sehr nützliche Methoden, welche man in der Anwendung überschreiben muss. So. z.B.
onCreate - wird aufgerufen, wenn die Datenbank geöffnet werden soll aber noch nicht existiert.
OnUpgrade(VersionOld, VersionNew : integer) wird aufgerufen, wenn die Datenbank zwar existiert aber in einer älteren Version.
und noch einiges mehr.
Ich werde mir wohl so etwas ähnliches auch für meine Anwendung machen.
Jede Tabelle bekommt dann auch eine entsprechende Klasseninstanz mit eigenen Methoden für Beziehungen zu anderen Tabellen, Einfüge und Updatefunktionen usw..
So spare ich mir die Arbeit, mich in ein umfangreiches Framework einarbeiten zu müssen und hab trotzdem hundertprozentigen Durchblick was so alles passiert.
Da gibt es eine Klasse SQLiteOpenHelper.
Diese hat einige sehr nützliche Methoden, welche man in der Anwendung überschreiben muss. So. z.B.
onCreate - wird aufgerufen, wenn die Datenbank geöffnet werden soll aber noch nicht existiert.
OnUpgrade(VersionOld, VersionNew : integer) wird aufgerufen, wenn die Datenbank zwar existiert aber in einer älteren Version.
und noch einiges mehr.
Ich werde mir wohl so etwas ähnliches auch für meine Anwendung machen.
Jede Tabelle bekommt dann auch eine entsprechende Klasseninstanz mit eigenen Methoden für Beziehungen zu anderen Tabellen, Einfüge und Updatefunktionen usw..
So spare ich mir die Arbeit, mich in ein umfangreiches Framework einarbeiten zu müssen und hab trotzdem hundertprozentigen Durchblick was so alles passiert.
-
- Beiträge: 1058
- 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: Datenbank-Zugriff auslagern in Datenmodul
Na ja, was da passiert ist jetzt keine Atomphysik und im Kern nicht umfangreich.
Zugriffsobjekte erzeugen, Parameter setzen, Datenbankverbindung öffnen
.
Der ganze Rest ist der bequemen Bedienung und dem Logging geschuldet.
Das Framework ist gedacht um schnell Beispiele für SQL-Datenbanken zu entwerfen, die man leicht zwischen unterschiedlichen Datenbanken umschalten kann. Weil ich mich bei den diversen Beispielen immer geärgert habe dass ich auf die DB, die dazu nötig ist eben gerade nicht irgend einen Zugriff hatte.
Viele Wege führen zum Ziel, aber für jede Tabelle eigene Methoden zu schreiben klingt mir etwas aufwendig, meine Applikationen bewegen sich schnell mal im zweistelligen oder dreistelligen Bereich von Tabellen.
Außerdem würdest du damit quasi den SQL-Server nachprogrammieren, denn der kann bereits alle Fähigkeiten die zur Tabellenmanipulation und zur referential integrity nötig sind.
Da meine Programme gegen unterschiedliche Servertypen liefen, habe ich meistens auf RI verzichtet und quasi im Programm darauf geachtet und den Schlüsselfeldern durchgängig sprechende Namen gegeben
Zugriffsobjekte erzeugen, Parameter setzen, Datenbankverbindung öffnen
.
Der ganze Rest ist der bequemen Bedienung und dem Logging geschuldet.
Na ja, das sind ganze 3 Prozeduren von denen OnOpen, OnCreate ohnedies in einer Form inkludiert sind und OnUpdate quasi vorbereitet ist (indem eine Versionsnummer schon vorbereitet ist.)fliegermichl hat geschrieben: Sa 8. Mär 2025, 11:58 Ich werde mir wohl so etwas ähnliches auch für meine Anwendung machen.
Jede Tabelle bekommt dann auch eine entsprechende Klasseninstanz mit eigenen Methoden für Beziehungen zu anderen Tabellen, Einfüge und Updatefunktionen usw..
Das Framework ist gedacht um schnell Beispiele für SQL-Datenbanken zu entwerfen, die man leicht zwischen unterschiedlichen Datenbanken umschalten kann. Weil ich mich bei den diversen Beispielen immer geärgert habe dass ich auf die DB, die dazu nötig ist eben gerade nicht irgend einen Zugriff hatte.
Viele Wege führen zum Ziel, aber für jede Tabelle eigene Methoden zu schreiben klingt mir etwas aufwendig, meine Applikationen bewegen sich schnell mal im zweistelligen oder dreistelligen Bereich von Tabellen.
Außerdem würdest du damit quasi den SQL-Server nachprogrammieren, denn der kann bereits alle Fähigkeiten die zur Tabellenmanipulation und zur referential integrity nötig sind.
Da meine Programme gegen unterschiedliche Servertypen liefen, habe ich meistens auf RI verzichtet und quasi im Programm darauf geachtet und den Schlüsselfeldern durchgängig sprechende Namen gegeben
- Maddias
- Lazarusforum e. V.
- Beiträge: 40
- Registriert: Mo 29. Apr 2019, 09:28
- OS, Lazarus, FPC: Windows 11, Lazarus 3.8, FPC 3.2.2
- Wohnort: Randwick, NSW, Australien
- Kontaktdaten:
Re: Datenbank-Zugriff auslagern in Datenmodul
Hallo Joh,Joh hat geschrieben: Di 2. Jul 2024, 21:58 Dann bleibe ich doch lieber bei den formulargebundenen Connections / Transaktionen.
Dann habe ich formularlokale Transaktionen und kann weiter mit den DBObjekten arbeiten.
für mich steht fest: Keine Software-Entwicklung ohne automatisierte Testfälle. Das geht sowohl mit FPCUnit als auch mit FPTest.
Formulare sind da zum Testen absolut ungeeignet. Deswegen packe ich soviel wie möglich in Datenmodule. Ein Beispiel dafür findest Du auf BitBucket unter meiner öffentlichen Repository hier.
Ziel muß sein die Formulare "so dumm wie möglich" zu halten und Geschäftslogik anderweitig zu implementieren.
Salut,
Mathias