🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

SQL Union in Macro möglich?

Alles zur Programmierung im LibreOffice.
Antworten
Decurtins
Beiträge: 20
Registriert: So 20. Mai 2012, 16:55

SQL Union in Macro möglich?

Beitrag von Decurtins » Di 25. Feb 2014, 20:23

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

pmoegenb

Re: SQL Union in Macro möglich?

Beitrag von pmoegenb » Mi 26. Feb 2014, 09:42

Lade Dir das Handbuch für Base herunter, dort findest Beispiele.

Decurtins
Beiträge: 20
Registriert: So 20. Mai 2012, 16:55

Re: SQL Union in Macro möglich?

Beitrag von Decurtins » Mi 26. Feb 2014, 13:52

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.

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: SQL Union in Macro möglich?

Beitrag von F3K Total » Mi 26. Feb 2014, 21:01

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
Windows 11: AOO, LO Linux Mint: AOO, LO

Decurtins
Beiträge: 20
Registriert: So 20. Mai 2012, 16:55

Re: SQL Union in Macro möglich?

Beitrag von Decurtins » Mi 26. Feb 2014, 21:10

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
Zuletzt geändert von Decurtins am Mi 26. Feb 2014, 21:37, insgesamt 1-mal geändert.

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: SQL Union in Macro möglich?

Beitrag von F3K Total » Mi 26. Feb 2014, 21:34

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
Windows 11: AOO, LO Linux Mint: AOO, LO


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten