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

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 2/2001.

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

Laufende Programme entdecken

Manchmal möchte man wissen, welche anderen Programme neben der Access-Anwendung laufen. Das kann z. B. interessant sein, wenn Sie von Access aus ein Word-Dokument anlegen möchten und nicht wissen, ob Sie Word zunächst starten müssen oder ob es bereits läuft.

Das lässt sich mit einer VBA-Funktion leicht realisieren. Die Prozedur überprüft nacheinander alle geöffneten Fenster auf ihren Titel. Dazu müssen Sie natürlich wissen, welchen Titel die gewünschte Anwendung in der Titelleiste bzw. in der Taskleiste verwendet.

Verwendung von API-Funktionen

Die VBA-Funktion greift auf drei API-Funktionen zu, die Sie zunächst in einem neuen Modul deklarieren müssen. Zusätzlich zu den drei Funktionen deklarieren Sie drei Konstanten, die später in der Funktion Verwendung finden:

Public Const GW_HWNDFIRST = 0

Public Const GW_OWNER = 4

Public Const GW_HWNDNEXT = 2

Anschließend folgt die Deklaration der API-Funktionen (Quelltext 1):

Quelltext 1

Schließlich erstellen Sie die Funktion, mit der Sie überprüfen wollen, ob ein Anwendungsfenster mit einem bestimmten Namen vorhanden ist.

Die Funktion ermittelt zunächst das Handle des aktuellen Access-Fensters. Ausgehend hiervon durchläuft sie anschließend alle weiteren vorhandenen Fenster. Dabei dient die API-Funktion zur Ermittlung des Fenstertitels. Dann überprüft die Funktion, ob es sich um ein Hauptfenster handelt und ob es sichtbar ist. Ist das der Fall, vergleicht die Funktion den gefundenen mit dem gesuchten Fenstertitel.

Wenn die Funktion den gesuchten Fenstertitel findet, gibt Sie einen Wert zurück, der unglcich 0 ist.

Abb. 1: Entwurfsansicht des Formulars zum Suchen einer Anwendung

Formular zur Fenstersuche

Erstellen Sie nun ein kleines Formular, in das Sie den Namen des gewünschten Fensters einfügen können. Speichern Sie das Formular unter dem Namen frmFensterSuchen und öffnen Sie es in der Entwurfsansicht.

Fügen Sie dem Formular ein Testfeld zur Eingabe des gesuchten Fenstertitels hinzu und nennen Sie es txtFenstertitel. Außerdem benötigen Sie eine Schaltfläche, mit der Sie den Suchvorgang auslösen können (Abb. 1).

Quelltext 2

Bezeichnen Sie die Schaltfläche mit dem Namen btnFensterSuchen und hinterlegen Sie für seine Ereigniseigenschaft Beim Klicken die Prozedur aus Quelltext 3. Anschließend können Sie das

Formular in der Formularansicht anzeigen und ausprobieren (s. Abb. 2).

Mit Jokern zum Ziel

Beachten Sie bitte, dass Sie die auch in Abfragen möglichen Platzhalter, z. B. Sternchen (*) oder

Abb. 2: Das Suchen einer Anwendung

Fragezeichen (?) verwenden können und - wahrscheinlich - auch müssen. Denn wenn Sie z. B. eine aktive Word-Anwendung auf die hier vorge-

Quelltext 3

stellte Art erkennen wollen, wissen Sie beispielsweise nicht, ob es sich um Word 97 oder Word 2000 handelt. Und während Word 97 im Titelleistentext beispielsweise den Anwendungsnamen einem eventuell geöffneten Dokument voranstellt, ist das bei Office 2000 genau andersherum. Hier sollten Sie also z. B. mit dem Ausdruck *Microsoft Word* arbeiten, um beide Versionen zu erkennen.

Tabellendaten an Feld übergeben

Der Zugriff auf die Daten einer Tabelle ist meist ausreichend schnell. Manchmal erfordert die bessere Handhabe oder der Wunsch nach einer noch höheren Geschwindigkeit allerdings eine Alternative.

Gerade wenn Sie gar nicht alle Daten, sondern nur einige wenige Felder einer Tabelle oder einer Abfrage benötigen, empfiehlt sich die Verwendung eines Feldes. Ein Feld hat den Datentyp Variant und kann mit der GetRows-Methode gefüllt werden.

Die GetRows-Methode

Die GetRows-Methode dient zum Füllen eines Feldes vom Typ Variant mit den Feldern einer Tabelle. Dabei ist die Wahl der Einzahl beim Variantfeld durchaus beabsichtigt, da es sich hier tatsächlich um ein zweidimensionales Feld handelt, während man bei der Tabelle, aus der die Daten stammen, aus mehreren Feldern mit eigenem Feldbezeichner auswählt.

GetRows ist eine Methode des Recordset-Objektes, die als einzigen Parameter die Anzahl der zu übergebenden Datensätze hat. Die folgende Beispielprozedur (Quelltext 4) zeigt anschaulich die Verwendung der Methode.

Quelltext 4

Nach dem Deklarationsteil erstellt die Prozedur zunächst ein Recordset-Objekt mit den Feldern Artikelname und Liefereinheit. Anschließend zählt sie die Datensätze des Recordset und fügt sie mit der GetRows-Methode in das Variantfeld Feld ein. Um die Funktionalität zu überprüfen, gibt die Prozedur alle Daten des Feldes im Testfenster aus.

Zufallszahlen ermitteln mit der Rnd-Funktion

Access stellt eine spezielle Funktion zum Ermitteln von Zufallszahlen zur Verfügung. Die Funktion heißt Rnd. Mit ihr können Sie Zufallszahlen ermitteln, deren Wert zwischen 0 und 1 liegen. Dabei gibt es nur zwei Probleme: Erstens gibt es nur wenige Fälle, in denen wirklich nur die Zahlen von 0 bis 1 gefragt sind. Und zweitens handelt es sich gar nicht wirklich um Zufallszahlen - es handelt es sich nur um eine bestimmte Reihe von Zahlen, von denen die erste von einem bestimmten Startwert abhängt.

Das können Sie ganz leicht selbst ausprobieren: Öffnen Sie eine Access-Datenbank und aktivieren Sie das Testfenster. Geben Sie den Befehl

? Rnd

ein und merken Sie sich die ausgegebene Zufallszahl. Wenn Sie die Datenbank anschließend erneut öffnen und den Vorgang wiederholen, ergibt die Funktion genau den selben Wert.

Variation des Startwertes

Den Startwert können Sie verändern, indem Sie die Funktion Randomize ausführen. Die Funktion Randomize hat nur einen Parameter, dem Sie einen beliebigen numerischen Ausdruck zuordnen können. Wenn Sie keinen Wert für den Parameter angeben, verwendet Access automatisch den Systemzeitgeber als Parameter. Dadurch ist die Wahl ein und desselben Startwertes für zwei aufeinanderfolgende Aufrufe der Rnd-Funktion sehr unwahrscheinlich.

Bereich der Zufallszahlen festlegen

Bleibt noch das Problem mit dem Zufallszahlenbereich. Wenn Sie sich im Klaren über den gewünschten Zufallszahlenbereich sind, können Sie die Ermittlung der gewünschten Zufallszahlen mit einer kleinen Funktion realisieren. Schauen Sie sich dazu Quelltext 5 an.

Quelltext 5

Nach dem Initialisieren des Zufallszahlengenerators dient eine einzige Anweisung zur Ermittlung der gewünschten Zufallszahl. In der inneren Klammer ermittelt der Ausdruck

ObereGrenze - UntereGrenze + 1

die Intervallgröße zwischen der kleinsten und der größten Zahl. Diesen Wert multipliziert man schließlich mit der Rnd-Funktion und addiert die untere Bereichsgrenze wieder hinzu.

Datensatz per Zufall auswählen lassen

Es kann manchmal nützlich sein, einen Datensatz per Zufall auszuwählen. Viele Anwendungen zeigen z. B. beim Start ein Fenster mit einem Tipp des Tages an, den die Anwendung jedes Mal per Zufallsfunktion auswählt. Vielleicht möchten Sie auch stichprobenartig Kundendaten überprüfen und die Auswahl der betroffenen Kunden automatisieren. In dem Fall hilft Ihnen die im Folgenden vorgestellte Funktion.

Das Problem gelöschter Datensätze

Normalerweise sollte man eine solche Funktion problemlos erstellen können. Man ermittelt die Anzahl der Datensätze, lässt sich einen Zufallswert ausgeben, der zwischen dem ersten und dem letzten Datensatz liegt und sucht den Datensatz mit der entsprechenden Datensatznummer. Leider funktioniert das nur, wenn man mit Autowerten arbeitet und vom Anlegen des ersten Datensatzes an nicht einen Datensatz gelöscht hat oder wenn man die Datensätze selbst nummeriert und dabei konsequent vorgeht. Anderenfalls kann es leicht passieren, dass per Zufall genau ein Wert ermittelt wird, zu dem kein Datensatz vorliegt.

Rettung durch AbsolutePosition

Die Lösung des Problems erfolgt mit der Eigenschaft AbsolutePosition des Recordset-Objektes. Dabei handelt es sich um eine - nicht mit dem Primärindex zu verwechselnde - Datensatznummer, die jedem Datensatz eines Recordsets zugewiesen wird. Hierbei spielt es keine Rolle, ob Sie die Datensatzgruppe per VBA oder als Datenherkunft eines Formulars angelegt haben. In einem Formular ist die Datensatznummer in der Navigationsleiste abzulesen - sofern Sie seine Anzeige nicht deaktiviert haben. Die Nummerierung der Datensätze beginnt immer bei eins und wird für jeden weiteren Datensatz inkrementell um eins erhöht.

Die folgende Funktion ermittelt zunächst die Anzahl der Datensätze. Anschließend ermittelt sie mit der Randomize-Funktion einen Startwert für die RND-Funktion, die zur Ermittlung der Zufallszahlen dient.

Nun setzt die Funktion den Datensatzzeiger über die AbsolutePosition-Eigenschaft auf den Datensatz mit der ausgewählten Datensatznummer. Für den ausgewählten Datensatz ermittelt die Funktion schließlich den Wert des Autowertfeldes (Quelltext 6).



Quelltext 6

Primärschlüsselfeld einer Tabelle finden

Wenn Sie die Funktion aus dem vorherigen Tipp oft anwenden, können Sie die Sache weiter vereinfachen. Sie können z. B. die Ermittlung des Primärindexfeldes automatisieren und anstatt zweier Parameter (Tabellenname und Name des Primärindexfeldes) nur noch den Namen der gewünschten Tabelle eingeben.

Verwendung der Index-Eigenschaft

Dazu benötigen Sie eine Funktion, die den Primärindex einer Tabelle ermittelt. Ob ein Feld einer Tabelle ein Primärindex ist, legen die Eigenschaften des Objekts Index fest. Für den vorliegenden Fall ist vor allem die Eigenschaft Primary wichtig. Falls die Eigenschaft den Wert True hat, handelt es sich bei dem Feld um ein Primärindexfeld.

Quelltext 7

Die weiter unten vorgestellte Funktion bedient sich der folgenden Objekte:

Das TableDef-Objekt beinhaltet alle Informationen über eine Tabelle. Die Gesamtheit aller TableDef-Objekte ist die TableDefs-Auflistung. Um eines der TableDef-Objekte der TableDefs-Auflistung anzusprechen, können Sie beispielsweise den Tabellennamen (TableDefs("Tabellenname")) oder auch den laufenden Index (TableDefs(1)) verwenden.

So wie jedes Datenbankobjekt eine TableDefs-Auflistung aufweist, verfügt jedes einzelne TableDef-Objekt über eine Indexes-Auflistung. Die Indexes-Auflistung wiederum enthält alle Index-Objekte der Tabelle zur Beschreibung der einzelnen Tabellenfelder. Die Index-Objekte können Sie analog zu den TableDef-Objekten entweder über den Namen oder den Index ansprechen.

Die Funktion macht sich die genannten Auflistungen zunutze. Sie ermittelt zunächst das TableDef-Objekt mit dem angegebenen Namen. Anschließend findet es die Primärindizes und ermittelt den Namen des entsprechenden Feldes (siehe Quelltext 7).

Wenn Sie die Funktion nun im Testfenster mit einem entsprechenden Befehl aufrufen, ermittelt sie den Primärindex der gewünschten Tabelle.

Abb. 3: Den Primärindex im Testfenster suchen

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:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.