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 :oops:


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