Matrixtabelle SQLite

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
coasting
Beiträge: 21
Registriert: Mi 30. Apr 2014, 14:32

Matrixtabelle SQLite

Beitrag von coasting »

n'Abend ;)

Ich möchte Distanzen in einer DB festhalten. Habe hierzu folgende Tabellen in meiner SQLIte DB angelegt:

Code: Alles auswählen

CREATE TABLE [points] (
  [POINT_ID] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [POINT_NAME] VARCHAR(50) NOT NULL);

Code: Alles auswählen

CREATE TABLE [distances] (
  [DISTANCE_ID] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [DISTANCE_KM] VARCHAR(50) NOT NULL, 
  [POINTFROM_ID] INTEGER NOT NULL REFERENCES [points]([POINT_ID]), 
  [POINTTO_ID] INTEGER NOT NULL REFERENCES [points]([POINT_ID]));
Wie ich diese Distanzen Abfrage, habe ich ebenfalls in SQL beschrieben:

Code: Alles auswählen

SELECT distance_km FROM distances WHERE pointfrom_id = :point_id AND pointto_id = :point_id; 
Soweit so gut.

Wie setze ich das aber in Lazarus mit den DB Komponenten visuell um? Die Daten sollen vom Benutzer nicht nur ausgelesen sondern auch bearbeitet und ergänzt werden können? Was wäre hierfür der beste bzw. der richtige Ansatz? ...oder geht das gar nicht so einfach?

coasting

RugiaArt
Beiträge: 41
Registriert: Do 11. Okt 2012, 18:50
OS, Lazarus, FPC: Win7 (L 1.0.0.2 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Rügen
Kontaktdaten:

Re: Matrixtabelle SQLite

Beitrag von RugiaArt »

vielleicht bringt dich das weiter:

http://wiki.lazarus.freepascal.org/Laza ... and_SQLite

mfg RugiaArt

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Matrixtabelle SQLite

Beitrag von Michl »

Generell kannst du ganz einfach ein DBGrid nutzen, dort ist sogar eine Bearbeitung in der Tabelle möglich.

In meinen professionelleren Anwendungen habe ich allerdings keine DBGrids mehr eingesetzt, dort nutze ich zumeist normale StringGrids oder DrawGrids und hole mir je nachdem, was ich für Daten benötige sie direkt vom Query. Das hat den Vorteil, dass MaskEdits und Abfragen von zulässigen Werten bei der "in der Zelle vom Grid" - Bearbeitung oder auch spezielle Ansichten in Gridzellen möglich sind.
Die Bearbeitung der Werte gaukel ich dem Nutzer vor, als würden diese in der Zelle stattfinden, habe aber dann meistens ein entsprechendes Control davorgelegt (ähnlich, wie das Excel macht). Bei manchen habe ich auch externe Editfelder.

Kannst auch die Daten in einem DBGrid darstellen und nur in DBEdits bearbeiten und einen DBNavigator für Grundfunktionen nutzen, was wohl die gängigste Einsteigervariante wäre.

Aber eigentlich sollte die Frage lauten, was Du willst?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

coasting
Beiträge: 21
Registriert: Mi 30. Apr 2014, 14:32

Re: Matrixtabelle SQLite

Beitrag von coasting »

Hmm... ja, wie Du schon richtig vermutet hattest, nehme ich normalerweise ein ein- oder zweispaltiges readonly DBGrid plus DBNavigator zur Auswahl bzw. Navigation des Datensatzes und lasse die Bearbeitung der Daten über DBEdits zu. Bei der Bearbeitung von Matrix-Daten, war ich mir aber nicht sicher ob das noch der richtige Weg ist. Bin mir auch bezgl. der darunter liegenden Logik nicht ganz im Klaren. Ich muss die Auswahl zweier Punkte in einer Tabelle zulassen und schreibe die eingegeben Werte in eine andere Tabelle. Dafür müsste ich doch zwei DBGrids mit jeweils eigenen Datasource und Query Komponenten einsetzen, oder? Das erschien mir ein wenig zu kompliziert gedacht. Vor allen Dingen wüsste der Anwender auf den ersten Blick nicht, ob die entsprechende Distanz schon vorhanden ist. Er muss erst beide Punkte auswählen. Das erschien mir nicht anwenderfreundlich für die Pflge der Daten zu sein. ...Hmm, mir fehlt da einfach ein Beispiel aus der Praxis wie so etwas anderswo gelöst wird.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Matrixtabelle SQLite

Beitrag von Michl »

Über welche Matrixgröße redest Du - was erwartest du für eine maximale Dimension?!

Falls diese noch darstellbar ist, würde ich ein Draw- oder StringGrid nehmen und die Tabelle per per Hand füllen und jenachdem, welches Feld gewählt wurde, dieses zur Bearbeitung (per Hand oder DBEdit) bereitstellen für beide Tabellen (sind ja dann, soweit ich das nachvollziehen kann, nur 3 Daten in 2 Tabellen).

Wahrscheinlich wäre es sinnvoll die Tabelle "points" extra bearbeitbar zu machen, z.B. in einem Extraformular, wo nur diese eingegeben werden können, somit hättest Du nur noch 1 Feld in dem Grid zu bearbeiten.

Ist aber schwierig Dir einen Tipp zu geben, wenn Du die eigentliche Frage bzw. deren Background so kleckerweise postest :wink:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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: Matrixtabelle SQLite

Beitrag von Socke »

coasting hat geschrieben:Hmm... ja, wie Du schon richtig vermutet hattest, nehme ich normalerweise ein ein- oder zweispaltiges readonly DBGrid plus DBNavigator zur Auswahl bzw. Navigation des Datensatzes und lasse die Bearbeitung der Daten über DBEdits zu. Bei der Bearbeitung von Matrix-Daten, war ich mir aber nicht sicher ob das noch der richtige Weg ist. [...] Vor allen Dingen wüsste der Anwender auf den ersten Blick nicht, ob die entsprechende Distanz schon vorhanden ist. Er muss erst beide Punkte auswählen. Das erschien mir nicht anwenderfreundlich für die Pflge der Daten zu sein. ...Hmm, mir fehlt da einfach ein Beispiel aus der Praxis wie so etwas anderswo gelöst wird.
Lese ich das richtig, dass du dir gerade Gedanken darüber machst, wie die Daten dem Anwender präsentiert werden? Hier hilft folgendes, erprobtes Vorgehen:
  • Rechner ausschalten
  • In einen anderen Raum gehen
  • Papier und Stift bereitstellen
  • Viele Skizzen anfertigen (mindestens 10 Stück :wink:)
  • Die besten drei Skizzen in einem Programm ausprobieren -- ohne Datenbank!
  • Datenbankverbindung herstellen
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

coasting
Beiträge: 21
Registriert: Mi 30. Apr 2014, 14:32

Re: Matrixtabelle SQLite

Beitrag von coasting »

Vielen Dank für die Tipps!

Ich habe jetzt versuchsweise folgenden Aufbau im Formular realisiert:
Formular
Formular
Formular.png (9.07 KiB) 1762 mal betrachtet
Das linke DBGrid ist an Datasource1 angebunden. SQLQuery1 holt die Daten per SQL wie folgt aus der DB:

Code: Alles auswählen

SELECT * FROM points ORDER BY point_name ASC;
Das rechte DBGrid ist über eine separate Datasoure2 Komponente angebunden. SQLQuery2 hat Datasource1 als Datasource, ist also eine klassische Master - Detail Verbindung. Der SQL String im SQLQuery2 sieht wie folgt aus:

Code: Alles auswählen

SELECT (SELECT point_name FROM points WHERE point_id = distances.pointto_id) Ziel, distance_km Kilometer
FROM distances
WHERE distances.pointfrom_id = :point_id ORDER BY Ziel ASC;   
Somit werden die bereits vorhandenen Distanzen bei Auswahl im linken sofort im rechten DBGrid angezeigt. Die Datenbearbeitung will ich entweder in den DBGrids selber erlauben oder über einen separaten Dialog erledigen lassen. Da bin ich mir noch unschlüssig. Was meint ihr?

coasting

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Matrixtabelle SQLite

Beitrag von Michl »

Ging es Dir nicht um eine Matrixtabelle???

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

coasting
Beiträge: 21
Registriert: Mi 30. Apr 2014, 14:32

Re: Matrixtabelle SQLite

Beitrag von coasting »

Michl hat geschrieben:Ging es Dir nicht um eine Matrixtabelle???
Jein... ;) Die Daten liegen in Form einer Matrix vor. Die Bearbeitung der Datensätze in einer Tabelle ala Excel (so wie im Screenshot unten), fand ich jedoch zu unübersichtlich. Insbesondere dann, wenn im Laufe der Zeit noch mehr Distanzen hinzukommen.
Matrix.png
Sorry, wenn ich mich vorher unklar ausgedrückt habe ...aber wusste am Anfang auch nicht so genau wie ich das umsetzen soll.

coasting

Antworten