Wie fülle ich eine Listbox in Abhängigkeit einer anderen (Dialog)? reloaded

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

wg Syntaxhighlighting 'single-quote am Ende der Zeile #16 eingefügt…

+1 für die strukturierte Erklärung

:slight_smile: .