VBA Tipp: Nächsthöhere Zahl als Standardwert für neuen Datensatz vorgeben

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Ich möchte beim Anlegen eines neuen Datensatzes den höchsten, vorhandenen Wert eines Zahlenfeldes auslesen, und den um 1 erhöhten Wert im neuen Datensatz

  • entweder als Standardwert
  • oder als Wert vorgeben.

Unterschied:
Die Vorgabe als Wert wird als Änderung des Datensatzes (Dateneingabe) behandelt. Im Gegenzug dazu bewirkt die Vorgabe als Standardwert keine Änderung des neu angelegten Datensatzes. Der Standardwert wird im ersten Schritt quasi nur als Vorschlag, nicht aber als Dateneingabe angesehen, wird aber beim anschließenden Speichern des Datensatzes mit übernommen.

Lösung

Das geht mit den folgenden Sub-Prozeduren (Beispiel 1 und 2), die einer Schaltfläche hinterlegt werden können. Die Namen der Steuerelemente, der Schaltfläche und des Formulars sind entsprechend anzupassen.

Beispiel 1

Der neue Datensatz soll im aktuellen, geöffneten Formular angelegt werden:

Private Sub Schaltfläche_NeuerDatensatz_Click()
 
   'Quelle: http://www.dbwiki.net/
 
   'Neuen Datensatz hinzufügen
   DoCmd.GoToRecord , , acNewRec
 
   'nächsthöhere Nummer (höchste vorhandene Nummer + 1) als Standardwert vorgeben
   Me!MeinZahlenfeld.DefaultValue = Nz(DMax("MeinZahlenfeld", "tblMeineTabelle"), 0) + 1
 
   'Alternative Möglichkeit: nächsthöhere Nummer als Wert vorgeben
   'Me!MeinZahlenfeld.Value = Nz(DMax("MeinZahlenfeld", "tblMeineTabelle"), 0) + 1
 
   'ggf. Fokus auf das nächste Feld setzen
   Me.NaechstesFeld.SetFocus
 
End Sub

Beispiel 2

Der neue Datensatz soll in einem anderen, noch nicht geöffneten Formular angelegt werden:

Private Sub Schaltfläche_NeuerDatensatz_Click()
 
   'Quelle: http://www.dbwiki.net/
 
   'Anderes Formular öffnen, Modus Neuer Datensatz
   DoCmd.OpenForm "AnderesFormular", , , , acFormAdd
 
   'nächsthöhere Nummer (höchste vorhandene Nummer + 1) als Standardwert vorgeben
   Forms!AnderesFormular!MeinZahlenfeld.DefaultValue = Nz(DMax("MeinZahlenfeld", "tblMeineTabelle"), 0) + 1
 
   'Alternative Möglichkeit: nächsthöhere Nummer als Wert vorgeben
   'Forms!AnderesFormular!MeinZahlenfeld.Value = Nz(DMax("MeinZahlenfeld", "tblMeineTabelle"), 0) + 1
 
   'ggf. Fokus auf das nächste Feld setzen
   Forms!NeuerKunde!NaechstesFeld.SetFocus
 
End Sub


Wiki warning.png

Mögliche Fehlerquelle in einer Mehrbenutzerumgebung:
Wenn mehr als ein Benutzer zeitgleich (ohne dass zwischenzeitlich ein neuer Datensatz gespeichert wurde) eine Nummer anfordert, erhalten alle dieselbe Nummer. Ist diese als eindeutiger Index ausgewiesen (dazu wird man sie ja wohl sinnvollerweise verwenden wollen), erhält der zweite und folgende Benutzer eine Fehlermeldung wegen Index-Verletzung beim Versuch, den neuen Datensatz zu speichern.

Mögliche Abhilfe:
Die Berechnung und Vergabe der nächsthöheren Nummer wird erst beim Speichern des neuen Datensatzes im Form_BeforeUpdate-Ereignis durchgeführt:

Private Sub Form_BeforeUpdate(Cancel As Integer)
 
   If Me.NewRecord Then
      Me.EinZahlenfeld.Value = Nz(DMax("EinZahlenfeld", "tblEineTabelle"), 0) + 1
   End If
 
End Sub


Wiki hinweis.png

Anmerkung:

Falls die Vergabe der laufenden Nummer nicht von einem festen Schema oder Format abhängig sein muss, empfiehlt es sich, stattdessen in der Tabelle für das Zahlenfeld den Felddatentyp "Autowert" zu verwenden, und auf obigen Code zu verzichten.


Weblinks