Seite 1 von 2

UUId als Key in Dbase-Tabellen unter Clipper [Erledigt]

Verfasst: Fr, 26. Feb 2021 7:46
von Klaus Schuster
Hi Folks,

hat jemand Erfahrung mit dem Einsatz von UUIds unter Clipper im Verbund mit XBase? Seek-Tests unter Clipper mit mehreren Millionen Datensätzen deren Key mit UUIdCreate() erstelllt wurde, sind problemlos gelaufen. Ist deren Einsatz somit problemlos möglich?

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 7:51
von Tom
Eine UUID ist nichts weiter als irgendein String. Welche Probleme sollte das ergeben? Da die UUID immer gleich lang ist, haben EXACT und SOFTSEEK und andere auch keinen negativen Einfluss.

Code: Alles auswählen

? UuidToChar(UuidCreate()) // z.B.  5b741013-cb04-4137-927c-a29d2ee7b29c 

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 8:14
von Klaus Schuster
Hallo Tom,

kann bei bei seiner Berechnung kein Char(0) oder sonst ein kritisches Zeichen gebildet werden?

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 8:57
von Martin Altmann
Klaus,
nein - das kommt im Hexadezimalen als Zeichen nicht vor. Nur die 16 Zeichen 0-9 und a-f

Viele Grüße,
Martin

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:00
von Jan
... und der "-" als Trenner zur Gliederung der Blöcke.

Jan

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:01
von Klaus Schuster
das ist so wenn ich die UUID mit UuidToChar() umwandle. Als Key verwende ich aber den 16stelligen Wert von UuidCreate() direkt, und der sieht zimmlich wild aus.

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:06
von Martin Altmann
Jan,
das ist sicherlich nur Repräsentation (wie bei picture).
Klaus,
ich gehe mal davon aus, dass das bei Deiner Anzeige dann immer als ASCII-Code interpretiert wird:
5b741013-cb04-4137-927c-a29d2ee7b29c
chr( 91 ) + chr( 116 ) + chr( 16 ) + chr( 19 ) + ...
Da kann dann schon mal was komisches angezeigt werden. Darum solltest Du die auch immer als Hexcode ablegen. Das ist in jeder Welt identisch (ASCII, ANSI, EBCDIC,...)

Viele Grüße,
Martin

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:19
von Klaus Schuster
Danke schon mal.

@Martin: Alaska schreibt in der Hilfe, dass die UUId direkt als Key verwandt werden kann. Da stehts nicht von Konvertierung. Wenn ich mir die Tabelle mit dem DBF Viewer 2000 ansehen, sehe ich folgendes Bild
Nicht vertrauenserweckend.

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:21
von Tom
Weil UUIDCreate() verdammte Binärdaten liefert. Schau doch einfach mal in die Hilfe, Klaus. Da bekommst Du diverse Probleme. Deshalb gibt es ja UUIDToChar().

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:23
von Klaus Schuster
Was findest Du in Hilfe, was ich nicht finde?

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:27
von Tom
The function UUIDCreate() returns a binary character string.

Einfach UUIDToChar() drauf und fertig. Dafür ist die Funktion da. Binärdaten in DBFs sind keine gute Idee.

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:28
von Klaus Schuster
Danke Tom. Es steht aber auch

With the function UuidCreate() an Universally Unique IDentifier can be created. This identifier can be used as primary key in a database

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:33
von Tom
Aber nicht in "any database". Dafür gibt's UUIDToChar, damit das z.B. auch in DBFs funktioniert. Und damit man die UUIDs auch irgendwie lesen kann und so. Davon abgesehen stimmt die Aussage ja auch, nur eben nicht direkt und nicht in allen Fällen. Die DBFDBE nimmt Konvertierungen vor, und DBFs sind für Binärdaten einfach nicht geeignet. Blobs in Fox können das, und entsprechende SQL-Datentypen sowieso. Aber DBF nicht.

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:33
von nightcrawler
hallo Klaus,
bitte aber nur direkt als Primary Key verwenden, wenn das zugrundeliegende Datenbanksystem dies als nativen Datentyp anbietet (wie zB ADS). Ansonsten _immer_ nach Char wandeln. Wie willst Du denn einen Seek auf Binärdaten sauber durchführen?

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 9:38
von Klaus Schuster
ich bin ganz bei euch; darum ja auch die Anfrage hier im Forum. Was mich überraschte war, das der oben erwähnte Test mit mehreren Millionen Datensätzen keine Probleme erbrachte. Da es mich interessiert, werden ich die Frage einmal an den Support richten. Vielleicht haben die eine Antwort.

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 11:28
von Tom
Ich denke, solange man den Kontext nicht verlässt, könnte das sogar mit den Binärdaten funktionieren. Also wenn es nur innerhalb einer Anwendung geschieht (die gute alte "Crypt()"-Funktion hat ja ähnliche Ergebnisse geliefert). Aber ich würde zwecks Les- und Nachvollziehbarkeit immer die ToChar-Variante verwenden (Was heißt "würde" - das mache ich ja so). Und es könnte sein, dass das beim Umkopieren von Tabellen problematisch wird.

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 12:02
von Klaus Schuster
Ah, ja, guter Einwand. Meine Hoffnung ist, mit der binären Version Zeit beim Suchen im Index zu sparen. Aber vielleicht spielt es dabei keine nennenswerte Rolle welcher Typ (binär oder character) eingetragen ist. Mal sehen, was der Support dazu schreibt.

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 13:30
von Tom
Da es keine binären Felder gibt, findet doch ohnehin eine stringbasierte Suche statt, Klaus. Wo Du aufs Jahr ein paar Nanosekunden einsparen kannst, das ist beim Weglassen von UUIDToChar() beim einmaligen Erzeugen und Speichern der UUID. Ansonsten erzeugst Du dadurch, dass Du Binärstrings speicherst und weit aus dem ASCII-7-Zeichensatz raus bist, eigentlich jetzt noch Konvertierungsoverhead.

Re: UUId als Key in Dbase-Tabellen unter Clipper

Verfasst: Fr, 26. Feb 2021 16:01
von Klaus Schuster
Ja, Tom, das befürchte ich auch. Zwischenzeitlich liegt die Antwort des Supports vor. Die Kernaussage:

Bezüglich der Verwendung von UUIDs als Schlüsselwerte in DBF-Tabellen gibt es technisch gesehen keine Einwände

bestätigt meinen Test.

Der Support fügt als weiteres Kritierium, besser die Zeichenkette zu speichern, dessen Lesbarkeit für uns Menschen an. Ich werde also eueren Rat befolgen...

Danke nochmals an alle!

Re: UUId als Key in Dbase-Tabellen unter Clipper [Erledigt]

Verfasst: Sa, 27. Aug 2022 16:21
von Manfred
hm,
wie immer. Ich habe mal wieder die A-Karte gezogen. Ich bin gerade dabei eine Tabelle mit vielen Sätze auf einmal zu befüllen und dabei nutze ich die Funktion UuidToChar(Uuidcreate()).
Und was soll ich euch sagen, nach 15 Durchläufen ca. wird eine ID erzeugt, die kurz vorher schonmal erzeugt wurde. Ich denke das kann nicht sein?

Re: UUId als Key in Dbase-Tabellen unter Clipper [Erledigt]

Verfasst: So, 28. Aug 2022 8:48
von Klaus Schuster
Bei 100.000ten erzeugter Key, war bisher kein doppelter Schlüssel dabei...

Re: UUId als Key in Dbase-Tabellen unter Clipper [Erledigt]

Verfasst: So, 28. Aug 2022 9:18
von Manfred
ok, ich weiß ja nicht genau, wie der erzeugt wird. Wie machst Du das denn? So nach und nach, oder in einer Schleife?
Ich kann ja auch nur sagen, was mir aufgefallen ist.

Re: UUId als Key in Dbase-Tabellen unter Clipper [Erledigt]

Verfasst: So, 28. Aug 2022 9:32
von Tom
Es ist technisch unmöglich, dass auf einem Rechner derselbe Key mehrfach erzeugt wird. Und die Wahrscheinlichkeit dafür, dass es auf zwei unterschiedlichen System passiert, ist astronomisch klein. Der Fehler muss woanders liegen.

Re: UUId als Key in Dbase-Tabellen unter Clipper [Erledigt]

Verfasst: So, 28. Aug 2022 9:45
von Manfred
das durchläuft eine Schleife

Code: Alles auswählen

TEXT INTO cSqlStmt WRAP CHR(13) TRIMMED
                  INSERT INTO {#tabelle#} (id, {#cFelder#}) VALUES ('{#cid#}' , {#cValues#})
          ENDTEXT
          cSqlStmt := StrTran(cSqlStmt,"{#tabelle#}",cTabellenName)
          cSqlStmt := StrTran(cSqlStmt,"{#cFelder#}",cFelder)
          cSqlStmt := StrTran(cSqlStmt,"{#cValues#}",cValue)
          cSqlStmt := StrTran(cSqlStmt,"{#cid#}",erzeugeuuid())
          ********************************
          FUNCTION erzeugeUuid()
                          LOCAL xuuid := Uuidcreate()                                            // erstmal eine kryptische id erzeugen
                          LOCAL cUuid := UuidToChar(xuuid)                                       // jetzt wird es eine lesbare ID

	             RETURN cUuid
               

Re: UUId als Key in Dbase-Tabellen unter Clipper [Erledigt]

Verfasst: So, 28. Aug 2022 9:58
von Klaus Schuster
Der Fehler muss im SQL-Statement liegen. Da muss ich passen.