Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 4/2002.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Literaturverwaltung, Teil 2

Autor: Martin Hoffmann, Düsseldorf

!

In der letzten Ausgabe wurde eine Literaturverwaltung vorgestellt, mit der Sie Literatur erfassen, bewerten und suchen können. In diesem Beitrag ergänzen Sie diese Datenbank um benutzerabhängige Literaturlisten sowie um die Ausgabe einer Signaturliste und eines Literaturanhangs in Word.

Eine der wichtigsten Zusatzfunktionen des Literatur-Managers ist die Verwaltung von Literaturlisten. Diese versetzen den Anwender in die Lage, die bestehenden Literatur-Datensätze nach Belieben zu selektieren und zu gruppieren. Jeder Benutzer kann dabei seine eigenen Listen führen.

Neben dem Zusammenstellen der Literaturlisten kann die Datenbank aus diesen Listen eine Signaturübersicht erstellen. Auf diese Weise kann man sich alle Standorte der gewünschten Literatur übersichtlich ausgeben lassen. Außerdem kann für jede Liste ein Literaturanhang in Word generiert werden. So können Sie beispielsweise die Literatur für eine Publikation in der Datenbank sammeln und anschließend automatisch den Literaturanhang für diese Publikation erzeugen.

Abb. 2: Die Datenbasis des Kombinationsfeldes cmbListe

Die folgenden Abschnitte zeigen Ihnen Schritt für Schritt die Entwicklung der oben aufgeführten Funktionen.

Literaturlisten verwalten

Zunächst soll die Verwaltung der Literaturlisten entwickelt werden. Legen Sie dazu ein neues Formular mit dem Namen frmLiteraturliste an. Fügen Sie in das Formular ein Kombinationsfeld mit dem Namen cmbListe ein. Dieses soll alle Listen eines Benutzers zur Auswahl stellen. zeigt den Aufbau der Datenherkunft für das Kombinationsfeld.

Die Funktion getCurrentUserID ermittelt den aktuell angemeldeten Benutzernamen und sucht anschließend in der Tabelle tblBenutzer die zugehörige BenutzerID heraus. Dadurch liefert das Abfrageergebnis nur die Listen des aktuellen Benutzers.

Die Elemente einer Liste sollen in einem Listenfeld angezeigt werden. Legen Sie dazu ein neues Listenfeld mit dem Namen lstPositionen an. Achten Sie darauf, dass die Datenherkunft das Datenfeld LiteraturID enthält, damit später per Doppelklick auf einen Eintrag das Literatur-Formular mit dem passenden Werk geöffnet werden kann. Ferner sollten Sie die Bedingung LiteraturListeID=0 einfügen, damit zunächst keine Listeneinträge angezeigt werden. Die Vorgehensweise entspricht derjenigen beim Suchen-Dialog.

Public Sub UpdatePositionen()

    Dim SQL As String

    Dim NeueListenID As Variant

    NeueListenID = Forms!frmLiteraturliste!cmbListe.Value

    If Nz(NeueListenID) <> "" Then

        SQL = "SELECT LiteraturListenPositionID, Titel, " _
            & "tblLiteraturlistenPositionen.LiteraturID, getAutorenliste" _
            & "([tblLiteratur].[LiteraturID],2) AS Autoren FROM tblLiteratur " _

            & "INNER JOIN tblLiteraturlistenPositionen " _
            & "ON tblLiteratur.LiteraturID=tblLiteraturlistenPositionen.LiteraturID" _

            & " WHERE LiteraturListeID=" & NeueListenID & ";"

        Forms!frmLiteraturliste!lstPositionen.RowSource = SQL

        Forms!frmLiteraturliste!lstPositionen.Requery

    End If

End Sub

Quellcode 1

Verknüpfen von Kombinations- und Listenfeld

Damit das Listenfeld nur die zu einer Liste gehörenden Elemente anzeigt, muss nach Auswahl einer Literaturliste im Kombinationsfeld cmbListe die Datensatzherkunft des Listenfeldes lstPositionen geändert werden. Zu diesem Zweck legen Sie eine Prozedur beim Nach Aktualisierung-Ereignis des Kombinationsfeldes an. Tragen Sie dort den Aufruf der globalen Prozedur UpdatePositionen ein.

Die Prozedur (s. Quellcode 1) liest zunächst die LiteraturlistenID aus dem Kombinationsfeld aus. Anschließend verwendet sie die identische Datenherkunft des Listenfeldes und ergänzt diese um eine Bedingung, mit der die Datensätze auf die Positionen mit passender LiteraturlisteID gefiltert werden. Zum Schluss weist die Prozedur dem Listenfeld die neue Datensatzherkunft zu und fragt es erneut ab.

Nachdem Sie die Anzeige von Listen und Positionen geregelt haben, benötigen Sie noch Funktionen, um neue Listen hinzuzufügen, umzubenennen oder zu löschen.

Listen anlegen

Fügen Sie in das Formular die Schaltfläche btnNeu ein. Diese übernimmt die Neuanlage von Literaturlisten.

Abb. 3: Die Schaltflächen btnNeu und btnLöschen

Die Ereignisprozedur der Schaltfläche enthält die folgenden zwei Prozeduraufrufe:

NeueLiteraturlisteAnlegen

UpdatePositionen

Mit dem ersten Aufruf wird ein neuer Datensatz angelegt. Der zweite, schon bekannte Aufruf aktualisiert lediglich das Listenfeld.

Die Anlage einer neuen Liste (s. Quellcode 2) gestaltet sich recht einfach. Zunächst wird der Name der neuen Liste über eine InputBox abgefragt. Gibt der Benutzer einen Namen ein, wird in der Tabelle tblLiteraturlisten ein neuer Datensatz mit dem Listennamen und der BenutzerID angelegt.

Public Sub NeueLiteraturlisteAnlegen()

    Dim SQL, NeuerName As String

    Dim db As Database

    Dim rstLiteraturlisten As Recordset

    Dim ListeID As Integer

    NeuerName = InputBox("Bitte geben Sie den neuen " _
        & "Namen ein:", "Literaturliste eingeben", _
        "<Neue Literaturliste>")

    If NeuerName <> "" Then

        Set db = CurrentDb()

        Set rstLiteraturlisten = _
            db.OpenRecordset("tblLiteraturListen")

        With rstLiteraturlisten

            .AddNew

            !ListenName = NeuerName

            !BenutzerID = GetCurrentUserID()

            ListeID = !LiteraturlisteID

            .Update

        End With

        If IsLoaded("frmLiteraturliste") = True Then

            Forms!frmLiteraturliste!cmbListe.Requery

            Forms!frmLiteraturliste!cmbListe = ListeID

        End If

        If IsLoaded("frmLiteratur") = True Then

            Forms!frmLiteratur!cmbListe.Requery

        End If

    End If

End Sub

Quellcode 2

Damit nach der Anlage im Kombinationsfeld direkt die neue Liste angezeigt wird, muss sich die Prozedur die neue ID merken. Dazu wird die ID über die Zuweisung

ListeID = !LiteraturlisteID

in der Variablen ListeID gespeichert. Wichtig ist, dass dieser Ausdruck vor der Update-Anweisung des Recordsets steht, da sonst die neue ID verloren geht und später nicht mehr zugewiesen werden kann.

Da sich die Daten des Kombinationsfeldes geändert haben, muss dieses mit der Requery-Methode neu abgefragt werden. Danach wird dem Kombinationsfeld die neue ID zugewiesen.

Hinweis

Im Quellcode wird vor der Aktualisierung des Kombinationsfeldes über den Ausdruck IsLoaded("frmLiteraturliste") = True abgefragt, ob das Literaturlisten-Formular geöffnet ist. Diese Abfrage scheint hier überflüssig zu sein, da die Prozedur ja von genau diesem Formular aus aufgerufen wird. Der Vorteil dieser Methode ist jedoch, dass die Funktion zum Anlegen einer neuen Liste so von überall aus aufgerufen werden kann - zum Beispiel über einen Menübefehl; und in diesem Fall muss das Formular nicht geöffnet sein. (

Am Ende der Prozedur wird noch ein Kombinationsfeld cmbListe aktualisiert, das sich im Literatur-Formular befindet. Dieses ist mit dem Kombinationsfeld im Literaturlisten-Formular identisch. Es dient dazu, Bücher direkt aus dem Literatur-Formular einer bestimmten Liste zuzuordnen (s. a. Abschnitt Listeneinträge hinzufügen).

Listen löschen

Zum Löschen einer Literaturliste fügen Sie die Schaltfläche btnLöschen in das Formular ein. Die Ereignisprozedur fragt zunächst über eine Msgbox ab, ob die Liste wirklich gelöscht werden soll. Diese Sicherheitsabfrage ist wichtig, da für die Beziehung zwischen den Tabellen tblLiteraturlisten und tblLiteraturlistenPositionen die Löschweitergabe aktiviert ist. Wenn also eine Liste gelöscht wird, werden automatisch auch alle Positionen entfernt.

Private Sub cmbListe_DblClick(Cancel As Integer)

    Dim AlterName As String

    Dim NeuerName As Variant

    Dim ListenID As Integer

    If Not IsNull(cmbListe.Value) Then

        ListenID = cmbListe.Value

        AlterName = cmbListe.Column(1)

        NeuerName = InputBox("Bitte geben Sie den neuen Namen ein:", _
            "Literaturliste umbenennen", AlterName)

        If NeuerName <> "" And NeuerName <> AlterName Then

            SQL = "UPDATE tblLiteraturListen SET ListenName=""" & NeuerName _
                & """ WHERE LiteraturListeID=" & ListenID

            CurrentDb().Execute SQL

            cmbListe.Requery

            cmbListe.Value = ListenID

        End If

    End If

End Sub

Quellcode 3

Bestätigt der Anwender die Meldung mit Ja, führt die Prozedur die folgende DELETE-SQL-Anweisung aus:

Set db = CurrentDb()

SQL = "DELETE * " _
    & "FROM tblLiteraturListen " _
    & "WHERE LiteraturListeID = " 
    & Me!cmbListe

db.Execute SQL

Da die Liste inklusive aller Positionen nach dieser Anweisung nicht mehr existiert, müssen sowohl das Kombinations- als auch das Listenfeld aktualisiert werden. Außerdem wird die Auswahl im Kombinationsfeld aufgehoben:

Me!cmbListe.Requery

UpdatePositionen

Me!cmbListe = Null

Auch nach dem Löschen muss wieder das Kombinationsfeld cmbListe im Literatur-Formular aktualisiert werden:

If IsLoaded("frmLiteratur") = True Then

    Forms!frmLiteratur!cmbListe.Requery

End If

Listen umbenennen

Das Umbenennen einer Liste könnte ebenfalls über eine Schaltfläche ausgeführt werden. In der Beispieldatenbank wird ein Eintrag jedoch per Doppelklick auf das Kombinationsfeld umbenannt.

Abb. 4: Umbenennen einer Liste per Doppelklick

Legen Sie dazu die Prozedur aus Quellcode 3 im Ereignis Beim Doppelklicken an.

Die Prozedur liest zunächst die LiteraturlistenID und den Namen der Liste aus dem Kombinationsfeld aus. Anschließend wird der neue Name über eine InputBox abgefragt. Gibt der Benutzer einen neuen Namen ein, führt die Prozedur die folgende Aktualisierungsabfrage aus und fragt alle Kombinationsfelder neu ab:

UPDATE tblLiteraturListen 
SET ListenName=""" & NeuerName & """ 
WHERE LiteraturListeID=" & ListenID

Listeneinträge hinzufügen

Neue Listeneinträge gelangen nicht über das Literaturlisten-Formular in die Listen, sondern direkt über das Literatur-Formular. Die Benutzerführung sieht vor, dass man zunächst ein Werk sucht und anschließend die Liste auswählt, in die das Werk übernommen werden soll. Die Übernahme erfolgt dabei automatisch nach Auswahl der Liste.

Abb. 5: Das Kombinationsfeld zur Auswahl einer Literaturliste

Zu diesem Zweck fügen Sie in das Formular frmLiteratur das bereits angesprochene Kombinationsfeld cmbListe ein, das Sie aus dem Formular frmLiteraturlisten kopieren können.

In der Beispieldatenbank ist das Kombinationsfeld so angelegt, dass es nicht direkt sichtbar ist, sondern über eine Schaltfläche mit dem Namen btnÜbernahmeÖffnen geöffnet wird. Daher gewinnt man den Eindruck, die Schaltfläche habe eine eigene Liste. Der Vorteil liegt darin, dass zum einen die Schaltfläche größer als die Drop-Down-Schaltfläche des Kombinationsfeldes ist. Zum anderen ist der Inhalt des Kombinationsfeldes nicht sichtbar, wodurch der Eindruck vermieden wird, dass es sich um ein Datenfeld des aktuellen Datensatzes handelt.

Das Kombinationsfeld sollte die Höhe 0 und die gleiche Breite wie die Schaltfläche haben. Richten Sie das Kombinationsfeld dann am unteren Rand der Schaltfläche aus. Um das Kombinationsfeld über die Schaltfläche zu öffnen, legen Sie die folgenden Programmzeilen im Beim Klicken-Ereignis der Schaltfläche ab:

Me!cmbListe.SetFocus

SendKeys "{F4}"

Die erste Zeile setzt den Fokus auf das Kombinationsfeld. Die SendKeys-Anweisung sendet anschließend den Tastaturbefehl der Funktionstaste F4, der ja der Shortcut für das Öffnen einer Kombinationsfeldliste ist.

Abb. 6: Öffnen des Kombinationsfeldes über eine Schaltfläche

Durch das Kontrollkästchen chkListeÖffnen kann der Benutzer wählen, ob nach der Übernahme eines Eintrags die Literaturliste geöffnet werden soll. Das Kontrollkästchen ist standardmäßig aktiviert.

Nach Auswahl eines Eintrags wird im Nach Aktualisierung-Ereignis des Kombinationsfeldes die globale Prozedur LiteraturInListeÜbernehmen aufgerufen (s. Quellcode 4).

Die Prozedur prüft zunächst, ob das Buch bereits in der ausgewählten Liste vorhanden ist. Jedes Buch soll schließlich nur einmal in jeder Liste auftauchen. Ist das Buch noch nicht in der Liste, wird es mittels einer Insert Into-Abfrage in die Tabelle tblLiteraturlistenPositionen eingefügt.

Public Sub LiteraturInListeÜbernehmen(LiteraturID As Long, ListeID As Long, _
    OpenListe As Boolean)

    Dim db As Database

    Dim SQL As String

    If Nz(DLookup("LiteraturlistenPositionID", "tblLiteraturlistenPositionen", _
        "LiteraturlisteID=" & ListeID & " And LiteraturID=" & LiteraturID)) = "" Then

        Set db = CurrentDb()

        SQL = "INSERT INTO tblLiteraturlistenPositionen (LiteraturlisteID, " _
            & "LiteraturID) Values (" & ListeID & ", " & LiteraturID & ")"

        db.Execute SQL

    End If

    If OpenListe = True Then

        If IsLoaded("frmLiteraturliste") = False Then

            DoCmd.OpenForm "frmLiteraturliste"

        End If

    End If

    If IsLoaded("frmLiteraturliste") = True Then

        Forms!frmLiteraturliste!cmbListe.Requery

        Forms!frmLiteraturliste!cmbListe = ListeID

        UpdatePositionen

    End If

End Sub

Quellcode 4

Im nächsten Schritt prüft die Prozedur, ob das Kontrollkästchen chkListeÖffnen aktiviert ist, und öffnet ggf. das Formular frmLiteraturliste. Am Ende wird noch die Anzeige im Literaturlisten-Formular aktualisiert.

Listeneinträge öffnen und löschen

Das Öffnen und Löschen von Positionseinträgen erfolgt hier aus Platzgründen nicht über Schaltflächen, sondern über das Kontextmenü der Liste.

Wie Sie die Kontextmenüs anlegen, zuweisen und mit dem Prozeduraufruf verknüpfen, erfahren Sie im Beitrag Arbeiten mit Kontextmenüs in Heft 4/2002 von Access im Unternehmen. (

Im Vorfeld seien hier jedoch schon einmal die verwendeten Prozeduren beschrieben. Das Öffnen erfolgt über die Prozedur PositionÖffnen. Sie verwendet die bereits behandelte Prozedur LiteraturÖffnen, die schon im Suchen-Dialog Anwendung fand.

Abb. 7: Öffnen und Löschen von Einträgen über Kontextmenüs

Die Prozedur zum Löschen einer Position heißt PositionLöschen und ist vom Aufbau her nahezu identisch mit der Prozedur zum Löschen einer Literaturliste. Nach einer Sicherheitsabfrage wird eine Löschabfrage ausgeführt, die die gewählte Position aus der Tabelle tblLiteraturPositionen entfernt.

Signaturliste drucken

Während bisher Aufbau und Zusammenstellung der Literaturlisten beschrieben wurden, wird in den folgenden Abschnitten näher auf die Weiterverarbeitung eingegangen.

Abb. 8: Datenbasis für den Signaturbericht

Abb. 9: Ausgeben einer Signaturliste

Die erste Form der Weiterverarbeitung stellt die Ausgabe einer Signaturliste dar.

Die Liste ist als tabellarischer Bericht mit dem Namen repSignaturliste aufgebaut. Als Datenbasis dient die Abfrage qrySignaturliste (s. Abb. 7).

Der Bericht wird im Literaturlisten-Formular über eine Schaltfläche mit der folgenden Anweisung geöffnet:

DoCmd.OpenReport "repSignaturliste", acViewPreview, , "LiteraturListeID=" & Me!cmbListe

Das Ergebnis sehen Sie in Abb. 9.

Literaturanhang in Word
ausgeben

Abb. 10: Literaturanhang in Word

Außerdem kann über die Literaturverwaltung ein Literaturanhang angelegt werden. Die Ausgabe erfolgt dabei per OLE-Automation in Word.

Das Erzeugen des Anhangs übernimmt die Prozedur LiteraturAnhangAusgeben (s. Quellcode 5), der als Parameter die LiteraturListeID übergeben wird, für die der Anhang erstellt werden soll.

Als Basis für die Prozedur wird die Abfrage qryLiteraturverzeichnis verwendet, die alle Felder enthält, die im Anhang ausgegeben werden sollen.

Die Prozedur filtert zunächst die Abfrage, sodass nur die Positionen der gewählten Liste übrig bleiben. Anschließend durchläuft die Prozedur alle Datensätze in einer Schleife und fügt für jeden Datensatz eine passende Zeile in Word ein.

Word ansteuern

Um den gewünschten Text in Word einzufügen, muss zunächst eine neue Instanz von Word gestartet werden, was über den folgenden Aufruf erfolgt:

Dim WordApp As Word.Application

Set WordApp = CreateObject("Word.Application")

Anschließend wird ein neues Dokument in Word angelegt:

WordApp.Documents.Add

Nachdem der Text für einen Datensatz in der Variablen Literatureintrag zusammengesetzt wurde, kann er über die Methode TypeText in Word eingefügt werden:

WordApp.Selection.TypeText Literatureintrag

Wenn die Schleife alle Datensätze durchlaufen hat, muss Word nur noch eingeblendet werden:

WordApp.Visible = True

Als Ergebnis erhalten Sie einen Literaturanhang, wie er in Abb. 10 zu sehen ist.

Public Sub LiteraturAnhangAusgeben(LiteraturlisteID As Long)

    Dim WordApp As Word.Application

    Dim db As Database

    Dim rstLiteratur As Recordset

    Dim SQL, Literatureintrag As String

    Dim i As Integer

    SQL = "SELECT * FROM qryLiteraturverzeichnis"

    SQL = SQL & " WHERE qryLiteraturverzeichnis.LiteraturlisteID=" & LiteraturlisteID

    Set db = CurrentDb()

    Set rstLiteratur = db.OpenRecordset(SQL)

    With rstLiteratur

        If .RecordCount > 0 Then

            Set WordApp = CreateObject("Word.Application")

            WordApp.Documents.Add

            i = 0

            While Not .EOF

                i = i + 1

                Literatureintrag = "/" & CStr(i) & "/ "

                If Nz(!Autoren, "") <> "" Then Literatureintrag = Literatureintrag _
                    & Nz(!Autoren, "") & ", "

                If Nz(!Titel, "") <> "" Then Literatureintrag = Literatureintrag _
                    & Nz(!Titel, "") & ", "

                If Nz(!Jahr, "") <> "" Then Literatureintrag = Literatureintrag _
                    & Nz(!Jahr, "") & ", "

                If Nz(!Verlag, "") <> "" Then Literatureintrag = Literatureintrag _
                    & Nz(!Verlag, "") & ", "

                If Nz(!Ort, "") <> "" Then Literatureintrag = Literatureintrag _
                    & Nz(!Ort, "") & ", "

                If Right(Literatureintrag, 2) = ", " Then Literatureintrag = _

                    Left(Literatureintrag, Len(Literatureintrag) - 2)

                Literatureintrag = Literatureintrag & vbCrLf

                WordApp.Selection.TypeText Literatureintrag

                .MoveNext

            Wend

            WordApp.Visible = True

        End If

    End With

End Sub

Quellcode 5

Zusammenfassung

In diesem Beitrag wurde beschrieben, wie Sie die Funktionen und Formulare zur Erstellung von benutzerdefinierten Literaturlisten programmieren. Ferner wurden zwei praktische Verwendungsformen für die Listen vorgestellt. Eine Möglichkeit war dabei die Ausgabe eines Berichts in Form einer Signaturliste, die alle Standorte der aufgeführten Werke ausgibt. Die zweite Variante war die Ausgabe eines Literaturanhangs in Word mittels OLE-Automation.

Die Ausgabe des Literaturanhangs könnte man beispielsweise noch durch ein Konfigurationsmodul erweitern, in dem verschiedene Standardformate für Literaturlisten abgespeichert und eigene Formate definiert werden können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Download

Download

Die .zip-Datei enthält folgende Dateien:

LiteraturManager2-97.mdb

LiteraturManager2-00.mdb

Beispieldateien downloaden

© 2003-2015 André Minhorst Alle Rechte vorbehalten.