|
MS Access: Kombinationsfelder und Tabellen
Ich möchte mit einem Kombinationsfeld den nächsten anzuzeigenden Datensatz auswählen. Wenn ich einen neuen Text eingebe, soll mit diesem neuen Text ein neuer Datensatz erstellt werden und der Text zum Kombinationsfeld hinzugefügt werden.
Lösung:
Ich möchte am Beispiel eines kleinen Telefonverzeichnisses zeigen, wie das gelöst weden könnte. Im Formularkopf befindet sich ein ungebundenes Kombinationsfeld, daß die Nachnamen darstellt. Der Anwender kann hier einen Namen auswählen und die entsprechenden Daten werden angezeigt. Gibt der Anwender einen neuen Namen ein, wird der Anwender zunächst gefragt, ob er den Namen hinzufügen möchte. Falls er mit ja antwortet, wird ein neuer Datensatz angelegt, der neue Name in das Feld Nachname eingetragen, und der (noch unvollständige) Datensatz angezeigt. |
1.) Tabelle
Eigenschaft | Wert |
Tabellenname | Telefonverzeichnis |
Feld | Typ |
Nachname | Text |
Vorname | Text |
Telefon | Text |
Bitte beachten: Keines dieser Felder ist Primärschlüssel!
2.) Formular
Steuerelement | Eigenschaft | Wert |
Formular | Formularname | frmTelefonverzeichnis |
Formular | Datenherkunft | Telefonverzeichnis (Tabelle) |
Formular | Standardansicht | Einzelnes Formular |
cmbNavigation | Typ | Kombinationsfeld |
cmbNavigation | Name | cmbNavigation |
cmbNavigation | Steuerelementinhalt | - kein - (Ungebunden) |
cmbNavigation | Herkunftstyp | Tabelle/Abfrage |
cmbNavigation | Datensatzherkunft
(Mit Assistenten erstellen!) |
SELECT DISTINCTROW Telefonverzeichnis.Nachname FROM Telefonverzeichnis ORDER BY Telefonverzeichnis.Nachname; |
cmbNavigation | Nur Listeneinträge | Ja |
cmbNavigation | Nach Aktualisierung (After Update) | [Ereignisprozedur] |
cmbNavigation | Bei Nicht in Liste (Not In List) | [Ereignisprozedur] |
txtNachname | Typ | Textfeld |
txtNachname | Steuerelementinhalt | Nachname |
txtVorname | Typ | Textfeld |
txtVorname | Steuerelementinhalt | Vorname |
txtTelefon | Typ | Textfeld |
txtTelefon | Steuerelementinhalt | Telefon |
3.) Programmcode
Den Ereignissen "Nach Aktualisierung" (AfterUpdate)
und "Bei Nicht in Liste" (NotInList) muß folgender Code zugewiesen
werden:
Option Compare Database4.) Kompilieren, speichern und ausprobieren!
Option ExplicitPrivate Sub cmbNavigation_AfterUpdate()
Me.Requery ' Datensatzherkunft der Tabelle aktualisieren
txtNachname.SetFocus
DoCmd.FindRecord cmbNavigation ' Datensatz suchen
End SubPrivate Sub cmbNavigation_NotInList(NewData As String, Response As Integer)
Dim DB As DATABASE
Dim RC As Recordset' Den Benutzer fragen, ob ein neuer Wert hinzugefügt werden soll.
If MsgBox("Eintrag fehlt. Hinzufügen?", _
vbOKCancel + vbQuestion, "Neuer Eintrag") = vbOK Then
' Einstellen des Arguments Response, um
' anzugeben, daß die Daten hinzugefügt werden.
Response = acDataErrAdded' Hinzufügen der Zeichenfolge aus dem Argument NewData _
' zur zugrundeliegenden Tabelle
Set DB = CurrentDb ' Datenbank zuweisen
Set RC = DB.OpenRecordset("Telefonverzeichnis") ' Tabelle öffnen
With RC
.AddNew ' Neuen Datensatz erstellen.
!Nachname = NewData ' Daten zuweisen
.UPDATE ' Änderungen speichern.
.Close ' schließen
End With
DB.Close ' Datenbank schließen
Else
' Der Benutzer hat "Abbrechen" gewählt: die Fehlermeldung
' unterdrücken und die Änderungen rückgängig machen.
Response = acDataErrContinue
cmbNavigation.Undo
End If
End Sub
5.) Anmerkungen
Dieses Beispiel sieht auf den ersten Blick zwar eindrucksvoll aus,
es ist aber zu bezweifeln, ob das Sinn macht:
|