Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wie am besten Daten visualisieren und auswahl verarbeiten (https://www.delphipraxis.net/128558-wie-am-besten-daten-visualisieren-und-auswahl-verarbeiten.html)

ryLIX 1. Feb 2009 12:42

Datenbank: SQLite • Version: 3 • Zugriff über: DISQLite3

Wie am besten Daten visualisieren und auswahl verarbeiten
 
:hi: Hi,

ich fühl mich im Moment etwas von einer Aufgabenstellung erschlagen :freak:

Das hab ich im Moment:
Datenbank:
1x Tabelle für ein TreeView
~1300 Tabellen für die Daten

Anwendung:
Ich habe im Hauptfenster eine DBTreeView Komponente (maximales Level = 1) mit der ich die Tabellen in meiner DB visualisiere.
Der Tabellenname setzt sich aus dem Nodenamen und dessen Parentnamen zusammen.
Die Inhalte der Tabellen (3 Spalten) werden in 2 ListBox und einer Textfeld Komponente dargestellt (durch auswählen des TreeView Nodes).
In jeder Tabelle kann der User zu jeder Row auch eine Kommentarspalte befüllen 8dazu ist das Textfeld).

Das möchte ich:
Ich möchte dam User nun die Möglichkeit stellen diese Kommentare aus der DB zu Exportieren und später auch wieder zu Importieren.
Wie ich an die entsprechenden Felder komme weiß ich schon :)
Wo es hakt ist die Visualisierung der Daten.
Da ich die Möglichkeit bieten möchte das der USer auswählen kann welche Datensätze Importiert bzw Exportiert werden.
Ich sitz nun schon länger hier und überlege wie ich das am besten auf den Schirm bringe...

Ich hatte an eine CheckListBox gedacht für den Tabelleninhalt.
Aber bei Menge an Tabellen ist das sehr unübersichtlich.
Also dachte ich mir das ich dazu noch ein (DB)TreeView nehme damit ich diese angenehme Unterteilung habe wie im Hauptfenster.
Das ganze soll später in einer SQLite3 Datei landen bzw aus einer kommen.

Nun zu den Fragen :stupid:
Wie bekomme ich es hin das im TreeView nur die Elemente angezeigt werden wo auch Kommentare vorhanden sind?
Wie kann ich am besten die Auswahl zwischen speichern zur späteren Verarbeitung?

Gibt es vielleicht eine Möglichkeit die Daten in der DB selber noch anders zu verknüpfen (Trigger, Views).
Wäre es für die Performance der ganzen Aktion vom Vorteil wenn ich die DB an meine vorhandene DB anhänge (ATTACH) und später wieder abhänge (DETACH)?

Ich weiß sind eine Menge Fragen aber bin nicht so bewandert was das angeht und ich werd das Gefühl nicht los das mein Ansatz nicht passt :|

sx2008 1. Feb 2009 12:47

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Zitat:

Zitat von ryLIX
~1300 Tabellen für die Daten

Da fängt das Problem schon an.
Mal angenommen, du willst die Wetterdaten der letzten 5 Jahre speichern.
Wer jetzt für jeden Tag eine eigene Tabelle anlegt und wenn diese Tabellen alle die gleiche Struktur haben hat schon einen Riesenfehler begangen.
Haben deine Datentabellen auch die gleiche Struktur; also gleiche Feldnamen und Feldtypen?

ryLIX 1. Feb 2009 13:00

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Ja die Tabellen haben alle die gleiche Struktur.

:pale: Mir war nicht bewusst dass das schon ein Fehler ist.

sx2008 1. Feb 2009 13:14

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Zitat:

Zitat von ryLIX
Ja die Tabellen haben alle die gleiche Struktur.

Ok, der "Trick" ist, nur eine einzige Tabelle daraus zu machen.
Um die Daten voneinander unterscheiden zu können muss ein weiteres Feld eingeführt werden.
Die kann z.B. ein Datum, die Nummer der Meßreihe oder eine Kundennummer sein.
Es muss die Eigenschaft sein, die den Unterschied zwischen deinen 1300 Tabellen ausmacht.
Dieses weitere Feld ist dann entweder selbst der Primärschlüssel oder wird zumindest Bestandteil des Primärschlüssels.
Du kannst ja mal deine Struktur dieser Tabelle(n) hier zeigen. (also die Liste der Feldnamen und Datentypen)

himitsu 1. Feb 2009 13:21

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
ich hätt gedacht es wäre mit gleichen Strukturn einfacher :gruebel:
und wenn er schon überall ein Feld z.B. mit Datem/Uhrzeit oder 'ner laufenden Nummer drin hat, dann bräcuhte er doch auch kein zusätzliches Feld, daß er die Unterscheidung schon eingebaut hat. :?:

ryLIX 1. Feb 2009 14:10

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Hmm ok dann 2 Schritt zurück und das Datanbank Design noch mal überdenken :roll:

Die Datenbank enthält Informationen über Steuergeräte sortiert auf durch die Tabellennamen (Baureihe und Steuergerät und Versionsindex)
Beispiel: Baureihe R50 Steuergerät LWR Versionsindex C03 dann hätte die Tabelle den Namen R50LWR_C03
Die Struktur der Tabellen sieht so aus:
ID: Integer Autoincrement
FSW: VARCHAR
PSW: VARCHAR
COMMENT: VARCHAR (werde ich wohl nach Blob ändern)

Da ID Feld ist nicht unbedingt nötig. Hatte es nur mit eingebaut weil ich dacht es könnte ma von nutzen sein :stupid:

@sx2008:
Also wenn ich das nun richtig verstanden habe sollte die neue Struktur dann so aussehen:
SERIES: VARCHAR (enthält die Baureihenbezeichnung)
SG: VARCHAR (enthält Steuergerätebezeichnung und Versionsindex)
FSW: VARCHAR (FSW = Funktionsschlüsselwort)
PSW: VARCHAR (PSW = Parameterschlüsselwörter)
COMMENT: VARCHAR (oder BLOB)


Kurz noch was zu den Verbindungen der Spalten:
Zu jedem Funktionsschlüsselwort gibt es ein oder mehrere Parameterschlüsselwort/wörter und halt das Kommentar welches durch den Benutzer eigegeben wird.


Das Programm auf diese Tabellenstruktur umstellen sollte nicht das Problem sein.
Nur das erstellen dauert 4h (Rohdaten im XML Format) :pale:

omata 1. Feb 2009 14:13

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Zitat:

Zitat von ryLIX
Nur das erstellen dauert 4h (Rohdaten im XML Format)

Du kannst die Daten auch innerhalb der Datenbank von einer Tabelle/Tabellen umkopieren in eine Tabelle.

Stichwort: INSERT INTO + SELECT

ryLIX 1. Feb 2009 14:18

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
ABer wie bekomme ich dann die Bezeichner in die beiden zusätzlichen Felder der neuen Tabelle?

omata 1. Feb 2009 14:20

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Ich verstehe dein Problem nicht?

SQL-Code:
INSERT INTO neueTabelle
SELECT 1 AS neueID, *
FROM alteTabelle1
:
:
INSERT INTO neueTabelle
SELECT 2 AS neueID, *
FROM alteTabelle2

ryLIX 1. Feb 2009 14:28

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Bezieht sich das SELCET Stmt nicht immer auf Columns?

ryLIX 2. Feb 2009 16:52

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
*push*
:duck:

mjustin 2. Feb 2009 17:40

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Zitat:

Zitat von ryLIX
Bezieht sich das SELCET Stmt nicht immer auf Columns?

Man kann in der SELECT Klausel auch dann konstante Ausdrücke angeben, wenn man mit der Ergebnisdatenmenge ein INSERT durchführt.

SQL-Code:
INSERT INTO NeueTabelle (NeuesFeld, sonstige Felder ...)
SELECT KonstanterAusdruck, sonstige Felder ...
FROM AlteTabelle
Damit können in diesem Fall die Tabellen-IDs bequem per SQL zusammen mit den sonstigen Daten aus den bisherigen Tabellen in die neue "Supertabelle" übernommen werden.

ryLIX 2. Feb 2009 18:21

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Ah ok danke für die erklärung.
War mir bisher nicht bekannt :)

Bleibt immer noch die eigentlich Threadfrage.
Da bin ich noch nciht weiter.

ryLIX 3. Feb 2009 18:24

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
So ich ein bisschen gewerkelt und überlegt...
Die Datenbank habe ich nun Umgebaut wie es empfohlen wurde.
Sie hat nun folgende Struktur:
SERIES: VARCHAR
SG: VARCHAR
FSW: VARCHAR
PSW: VARCHAR
COMMENT: NVARCHAR (Hab entdeckt das der Umlaute erlaubt :) )

Nun bin ich wieder bei der Visualisierung.
Ich hatte überlegt hier ein record einzusetzten aber wieder verworfen weil es ja quatsch wäre und nur auf die Performance drücken würde.

Mein derzeitiger Plan ist so:
Ich hole mir aus der Tabelle alle Einträge von Series und SG wo Comment nicht NULL ist und baue daraus ein TreeView auf.
Hier wäre schon eine Frage:
Lieber alle auf einmal verarbeiten. In einem record array zwischen speichern und dann über eine funktion ins TreeView.
Oder gleich in der while Schleife die Funktion für das TreeView aufrufen?

Die anderen Daten würde ich dann wie im Hauptfenster über das selektierte TreeViewNode holen.
Dann brächte ich nur noch einen "merker" damit ich weiß welche Datansätze in die DB geladen werden sollen bzw in die andere geschickt werden sollen.

Hat jemand eine Idee dazu?

shmia 4. Feb 2009 18:32

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Du kannst auch mehrere Datensätze im DBGrid markieren.
Delphi-Quellcode:
DBGrid1.Options := DBGrid1.Options + [dgMultiSelect]
Damit könnte der Benutzer auswählen, welche Datensätze er exportieren will.
Die markierten Datensätzen werden dann "abgegrasst" und als CSV-Datei oder XML auf Platte geschrieben.

Zusätzlicher Komfort wäre das Markieren per Wildcards.
Der Benutzer wählt im Menue "per Wildcard markieren..." und wird nach dem Muster gefragt.
Wenn er z.B. *X2008 eingibt, dann werden alle Serien, die auf "X2008" enden markiert.

ryLIX 4. Feb 2009 18:44

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Ich hab nun angefangen mit einer Hilfstabelle ein DB TreeView zu füllen und von da aus eine ListView mit Checkboxes.
Sieht alles schon relativ nett aus aber irgendwie macht mir DISQLite3 Probleme.

SQL-Code:
SELECT SERIES, ECU, COMMENT FROM DATA WHERE COMMENT !=""
Ist das Stmt was ich verwende um den Tree aufzubauen.
Seltsam ist das wenn ich im SQLiteAdministrator (der arbeitet mit ZEOS Kompos) das Stmt ausführe werden die richtigen zurück geliefert (das COMMENT holen soll dient nur der Kontrolle) aber wenn ich DISQLite3 das Stmt ausführen lass kommen auch einige Einträge die nicht da sein sollten.

:?

Ich habe schon versucht den FeldTypen fest zu legen auf WideString aber trotzdem kommen immer noch leere Felder mit.
Es sind auch immer die gleichen.
Auch das Manuelle Editieren der Felder, um diese zu leeren, bring nix.

Edit:
Hab nun och mal den Debug laufen lassen.
Es scheint als würde es nicht an DISQLite liegen sondern daran wie ich die Tabelle aufbaue.

Hier mal der Code:
Delphi-Quellcode:
    with Main.dbqry do
    begin
      SelectSQL := 'SELECT SERIES, ECU, COMMENT FROM DATA WHERE COMMENT !="" OR COMMENT !=NULL';
      Open;
      while not Eof do
      begin
        Main.Databaseconn.Execute16('REPLACE INTO HELP (MASTER_ID, PARENT_ID, Name, Image) SELECT MASTER_ID, PARENT_ID, Name, Image FROM TreeView WHERE Name ="' + FieldByName('SERIES').AsString + '"');
        Main.Databaseconn.Execute16('REPLACE INTO HELP (MASTER_ID, PARENT_ID, Name, Image) SELECT MASTER_ID, PARENT_ID, Name, Image FROM TreeView WHERE Name ="' + FieldByName('ECU').AsString + '"');
        Next;
      end;
      Close;
    end;
Die Connection von dbqry ist Databaseconn.
Könnte es daran liegen?

nahpets 5. Feb 2009 13:19

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Hallo,

probiere mal bitte:
SQL-Code:
SelectSQL := 'SELECT SERIES, ECU, COMMENT FROM DATA WHERE COMMENT != "" AND COMMENT IS NOT NULL';
Noch ein "blöder" Vorschlag:
SQL-Code:
SELECT SERIES, ECU, COMMENT FROM DATA WHERE COMMENT is not null and COMMENT > " "

ryLIX 5. Feb 2009 13:42

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Ich hab das Problem mittlerweile Isoliert in dem ich das ganze auf zwei qrys verkürzt habe.

SQL-Code:
REPLACE INTO HELP (MASTER_ID, PARENT_ID, Name, Image) SELECT T.MASTER_ID, T.PARENT_ID, T.Name, T.Image FROM TreeView AS T WHERE T.Name IN (SELECT SERIES FROM DATA WHERE COMMENT !="")'
Funktioniert wunderbar aber

SQL-Code:
REPLACE INTO HELP (MASTER_ID, PARENT_ID, Name, Image) SELECT T.MASTER_ID, T.PARENT_ID, T.Name, T.Image FROM TreeView AS T WHERE T.Name IN (SELECT ECU FROM DATA WHERE COMMENT !="")'
Macht mir Probleme.
Durch den IN Operator werden alle Einträge von ECU zurück geliefert die passen aber auch welche wo doppelt vorkommen.

Sprich wenn ich bei Serie A das Steuergerät Z habe und dort ein Kommentar drin ist wird mir das geliefert.
Ist aber Steuergerät Z auch in Serie C verbaut wird mir das auch aus der TreeView Tabelle geladen obwohl dort der Kommentar bei Data leer ist.

Ich habs mit LIKE versucht aber dann wird mir nur der erste Treffer zurück geliefert.
Im Moment suche ich nach einer Möglichkeit die doppelten Felder zu entfernen wenn kein Kommentar vorhanden ist.

nahpets 5. Feb 2009 15:15

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Hallo,

meinst Du das?
SQL-Code:
REPLACE INTO HELP (MASTER_ID, PARENT_ID, Name, Image) SELECT T.MASTER_ID, T.PARENT_ID, T.Name, T.Image FROM TreeView AS T WHERE T.Name IN (SELECT DISTINCT ECU FROM DATA WHERE COMMENT !="")'

ryLIX 5. Feb 2009 15:25

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Nein mit DISTINCT hab ich es auch schon Probiert.
Es kann ja vorkommen das dieses Steuergerät tatsächlich 2x vorkommt und auch 2x Kommentiert wurde.

Edit.
Jetzt hatte ich die zündende Idee :)

So gehts:
Delphi-Quellcode:
with Main.dbqry do
    begin
      SelectSQL := 'SELECT SERIES, ECU, COMMENT FROM DATA WHERE COMMENT !="" OR COMMENT !=NULL';
      Open;
      while not Eof do
      begin
        Main.Databaseconn.Execute16('REPLACE INTO HELP (MASTER_ID, PARENT_ID, Name, Image) SELECT MASTER_ID, PARENT_ID, Name, Image FROM TreeView WHERE Name ="' + FieldByName('SERIES').AsString + '"');
        Main.Databaseconn.Execute16('REPLACE INTO HELP (MASTER_ID, PARENT_ID, Name, Image) SELECT MASTER_ID, PARENT_ID, Name, Image FROM TreeView WHERE Name ="' + FieldByName('ECU').AsString + '" AND PARENT_ID = (SELECT MASTER_ID FROM TreeView WHERE Name ="'+FieldByName('SERIES').AsString+'")');
        Next;
      end;
      Close;
    end;

ryLIX 5. Feb 2009 19:09

Re: Wie am besten Daten visualisieren und auswahl verarbeite
 
Ich hab die Probleme nun bis auf eins gelöst.

Wenn ich Daten Importiere dann möchte ich Wahlweise die Daten überschreiben oder zusammen führen, also das Importierte an das existierende anhängen.
Überschreiben ist kein Problem das mach UPDATE ja von allein.

Gibt es eine Möglichkeit hier mit CONCAT zu erbeiten ohne vorher die alten Daten zu holen?
Oder kann ich die Daten auch im UPDATE stmt noch dazu holen?

Edit:
Ja man kann in UPDATE noch ein SELECT nutzen und mit || zusammen führen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz