|
Wenn Sie eine Funktion zum direkten
Anwählen eines Datensatzes in ein Formular implementieren möchten,
verwenden Sie dazu in der Regel ein Kombinationslistenfeld, dem eine
entsprechende Abfrage zugrunde liegt. Nach Auswahl eines Eintrages
wird der dazugehörige Datensatz angezeigt. Bis zu einer gewissen
Anzahl von Datensätzen ist diese Lösung praktikabel, aber bei grösseren
Beständen ist das Kombinationslistenfeld recht langsam. Die im
folgenden beschriebene Lösung zeigt, wie Sie statt dessen ein übersichtliches
und schnelleres Auswahlformular einsetzen.
Die Lösung arbeitet mit einem zusätzlichen Formular "frmAuswahl",
das über eine Schaltfläche "btnAuswahl" aus dem
Hauptformular heraus aufgerufen wird. Im Formular ist eine
dreispaltige Liste "lstAuswahl" vorhanden, der eine
Abfrage zugrunde liegt, die drei Felder liefert: Name der Firma, Ort
und eindeutiges Zugriffskriterium (im Beispiel das Feld
"Kunden-Code"). Die Liste zeigt nur die beiden ersten
Felder für die Auswahl an. Die dritte Spalte ist die gebundene
Spalte und versteckt formatiert (Eigenschaft
"Spaltenbreite" = "5cm;5cm;0cm"). Wenn ein
Eintrag ausgewählt wird, dient der Inhalt der dritten, versteckten
Spalte dazu, im Hauptformular auf den entsprechenden Datensatz zu
positionieren. Die Ereignisprozedur "Beim Klicken" der
Schaltfläche "btnAuswahl" im Hauptformular steuert die
gesamte Funktion:
Sub btnAuswahl_Click ()
Dim strX As String
DoCmd OpenForm "frmAuswahl", A_Normal, , , ,
A_Dialog
On Error Resume Next
strX = Forms![frmAuswahl].Tag
DoCmd Close A_Form, "frmAuswahl"
If Err <> 0 Or strX="" Then Exit Sub
On Error GoTo 0
Me.[Kunden-Code].SetFocus
DoCmd FindRecord strX, A_Entire, , A_Down, , _
A_Current, True
Me.[Firma].SetFocus
End Sub
Zunächst wird das Formular "frmAuswahl" als
Dialog/Popup angezeigt. Der darin enthaltenen Liste "lstAuswahl"
liegt die Abfrage "AFfrm Auswahl" zugrunde, die die benötigten
Felder "Firma", "Ort" und
"Kunden-Code" liefert.
Wenn im Popup-Formular ein Eintrag
markiert und auf OK geklickt oder ein Doppelklick auf einen Eintrag
ausgeführt wird, sorgt die Prozedur "Beim Klicken" der
Schaltfläche "btnOK" im Formular "frmAuswahl"
dafür, dass das Zugriffskriterium, hier "Kunden-Code", über
die Eigenschaft "Tag" des Formulars festgehalten wird:
Private Sub btnOK_Click()
Dim intIdx As Integer, strX As String
intIdx = Me.lstAuswahl.ListIndex
If intIdx < 0 Then
Beep
Exit Sub
End If
strX = Me.lstAuswahl.Column(2)
Me.Tag = strX
Me.Visible = False
End Sub
Klickt der Anwender auf Abbrechen, muss die Tag-Eigenschaft auf einen leeren String gesetzt werden:
Private Sub btnCancel_Click()
Me.Tag = ""
Me.Visible = False
End Sub
In der Ereignisprozedur des Hauptformulars prüfen wir den Inhalt
von "Tag" - ist dieser leer, wurde auf Abbrechen
geklickt, andernfalls stellt der Inhalt den Kundencode für den
anzuzeigenden Datensatz dar. Über "FindRecord" wird dann
auf diesen Datensatz positioniert.
Wenn Sie diese Lösung in Ihre eigene Projekte einbauen möchten,
benötigen Sie zunächst das Formular "frmAuswahl" und
eine zugehörige Abfrage namens "AFfrm Auswahl", die die
drei Felder für die Liste liefert. Beachten Sie dabei, dass
die ersten beiden Felder für die Anzeige dienen und das dritte Feld
ein Zugriffskriterium wie beispielsweise eine Artikel- oder
Lieferantennummer sein soll.
Öffnen Sie das betreffende Hauptformular im Entwurfsmodus und legen
Sie dort eine neue Schaltfläche "btnAuswahl" an. Stellen
Sie deren Eigenschaft "Beim Klicken" auf
"[Ereignisprozedur]" und klicken Sie auf die Schaltfläche
mit den drei kleinen Punkten, um den VBA-Editor zu starten.
Geben
Sie dann die oben im Listing "Sub btnAuswahl_Click"
gezeigten Anweisungen ein und passen Sie dabei die folgenden Zeilen
an Ihr Hauptformular an:
Me.[Kunden-Code].SetFocus
DoCmd FindRecord strX, A_Entire, , A_Down, , _
A_Current, True
Me.[Firma].SetFocus
"Kunden-Code" ersetzen Sie dabei durch den Namen des
Feldes, das das Zugriffskriterium darstellt.Für "Firma"
verwenden Sie den Namen des Feldes, das anschliessend
als aktives Feld selektiert werden soll. |