Best practice für mehrere DBGrids

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
zarquon
Beiträge: 12
Registriert: Mo 18. Jun 2012, 16:30

Best practice für mehrere DBGrids

Beitrag von zarquon »

Hallo zusammen,

bin neu hier und versuche mich wenigstens halbwegs verständlich auszudrücken.
Ich habe früher (wirklich früher) ein wenig in Turbo-Pascal gemacht, dann lange die Finger von gelassen und in den letzten Jahren eigentlich nur mit PHP gearbeitet. Jetzt bin ich über Free Pascal/Lazarus gestolpert und habe den Eindruck, das es Erwachsen genug ist um jenseits des Sandkastens eingesetzt zu werden. Auch aufgrund der Cross-Platform Möglichkeiten keimte dadurch der Gedanke ein aktuelles Projekt nicht als Web-App (Ich sage eigentlich immer noch lieber Intranetanwendung) zu realisieren, sondern zurück zu den Pascal-Wurzeln zu gehen.

Ich bin ganz gewiss kein Star-Programmierer, aber mit PHP/MySQL habe ich immer meinen Weg gefunden. Muss aber gerade feststellen, das die ganze Handhabung in einer IDE wie Lazarus doch so unterschiedlich ist, das ich mir an so einigen Stellen mehr als unsicher bin. Wäre schön wenn ich meinen Horizont erweitert bekäme.

1. Was ist die best practice (oder zumindest eine gute?) wenn meine Datenbank mehr als eine Tabelle hat und ich diese wechselweise darstellen/bearbeiten will? z.b. bei Menüpunkt zwischen Kunden und Aufträgen wechseln. Ganz banal für das entsprechende Grid "Visible" auf true oder false setzen?

2. Mein Projekt kommt wohl einer Leihliste am nächsten. Ich habe eine Inventarliste und alles was dort an Inventar geführt wird kann von Datum1 bis Datum2 "verliehen" sein. Verfügbarkeiten sind also Datumsanhängig. In PHP/MySQL habe ich diese Funktionalität prinzipiell schon realisiert. Per SQL Abfrage hole ich mir eine Liste ALLER Items und eine Liste der für das jeweilige Datum nicht verfügbaren Items. Die eine kann man in PHP recht simpel per array_diff von der anderen abziehen. Meine Liste der am jeweiligen Datum verfügbaren items ist damit ein array, das ich dann einfach per Schleife als Tabellenzeilen in in HTML Code, und damit auf den Bildschirm, werfe. Den ersten Teil werde ich hier analog lösen, denke ich. Mir ist aber gerade (noch) nicht klar, wie ich eine Datenbankabfrage per SQL letztlich in ein Array in Pascal bekomme. Und welches Konstrukt ich in Lazarus am besten nutzen sollte um das Ergebnis-Array auf den Bildschirm zu bringen durchschaue ich in diesem Augenblick noch gar nicht.

3. Eine meiner Datenbanktabellen hält die Items. Diese haben ein generelles Verfügbarkeitsflag. Für den Fall das z.B. etwas in Reparatur ist, und damit generell nicht verfügbar. Die entsprechende Tabelle sollte sich in einem DBGrid recht einfach darstellen lassen. Entsprechende Beispiele liegen so sogar im examples Verzeichnis. Ich fände das jetzt todschick und ungemein praktisch wenn mit entsprechend Flag versehene Items mit einer anderen Farbe versehen werden. So Ampel-Technisch. Rot, Gelb und Grün. Geht das mit einem DBGrid, oder wie kann so etwas elegant gelöst werden.

4. Vor der simplen Frage habe ich die größte Angst. Welche Datenbank nimmt man überhaupt? Es wird nix riesiges. Wir reden über 100-200 Items, und ca. 500 Benutzer bzw. Kunden denen diese temporär zugeordnet werden. Der Testballon wird ein Einzelplatzsystem. Perspektivisch wären 3-5 Clients denkbar.

freue mich auf Antworten.
Rafael

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Best practice für mehrere DBGrids

Beitrag von Socke »

Herzlich Willkommen im Forum!
zarquon hat geschrieben:1. Was ist die best practice (oder zumindest eine gute?) wenn meine Datenbank mehr als eine Tabelle hat und ich diese wechselweise darstellen/bearbeiten will? z.b. bei Menüpunkt zwischen Kunden und Aufträgen wechseln. Ganz banal für das entsprechende Grid "Visible" auf true oder false setzen?
Wie wärs mit einem Tab-Control? Über die Tabs wechselst du dann zwischen den Tabellen hin und her.
zarquon hat geschrieben: 2. Per SQL Abfrage hole ich mir eine Liste ALLER Items und eine Liste der für das jeweilige Datum nicht verfügbaren Items. Die eine kann man in PHP recht simpel per array_diff von der anderen abziehen.
Das ist schon in PHP/MySQL eine eine blöde Idee. Sofern du die beiden Arrays in deinem Programm nicht zwingend brauchst, solltest du die Differenz schon in der Datenbank berechnen und nur diese in dein Programm laden.
zarquon hat geschrieben:Mir ist aber gerade (noch) nicht klar, wie ich eine Datenbankabfrage per SQL letztlich in ein Array in Pascal bekomme. Und welches Konstrukt ich in Lazarus am besten nutzen sollte um das Ergebnis-Array auf den Bildschirm zu bringen durchschaue ich in diesem Augenblick noch gar nicht.
Hier hast du prinzipiell drei Möglichkeiten:
  • MySQL-API direkt verwenden
  • ZEOS (externes Package)
  • SQLDB (Package wird mit Lazarus mitgeliefert)
Punkt 1 funktioniert (fast) genau so wie in PHP. Bei Punkt 2 und 3 hast du ein TDataset-Objekt, mit dem du objektorientiert auf deine Datensätze zugreifen kannst. Welches dieser beiden Packages für dich und dein Projekt besser geeignet ist, kann ich nicht beurteilen (dazu verwende ich beide zu wenig). Bei beiden hast du dann aber auch die Möglichkeit alles halbautomatisch in einem DBGrid anzeigen zu lassen.
zarquon hat geschrieben:Geht das mit einem DBGrid, oder wie kann so etwas elegant gelöst werden.
Vermutlich musst du dann alles selber Zeichnen; schau mal ob du bei dem Grid die Paint-/Draw-Events findest
zarquon hat geschrieben:Welche Datenbank nimmt man überhaupt? Es wird nix riesiges. Wir reden über 100-200 Items, und ca. 500 Benutzer bzw. Kunden denen diese temporär zugeordnet werden. Der Testballon wird ein Einzelplatzsystem. Perspektivisch wären 3-5 Clients denkbar.
Bei einer Anwendung mit mehreren Clients ist eine Client-Server-Datenbank in der Regel im Vorteil. SQLite hat den Vorteil, dass du keinen Server installieren und konfigurieren muss; es sollte diese Benutzerzahl auch noch bewältigen können.

Bei den Servern hast du eigentlich freie Auswahl. Da kann ich dir nur empfehlen auf deine eigene Erfahrung zu bauen. MySQL ist für Einsteiger recht einfach aufzusetzen. Microsoft SQL-Server (die Express-Version ist kostenlos) benötigt ein wenig mehr Einarbeitungszeit. Andere Datenbanken, mit denen ich zu tun habe (MaxDB, Oracle, DB2), sind benötigen zu viel Konfiguration und Wartung und sind für dein Projekt damit wenig sinnvoll.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

zarquon
Beiträge: 12
Registriert: Mo 18. Jun 2012, 16:30

Re: Best practice für mehrere DBGrids

Beitrag von zarquon »

Socke hat geschrieben:Wie wärs mit einem Tab-Control? Über die Tabs wechselst du dann zwischen den Tabellen hin und her.
War auch eine meiner Ideen, aber da ich eine solche Lösungen anderweitig selten bis nie gesehen habe bin ich nicht sicher ob das als guter Stil durchgeht.
Socke hat geschrieben:Das ist schon in PHP/MySQL eine eine blöde Idee. Sofern du die beiden Arrays in deinem Programm nicht zwingend brauchst, solltest du die Differenz schon in der Datenbank berechnen und nur diese in dein Programm laden.
Das dachte ich eigentlich auch. Aber nachdem ich mindestens einen Tag mit inneren, äußeren, linken und auch rechten Joins verbracht habe fiel mir auf, das zwei einfache SQL Statements und ein simpler Befehl den Job erledigen. Mag an meinem unzureichenden SQL-Fähigkeiten liegen, aber da das hier kein SQL Forum ist wollte ich das nicht näher vertiefen. Mein Weg funktioniert, und Performanceprobleme gibt es möglicherweise bei der 100fachen Datenmenge.
Socke hat geschrieben:Vermutlich musst du dann alles selber Zeichnen; schau mal ob du bei dem Grid die Paint-/Draw-Events findest
Genau das hoffte ich nicht machen zu müssen.
Socke hat geschrieben:Bei den Servern hast du eigentlich freie Auswahl. Da kann ich dir nur empfehlen auf deine eigene Erfahrung zu bauen.
Die beziehen sich ja auf eine völlig andere Umgebung.
In meinen Augen sind die Möglichkeiten einer MySQL sicherlich ausreichend. Und für ein recht großes Plus halte ich die Verfügbarkeit für alle erdenklichen Plattformen.

zarquon
Beiträge: 12
Registriert: Mo 18. Jun 2012, 16:30

Re: Best practice für mehrere DBGrids

Beitrag von zarquon »

Falls mal jemand ähnliche Sorgen oder Wünsche hat:
Ich habe im Lazarus Code and Component Repository auf sourceforge das "SQLite3 master detail example" gefunden in dem ich für mich gerade ein paar hilfreiche Dinge finde.
http://sourceforge.net/projects/lazarus ... 20example/

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Best practice für mehrere DBGrids

Beitrag von Socke »

zarquon hat geschrieben:
Socke hat geschrieben:Wie wärs mit einem Tab-Control? Über die Tabs wechselst du dann zwischen den Tabellen hin und her.
War auch eine meiner Ideen, aber da ich eine solche Lösungen anderweitig selten bis nie gesehen habe bin ich nicht sicher ob das als guter Stil durchgeht.
Ich kenne da zum Beispiel Microsoft Access, aber das ist kein guter Stil. Ansonsten kommt das wohl auch stark darauf an, welche Informationen in den Tabellen enthalten sind und zu welcher Zeit (Arbeitsschritte) man welche Information braucht. Gegebenenfalls können die Tabellen auch neben- oder untereinander angeordnet werden.
zarquon hat geschrieben:
Socke hat geschrieben:Das ist schon in PHP/MySQL eine eine blöde Idee. Sofern du die beiden Arrays in deinem Programm nicht zwingend brauchst, solltest du die Differenz schon in der Datenbank berechnen und nur diese in dein Programm laden.
Das dachte ich eigentlich auch. Aber nachdem ich mindestens einen Tag mit inneren, äußeren, linken und auch rechten Joins verbracht habe fiel mir auf, das zwei einfache SQL Statements und ein simpler Befehl den Job erledigen. Mag an meinem unzureichenden SQL-Fähigkeiten liegen, aber da das hier kein SQL Forum ist wollte ich das nicht näher vertiefen. Mein Weg funktioniert, und Performanceprobleme gibt es möglicherweise bei der 100fachen Datenmenge.
Ich sage immer: Lass die Datenbank erledigen, was sie tun kann. In einer meiner Anwendungen steckt ein ca. 3 Kilobyte SQL-Statement (Okay, da steckt eine ganze Menge Formatierung drinnen).

Wenn du Fragen hast, kannst du die selbstverständlich auch hier im Forum stellen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

zarquon
Beiträge: 12
Registriert: Mo 18. Jun 2012, 16:30

Re: Best practice für mehrere DBGrids

Beitrag von zarquon »

Socke hat geschrieben:Ich kenne da zum Beispiel Microsoft Access, aber das ist kein guter Stil.
Eben :-)
Socke hat geschrieben:Ansonsten kommt das wohl auch stark darauf an, welche Informationen in den Tabellen enthalten sind und zu welcher Zeit (Arbeitsschritte) man welche Information braucht. Gegebenenfalls können die Tabellen auch neben- oder untereinander angeordnet werden.
Ich denke aus pragmatischen Gründen werde ich fürs erste doch die Tab-Lösung ins Auge fassen.
Socke hat geschrieben:Ich sage immer: Lass die Datenbank erledigen, was sie tun kann. In einer meiner Anwendungen steckt ein ca. 3 Kilobyte SQL-Statement (Okay, da steckt eine ganze Menge Formatierung drinnen).

Wenn du Fragen hast, kannst du die selbstverständlich auch hier im Forum stellen.
Ich kann den Sachverhalt ja kurz generell schildern.
Nach der bisherigen Planung sieht es im Kern wie folgt aus:

Ich hab eine Tabelle mit ID, TITLE, AVAIL in der alle verfügbaren Items gelistet sind. Ein AVAIL Flag brauche ich, da ein Item z.b. in Reparatur sein kann. Ein SELECT * FROM ITEMS WHERE AVAIL='1' liefert mir alle generell verfügbaren Items.
In einer zweiten Tabelle, quasi einer Leihliste, sind die Zeiten definiert wo ein Item verwendet wird und damit nicht verfügbar ist. Die elementaren Felder wären ID, ITEM_ID, ARRIVAL, DEPARTURE.
Zwischen ARRIVAL und DEPARTURE ist ein ITEM nicht verfügbar, weil ... sagen wir ausgeliehen.
Ein SELECT * FROM SCHEDULE WHERE ARRIVAL < $date AND (DEPARTURE > $date OR departure IS NULL) liefert mir alle nicht verfügbaren Items.
Alle minus die nicht verfügbaren ergibt die an einem Datum verfügbaren. Das macht (zumindest in PHP) ein simples array_diff.
Das gleiche in einem SQL Statement wäre fraglos eleganter, meine Hirnwindungen waren aber bislang nicht dazu in der Lage selbiges zu erdenken.

zarquon
Beiträge: 12
Registriert: Mo 18. Jun 2012, 16:30

Re: Best practice für mehrere DBGrids

Beitrag von zarquon »

Wenn ich das gerade richtig überblicke, dann geht bei Datenbankzugriffen ganz nebenbei der Cross-Platform Gedanke gehörig baden. Zeos gibt es nicht für den Mac, und mit der SQLite3.dll kann er auch nix anfangen.

Ich sollte mich fragen ob Lazarus überhaupt das richtige Werkzeug für meinen Fall ist. Das ich zu DOS Zeiten mal in Pascal programmiert habe verschafft mir nicht mehr wirklich einen Vorteil, so wie es aussieht.
Ideologisch ist mir das ganze sehr sympathisch, aber ökonomisch sehe ich leider Probleme.
Ich denke als nächstes werde ich mal ein paar Tage mit REAL Studio verbringen. (Nicht schlagen, bitte :-) )

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

Re: Best practice für mehrere DBGrids

Beitrag von hde »

[quote="zarquon"
Ich denke als nächstes werde ich mal ein paar Tage mit REAL Studio verbringen. (Nicht schlagen, bitte :-) )[/quote]

Das hab ich auch mal gecheckt .. Datenbankanbindung "ganz zu Fuss" .. Viel Spaß damit
zarquon hat geschrieben: Cross-Platform Gedanke gehörig baden
Wie kommst du auf den Quatsch? :wink:

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

Re: Best practice für mehrere DBGrids

Beitrag von hde »

zarquon hat geschrieben:Ich sollte mich fragen ob Lazarus überhaupt das richtige Werkzeug für meinen Fall ist.
Lazarus ist für Cross-Plattform-Anwendungen sehr geeignet, auch die Datenbank-/tool/anbindung. Und mit Zeos auch sehr flexibel was die Datenbanken asngeht.

aber .. wenn du Pascal nicht richtig kannst sondern erlernen musst, dich in SQL nicht wirklich auskennst, aber Cross-Plattform programmieren willst ..
dann schau dir meinen "Geheimtip" an: XDEV Studio 3. Das ist Java, Cross-Plattform, die Basis kostenlos, und damit kannst du relativ einfach Datenbankanwendungen, gute Formulare etc. "zusammenklicken" (auch fast ohne SQL zu kennen) und es läuft Cross-Plattform

(Sorry, dass ich das hier mal so offen sage) :wink:
hde

hausi
Beiträge: 132
Registriert: Mi 23. Sep 2009, 08:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Best practice für mehrere DBGrids

Beitrag von hausi »

Hallo hde

und wie sieht es mit Reports aus und einem Designtool für Reports, damit der Kunde die Reports selber anpassen kann.

Hast einen Link


Hausi

zarquon
Beiträge: 12
Registriert: Mo 18. Jun 2012, 16:30

Re: Best practice für mehrere DBGrids

Beitrag von zarquon »

hde hat geschrieben:Wie kommst du auf den Quatsch? :wink:
Weil es nach Stand der Dokumentation (erstmal) so ausschaut. Im Wiki findet sich z.B. nur die Anleitung wie ich zeos für Win und Linux aus dem svn holen soll. Da bin ich geneigt anzunehmen es funktioniere auch nur unter den Systemen.

zarquon
Beiträge: 12
Registriert: Mo 18. Jun 2012, 16:30

Re: Best practice für mehrere DBGrids

Beitrag von zarquon »

hde hat geschrieben:
zarquon hat geschrieben:Ich sollte mich fragen ob Lazarus überhaupt das richtige Werkzeug für meinen Fall ist.
Lazarus ist für Cross-Plattform-Anwendungen sehr geeignet, auch die Datenbank-/tool/anbindung. Und mit Zeos auch sehr flexibel was die Datenbanken asngeht.

aber .. wenn du Pascal nicht richtig kannst sondern erlernen musst, dich in SQL nicht wirklich auskennst, aber Cross-Plattform programmieren willst ..
Da muss ich mich jetzt mal selbst in Schutz nehmen :-)
Mein Pascal ist komplett eingerostet, weil mein Erfahrungshorizont Borlands Turbo-Pascal aus den 1990ern ist. Da durfte ich jetzt selber feststellen, das es womöglich der gleiche Aufwand ist sich an etwas neues zu gewöhnen, wie altes zu reaktivieren.
Mein SQL ist wie mein RegEx garantiert nicht großartig, aber bislang habe ich alle meine praktischen Aufgabenstellungen lösen können. In der LAMP-Welt halt. Möglicherweise nicht immer der eleganteste Code, aber immerhin funktional.
hde hat geschrieben:dann schau dir meinen "Geheimtip" an: XDEV Studio 3. Das ist Java, Cross-Plattform, die Basis kostenlos, und damit kannst du relativ einfach Datenbankanwendungen, gute Formulare etc. "zusammenklicken" (auch fast ohne SQL zu kennen) und es läuft Cross-Plattform
Um das zusammenklicken geht es mir nicht wirklich. Möglicherweise ganz im Gegenteil. Konnte ich bei dem, was ich die letzten 10 Jahre gemacht habe auch nicht. Was mich im Augenblick sehr verwirrt ist, das halt jeder "seine" Entwicklungsumgebung als quickest, easiest and most powerful cross platform development solution on the market anpreist. Und ich armer kleiner Spagetticoder habe kaum eine reelle Chance zu ermitteln wer nun wirklich recht hat.
Und dann kommst du noch mit Java um die Ecke :-)
hde hat geschrieben:(Sorry, dass ich das hier mal so offen sage) :wink:
In der Form kann ich da gut mit Leben.

grüße

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

Re: Best practice für mehrere DBGrids

Beitrag von hde »

Ja, bei Lazarus gibt es keine kommerzielle Installation. Ich hab mich am Anfang auch sehr schwer getan und auch überlegt, ob Lazarus die richtige Basis für mein Projekt ist. Dieses Forum hat mir aber sehr geholfen und jetzt habe ich auf allen für mich wichtigen Systemen eine einheitliche Lazarus-Installation mit denen ich mein Projekt crossplattformtauglich fertigstellen will (so hoffe ich jedenfalls). Klar, man muss sich mit den Quellen des einen oder anderen Tools befassen, selbst was kompilieren und sich mit Hilfe vieler netter Leute in diesem Forum einarbeiten. Es ist (leider noch) kein System, das man fertig "aus dem Schrank nimmt" und loslegt. Man muss sich einarbeiten und selbst "Hand anlegen". Wer das nicht will und kein Pascal braucht und keine "Systemnähe" für den hab ich einen andren Tipp (s.o.)
hde

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

Re: Best practice für mehrere DBGrids

Beitrag von hde »

zarquon hat geschrieben:Und dann kommst du noch mit Java um die Ecke
Soo schlimm ist Java ja nun auch nicht. Und mit dem genannten Tool kann man es auch sehr leicht lernen. Und man kann da auch nicht nur "klicken" sondern auch voll komplex programmieren, nur der Einstieg ist einfacher. Auch ich werde es für ein Projekt nutzen, das andere Ansprüche stellt als das jetzige mit Lazarus. Es gibt viele Entwicklungsumgebungen, man muss eben für sein Projekt die richtige finden. Für mein jetziges Projekt ist es nun mal Lazarus.
hde

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

Re: Best practice für mehrere DBGrids

Beitrag von hde »

hausi hat geschrieben:und wie sieht es mit Reports aus und einem Designtool für Reports, damit der Kunde die Reports selber anpassen kann
Sorry @hausi,
hatte ich glatt überlesen. Zu welcher IDE / Sprache soll's denn passen?
Gruß hde

Antworten