Hallo, in eine Tabellenspalte PEOPLE.UUID sollen UUIDs mit Hilfe der Funktion UUID() geschrieben werden (gibt String zurück).
Komme mit den Anführungszeichen noch nicht klar und weiß nicht ob executeUpdate stimmt?
vDataSource = ThisDataBaseDocument.CurrentController
If NOT (vDataSource.isConnected()) THEN vDataSource.connect()
vStatement = vDataSource.ActiveConnection.createStatement()
s = "SELECT CASE WHEN "PEOPLE"."UUID" IS NULL THEN "PEOPLE"."UUID" = UUID(0,0) END FROM "PEOPLE""
vStatement.executeUpdate(s)
Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat
Moderator: Moderatoren
Re: Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat
Doppelte Anführungszeichen innerhalb von Texten müssen durch doppelte Anführungszeichen maskiert werden. Deswegen lauter Doppler.
Das ganze was Du da aufschreibst, ist eine Abfrage. Es beginnt mit SELECT. Deswegen passt auch nicht executeUpdate.
Die Funktion UUID gibt es bei den internen Datenbanken nicht. Da gibt es bloß bei Firebird die Möglichkeiten, Texte in UUID zu überführen. Hier musst Du schon klarer werden, mit was für einer Datenbank Du denn da arbeitest.
Das ganze was Du da aufschreibst, ist eine Abfrage. Es beginnt mit SELECT. Deswegen passt auch nicht executeUpdate.
Die Funktion UUID gibt es bei den internen Datenbanken nicht. Da gibt es bloß bei Firebird die Möglichkeiten, Texte in UUID zu überführen. Hier musst Du schon klarer werden, mit was für einer Datenbank Du denn da arbeitest.
Re: Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat
UUID() ist eine eigene Funktion die 36 characters zurückgibt.
Das mit den Anführungszeichen bekomme ich jetzt ohne Fehlermeldung hin, weiß aber nicht, wie man dann das Feld UUID aller Datensätze einer bestehenden Tabelle beschreibt?
"Update" habe ich gefunden, damit geht aber leider nicht das Beschreiben mit unterschiedlichen UUIDs.
Ich nehme die normale Libreoffice Datenbank
Das mit den Anführungszeichen bekomme ich jetzt ohne Fehlermeldung hin, weiß aber nicht, wie man dann das Feld UUID aller Datensätze einer bestehenden Tabelle beschreibt?
"Update" habe ich gefunden, damit geht aber leider nicht das Beschreiben mit unterschiedlichen UUIDs.
Ich nehme die normale Libreoffice Datenbank
Code: Alles auswählen
Sub UUID(lowercase As Boolean, braces As Boolean) As String
'Native VBA function to create a GUID / UUID type 4 that does not rely upon Scriptlet. TypeLib or any external library.
'Save UUID as binary(16 bytes) without "-" or as char(36) with 4 "-"
'To produce numbers between a range: Fix(Rnd * (topnumber - bottomnumber + 1) + bottomnumber)
'GUID(1, 0): 3c763963-7a55-41c5-a04e-401955387e5c, GUID(False, True): {4B98B15B-8B21-49A4-ACEB-58879135D227}
Dim k&, h$, s$
s = Space(36)
For k = 1 To 36
Randomize()
Select Case k
Case 9, 14, 19, 24: h = "-"
Case 15: h = "4"
Case 20: h = Hex(Fix(Rnd * 4 + 8)) 'must be 8,9,A or B
Case Else: h = Hex(Fix(Rnd * 16)) 'Int() or Fix() rounds down! Fix() and Rnd() return type double
End Select
Mid(s, k, 1, h)
Next
If lowercase Then s = LCase$(s)
If braces Then UUID = "{" & s & "}" Else UUID = s
End Sub
Re: Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat
Versuche einmal
Das macht ein Udpate und fragt nicht Inhalte ab wie SELECT. Außerdem wird die Varibale eingebaut. Nur: die UUID wird für alle Datensätze gleich, weil das ja keine Datenbankfunktion ist sondern eine String, den Du da weiter gibst - mit einem Wert für UUID. Deswegen müsstest Du vermutlich erst einmal eine Abfrage starten, die die Primärschlüssel von den Leuten ausliest, die keine UUID haben. Und dann müsstest Du ein Update auf jeden dieser Schlüsselwerte machen. Also vielleicht so:
Du hast hier 2 Statements. Zuerst die Abfrage nach den leeren Datensätzen, dann das Einfügen jedes neuen Datensatzes mit jeweils unterschiedlicher UUID, weil die Funktion von Dir diese ID wiedergibt.
Gruß
Robert
Code: Alles auswählen
s = "UPDATE ""PEOPLE"" SET ""UUID"" = '" + UUID(0,0) + "' WHERE ""UUID"" IS NULL"
vStatement.executeUpdate(s)
Code: Alles auswählen
vStatement1 = vDataSource.ActiveConnection.createStatement()
stSql = "SELECT ""ID"" FROM ""PEOPLE"" WHERE ""UUID"" IS NULL"
oResult = vStatement1.executeQuery(stSql)
WHILE oResult.next
loID = oResult.getLong(1)
s = "UPDATE ""PEOPLE"" SET ""UUID"" = '" + UUID(0,0) + "' WHERE ""ID""='"+loID+"'"
vStatement.executeUpdate(s)
WEND
Gruß
Robert
Re: Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat
Fehler in WHILE oResult.next: Type: com.sun.star.lang.DisposedException Message: .
Der Punkt gefällt ihm nicht
Vielleicht die UUIDs in die Abfrage schon reinschreiben und dann das Abfrageergebnis in die Tabelle kopieren?
Bin einfach zu schlecht in SQL...
Nochmal edit: es funktioniert halb, er schreibt trotz der Fehlermeldung eine UUID in den ersten Datensatz, d.h. er macht die Schleife nur einmal
Der Punkt gefällt ihm nicht

Vielleicht die UUIDs in die Abfrage schon reinschreiben und dann das Abfrageergebnis in die Tabelle kopieren?
Bin einfach zu schlecht in SQL...
Nochmal edit: es funktioniert halb, er schreibt trotz der Fehlermeldung eine UUID in den ersten Datensatz, d.h. er macht die Schleife nur einmal
Re: Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat
Jetzt hab ich's. Muss natürlich das zweite Statement auch noch connecten:
Vielen Dank, Problem gelöst!
Code: Alles auswählen
vStatement = vDataSource.ActiveConnection.createStatement()
vStatement1 = vDataSource.ActiveConnection.createStatement()
stSql = "SELECT ""P_NR"" FROM ""PEOPLE"" WHERE ""UUID"" IS NULL"
DIM oResult As Object, loID&
oResult = vStatement.executeQuery(stSql)
WHILE oResult.next
loID = oResult.getLong(1)
s = "UPDATE ""PEOPLE"" SET ""UUID"" = '" + UUID(0,0) + "' WHERE ""P_NR""='"+loID+"'"
vStatement1.executeUpdate(s)
WEND