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.

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: www.dbwiki.net oder www.dbwiki.de
 
   '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: www.dbwiki.net oder www.dbwiki.de
 
   '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!MeinZahlenfeld.Value = Nz(DMax("MeinZahlenfeld", "tblMeineTabelle"), 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