Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Array/List-Datatype (https://www.delphipraxis.net/200540-array-list-datatype.html)

lxo 30. Apr 2019 10:55

Datenbank: Firebird • Version: 3 • Zugriff über: UniDAC

Array/List-Datatype
 
Hallo zusammen,

ich komme nicht darauf wie ich das realisieren soll bzw. macht es anders Sinn?

Folgendes Problem:
Ich habe eine Tabelle mit einem Feld in der ich eine Referenzkette schreibe.
z.B. "10.436.223.454.34" "10.1" "2" "4943.393.59"
Momentan würde ich diese Kette als String mit Punkt getrennt schreiben.
Angenehmer wäre jedoch meiner Meinung ein dynamisches array of Integer oder ähnliches.
Gibt es eine Möglichkeit so ein Array in ein Feld in der Datenbank zu sichern bzw. in ein Feld in einem Dataset?

hoika 30. Apr 2019 10:58

AW: Array/List-Datatype
 
Hallo,
FB kennt zwar arrays (https://firebirdsql.org/file/documen...bnrytypes.html), aber dafür sind die glaube ich nicht geeignet.

Warum willst du das ausdröseln?
Für eine bessere Suche?

mkinzler 30. Apr 2019 11:01

AW: Array/List-Datatype
 
Man könnte dies in einen BLOB Streamen. Firebird kennt zwar Arrays, die (clientseitige) Unterstützung dafür ist aber nicht so toll.

peterbelow 30. Apr 2019 11:02

AW: Array/List-Datatype
 
Zitat:

Zitat von lxo (Beitrag 1431345)
Hallo zusammen,

ich komme nicht darauf wie ich das realisieren soll bzw. macht es anders Sinn?

Folgendes Problem:
Ich habe eine Tabelle mit einem Feld in der ich eine Referenzkette schreibe.
z.B. "10.436.223.454.34" "10.1" "2" "4943.393.59"
Momentan würde ich diese Kette als String mit Punkt getrennt schreiben.
Angenehmer wäre jedoch meiner Meinung ein dynamisches array of Integer oder ähnliches.
Gibt es eine Möglichkeit so ein Array in ein Feld in der Datenbank zu sichern bzw. in ein Feld in einem Dataset?

Klar geht das, dazu gibt es BLOB-Felder. Du kannst halt nur nicht in einem solchen Feld direkt irgend was suche, aber eine array zu speichern und später wieder zu laden ist einfach. Schreib als erstes die Zahl der Elemente in den bolb-stream, dann den Inhalt des Arrays. Zum Laden lies ein Integer aus dem Blobstream (= Zahl der Elemente), dimensioniere den Zielarray per SetLength entsprechend und lies den Rest des stream in den Array ein.

lxo 30. Apr 2019 11:04

AW: Array/List-Datatype
 
Zitat:

Zitat von hoika (Beitrag 1431346)
Warum willst du das ausdröseln?
Für eine bessere Suche?

Genau um angenehmer an jedes Element des Eintrags zu gelangen.

lxo 30. Apr 2019 11:07

AW: Array/List-Datatype
 
Zitat:

Zitat von peterbelow (Beitrag 1431348)
Zitat:

Zitat von lxo (Beitrag 1431345)
Hallo zusammen,

ich komme nicht darauf wie ich das realisieren soll bzw. macht es anders Sinn?

Folgendes Problem:
Ich habe eine Tabelle mit einem Feld in der ich eine Referenzkette schreibe.
z.B. "10.436.223.454.34" "10.1" "2" "4943.393.59"
Momentan würde ich diese Kette als String mit Punkt getrennt schreiben.
Angenehmer wäre jedoch meiner Meinung ein dynamisches array of Integer oder ähnliches.
Gibt es eine Möglichkeit so ein Array in ein Feld in der Datenbank zu sichern bzw. in ein Feld in einem Dataset?

Klar geht das, dazu gibt es BLOB-Felder. Du kannst halt nur nicht in einem solchen Feld direkt irgend was suche, aber eine array zu speichern und später wieder zu laden ist einfach. Schreib als erstes die Zahl der Elemente in den bolb-stream, dann den Inhalt des Arrays. Zum Laden lies ein Integer aus dem Blobstream (= Zahl der Elemente), dimensioniere den Zielarray per SetLength entsprechend und lies den Rest des stream in den Array ein.

Hm.. siehst du da denn ein Vorteil zu der Methode die ich habe?
Vom Aufwand eigentlich das mindestens das selbe oder?

Union 30. Apr 2019 11:15

AW: Array/List-Datatype
 
Warum schreibst Du nicht jedes Element der Referenzkette in eine weitere Tabelle?

peterbelow 30. Apr 2019 11:18

AW: Array/List-Datatype
 
Zitat:

Zitat von lxo (Beitrag 1431353)

Hm.. siehst du da denn ein Vorteil zu der Methode die ich habe?
Vom Aufwand eigentlich das mindestens das selbe oder?

Naja, Du brauchst halt keine komplexen String zusammenzubauen und wieder auseinanderzunehmen. Ob Du mit einem array of integer in deinem Programm einfacher arbeiten kannst als mit deinem momentanen Konstrukt mußt Du selbst wissen.

DeddyH 30. Apr 2019 11:21

AW: Array/List-Datatype
 
Zitat:

Zitat von Union (Beitrag 1431354)
Warum schreibst Du nicht jedes Element der Referenzkette in eine weitere Tabelle?

Ich habe auch das Gefühl, dass es eigentlich um eine Master-Detail-Beziehung geht.

lxo 30. Apr 2019 11:43

AW: Array/List-Datatype
 
Zitat:

Zitat von Union (Beitrag 1431354)
Warum schreibst Du nicht jedes Element der Referenzkette in eine weitere Tabelle?

Aber nicht jedes Element gehört zwingend zur gleichen Vorfahr.
Es gibt auch solche Konstrukte "10.436.1" "10.235.1" "10.1" (theoretisch)
Da müsste ich ja jedes Element mehrfach eintragen und woher weiß ich welches jetzt der richtige Vorfahr ist?

lxo 30. Apr 2019 11:45

AW: Array/List-Datatype
 
Zitat:

Zitat von peterbelow (Beitrag 1431355)
Zitat:

Zitat von lxo (Beitrag 1431353)

Hm.. siehst du da denn ein Vorteil zu der Methode die ich habe?
Vom Aufwand eigentlich das mindestens das selbe oder?

Naja, Du brauchst halt keine komplexen String zusammenzubauen und wieder auseinanderzunehmen. Ob Du mit einem array of integer in deinem Programm einfacher arbeiten kannst als mit deinem momentanen Konstrukt mußt Du selbst wissen.

Ich könnte ja aus dem String ein Array erstellen.
Weil wie ich das sehe muss ich ja den Blob auch erstmal auseinander Pflücken. Also die Länge und Inhalt ermitteln.

Union 30. Apr 2019 11:46

AW: Array/List-Datatype
 
Zitat:

Zitat von lxo (Beitrag 1431357)
woher weiß ich welches jetzt der richtige Vorfahr ist?

Indem Du die ID des Vorfahrs einträgst.

hoika 30. Apr 2019 11:49

AW: Array/List-Datatype
 
Hallo,
genau, ID des Vorfahrs muss mit rein.
Ist die VorfahrID=0, ist es das "Root"-Element.

Aber muss Du denn per SQL gezielt darauf zugreifen?

lxo 30. Apr 2019 11:49

AW: Array/List-Datatype
 
Zitat:

Zitat von Union (Beitrag 1431359)
Zitat:

Zitat von lxo (Beitrag 1431357)
woher weiß ich welches jetzt der richtige Vorfahr ist?

Indem Du die ID des Vorfahrs einträgst.

Und wenn ich ein Element mehrfach drin habe ?

Union 30. Apr 2019 11:51

AW: Array/List-Datatype
 
Wenn Du ein Element mehrfach drin hast, kannst Du den Vorgänger bzw. den Nachfolger nicht direkt referenzieren. Dann musst Du eine Kreuztabelle zwischenschalten.

lxo 30. Apr 2019 11:57

AW: Array/List-Datatype
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ein Beispiel, vielleicht wird es dann klarer was ich genau vor habe.

lxo 30. Apr 2019 12:00

AW: Array/List-Datatype
 
Zitat:

Zitat von Union (Beitrag 1431363)
Wenn Du ein Element mehrfach drin hast, kannst Du den Vorgänger bzw. den Nachfolger nicht direkt referenzieren. Dann musst Du eine Kreuztabelle zwischenschalten.

Ich sehe da irgendwie aber nicht den Vorteil zu meiner Vorgehensweise.
Eher etwas umständlicher.

Union 30. Apr 2019 12:15

AW: Array/List-Datatype
 
Das ist relativ simpel. Du brauchst zwei Tabellen. Eine für die Bestandteile und eine für die Komponenten.

Die Bestandteile hätten dann die Form einer doppelt verketteten Liste (ID, Vorgänger-ID, Nachfolger-ID, Menge bzw. Prozentsatz) und können auch selbstreferenzierend sein. Du musst nur Rekursion verhindern und bei der Verwendung von Prozent darauf achten, dass die Summe immer = 100 ist.

Ich bilde z.b. Autobatterien genauso ab.

hoika 30. Apr 2019 12:30

AW: Array/List-Datatype
 
Hallo,
ich würde sogar soweit gehen,
dass zur Komponentenbildung ausschließlich Komponenten, keine Bestandteile benutzt werden können.
Eine Komponente enthält mindestens einen Bestandteil.

lxo 30. Apr 2019 13:18

AW: Array/List-Datatype
 
Ich versteh langsam glaub ich worauf ihr hinaus wollt.

Ich versuch das erstmal umzusetzen jetzt, dann geb ich nochmal Rückmeldung.

Vielen Dank erstmal.

lxo 2. Mai 2019 07:48

AW: Array/List-Datatype
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Union (Beitrag 1431366)
Das ist relativ simpel. Du brauchst zwei Tabellen. Eine für die Bestandteile und eine für die Komponenten.

Die Bestandteile hätten dann die Form einer doppelt verketteten Liste (ID, Vorgänger-ID, Nachfolger-ID, Menge bzw. Prozentsatz) und können auch selbstreferenzierend sein. Du musst nur Rekursion verhindern und bei der Verwendung von Prozent darauf achten, dass die Summe immer = 100 ist.

Ich bilde z.b. Autobatterien genauso ab.

Hab das jetzt mal in einer Tabelle versucht darzustellen.
Hab ich das richtig verstanden, siehe Anhang?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:19 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