Seite 1 von 1
SQL Union in Macro möglich?
Verfasst: Di 25. Feb 2014, 20:23
von Decurtins
Hallo zusammen
Habe ein vielleicht altbekanntes Problem mit dem SQl Union Befehl.
In einem Basic Sub scheint das irgendwie nicht zu funktionieren.
Kann mir jemand Helfen?
Ich möchte untenstehendes SUB (ImportRowSet) verwenden.
src ist dabei in etwa folgendes:
Code: Alles auswählen
"SELECT ""Product 1"", ""Product 1 Exemplars"", ""Product 1 Pritsch"", ""Quint"", ""Pajà"" FROM ""Empustaziuns_Debiturs_R-tunes"" WHERE ""Product 1"" LIKE '" + sArtist + "%' UNION SELECT ""Product 2"", ""Product 2 Exemplars"", etc
Code: Alles auswählen
Sub importRowSet( oDBRange, dbSourceName$, srcType%, src$ )
Dim oDesc(),i%,oPrp
'on error goto exitErr:
oDesc() = oDBRange.getImportDescriptor() 'array of com.sun.star.beans.PropertyValues
For i = 0 to ubound(oDesc())
oPrp = oDesc(i)
If oPrp.Name = "DatabaseName" then
oPrp.Value = dbSourceName
elseIf oPrp.Name = "SourceType" then
oPrp.Value = srcType
elseIf oPrp.Name = "SourceObject" then
oPrp.Value = src
Endif
oDesc(i) = oPrp
Next
oDBRange.getReferredCells.doImport(oDesc())
exit sub
exitErr:
'raise API-error
error err
End Sub
Re: SQL Union in Macro möglich?
Verfasst: Mi 26. Feb 2014, 09:42
von pmoegenb
Lade Dir das
Handbuch für Base herunter, dort findest Beispiele.
Re: SQL Union in Macro möglich?
Verfasst: Mi 26. Feb 2014, 13:52
von Decurtins
Danke für die rasche Antwort.
Sie bringt mich jedoch nicht weiter.
Das Problem ist "UNION" das via das obengenannte Sub ausgelöst wird. Libreoffice meldet: Kein Select-Befehl.
Eine einfache "Select-Anfrage" abzuschicken ist kein Problem.
meine Frage: Wie wäre ein "SELECT … UNION SELECT" möglich?
herzlichen Dank.
Re: SQL Union in Macro möglich?
Verfasst: Mi 26. Feb 2014, 21:01
von F3K Total
Hi,
habe es versucht und folgende Info:
Es gibt eine weitere Eigenschaft des Importdescriptors:
oPrp.Name = "IsNative"
diese Eigenschaft steht standardmäßig auf FALSE
In der API steht dazu
IsNative
Description
specifies whether the SQL statement is given directly to the database or is parsed before.
mein Versuch mit
oPrp.Value = TRUE scheiterte, obwohl zu erwarten war, dass es funktionieren würde, denn genau dass Einschalten des direkten SQL-Modes, was auch in Ansichten und Abfragen Voraussetzung für ein
UNION SELECT ist, entspricht
is given directly to the database
Scheint wirklich ein BUG zu sein.
Was geht, ist das Anlegen einer View, dann der Import, dann das Löschen der View, wenn erforderlich.
Beispiel:
Code: Alles auswählen
SUB Import
odbRange = thiscomponent.databaseranges.getByName("myImport")
dbSourceName = "Adressen"
srcType = com.sun.star.sheet.DataImportMode.TABLE
src = "UNIONSELECT"
oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
oDatasource = oDatabaseContext.getByName(dbSourceName)
oConnection = oDatasource.GetConnection("","")
SQL_Statement = oConnection.createStatement()
sSQL = "DROP VIEW UNIONSELECT IF EXISTS"
SQL_Statement.executeupdate(sSQL)
sSQL = "CREATE VIEW ""UNIONSELECT"" (""ID"",""Nachname"",""Vorname"") AS SELECT ""ID"", ""Nachname"", ""Vorname"" FROM ""Adressen"" Where ""Nachname"" like 'Hu%' UNION SELECT ""ID"", ""Nachname"", ""Vorname"" FROM ""Adressen"" Where ""Nachname"" like 'A%'"
SQL_Statement.executeupdate(sSQL)
importRowSet( oDBRange, dbSourceName, srcType, src )
sSQL = "DROP VIEW UNIONSELECT IF EXISTS"
SQL_Statement.executeupdate(sSQL)
end sub
Sub importRowSet( oDBRange, dbSourceName$, srcType%, src$ )
Dim oDesc(),i%,oPrp
'on error goto exitErr:
oDesc() = oDBRange.getImportDescriptor() 'array of com.sun.star.beans.PropertyValues
For i = 0 to ubound(oDesc())
oPrp = oDesc(i)
If oPrp.Name = "DatabaseName" then
oPrp.Value = dbSourceName
elseIf oPrp.Name = "SourceType" then
oPrp.Value = srcType
elseIF oPrp.Name = "IsNative" then
oPrp.Value = TRUE
elseIf oPrp.Name = "SourceObject" then
oPrp.Value = src
Endif
oDesc(i) = oPrp
Next
oDBRange.getReferredCells.doImport(oDesc())
exit sub
exitErr:
'raise API-error
error err
End Sub
HTH Gruß R
Re: SQL Union in Macro möglich?
Verfasst: Mi 26. Feb 2014, 21:10
von Decurtins
Aber Hallo F3k Total!
Ganz herzlichen Dank.
Hatte die IsNative-Eigenschaft von .Name in der API nicht gesehen
werde die Variante mit der View versuchen!
cars salids
Michel
Re: SQL Union in Macro möglich?
Verfasst: Mi 26. Feb 2014, 21:34
von F3K Total
Hi,
habe gerade noch eine einfachere Möglichkeit gefunden:
Wenn Du, auch manuell, erstmal eine View "UNIONSELECT" angelegt hast, kannst du den SQL Befehl der View auch manipulieren:
Code: Alles auswählen
src = "UNIONSELECT"
oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
oDatasource = oDatabaseContext.getByName(dbSourceName)
oConnection = oDatasource.GetConnection("","")
oView = oConnection.Views.GetByName(src)
oView.alterCommand("SELECT ""ID"", ""Nachname"", ""Vorname"" FROM ""Adressen"" Where ""Nachname"" like 'Hu%' UNION SELECT ""ID"", ""Nachname"", ""Vorname"" FROM ""Adressen"" Where ""Nachname"" like 'B%'")
Dann brauchst Du sie nicht immer löschen und neu anlegen.
Dies hat bei meinen Versuchen nämlich zu folgendem Problem geführt:
Dem Datenbankbereich des CALC-Dokumentes wird beim ersten Import die VIEW zugeordnet.
Speichert man die Calc Datei und versucht den Import erneut, gibt es eine Fehlermeldung, UNIONSELECT würde fehlen.
Gruß R