Dateien in Datenbanken einbinden

Datenbank

Dokumente, PDF-Dateien, Kalkulationen etc. – für viele Anwendungen wäre es sinnvoll, Access-Daten mit externen Dateien zu verbinden. Sei es, um die Korrespondenz zusammen mit einem Kunden zu speichern oder um auf das komplette Marketing- und Support-Material über den entsprechenden Artikeldatensatz zugreifen zu können. Wir zeigen Ihnen, wie Sie genau diese Verknüpfung mit wenig Auf – wand und ohne Speicherplatzprobleme her stellen. Dabei spielt es keine Rolle, Die Prozedur startet über „CreateObject“ eine neue Instanz von Access. Wenn ein Kennwort angegeben ist, öffnet die Methode „Open Database“ die Datenbank und übergibt dabei das Kennwort. Dann wird die Datenbank mit „OpenCurrentDatabase“ für die Bearbeitung per Benutzeroberfläche initialisiert. Zwei weitere Anweisungen, „.RunCommand acCmdAppRestore“ und „.RunCommand acCmdAppMaximize“, sorgen nun da für, dass das zweite Access-Fenster maximiert im Vordergrund angezeigt wird.

Ob Sie Word-Texte, Excel-Kalkulationen, PDF-Dateien oder BMP-Grafiken in Access einbinden möchten.

Die standardmäßig von Access an gebotenen OLE-Felder scheiden hier von Anfang an aus, denn abgesehen davon, dass Sie auf diesem Weg nicht jeden Dateityp einbinden können, ist ihr Einsatz immer mit einer erheblichen Vergrößerung der Datenbank verbunden. Geschwindigkeitseinbußen und ein erhöhtes Risiko für Datenverlust sind die Folge. Mit der Anhang-Funktion bietet Access 2007 zwar eine interessante Alternative, aber unsere Lösung ist dennoch schneller, flexibler und speichersparender!

Zur Lösung des Problems wird einfach nicht die komplette Datei in der Datenbank gespeichert, sondern es werden nur Pfad und Dateiname in einem normalen Textfeld festgehalten. Sie müssen daher selber da für sorgen, dass die Datei bei Bedarf irgend wie angezeigt werden kann, während bei einem OLE-Feld ein Doppelklick genügen würde.

Behilflich ist Ihnen dabei eine API-Funktion namens „ShellExecute()“. Diese Funktion hat normalerweise die Aufgabe, Anwendungen kontrolliert zu starten. Man kann sie aber auch dazu einsetzen, ein beliebiges Dokument oder eine beliebige Datei zu öffnen. „ShellExecute()“ analysiert dabei die Erweiterung der Datei, fragt über andere Funktionen beim Betriebssystem an, welche Anwendung dafür zuständig ist, und öffnet diese Anwendung mit der Datei als Parameter. Wenn Sie „ShellExecute()“ also einen Dateinamen mit der Kennung DOC übergeben, wird dementsprechend Word oder bei einem PDF-Dokument der Adobe Acrobat Reader gestartet. Für den Entwickler hat das den Vorteil, dass er sich innerhalb der Datenbank nicht darum kümmern muss, welche Anwendung für welche Dateierweiterung aufzurufen ist. Vielmehr kann er Zuordnungen nutzen, die auch unter Windows genutzt werden.

Dazu aber gleich etwas mehr, denn bevor eine Datei über „ShellExecute()“ geöffnet werden kann, müssen Pfad und Dateiname irgendwo gespeichert und beispielsweise einzelnen Kunden, Lieferanten oder Artikeln zugeordnet werden können. Die zweckmäßigste Lösung besteht darin, eine zusätzliche Tabelle „Externe Datei en“ einzusetzen, die mit der Haupttabelle über einen Primärschlüssel wie „Kunden-Code“, „Lieferanten-Nr“ oder „Artikel-Nr“ verknüpft ist. Verwaltung und Anzeige können dann ganz einfach über ein Unterformular abgewickelt werden. Anhand der Beispieldatenbank „Nordwind“ werden wir das im Folgen den einmal demonstrieren.

Im ersten Schritt legen Sie die benötigte Zusatztabelle an:

  1. Wechseln Sie im Datenbankfenster in den Bereich „Tabellen“, klicken Sie auf NEU und wählen Sie im folgen den Dialog den Eintrag „Entwurfsansicht“ per Doppelklick aus. In Access 2007 klicken Sie auf der Multifunktionsleiste „Erstellen“ auf das Symbol TABELLE.
  2. Legen Sie ein Feld an, das den gleichen Namen, den gleichen Datentyp und die gleichen Eigenschaften auf – weist wie der Primärschlüssel in der Haupttabelle. In unserem Beispiel ist das das Feld „Kunden-Code“ vom Datentyp „Text“ mit einer Länge von fünf Zeichen. Bei einer Lieferanten oder Artikelverwaltung käme hier beispielsweise ein Feld „Lieferanten-Nr“ oder „Artikel-Nr“ zum Einsatz. Dieses Feld dient später der Verknüpfung zur Haupttabelle.
  3. Legen Sie ein Feld „Stichwort“ vom Datentyp „Text“ mit einer Länge von „50“ Zeichen an. Dieses Feld speichert einen kurzen Hinweis auf den Inhalt der externen Datei wie beispielsweise „Besuchsbericht I/2007“, „Angebot Elektroartikel“ oder ähnlich.
  4. Erstellen Sie ein Feld „Datei“ vom Datentyp „Text“ mit einer Länge von „250“ Zeichen. In diesem Feld wird der Pfad der externen Datei in der Form „X:\Pfad\Dateiname.Erw“ festgehalten.
  5. Legen Sie ein Feld „Auf genommen – Am“ vom Datentyp „Datum/Zeit“ an und stellen Sie die Eigenschaft „Standard wert“ auf „Jetzt()“. Dieses Feld wird beim Anlegen neuer Datensätze und somit bei der Zuordnung neuer externer Dateien auf das aktuelle Systemdatum und die Zeit gesetzt. Sie können es beispielsweise ein setzen, um die externenDateien später im Unterformular chronologisch auf – zulisten.
  6. Speichern Sie die Tabelle unter dem Namen „Externe Dateien/Kunden“ und verlassen Sie den Entwurfsmodus. Ein Primärschlüssel muss für diese Tabelle nicht angelegt werden – beantworten Sie die entsprechende Abfrage mit NEIN.

Im zweiten Schritt legen Sie eine Abfrage an, die einerseits die Verknüpfung zwischen Haupt- und Detailtabelle – hier „Kunden“ und „Externe Dateien/Kunden“ – herstellt und das Ergebnis nach dem Stichwort oder Datum sortiert:

  1. Wechseln Sie im Datenbankfenster in den Bereich „Abfragen“, klicken Sie auf NEU und klicken Sie im folgen – den Dialog zweimal auf den Eintrag „Entwurfsansicht“. In Access 2007 wechseln Sie auf die Multifunktionsleiste „Erstellen“ und klicken auf das Symbol ABFRAGEENTWURF.
  2. Wählen Sie dann zunächst die Haupttabelle, also zum Beispiel „Kunden“, „Lieferanten“ oder „Artikel“, und an – schließend die dazugehörige Detailtabelle für die externen Dateien, also beispielsweise „Externe Dateien/Kunden“, per Doppelklick aus. Klicken Sie dann auf SCHLIEßEN. Access stellt daraufhin automatisch eine Verknüpfung zwischen dem Primärschlüsselfeld der Haupttabelle und dem gleichnamigen Feld in der Detailtabelle her.
  3. Klicken Sie zweimal auf das Sternchen, um alle Felder der Detailtabelle zu verwenden.
  4. Wählen Sie das Feld „Stichwort“ oder „Aufgenommen Am“ per Doppelklick aus, deaktivieren Sie das Kontrollkästchen in der Zeile „Anzeigen“ und stellen Sie die Sortierung auf „Aufsteigend“ (wenn nach Stichwort sortiert werden soll) oder auf „Absteigend“ (wenn nach dem Datum sortiert und neueste Dateien am Anfang auf gelistet werden sollen).
  5. Sichern Sie die Abfrage unter dem Namen „AFufo Externe Dateien/Kunden“ oder ähnlich und verlassen Sie den Entwurfsmodus.

Im dritten Schritt erstellen Sie ein Unterformular und fügen es in das Haupt -formular ein. Als Basis können Sie das Unterformular „UF Externe Dateien/Kunden“ aus unserer Beispieldatenbank verwenden.

Übertragen Sie das Formular in Ihre Datenbank.
Gehen Sie dann wie folgt vor:

  1. Öffnen Sie das Unterformular im Entwurfsmodus.
  2. Stellen Sie die Eigenschaft „Datenherkunft“ auf den Namen der zu verwendenden Abfrage, in unserem Bei – spiel „AFufo Externe Dateien/Kunden“.
  3. Weitere Anpassungen sind nicht notwendig, da die Funktionen des Unterformulars unabhängig von Feldnamen arbeiten.
  4. Speichern Sie die Änderungen und verlassen Sie den Entwurfsmodus.

Das Unterformular arbeitet mit Funktionen, die in einem Modul „modWinDialogs“ und der Klassenbibliothek „clsShellExec“ abgelegt sind. Diese beiden Objekte müssen Sie im vierten Schritt aus der Beispieldatenbank in Ihre Datenbank übertragen.

Im fünften und letzten Schritt fügen Sie das Unterformular in das Hauptformular ein:

  1. Öffnen Sie das Hauptformular im Entwurfsmodus.
  2. Ziehen Sie das dazugehörige Unterformular, hier „UF Externe Dateien/Kunden“, aus dem Datenbankfenster in das Hauptformular. Access stellt automatisch die passende Größe dafür ein.
  3. Markieren Sie das Unterformular- Steuerelement und lassen Sie das Eigenschaftenfenster anzeigen.
  4. Prüfen Sie die Einstellungen in den Eigenschaften „Verknüpfen von“ und „Verknüpfen nach“. Diese sollten bereits die korrekten Feldnamen – in unserem Beispiel „Kunden-Code“ und „Kunden-Code“ – enthalten. Bei Bedarf passen Sie die Felder entsprechend an.
  5. Speichern Sie die Änderungen und lassen Sie das Formular testweise anzeigen.

Im Hauptformular wird zunächst ein leeres Unterformular angezeigt. Die Kopfzeile enthält neben den Bezeichnungsfeldern „Stichwort“ und „Datei“ zwei Symbole. Setzen Sie den Cursor zunächst in das Feld STICHWORT und geben Sie bei spielsweise „Besuchsbericht I/2007“ oder ähnlich ein.

Klicken Sie dann auf das erste Symbol Datei AUSWÄHLEN/ZUORDNEN im Formularkopf. Über einen komfortablen Dateiauswahldialog können Sie die gewünschte externe Datei ganz einfach lokalisieren oder geben Sie Pfad und Dateiname aber manuell in das Feld DATEI ein.

Über die Liste DATEITYP im Auswahldialog können Sie die Auswahl auf verschiedene Dateigruppen wie „Office- Dateien“, „Bilder“ oder „Alle Dateien“ einschränken und Ihre Daten bestände so etwas einfacher durchsuchen.

Um eine der externen Dateien an zeigen zu lassen, setzen Sie den Cursor einfach in das Feld STICHWORT oder DATEI und klicken dann auf das Symbol DATEI ANZEIGEN im Formularkopf. Daraufhin wird die zugehörige Anwendung zusammen mit der Datei gestartet. Alternativ dazu können Sie auch direkt einen Doppel klick in das Feld STICHWORT oder DATEI ausführen.

Sollten Sie die Zuordnung einer externen Datei einmal nicht mehr benötigen, können Sie den dazugehörigen Datensatz im Unterformular wie gewohnt löschen: Wechseln Sie einfach in den betreffen – den Datensatz und wählen Sie das Menü BE AR BEITEN-DATENSATZ LÖSCHEN an. In Access 2007 wechseln Sie auf die Multifunktionsleiste „Start“ und klicken auf den Pfeil neben LÖSCHEN. An schließend wählen Sie den Eintrag DATENSATZ LÖSCHEN aus.

Häufig haben Sie die zu einem Kunden, Lieferanten oder Artikel gehörenden Dateien bereits in einem speziellen Verzeichnis auf Ihrer Festplatte gespeichert. Damit Sie in solchen Fällen nicht jede Datei einzeln aufnehmen müssen, haben wir eine Sonderfunktion „Verzeichnis ein lesen“ in die Datenbank integriert:

Wenn Sie beim Klick auf das Symbol DATEI AUSWÄHLEN/ZUORDNEN die Strg-Taste gedrückt halten, wird eine Ordnerauswahl angezeigt, über die Sie das gewünschte Verzeichnis auswählen können.

Anschließend wird für jede in diesem Verzeichnis gefundene Datei ein neuer Datensatz mit dem Stichwort „Neue Datei“ und dem jeweiligen Pfad an gelegt. Anschließend können Sie die entsprechen den Stichwörter eingeben und auf diesem Weg viel Zeit bei der Zuordnung der Dateien sparen.


 

 


 

Bild dynamisch laden

Um einen Pfad zu ermitteln, zum Beispiel von einem Foto auf der Festplatte, brauchen wir ein Modul. Gehen Sie auf Module ==> Neu und kopieren Sie den Text von dem Modul: basWinDialoge (ganz unten den grünen Text)

Speichern Sie Ihn unter den Namen „basWinDialoge“ ab.

Um ein Bild in Ihrem Formular dynamisch zu laden, erstellen Sie in der Tabelle ein Textfeld mit 200 Stellen. Nennen wir es hier Foto. Hier wird der Pfad des Bildes hineingeschrieben, wo das Bild auf der Festplatte liegt.

Erstellen Sie eine Schaltfläche mit folgendem Ereignis: 

Dim strPicName As String
strPicName = ACL_DateiOeffnen(CurDir$, „Bild laden:“)
If strPicName = „“ Then Exit Sub
Me.[Foto] = strPicName
Me.[bldFoto].Picture = strPicName
DoEvents


Für die Anzeige im Formular kommt ein Steuerelement vom Type „Bild“ mit dem Namen „bldFoto“ zum Einsatz, das in der Lage ist, verschiedene Bildformate darzustellen.

Hier die Eigenschaften von „bldFoto“:

Beim Öffnen des Formulars ruft Access die Ereignisprozedur „Bei Laden“ auf.

Ereignisprozedur:

Private Sub Form_Load()
Me.bldFoto.Picture = „“
End Sub


Beim Wechsel der Datensätze ruft Access die Ereignisprozedur „Beim Anzeigen“ auf.

Ereignisprozedur:

Dim strPicName As String
On Error Resume Next
DoCmd.Hourglass True
If Not IsNull(Me.[Foto]) Then
strPicName = Me.[Foto]
If Dir$(strPicName) <> „“ Then
Me.[bldFoto].Picture = strPicName
Else
DoCmd.Hourglass False
Me.[bldFoto].Picture = „“
DoEvents
Beep
MsgBox „Bilddatei nicht gefunden!“
End If
Else
Me.[bldFoto].Picture = „“
End If
DoCmd.Hourglass False

Zunächst prüfen wir, ob überhaupt ein Bild zugeordnet ist: IsNull(Me.[Foto])

Wenn ja, erfolgt eine Zuweisung an die Variable „strPicName“ für den einfacheren Zugriff in den folgenden Anweisungen. Über die Konstruktion If Dir$(strPicName) <> „“ stellen wir fest, ob die Bilddatei vorhanden ist. Dir$() liefert als Ergebnis eine leere Zeichenkette, wenn die Datei nicht existiert. Ist die Datei jedoch vorhanden, erfolgt eine Zuweisungdes Pfades zur Eigenschaft „Picture“ des Steuerelementes und das Bild wird angezeigt. Wurde dem aktuellen Datensatz hingegen noch kein Foto zugeordnet, oder die ehemals zugeordnete Bilddatei ist nicht mehr vorhanden, so erfolgt eine leere Zeichenkette zur Eigenschaft „Picture“. Das Steuerelement zeigt dann nichts an. Andernfalls würde es noch das Bild des vorherigen Datensatze anzeigen.


 

 

Anzeige von Feldern gezielt schützen

Datenbank

Über das Menü EXTRAS-SICHERHEIT- BENUTZER UND GRUPPENBERECHTIGUNGEN (Access 2003, 2002/XP und 2000) bzw. EXTRASZUGRIFFSRECHTEBENUTZER- UND GRUPPENBERECHTIGUNGEN (Access 97) können Sie Zugriffsrechte für einzelne Objekte wie Tabellen, Formulare oder Berichte setzen und so beispielsweise erreichen, dass Anwender sensible Daten über Formulare nicht einsehen oder nur die für sie gedachten Auswertungen abrufen können. So lässt sich z.B. für ein Formular steuern, dass es vom Anwender „Müller“ geöffnet werden darf, vom Anwender „Schmidt“ aber nicht.

Es gibt jedoch verschiedene Anwendungsbereiche, in denen dieses strikte „Ja/Nein“- Konzept nicht praktikabel ist: In einer Artikelverwaltung können beispielsweise neben den Feldern für die Basisdaten spezielle Felder vorhanden sein, über die sensible Daten wie Einkaufsrabatte, Handelspannen oder Verkaufspreise verwaltet werden. Diese Informationen müssen zwar dem Sachbearbeiter für seine tägliche Arbeit zugänglich sein, sollen aber der zur Erfassung von Wareneingängen abgestellten Aushilfe verborgen bleiben. Hier bleibt in der Regel nur der Ausweg, zwei Formulare einzusetzen. Dieser Aufwand lässt sich jedoch recht einfach vermeiden. Das grundsätzliche Konzept sieht folgendermaßen aus:

— In der Eigenschaft „Marke“ (VBA: Tag) der Felder und Steuerelemente Ihres Formulars geben Sie eine Liste der Anwender vor, die die einzelnen Felder bearbeiten dürfen. Also zum Beispiel:

;Admin;Müller;Schmidt;

— Beim Laden des Formulars wird eine Funktion ausgeführt, die zunächst den aktuellen Anwendernamen wie zum Beispiel „Schmidt“ ermittelt.

— In einer Schleife werden dann alle Felder und Steuerelemente des Formulars geprüft: Befindet sich der Name des aktuellen Anwenders nicht in der Eigenschaft „Marke“, wird das entsprechende Feld oder Steuerelement ausgeblendet. Das Ergebnis ist dann ein Formular, das nur die Felder anzeigt, die für den jeweiligen Anwender bestimmt sind.

Um eine solche Lösung in Ihrer Datenbank einzusetzen, gehen Sie wie folgt vor:

1. Wir haben für Sie eine Beispieldatenbank vorbereitet, in der wir diese Technik bereits umgesetzt haben.

Übertragen Sie das Modul „modSecureForms“ aus der Beispieldatei in Ihre Datenbank.

2. Öffnen Sie das Formular im Entwurfsmodus.

3. Versehen Sie zunächst alle Felder und Steuerelemente mit der oben erwähnten „Namensliste“.

Bitte achten Sie darauf, dass sowohl am Anfang als auch am Ende sowie zwischen den Namen jeweils ein Semikolon angegeben ist. Andernfalls kann ein Name eventuell nicht korrekt erkannt werden. Außerdem müssen Sie darauf achten, dass auch Bezeichnungsfelder von Textfeldern und anderen Steuerelementen über die Eigenschaft „Marke“ zu kennzeichnen sind. Bei allgemeingültigen Steuerelementen wie z. B. einer Formularbezeichnung im Formularkopf oder Schaltflächen im Formularfuß lassen Sie die Eigenschaft „Marke“ einfach leer.

 

4. Stellen Sie die Eigenschaft „Beim Laden“ des Formulars auf den Eintrag „[Ereignisprozedur]“ ein, klicken Sie auf die Schaltfläche mit den drei Punkten und geben Sie die folgende Anweisung ein:

Private Sub Form_Load()
FelderEinAus Me, btnFertig
End Sub

Diese Anweisung ruft die Prozedur „Felder- EinAus“ im Modul „modSecureForms“ auf. Als Parameter sind einmal eine Referenz auf das zu behandelnde Formular sowie ein Steuerelement des Formulars anzugeben, das nicht ausgeblendet wird.

Da Access beim Öffnen eines Formulars den Fokus immer auf das erste Textfeld im Formular setzt, dieses aber eventuell ausgeblendet werden muss, wird der Fokus zum Beispiel auf eine Schaltfläche „btnFertig“ gesetzt, um einen Laufzeitfehler beim Ausblenden eines aktivierten Feldes zu vermeiden.

Die Prozedur „FelderEinAus“ arbeitet wie folgt:

Sub FelderEinAus(F As Form, C As Control)
Dim strUser As String
Dim ctl As Control
C.SetFocus

Hier wird zunächst der Fokus aus den eben erläuterten Gründen zum Beispiel auf eine Schaltfläche „btnFertig“ gesetzt, die als Parameter „C“ übergeben wurde.

strUser = CurrentUser()

Über die Funktion „CurrentUser()“ ermitteln wir den Anmeldenamen des aktuellen Anwenders.

For Each ctl In F.Controls
If ctl.Tag <> „“ Then
ctl.Visible = (InStr(ctl.Tag, „;“ & strUser & „;“) <> 0)
End If
Next
End Sub

In einer Schleife werden dann alle Felder und Steuerelemente des Formulars mithilfe der Funktion „InStr()“ daraufhin geprüft, ob der aktuelle Anmeldename (mit führendem und abschließendem Semikolon) in der Eigenschaft „Marke“ enthalten ist. Das Ergebnis der Prüfung weisen wir direkt der Eigenschaft „Visible“ (sichtbar) des jeweiligen Feldes oder Steuerelementes zu, sodass Felder, bei denen der aktuelle Name nicht in „Marke“ vermerkt ist, ausgeblendet werden.

Sichern Sie die Änderungen und lassen Sie das Formular anzeigen.Wie gewünscht werden daraufhin nur noch die erlaubten Steuerelemente für den aktuellen Anwender sichtbar sein.

Bitte beachten Sie, dass diese Maßnahme alleine natürlich keinen 100 %-igen Schutz darstellt. Gleichzeitig sollten Sie beispielsweise den Entwurfsmodus für das Formular über das Menü EXTRAS-SICHERHEITBENUTZER- UND GRUPPENBERECHTIGUNGEN (Access 2003, 2002/XP und 2000) oder EXTRAS-ZUGRIFFSRECHTE-BENUTZER- UND GRUPPENBERECHTIGUNGEN (Access 97) für „normale“ Anwender sperren oder die Datenblattansicht in der Eigenschaft „Zugelassene Ansicht(en)“ des Formulars deaktivieren.


 

Angemeldete User auslesen (2)

Datenbank

Damit Sie Wartungsarbeiten oder Änderungen an einer gemeinsam genutzten Datenbank vornehmen können, müssen alle Anwender ihre Arbeit mit der Datenbank beenden.

Für diesen Zweck müssen Sie wissen, welche Anwender momentan mit der Datenbank arbeiten. Hilfreich wäre in diesem Fall also eine Liste der Anwender, die die Datenbank derzeit benutzen. Diese Liste sollte auch den Namen der Rechner enthalten, an denen sich die jeweiligen Anwender angemeldet haben, da es auch beispielsweise vorkommen kann, dass Anwender auf mehreren Rechnern gleichzeitig angemeldet sind.

Microsoft hat für diesen Zweck in ADO beziehungsweise OLE DB eine Funktion vorgesehen, die als so genanntes „Schema“ realisiert ist. Einfach ausgedrückt können Sie anhand einer Schema-ID weitergehende Informationen vom OLE – DB-Provider anfordern, die dieser dann als Schema in Form eines Recordsets liefert.

Um diese Auflistung in einer Access- Datenbank abzurufen, verwenden Sie die VBA-Funktion „AngemeldeteAnwender()“, die eine Werteliste als Ergebnis liefert, die einer Liste im Formular zugrunde gelegt werden kann. Anhand dieser Informationen können Sie die aktiven Anwender kontaktieren und sie da – rum bitten, die Arbeit mit der Datenbank zu beenden.

Werfen wir einen Blick auf die Arbeitsweise der Funktion „AngemeldeteAnwender()“:

Function AngemeldeteAnwender() As String
Dim cnn As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strListe As String

Set cnn = CurrentProject.Connection
Set rs = cnn.OpenSchema(adSchemaProviderSpecific, , _
„{947BB102-5D43-11D1-BDBF-00C04FB92675}“)

Der Abruf von Schemata erfolgt über die „OpenSchema“-Methode des „Connection“-Objektes.

Dazu weisen Sie zu nächst der Objektvariable „cnn“ die aktuelle Verbindung der Datenbank über „CurrentProject“ zu.

„cnn.OpenSchema“ liefert dann das über die Schema-ID „{947BB102-5D43- 11D1-BDBF-00C04FB92675}“ spezifizierte Recordset als Ergebnis (Schema- IDs sind in der Dokumentation des jeweiligen OLE-DB-Providers aufgelistet).

strListe = „“
While Not rs.EOF ‚Feldinhalte ausgeben
strListe = strListe & _
VBAStr(rs.Fields(1).Value) & _
“ (“ & _
VBAStr(rs.Fields(0).Value) & „);“
rs.MoveNext
Wend

AngemeldeteAnwender = Left$(strListe, Len(strListe) – 1)

End Function

Das Recordset gibt im ersten Feld über den Rechnernamen und im zweiten Feld über den Anwendernamen Auskunft.

Diese Informationen setzen wir zu einer Zeile der Form „Anwendername (Rechnername)“ zusammen. Die Hilfsfunktion „VBAStr()“ konvertiert dabei einen nullterminierten C-String in eine VBA-Zeichenkette.

Um die Lösung in Ihren Datenbanken zu nutzen, übertragen Sie einfach das Modul „modAngAnw“ und das Formular „Angemeldete Anwender anzeigen“ aus der Beispieldatenbank in Ihre Anwendung.


 

Angemeldete User auslesen (1)

Datenbank

Wenn Sie eine Datenbank im Netzwerk einsetzen und Wartungs- oder Reparaturarbeiten anstehen, ergibt sich immer wieder das Problem, dass Anwender momentan noch mit der Datenbank arbeiten. Solange das der Fall ist, erlaubt Access die Ausführung bestimmter Funktionen wie der Komprimierung nicht. Hilfreich wäre in diesem Fall eine Liste der User und Rechner, die die Datenbank zur Zeit benutzen. Microsoft hat deshalb in ADO bzw. OLE DB eine Möglichkeit vorgesehen, die aktuell mit einer Datenbank arbeitenden Anwender aufzulisten.

Diese Funktion ist als so genanntes „Schema“ realisiert. Einfach ausgedrückt, können Sie anhand einer „Schema-ID“ weiter gehende Informationen vom OLE DB-Provider abrufen, die dieser dann als Schema in Form eines Recordsets liefert.

Um diese Auflistung in einer Access- Datenbank abzurufen, reicht eine kleine VBA-Routine, die das Ergebnis im Direktfenster über „Debug.Print“ ausgibt.

Anhand dieser Informationen können Sie die noch aktiven User dann kontaktieren und sie darum bitten, die Arbeit mit der Datenbank zu beenden:

Function UserListAsString() As String
Dim cnn As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strListe As String

Set cnn = CurrentProject.Connection
Set rs = cnn.OpenSchema(adSchemaProviderSpecific, , _
„{947BB102-5D43-11D1-BDBF-00C04FB92675}“)

Der Abruf von Schemata erfolgt über die „OpenSchema“-Methode des „Connection“- Objektes. Dazu weisen Sie zunächst der Objektvariable „cn“ die aktuelle Verbindung der Datenbank über „Current- Project“ zu. „cn.OpenSchema“ liefert dann den über die Schema-ID „{947BB- 102-5D43-11D1-BDBF-00C04FB92675}“ spezifizierten Recordset als Ergebnis (Schema-IDs sind in der Dokumentation des jeweiligen OLE DB-Providers aufgelistet).

While Not rs.EOF ‚Feldinhalte ausgeben
Debug.Print „Rechner: “ & rs.Fields(0).Value
Debug.Print „User: “ & rs.Fields(1).Value
Debug.Print String$(50, „-„)
rs.MoveNext
Wend

Dieser Recordset gibt im ersten Feld über den Rechnernamen und im zweiten Feld über den Usernamen Auskunft. Diese Informationen schreiben Sie hier pro User durch eine Linie getrennt in das Direktfenster.

Bei Bedarf öffnen Sie nun einfach mit Strg+G das Direktfenster, geben

? Userlist()

ein und können sofort sehen, welche User momentan mit der betreffenden Datenbank arbeiten.


Angemeldete Anwender anzeigen

Wenn Sie regelmäßig eine Übersicht der angemeldeten Anwender benötigen, ist der Abruf der Liste über das Direktfenster zu umständlich. Nutzen Sie stattdessen ein Formular und ein Listen-Steuerelement, dessen Eigenschaft „Herkunftstyp“ auf „Werteliste“ eingestellt ist. Die für die Werteliste als „Datenlieferant“ verwendete Funktion „UserListAsString()“ finden Sie ebenfalls fertig vorbereitet im Modul „modUserlist“.

In der Ereignisprozedur „Beim Laden“ eines Formulars wird diese Liste wie folgt initialisiert:

Me.IstAngAnw.RowSource = UserListAsString()

Damit die Liste später bei Bedarf aktualisiert werden kann, ist eine entsprechende Schaltfläche AKTUALISIEREN vorhanden, deren Ereignisprozedur „Beim Klicken“ diese Initialisierung mit genau derselben Anweisung wiederholt.


Akuelles Feld farblich hervorheben

Frage:

Wir verwenden für die Erfassung und Bearbeitung unserer Daten umfangreiche Formulare und es würde uns helfen, wenn das Feld, in dem sich der Cursor befindet, in farbig erscheint. Gibt es dafür eine Lösung?

 

Lösung

Markieren Sie der Reihe nach die Textfelder und wählen Sie FORMATBEDINGTE FORMATIERUNG an (bis Access 2003) bzw. klicken Sie unter „Formularentwurfstools/ Entwurf“ in der Gruppe „Schriftart“ auf BEDINGT (Access 2007) bzw. unter „Formularentwurfstools/Format“ in der Gruppe „Steuerelementeformatierung“ auf BEDINGTE FORMATIERUNG und dann auf NEUES FELD (Access 2010). Im nachfolgenden Dialog stellen Sie als Bedingung „Feld hat Fokus“ ein und wählen die gewünschte Hintergrundfarbe. Mit einem Klick auf OK übernehmen Sie die Einstellungen. In Access 2010 klicken Sie nochmals auf OK, um die Regelverwaltung zu schließen.

Zufällige Datensätze von gesamten Datenbestand

Zufallzahlen kann man in Access mit dem Befehl ZZG generieren. Der Wertebereich liegt zwischen 0 und 1.
In der Abfrage sieht das dann so aus:

Wie viele Datensätze angezeigt werden sollen, wir in der Symbolleiste mit dem Symbol „Hohe Werte“ angegeben.

Das Problem ist nur, wenn Sie Access neu starten, kommen die gleichen Datensätze immer wieder. Grund dafür ist, dass der Zufallszahlengenerator vorher nicht initialisiert wird. Das ist im Rahmen einer Abfrage mit herkömmlichen Mitteln auch nicht möglich. Erstellen Sie Ihre eigene Funktion in einem Access-Modul, das Sie mit der Schaltfläche NEU im Datenbankregister MODULE anlegen können. Der Funktionscode ist recht simpel:

Function Zufallszahl
(intDummywert As Integer) As Single
Randomize
Zufallszahl = Rnd(intDummywert)
End Function

Da „Rnd“ lediglich die VBA-Entsprechung der Funktion „ZZG“ ist, besteht der einzige Unterschied darin, dass zuvor die Anweisung „Randomize“ aufgerufen wird. Sie sorgt für die gewünschte Initialisierung des Zufallszahlengenerators, sodass das Ergebnis auch nach einem Neustart der Datenbank willkürlich ist.

Die Abfrage sieht nun so aus:

Da die Funktion im Modul „Zufallszahl“ benannt wurde, muss im Feld in der Abfrage ebenfalls der Befehl Zufallszahl genannt werden.

Wochentage als Abfragekriterium verwenden

In einer Datenbank haben Sie beispielsweise die täglichen Arbeitszeiten von Mitarbeitern erfasst. Für die Abrechnungskontrolle soll eine Abfrage eingesetzt werden, die die Arbeitszeiten für einen bestimmten Tag wie Freitag, Samstag, Sonntag usw. auflistet.

Dazu verwenden Sie die Funktion »Wochentag() « (VBA: »WeekDay«).
Möchten Sie beispielsweise alle Datensätze ermitteln, die auf einen Freitag fallen, sieht das Kriterium zum Beispiel so aus:

Wochentag([Datumsfeld])=6

Sollen nur Datensätze ermittelt werden, die auf einen Samstag oder Sonntag fallen, setzen Sie folgendes Kriterium ein:

Wochentag([Datumsfeld])=1 Oder
Wochentag([Datumsfeld])=7

Umalle Datensätze zu selektieren, die nicht auf einen Freitag, Samstag oder Sonntag fallen, setzen Sie dieses Kriterium ein:

Wochentag([Datumsfeld])<>6 Und
Wochentag([Datumsfeld])<>7 Und
Wochentag([Datumsfeld])<>1

Hier die Zuordnung der Wochentage und der numerischen Werte:

  • 1 – Sonntag

  • 2 – Montag

  • 3 – Dienstag

  • 4 – Mittwoch

  • 5 – Donnerstag

  • 6 – Freitag

  • 7 – Samstag