Inhalte von Anlagenfeldern verwalten

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Inhalte von Anlagefeldern verwalten

Anlagefelder sind eine prima Möglichkeit, um Dateien in Access-Tabellen zu speichern. Im Gegen­satz zu OLE-Feldern stehen dazu sogar geeignete Elemente in der Benutzeroberfläche zur Ver­fügung. Diese sind allerdings nicht besonders ausgereift – so kann man nicht direkt im For­mu­lar die in einem Anlagefeld gespeicherten Elemente anzeigen oder neue hinzufügen. Dieser Beitrag zeigt, wie Sie ein Formular um diese Möglichkeit erweitern. Dabei fügen wir auch gleich die im Beitrag Drag and Drop im Anlagefeld vorgestellte Technik hinzu.

Beispieltabelle

Als Beispiel nutzen wir eine Tabelle namens tblProjekte, die neben dem Primärschlüsselfeld und der Projektbezeichnung nur ein Anlagefeld namens Dateien zum Speichern projektrelevanter Dateien enthält. Dies ist natürlich stark vereinfacht, aber es soll ja auch nur ein Beispiel sein. Bild 1 zeigt die Entwurfsansicht der Tabelle tblProjekte.

Tabelle mit Anlagefeld

Bild 1: Tabelle mit Anlagefeld

Formular zum Verwalten der Anlagen

Das Formular zum Verwalten der Anlagen im Anlagefeld Dateien der Tabelle tblProjekte verwendet natürlich die Tabelle tblProjekte als Datenherkunft (s. Bild 2).

Formular zum Verwalten von Anlagefeld-Inhalten

Bild 2: Formular zum Verwalten von Anlagefeld-Inhalten

Dabei soll sie den Inhalten der beiden Felder Projekt­ID und Projektbezeichung in entsprechenden Textfeldern anzeigen. Die im Anlagefeld gespeicherten Anlagen sollen in einem ListView-Steuerelement erscheinen. Drei Schaltflächen stellen die Funktionen zum Löschen, Öffnen und Speichern der aktuell markierten Anlage im ListView-Steuerelement bereit. Als Gimmick soll ein Anlage-Steuerelement im rechten Bereich auch noch die aktuell im Listenfeld markierte Anlage anzeigen. Im Falle einiger Dateien erscheint dann die Vorschau, wie in der Abbildung etwa für eine Bilddatei. Dateien können per Drag and Drop zum ListView-Steuerelement hinzugefügt werden. Eine neu hinzugefügte Datei wird gleich markiert und im Anlage-Steuerelement angezeigt.

Zu den Einträgen des ListView-Steuerelements haben wir noch jeweils drei Kontextmenü-Befehle hinzugefügt, und zwar Löschen, Öffnen und Speichern unter (s. Bild 3).

Kontextmenü mit den Anlagen-spezifischen Befehlen

Bild 3: Kontextmenü mit den Anlagen-spezifischen Befehlen

Erstellen des Formulars

Das Formular sieht im Entwurf wie in Bild 4 aus. Hier können Sie erkennen, dass sich das Anlage-Steuerelement nicht direkt im Hauptformular befindet, sondern in ein Unterformular eingebettet ist. Dies haben wir so gemacht, weil wir ja das Anlagen-Feld der Datenherkunft nicht so an ein Anlagen-Steuerelement binden können, dass jeweils der Inhalt einer speziellen Anlage angezeigt wird. Wie dies technisch gelöst ist, schauen wir uns jedoch weiter unten an.

Das Formular frmAnlagefeldVerwalten in der Entwurfsansicht

Bild 4: Das Formular frmAnlagefeldVerwalten in der Entwurfsansicht

Laden des Formulars

Beim Laden des Formulars sind zunächst einige Schritte zur Konfiguration des ListView-Steuerelements nötig. Dies erledigen wir in der Ereignisprozedur Beim Laden (s. Listing 1).

Private Sub Form_Load()
     Dim objColumnheader As MSComctlLib.ColumnHeader
     With Me!ctlListview
         .ColumnHeaders.Clear
         Set objColumnheader = .ColumnHeaders.Add(, , "Dateien hierher ziehen:")
         objColumnheader.Width = Me!ctlListview.Width - 350
         .View = lvwReport
         .Font.Name = "Calibri"
         .Font.Size = 11
         .Appearance = ccFlat
         .OLEDropMode = ccOLEDropManual
         .ListItems.Clear
     End With
End Sub

Listing 1: Vorbereitungen, die beim Laden des Formulars durchgeführt werden

Die Prozedur leert eventuell vorhandene Spaltenköpfe im ListView-Steuerelement und fügt dann einen neuen Spaltenkopf mit dem Text Dateien hierher ziehen hinzu. Die Breite dieses Elements stellt sie auf die Breite des Steuerelements minus 350 ein. Dies sorgt dafür, dass die einzige Spalte auch beim Einblenden der vertikalen Bildlaufleiste noch vollständig sichtbar ist und keine horizontale Bildlaufleiste eingeblendet werden muss. Dann stellt sie die Ansicht auf lvwReport ein und legt die Schriftart und Schriftgröße so fest, dass diese zur Schrift der übrigen Steuerelemente passt. Der Wert ccFlat für die Eigenschaft Appearance sorgt dafür, dass das Steuerelement nicht vertieft angezeigt wird. OLEDropMode = ccOLEDropManual sorgt dafür, dass einige Ereignisse beim Drag and Drop auf das ListView-Steuerelement ausgelöst und implementiert werden können. Schließlich leert die Prozedur das ListView-Steuerelement, falls noch Einträge von vorherigen Anwendungen vorhanden sind.

Unterformular zur Ansicht der aktuell markierten Anlage

Das Unterformular sfmAnlagefeld enthält als einziges Steuerelement das Anlage-Steuerelement ctlAttachment. Das Formular selbst ist über die Eigenschaft Datenherkunft an eine Abfrage gebunden, welche die beiden Felder Dateien.FileData und Dateien.FileName liefert (s. Bild 5). Die »doppelten« Feldnamen mit dem trennenden Punkt erklären sich durch die Besonderheit des Anlagefeldes: Dieses hat in der Tabelle tblProjekte den Namen Dateien. Ein Anlagefeld enthält aber intern immer eine Tabelle, da es ja auch mehrere Anlagen samt Metadaten aufnehmen kann. Und zwei der Felder dieser Tabelle heißen FileData und FileName. Um direkt auf diese Felder zuzugreifen, verwendet man dann die Syntax ., also zum Beispiel Dateien.FileData.

Das Unterformular sfmAnlagefeld in der Entwurfsansicht

Bild 5: Das Unterformular sfmAnlagefeld in der Entwurfsansicht

Das Feld Dateien.FileData weisen wir direkt dem Anlage-Steuerelement ctlAttachment als Steuerelementinhalt zu, damit dieses den Inhalt der Datei oder ein entsprechendes Symbol anzeigt. Wofür aber benötigen wir das Feld Dateien.FileName? Dieses verwenden wir, um den aktuellen Datensatz des Unterformulars mit dem im ListView-Steuerelement des Hauptformulars angezeigten Anlage-Datensatz zu synchronisieren.

Dazu verwenden wir die beiden Eigenschaften Verknüpfen von und Verknüpfen nach des Unterformular-Steuerelements, die sonst für die Verknüpfung von Daten in einer 1:n-Beziehung in Haupt- und Unterformular dienen. In diesem Fall stellen wir die Eigenschaft Verknüpfen von auf das Feld Dateien.FileName der Datenherkunft des Unterformulars und die Eigenschaft Verknüpfen nach auf das Textfeld txtDateiname ein. Dieses finden Sie samt den Eigenschaften des Unterformular-Steuerelements in Bild 6.

Einstellungen für das Unterformular-Steuerelement

Bild 6: Einstellungen für das Unterformular-Steuerelement

Nun müssen wir nur noch klären, wie das Textfeld txtDateiname an den Namen des aktuell im ListView-Steuerelement ausgewählten Eintrags kommt.

Beim Anzeigen eines Datensatzes

Jeder Datensatzwechsel, und damit auch das erste Anzeigen eines Datensatzes im Formular frmAnlagefeldVerwalten, löst das Ereignis Beim Anzeigen und somit die Prozedur aus Listing 2 aus. Diese prüft zunächst, ob das Formular aktuell überhaupt einen Datensatz anzeigt. Dies ist der Fall, wenn Me!ProjektID den Wert Null aufweist und geschieht etwa dann, wenn der Benutzer zu einem neuen, leeren Datensatz wechselt. In diesem Fall soll dann einfach das ListView-Steuerelement geleert werden – siehe Else-Teil der If...Then-Bedingung.

Private Sub Form_Current()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim rstDateien As DAO.Recordset
     Set db = CurrentDb
     If Not IsNull(Me!ProjektID) Then
         Set rst = db.OpenRecordset("SELECT Dateien.Filename FROM tblProjekte WHERE ProjektID = " & Me!ProjektID _
             & " ORDER BY Dateien.Filename", dbOpenDynaset)
         Me!ctlListview.ListItems.Clear
         Me!txtDateiname = rst("Dateien.Filename")
         Do While Not rst.EOF
             If Not IsNull(rst.Fields("Dateien.Filename")) Then
                 Me!ctlListview.ListItems.Add , , rst.Fields("Dateien.FileName")
             End If
             rst.MoveNext
         Loop
     Else
         Me!txtDateiname = ""
         Me!ctlListview.ListItems.Clear
     End If
End Sub

Listing 2: Diese Ereignisprozedur wird beim Anzeigen eines jeden Datensatzes ausgelöst.

Liegt jedoch ein Datensatz vor, erstellt die Prozedur ein neues Recordset, welches das Feld Dateien.FileName der Tabelle tblProjekte für alle Datensätze enthält, deren Feld ProjektID mit dem aktuellen Primärschlüsselwert des Datensatzes im Hauptformular übereinstimmt. Die Prozedur leert dann die Einträge des Listenfeldes.

Anschließend folgt eine Anweisung, die für die Synchronisierung mit dem Unterformular zur Anzeige der aktuell markierten Anlage verantwortlich ist: Sie stellt den Wert des Feldes txtDateiname auf den Dateinamen aus rst("Dateien.FileName") ein. Das Anlage-Steuerelement im Unterformular zeigt nun Inhalt des Anlagefeldes des ersten Datensatzes der Tabelle tblProjekte für das aktuellen Projekt an.

Nun durchläuft die Prozedur alle Datensätze der Abfrage und fügt dem ListView-Steuerelement jeweils einen neuen Eintrag hinzu, wobei dieser als Text jeweils den Inhalt des Feldes Dateien.FileName erhält.

Hinzufügen neuer Anlagen per Drag and Drop

Neue Dateien fügen Sie zum aktuellen Projekt hinzu, indem Sie diese aus dem Windows Explorer auf das Steuerelement ziehen. Wenn Sie ein beliebiges Objekt über dieses Steuerelement ziehen, löst dies das Ereignis OLEDragOver aus. Dieses liefert mit Data einen Verweis auf das gezogene Objekt. Die If...Then-Bedingung aus Listing 3 prüft, ob es sich bei dem Objekt um eine Datei handelt (ccDFFiles).

Private Sub ctlListview_OLEDragOver(Data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, _
         y As Single, State As Integer)
     If Not Data.GetFormat(ccCFFiles) Then
         Effect = ccOLEDropEffectNone
     End If
End Sub

Listing 3: Ereignis beim Überfahren des Drop-Ziels

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Neues aus unseren Magazinen
Listenfeld: Reihenfolge mehrerer Einträge...

Wir haben bereits in mehreren Beiträgen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle über den Inhalt eines Feldes etwa namens »ReihenfolgeID« einstellen können –... [mehr]

Diagramme mit gefilterten Daten

In Ausgabe 2/2019 haben wir in zwei Artikeln die modernen Diagramme von Access vorgestellt. Im vorliegenen Beitrag zeigen wir Ihnen, wie Sie diese abhängig von den in einem Formular angezeigten... [mehr]

Benutzerverwaltung mit verschlüsselten...

Wenn Sie in einer Access-Anwendung Benutzer verwalten wollen, die sich per Benutzername und Kennwort an die Anwendung anmelden, sollten Sie sehr sensibel mit den in der Anwendung gespeicherten... [mehr]

HTML-Tabellen mit fester Kopfzeile

In den vorherigen Ausgaben von Access im Unternehmen und in der aktuellen Ausgabe arbeiten wir in einigen Beiträgen mit dem Webbrowser-Steuerelement und stellen Daten, die wir mit den Bordmitteln... [mehr]

Flexible HTML-Tabellen mit fester Kopfzeile

Im Beitrag »HTML-Tabellen mit fester Kopfzeile« haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenköpfe oben fixiert... [mehr]

Berechtigungen per HTML verwalten

Im Beitrag »Benutzerverwaltung mit verschlüsselten Kennwörtern« stellen wir eine Lösung vor, in der wir die Berechtigungen von Benutzergruppen an Datenbankobjekten definieren. Dort benötigen wir... [mehr]

Benutzer und Berechtigungen ermitteln

In den Beiträgen »Benutzerverwaltung mit verschlüsselten Kennwörtern« und »Berechtigungen per HTML verwalten« haben wir die Voraussetzungen für eine Benutzerverwaltung geschaffen. Im vorliegenden... [mehr]

Zugriffsrechte mit Datenmakros

Es gibt verschiedene Möglichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die für ihn vorgesehenen Aktionen mit Daten durchführen darf – beispielsweise durch... [mehr]

Kennwörter generieren

Für den einen oder anderen Zweck möchten Sie vielleicht Kennwörter generieren oder in einer Benutzeroberfläche die Möglichkeit zum Generieren von Kennwörtern anbieten. Wenn Sie etwa Benutzer zu... [mehr]

Neuer Datensatz von Frontend zu Backend

Für manche Themen gibt es keine kurze, prägnante Überschrift. In diesem Fall wollen wir zeigen, wie Sie einen neuen Datensatz anlegen, der in einer temporären Tabelle im Frontend gespeichert wird,... [mehr]