Programmiertips
Vorherige Seite
Zurück zur Übersicht
Nächste Seite

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:
 
Beispiel FormularansichtIch 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 Database
Option Explicit

Private Sub cmbNavigation_AfterUpdate()
  Me.Requery ' Datensatzherkunft der Tabelle aktualisieren
  txtNachname.SetFocus
  DoCmd.FindRecord cmbNavigation ' Datensatz suchen
End Sub

Private 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

4.) Kompilieren, speichern und ausprobieren!

5.) Anmerkungen
Dieses Beispiel sieht auf den ersten Blick zwar eindrucksvoll aus, es ist aber zu bezweifeln, ob das Sinn macht:

  1. Das Feld [Nachname], das als Grundlage dient, ist nicht eindeutig, da es kein Primärschlüssel ist. Es ist also sehr wahrscheinlich, daß zwei (oder mehr) Personen mit dem gleichen Nachnamen eingetragen sind. Wenn der Anwender nun einen Nachnamen auswählt, verzweigt der Code stets zum ersten Eintrag.
  2. Ein ähnliches Problem entsteht, wenn Fritz Müller bereits eingetragen ist und ich Hans Müller hinzufügen möchte. Wenn ich "Müller" eingebe, wird zu Fritz Müller verzweigt und nicht zu einen neuen Datensatz.
  3. Deshalb würde ich eine separate Schaltfläche und/oder ein Eingabeformular für den neuen Datensatz vorziehen
  4. Einfacher wäre es, bei "Nicht in Liste" mit der Anweisung

  5. DoCmd.GoToRecord , , acNewRec
    Zu einem neuen, leeren Datensatz zu springen.

Vorherige Seite
Zurück zur Übersicht
Nächste Seite