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

gefragt 2017-03-09 16:49:37 +0100

krueuw Gravatar-Bild

updated 2017-03-09 22:51:48 +0100

karolus Gravatar-Bild

Das ursprüngliche Thema https://ask.libreoffice.org/de/question/61409/wie-fulle-ich-eine-listbox-in-abhangigkeit-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
edit retag flag offensive close merge delete

Comments

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

+1 für die strukturierte Erklärung

karolus Gravatar-Bildkarolus ( 2017-03-09 22:58:35 +0100 )edit

:-) .

krueuw Gravatar-Bildkrueuw ( 2017-03-10 08:05:52 +0100 )edit