So fügen Sie Ihrem Access-Datenbankformular eine Suchschaltfläche hinzu

Ich benutze MS Access (noch Windows Version 2003) um meine wichtigen Listen zu verwalten, wie zum Beispiel meine Inventarliste für meinen eBay-Shop. Ich handele hauptsächlich mit einzigartigen Waren, daher habe ich im Laufe der Zeit über tausend Angebote. Das ist eine Menge, um den Überblick zu behalten.

Ich brauchte eine gute Möglichkeit, Artikel in verschiedenen Bereichen zu suchen und zu finden. Du kannst den … benutzen „[control] + f“ Tastaturkürzel, oder Sie können das Menü Bearbeiten | Suchen verwenden, um zu suchen, aber Greifen Sie auf die Standardwerte zu, um das gesamte Feld abzugleichen, und Sie müssen es ändern, wenn Sie etwas anderes möchten. Ich möchte normalerweise nicht das gesamte Feld abgleichen. I Normalerweise möchten Sie einen beliebigen Teil des Felds abgleichen.

Einige Leute verwenden gerne Tastaturkürzel. Ich bin eher ein Mausmensch, wenn es eine Ein-Klick-Möglichkeit gibt, etwas zu tun. Wenn es nur einen Weg mit vielen Klicks gibt, der durch Menüs geht, sogar mit nur zwei Klicks wie Bearbeiten | Finden, dann werde ich meist auf Pressen zurückgreifen [control] + f. Aber in diesem Artikel geht es nicht darum, ob eine Methode besser ist als eine andere; In diesem Artikel geht es darum, eine andere Möglichkeit zum Suchen mithilfe eines Access-Datenbankformulars anzubieten.

Also habe ich ein kleines Tastensystem entwickelt, das ich verwende, um Artikel in einem bestimmten Feld zu finden. Ich habe die Schaltfläche rechts neben das Feld gesetzt, auf dem es funktioniert. Ich kann mit einem Klick zum Suchdialogfeld gelangen, das so eingerichtet ist, wie ich es möchte.

Ich füge die Schaltfläche im Formulardesign mit dem Schaltflächenwerkzeug hinzu. Wenn Sie die Datensatznavigation | Find Record action (eine logische Wahl), dann gibt Ihnen der Assistent den folgenden Code (wir werden den Code später ändern):

Screen.PreviousControl.SetFocus

DoCmd.DoMenuItem acFormBar, acEditMenu, 10,, acMenuVer70

Die erste Zeile Screen.PreviousControl.SetFocus ist nett. Es setzt den Fokus dessen, welches Feld durchsucht wird, auf das zuletzt berührte Feld. Auf diese Weise könnten Sie eine Schaltfläche für alle Suchen haben, aber Sie müssen zuerst auf ein Feld und dann auf die Schaltfläche klicken. Das sind zwei Klicks und nicht jeder Benutzer wird verstehen, wie es funktioniert.

Die zweite Zeile, DoMenuItem, ist für jede Version von Access spezifisch und bedeutet in diesem Fall das zehnte Element im Menü Bearbeiten. Sie müssten dies für jede Version von Access ändern.

Wenn Sie die Datensatznavigation | Stattdessen gibt Ihnen der Assistent den folgenden Code:

Screen.PreviousControl.SetFocus

DoCmd.FindNext

FindNext ist besser als DoMenuItem, da Sie den Code nicht für jede Version von Access ändern müssen. Das Dialogfeld, das angezeigt wird, wenn Sie in diesem Artikel auf die benutzerdefinierte Schaltfläche klicken, verfügt über eine Schaltfläche „Weitersuchen“, sodass Sie wirklich nicht die beiden Schaltflächen „Suchen“ und „Weitersuchen“ benötigen. Finden allein wird gut tun.

Die Codierung des Zugriffsassistenten ist in Ordnung, aber Sie haben keine Kontrolle über die Parameter für die Suche. Ich mag es nicht, die Streichholzschachtel vom ganzen Feld auf einen Teil des Feldes zu setzen, nachdem ich es vergessen habe, und ich habe bereits mit dem ganzen Feld gesucht und kann nicht finden, was ich weiß, dass es dort sein muss.

Ich brauchte eine Möglichkeit, jedes Feld mit einem Klick zu durchsuchen, also wählte ich eine Schaltfläche, um dies zu tun.

Ich habe mehrere Felder, in denen ich suchen können möchte. Ich wollte nicht für jedes Feld denselben Code schreiben. Wenn ich einen besseren Weg finde, es zu codieren, muss ich jede Instanz dieses alten Codes neu codieren. Ein Verfahren zu haben ist viel besser.

Meine Schaltfläche setzt den Fokus der Suche auf das eine Feld links von der Schaltfläche und ruft dann eine Prozedur auf, um den Suchbefehl aufzurufen. Jede dieser Schaltflächen auf dem Formular setzt den Fokus auf das Feld links davon und ruft dieselbe Funktion auf, um die Suche durchzuführen.

Bevor ich zum Code komme, muss ich das Konzept behandeln, dass es wichtig ist, wo Sie die Prozedur platzieren. Wenn Sie viele Schaltflächen, aber nur ein Formular haben, können Sie die Prozedur im Code für das Formular selbst hinzufügen. Wenn Sie mehr als ein Formular haben oder das Verfahren allgemeiner gestalten möchten, falls Sie es später in einem anderen Formular verwenden müssen, fügen Sie dieses Verfahren am besten einem Modul und nicht Ihren Formularen hinzu. Ich nenne mein Modul Allgemein, aber Sie könnten separate Module mit einer oder mehreren verwandten Prozeduren hinzufügen, sodass Sie sie bei Bedarf einfach in neue Datenbanken importieren können. Dies könnte Ihr FindRecord-Modul sein. Sie finden Module im Hauptdatenbankfenster zusammen mit Tabellen, Abfragen, Formularen, Berichten und Makros.

Wenn Sie Ihr Verfahren in Ihren Formularcode einfügen, gilt der Geltungsbereich Ihres Verfahrens nur für dieses Formular. Wenn Sie Ihre Prozedur in Form 1 haben und sie in Form 2 aufrufen müssen, erhalten Sie eine Fehlermeldung, weil Form 2 sie nicht finden kann. In diesem Fall müssten Sie entweder eine weitere Prozedur zu Formular 2 hinzufügen und zwei Prozeduren pflegen, oder besser, die Prozedur in ein Modul packen, damit beide Formulare sie finden können und Sie nur eine Prozedur pflegen müssen.

Sobald Sie ein allgemeines Modul verwenden, müssen Ihre Codereferenzen ebenfalls allgemein sein. Sie können die Me-Verknüpfung nicht für einen Feldnamen verwenden, wie Sie dies in einer Prozedur innerhalb eines Formulars tun können. Wenn sich eine Prozedur in einem Formular befindet, interpretiert der Code Me so, dass es sich auf das Formular bezieht.

Wenn Sie in einem allgemeinen Modul auf einen Feldnamen verweisen müssen, müssen Sie eine allgemeine Anweisung verwenden, z. B.:

Forms.frmInventory.PurchaseTotal

oder

Formen![frmInventory]![PurchaseTotal]

(Sie müssen Klammern hinzufügen, wenn die Namen Leerzeichen enthalten)

Hier ist PurchaseTotal ein Feldname im frmInventory-Formular in der Forms Access-Datenbanksammlung. Wenn dies im frmInventory-Code wäre, wäre es nur:

Me.PurchaseTotal

In unserem Fall verwenden wir die Me in der OnClick-Eigenschaft im Formular, um den Fokus mithilfe der Me-Methode auf ein bestimmtes Feld zu setzen, und rufen dann eine Prozedur auf, die nicht auf einen Feldnamen verweisen muss, wodurch das Me-Problem umgangen wird.

So erstellen Sie eine praktische Suchschaltfläche:

* Erstellen Sie eine Schaltfläche mit dem Schaltflächenwerkzeug und seinem Assistenten.
* Stellen Sie die Schaltfläche so ein, dass Text angezeigt wird, und setzen Sie diesen Text auf F.
* Benennen Sie die Schaltfläche cmdFind + Feldname, um also ein Feld namens InvNum zu finden, wäre der Name cmdFindInvNum.

Bearbeiten Sie nach Abschluss des Assistenten die Schaltfläche:

* Stellen Sie die Schriftgröße auf 6 ein, eine kleine, aber lesbare Größe.
* Setzen Sie den Tabstopp auf NEIN, da Benutzer nicht an der Schaltfläche anhalten müssen, wenn sie mit der Tabulatortaste durch das Formular navigieren.
* Setzen Sie den Statusleistentext und den ControlTip-Text auf Datensatz suchen, damit Benutzer sich leicht daran erinnern können, was die Schaltfläche bewirkt, wenn sie ihren Mauszeiger über Ihre Schaltfläche halten.

Verkleinern Sie Ihre Schaltfläche so klein wie möglich, damit Sie das F immer noch sehen können. Ich verwende 0,1708 Zoll Breite und 0,166 Zoll Höhe mit Arial-Text mit meinem Formularrasterabstand. Ihre Größe kann variieren. Dies ist eine gute Größe, da ihre Höhe der Höhe meines Textes und meiner Kombinationsfelder entspricht, sodass sie alle gut in jede Zeile passen.

(Nachdem Sie auf diese Weise eine Schaltfläche erstellt haben, können Sie sie für alle anderen Schaltflächen kopieren und einfügen, wobei alle diese Einstellungen gespeichert und in der Kopie festgelegt werden. Sie müssen lediglich den Namen jeder Schaltfläche ändern und hinzufügen die OnClick-Ereignisprozedur unten.)

Jetzt setzen Sie die OnClick-Eigenschaft auf [Event Procedure]. Sie stellen die Ereignisprozedur so ein, dass sie auf ein bestimmtes Feld einwirkt. Wenn der Feldname ProductNumber ist, schreiben Sie Ihre Ereignisprozedur wie folgt:

Me.ProductNumber.SetFocus

Datensatz finden

Die erste Zeile, die SetFocus-Aktion bestimmt, welches Feld Ihre Prozedur durchsucht, und die Me.Productumber gibt nur einen Feldnamen an. Wenn Sie Screen.PreviousControl.SetFocus verwenden, wie es der Assistent empfiehlt, für Ihre erste Zeile, dann suchen Sie in dem Feld, das Sie zuletzt mit Ihrer Maus berührt haben. Das ist schön, wenn Sie das wollen, aber ich möchte nicht, dass diese Schaltfläche funktioniert.

Die zweite Zeile, FindRecord, ruft Ihre benutzerdefinierte Prozedur auf. (In Windows. Nachdem Sie Ihre benutzerdefinierte FindRecord-Prozedur hinzugefügt haben, können Sie FindRecord hier im Formularcode markieren und mit der rechten Maustaste klicken und Definition auswählen, um sofort zum Code zu wechseln.)

Fügen Sie dann Ihre benutzerdefinierte Prozedur zu einem Modul hinzu und speichern Sie sie:

Public Sub FindRecord()

DoCmd.GotoRecord,, acFirst

SendKeys „%ha%n“, falsch

DoCmd.RunCommand acCmdFind

End Sub

Der erste Befehl ist optional, Sie können ihn also auskommentieren, indem Sie ihm ein einfaches Anführungszeichen voranstellen, wenn Sie ihn nicht verwenden möchten.

Der erste Befehl setzt den Datensatzzeiger auf den ersten Datensatz, um die Suche zu starten. Ich habe dies getan, weil ich es für das Beste hielt, am Anfang mit der Suche zu beginnen, aber es ist nicht notwendig, damit dieses Verfahren funktioniert.

Der zweite Befehl sendet Tastencodes zum Einrichten des Suchdialogfelds. Hier sind einige mögliche Optionen von einer Microsoft Knowledge Base-Webseite http://support.microsoft.com/kb/120912: [out]

Wählen Sie das Übereinstimmungsfeld: %h

Beliebigen Teil des Feldes abgleichen: %ha

Match Beginn des Feldes: %hs

Nur suchen Aktuelles Feld (gelöscht): %e

Match Case (ausgewählt>): %c

Suchfelder wie formatiert (ausgewählt): %o

Wählen Sie das Suchfeld: %r

Suche nach oben: %ru

Suche nach unten: %rd

Wählen Sie das Feld Suchen nach: %n

Beispielsweise wählt SendKeys %h das Match-Feld aus und SendKeys %ha wählt das Match-Feld aus und stellt das Match-Feld so ein, dass es mit einem beliebigen Teil des Felds übereinstimmt. Sie müssen nicht beides tun; Verwenden Sie eine Variation der zweiten Aussage. Dasselbe gilt für SendKeys %r und SendKeys %ru oder SendKeys %rd.

Die spezielle Kombination in Ihrem Verfahren, wie hier beschrieben, stellt das Übereinstimmungsfeld so ein, dass es mit einem beliebigen Teil des Felds übereinstimmt, und wählt dann das Feld Suchen nach für den Fokus Ihres Cursors aus. Sie können also eingeben, wonach Sie suchen. Schreiben Sie Ihre Prozedur mit den gewünschten Einstellungen.

Der zweite Teil der SendKeys-Anweisung ist ein optionaler boolescher Wert, der den Wartemodus angibt. Wenn es auf False (Standard) gesetzt ist, wird die Kontrolle unmittelbar nach dem Senden der Schlüssel an die Prozedur zurückgegeben. Wenn es auf True gesetzt ist, müssen Tastenanschläge verarbeitet werden, bevor die Steuerung an Ihre Prozedur zurückgegeben wird. Technisch gesehen müssen wir es nicht angeben, weil wir False wollen und der Standardwert False ist; Ich präzisiere es jedoch gerne, damit mir in sechs Monaten klar ist, dass ich das wollte.

Das % vor jedem Schlüsselwert repräsentiert die Alt-Taste in Windows und ich nehme an, es repräsentiert die Befehlstaste in Macs. Wenn Sie im Codefenster SendKeys im Code markieren und die Funktionstaste F1 drücken; dann erscheint ein Hilfebildschirm und erklärt allgemeine Informationen über SendKeys. Suchen Sie nicht in der Access-Hilfe nach den oben gezeigten spezifischen Suchtastencodes. Die Zugangshilfe ist allgemein und nicht allumfassend.

Der dritte Befehl führt die von Ihnen eingerichtete Access Find-Aktion aus. Dies ist endlich der Befehl, der das tut, was Sie wollen.

Ich gebe zu, dass dies eine grobe Art ist, Dinge zu tun, aber Access bietet uns genau das. Der SendKeys-Weg ist besser als der DoMenuItem-Weg, aber es kann Probleme in einer Mehrbenutzerumgebung geben, wie ich gelesen, aber nicht erlebt habe.

Sie können mit verschiedenen Kombinationen von Tastencodes experimentieren. Sie können Tastenanschläge auf verschiedene Zeilen senden oder sie wie ich in einer Zeile kombinieren. Ich empfehle, sie alle wie im Beispiel in einem zu platzieren. Wenn Sie den Tastencode %n verwenden, setzen Sie ihn an das Ende, da er den Fokus auf das Feld „Suchen nach“ setzt und an letzter Stelle stehen sollte.

Probieren Sie dies auf Ihren Access-Formularen aus und prüfen Sie, ob dies nützlich ist. Ich finde es hilfreich, weil allgemeine Benutzer nicht wissen, wie man drückt [control] + f oder um das Bearbeiten | zu verwenden Menü suchen, um etwas zu finden. Beide sind zu nerdig. Wenn sie über sie Bescheid wissen, werden sie meiner Erfahrung nach gelegentlich durch die Standardeinstellung „Match Whole Field“ gestolpert und wissen nicht, wie sie bekommen, was sie wollen. Viel hängt vom Training und der Häufigkeit der Anwendung ab. Menschen, die gut ausgebildet sind, werden besser abschneiden als schlecht ausgebildete Benutzer. Personen, die selten suchen, erinnern sich möglicherweise nicht so gut wie häufige Benutzer.

Wenn Benutzer eine Schaltfläche neben dem Feld sehen und wenn Sie ihnen beibringen, dass F „Finden“ bedeutet, werden sie wahrscheinlich „Verwenden“ verwenden, da das Suchen so grundlegend für die Verwendung einer Datenbank ist, dass sie eine einfache Suchmethode wünschen.

Ich werde Ihnen in anderen Artikeln zeigen, wie Sie weitere nützliche Formularschaltflächen zu Access-Formularen hinzufügen können.



Quelle von William J Rowe

Kommentar verfassen