Das ursprüngliche Thema Wie fülle ich eine Listbox in Abhängigkeit einer anderen (Dialog)? ist ist leider geschlossen, deshalb eröffne ich ein neues. Der Einstieg in die Thematik Writer mit Datenbankzugriff (Serienbrieffunktionalität reicht hier nicht) war so unwahrscheinlich mühselig, dass ich mein Arbeitsergebnis anderen Einsteigern in nachvollziehbarer Form zur Verfügung stellen möchte.
Zweck des Makros: Ermittlung der persönlichen Daten eines Schülers aus einer Schülerliste. Nach Auswahl in einer Klassenliste und danach einer angepassten Namensliste werden die Daten in einem Array mSelectedSchueler gespeichert.
Vorbereitungen:
Schülerliste nach Calc importieren, mindestens die Spalten KLASSE und NAME benennen,
Schülerliste.ods über Base “Verbindung zu einer bestehnenden Datenbank herstellen” als Datenbank zur Verfügung stellen
Datenquelle unter Extras - Optionen - Libreoffice Base - als “Schueler” zur Verfügung stellen,
Mit Writer das Zieldokument z.B. Schuelerbrief anlegen,
Ein neues Makromodul z.B. Modul1 unterhalb des Zieldokuments im Makroeditor anlegen und den Inhalt durch das unten
aufgeführte Makro ersetzen,
Einen Dialog1 mit ListBox1 und ListBox2 mittels Dialogeditor unter Extras - Makros - Dialoge verwalten unterhalb des Zieldokuments erzeugen,
Im Dialogeditor unter Listbox1.Ereignisse das Makro ListBox1_ItemStatusChanged “Status geändert” zuweisen,
Im Dialogeditor unter Listbox2.Ereignisse das Makro ListBox2_ItemStatusChanged “Status geändert” zuweisen,
Im Writer-Zieldokument Formularleisten einblenden,
Im Formularentwurfsmodus einen Button anlegen und danach mit dem Makro SchuelerDialogAusführen verknüpfen,
Im Makroeditor einen Haltepunkt mittels Doppelklick vor der Dummyzeile a=a setzen,
einen Beobachter für mSelectedSchueler im unteren Fenster des makroeditors anlegen,
Makro durch Klick auf den Button im Zieldokument starten,
Im Beobachter sollten jetzt die Zieldaten vorhanden sein.
Dim oSchuelerDialog As Object
Dim oSQLAnweisung As Object
Dim sSelectedKlasse As String
DIM mSelectedSchueler (1 To 23) As String
Sub SchuelerDialogAusfuehren
DialogLibraries.LoadLibrary("Standard")
oSchuelerDialog = createUnoDialog(DialogLibraries.Standard.Dialog1)
DatabaseContext=createUnoService("com.sun.star.sdb.DatabaseContext")
If DatabaseContext.hasByName("Schueler")=true Then
Datenquelle = DatabaseContext.getByName("Schueler")
Else
MsgBox("Falsche Datenbank angemeldet")
End If
Verbindung = Datenquelle.GetConnection("","")
oSQLAnweisung = Verbindung.createStatement()'1.7. SQL-Kommunikationskanal aufgebaut'
Sql = "SELECT DISTINCT""KLASSE"" From ""TESTEXPORT"""
AbfrageErgebnis = oSQLAnweisung.executeQuery(Sql)
oKlassenBox = oSchuelerDialog.GetControl("ListBox1")
oKlassenBox.removeItems(0, oKlassenBox.getItemCount())
While AbfrageErgebnis.next
ListBoxItem=AbfrageErgebnis.getString(1)
oKlassenBox.additem(ListBoxItem, oKlassenBox.ItemCount)
Wend
oSchuelerDialog.execute()
End Sub
Sub ListBox1_ItemStatusChanged
sSelectedKlasse = oSchuelerDialog.getControl("ListBox1").getSelectedItem()
Sql = "SELECT "+CHR(34)+"NAME"+CHR(34)+","+CHR(34)+"KLASSE"+CHR(34)+" FROM "+CHR(34)+"TESTEXPORT"+CHR(34)
Sql = Sql+" WHERE "+CHR(34)+"KLASSE"+CHR(34)+" = '"+sSelectedKlasse+"'"
oAbfrageErgebnis = oSQLAnweisung.executeQuery(Sql)
oSchuelerBox = oSchuelerDialog.GetControl("ListBox2")
oSchuelerBox.removeItems(0, oSchuelerBox.getItemCount())
While oAbfrageErgebnis.next
ListBoxItem=oAbfrageErgebnis.getString(1)
oSchuelerBox.additem(ListBoxItem, oSchuelerBox.ItemCount)
Wend
End Sub
Sub ListBox2_ItemStatusChanged
SelectedNachname = oSchuelerDialog.getControl("ListBox2").getSelectedItem()
Sql = "SELECT "+CHR(34)+"*"+CHR(34)+" FROM "+CHR(34)+"TESTEXPORT"+CHR(34)
Sql = Sql+" WHERE "+CHR(34)+"KLASSE"+CHR(34)+" = "+ "'"+sSelectedKlasse+"'"
Sql = Sql+" AND "+CHR(34)+"NAME"+CHR(34)+" = "+"'"+SelectedNachname+"'"
oAbfrageErgebnis = oSQLAnweisung.executeQuery(Sql)
oAbfrageErgebnis.Next
For i=1 to 23
mSelectedSchueler(i)=oAbfrageErgebnis.getString(i)
Next
a=a
End Sub