ods Datei mit Inhalt aus einer SQL Abfrage füllen?

Hallo zusammen,

kurz zum Hintergrund. Es existiert ein Dialog, der verschiedene Dropdown und Textfelder enthält, welche meist durch SQL Abfragen auf eine Postgre SQL DB gefüllt werden. Nun möchte ich diese abgefragten Daten in eine ods Datei speichern.

Beispiel: Dropdown 1 enthält alle Länder Ich möchte nun für jedes Land ein neues Tabellenblatt in der ods Datei erzeugen und dies entsprechend benennen

Dropdown 2 enthält alle Städte, die zum jeweiligen Land gehören Ich möchte nun dass alle Städte des jeweiligen Landes in das entsprechende Tabellenblatt untereinander in einer bestimmten Spalte geschrieben werden

Aktueller Stand: DIe Länder werden in ein Tabellenblatt geschrieben und auch für jedes Land schaffe ich es ein separates Tabellenblatt anzulegen.

REM Bibliothek laden
   globalScope.BasicLibraries.loadLibrary("Tools")
   
   REM Dateipfad
   STEUrl = DirectoryNameoutofPath(convertfromurl(thisComponent.url), getPathSeparator())

      REM Abfrage
      Testabfrage = SQL_Anweisung.executeQuery("SELECT ""test1"",""test2"",""test3"",""test4"",""test5"" FROM ""laender"" ORDER BY ""test1""")
 
     aColumns = Testabfrage.Columns.ElementNames
       AuswDoc = StarDesktop.loadComponentFromURL("file:///" & STEUrl & "\" & "Vorlagen\Auswertung.ods", "_blank", 0, Args()
    
    oSheet = AuswDoc.Sheets(0)
      nColumnCount = UBound(aColumns)
    Dim aLine(nColumnCount)
      Dim aData(0)
      aData(0) = aColumns
      nUpperBoundary = 0
      Do While Testabfrage.Next
         nUpperBoundary = UBound(aData)+1
         ReDim Preserve aData(nUpperBoundary)
         ReDim aLine(nColumnCount)
         For i = 0 To nColumnCount
         aLine(i) = Testabfrage.getString(i+1)
         Next i
         aData(nUpperBoundary) = aLine
         AuswDoc.sheets.insertNewByName(Testabfrage.getString(2), 1)
      Loop
      oRange = oSheet.getCellRangeByPosition(0,0,nColumnCount,nUpperBoundary)
      oRange.setDataArray(aData)
   
   Call Sortieren_steigend

Wie kann ich nun aber diese separaten Tabellenblätter mit Inhalt aus einer SQL Abfrage füllen?

Viele Grüße

Kenji

Na ja… im Grunde genommen genauso.
Die SQL Abfrage liefert ja einen Result-Set- also ein Array von Arrays (Datenzeilen).
Genau das brauchst Du auch für die Calc-Tabelle.
Soweit zur Theorie. In der Praxis ist es oft einfacher (wenn auch deutlich langsamer) über Schleifen wie in deinem Code die Inhalte zu schreiben. Das ist immer dann notwenig (und sinnvoll) wenn du noch Korrekturen der Inhalte vornehmen willst (z.B. Dezimalpunkte durch Kommas ersetzen oder bei Datumsangaben etc).
Am Besten schreibst Du dir ne eigene Toolbox für Standard-SQL Abfragen - und die liefert Dir danndas gewünschte Ergebnis.
Als Beispiel:

    '/** Basisabfrage
'*************************************************************************.
'* @kurztext SQL Abfrage auf die Datenbank
'* Die Funktion erzeugt eine SQL Abfrage auf die Datenbank
'*
'* @param1  sSQL as string   SQL String
'*
'* @return  aDaten as array  Array von Arrays der Liste
'*************************************************************************
'*/
function Basisabfrage(sSQL as string)
  dim oErgSet as variant
  dim oDBVerb as variant, oSM as variant
  dim aDaten()
  dim aZeile()
  dim n%, n2%, j%, i%
  
  REM Datenbank-Verbindung erzeugen
  oDBVerb = db_tools.TVP_getConnection
  'Datenbankverbindung holen
  oSM = oDBVerb.createStatement()  'Statementobjekt erzeugen
'msgbox ssql

  oErgSet = oSM.executeQuery(sSQL)
' xray oErgSet 

'  oErgSet.next    ' ODBC spezifisch - #####

  if oErgSet.isBeforeFirst then  ' Daten vorhanden  - Base etc!    
  'if NOT oErgSet.isAfterLast then    'ODBC spezifisch - #####
  'if NOT oErgSet.wasNull then
    n = oErgSet.Metadata.columncount
    n2 = nDatAnz
    redim aDaten(n2)
    j = 0
    REM jetzt für jede Zeile:
    Do while oErgSet.next  ' ODBC spezifisch - #####
      redim aZeile(n-1)
      for i = 1 to n
        aZeile(i-1) = oErgSet.getString(i)
      next
      aDaten(j) = aZeile
      j = j+1
      if j > n2 then 
        n2 = n2 + nDatAdd
        redim preserve aDaten(n2)
      end if
    loop
    REM Liste korrigieren
    if j > 0 then 
      redim preserve aDaten(j-1)
    else
      redim aDaten()   'kein Datensatz vorhanden!
    end if     
  end if 
  
  oDBVerb.close() 'DB Verbindung schließen
  REM Daten übernehmen  
  Basisabfrage = aDaten
end function

Hallo zusammen,

vielen Dank für die Rückmeldung, allerdings komme ich damit nicht sonderlich gut zurecht. Ich stehe weiterhin total auf dem Schlauch und habe keinerlei Idee mehr wie es weitergehen könnte.

Kannst du oder jemand anderes mir evtl. einen Code zur Verfügung stellen, der genau das macht was ich suche? Ich verzweifle wirklich so langsam…

Grüße

Kenji