Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

ID bei Abbruch nach Datensatzeingabe weiter vergeben

Begonnen von Chris_HN, Oktober 25, 2023, 11:52:56

⏪ vorheriges - nächstes ⏩

Chris_HN

Ein herzliches Hallo an die Acces-Profis...

In meiner Bestellverwaltung stehe ich gerade vor dem Problem, dass ich, wenn ich die Eingabe in ein Formular abbreche oder aus dem Formular herausgehe, bzw. beim Klick auf den "Speichern"-Button "Nein" auswähle, dann zwar - wie gewünscht - der Datensatz nicht gespeichert wird.
Allerdings- und das ist mein Problem - zählt Access dann brav eine ID hoch. Heißt: Die unbelegte ID des nicht gespeicherten Datensatzes wird dann auch zukünftig nicht mehr vergeben.

Ist insofern kompliziert, da ich gerade die aufgelaufenen Bestellungen mit ihrer ID einpflege.

Zur Info:
Die Bestellungen wurden seither in einer Excel-Tabelle verwaltet, jeweils beginnend mit 30xxx.

Daher habe ich als Bestell-ID ein berechnetes Feld mit "30000"+Best_ID generiert, sodass die Bestellnummer dann zukünftig automatisch vergeben wird.

Wie bekomme ich diese "Kuh am besten vom Eis"?

Bin über jeden Ratschlag dankbar...
Bis her umgehe ich das testhalber, dass ich dann mittel "Datenbank komprimieren" die nicht belegten ID'S zurücksetze und Access dann mit der nächsten unbelegten ID weiter macht.

Aktuell arbeite ich mit folgendem Makro für die Schaltfläche:
Private Sub cmd_BestSpeichern_Nachfrage_Click()
    If Me.Dirty Then ' bei Eingabe eines neuen Datensatzes
 
           If vbNo = MsgBox("Möchten Sie Speichern?", vbQuestion + vbYesNo, "Frage") Then
            Cancel = acDataErrContinue
            Me.Undo
            End If
        Me.lst_Bestellauswahl.Requery
    End If

End Sub

Beim Speichern soll das auch die Listbox im Formular, wo alle Bestellungen aufgeführt sind, aktualisiert werden.
Deshalb das "Me.lst_Bestellauswahl.Requery".

Hoffe, das passt so.

Grüßle aus dem Süden der Republik,
Chris_HN
Das Gras wächst nicht schneller, wenn man daran zieht.
(Afrikanisches Sprichwort)

MzKlMu

#1
Hallo,
das ist normales Verhalten eines Autowertes und kann nicht verhindert werden.
Im Regelfall sind aber doch diese Lücken bedeutungslos. Eine ID sollte auch einfach nur eine ID (Primärschlüssel) sein und sonst keine Bedeutung haben. Was stört Dich an den Lücken ?
Wenn Du das nicht haben willst, musst Du ein extra Zählerfeld in der Tabelle führen das Du beim Speichern eines DS hochzählst.
Gruß Klaus

Chris_HN

Zitat von: MzKlMu am Oktober 25, 2023, 12:20:12das ist normales Verhalten eines Autowertes und kann nicht verhindert werden.

...Das wusste ich nicht - danke für den Tipp.

Zitat von: MzKlMu am Oktober 25, 2023, 12:20:12Wenn Du das nicht haben willst, musst Du ein extra Zählerfeld in der Tabelle führen das Du beim Speichern eines DS hochzählst.
Wie müsste man das denn anstellen? Bei der Berechnung fällt mir gerade nicht ein, wie ich das adäquat umsetzen könnte. Es geht ja auch darum, dass der Wert beibehalten wird, wenn bspw. ein Datensatz rausgelöscht wird.
Da es die Bestellnummer ist, darf sich diese ja im Nachinein nicht mehr ändern.
Das Gras wächst nicht schneller, wenn man daran zieht.
(Afrikanisches Sprichwort)

MzKlMu

Hallo,
Du musst wie gesagt für die Bestellnummer ein extra Feld anlegen.
Unmittelbar nach dem Füllen eines Pflichtfeldes (z.B. das BestDatum) wird mit DMax die höchste BestNummer ermittelt und 1 addiert.
Die bisherigen Bestellnummern müssen mit einer Aktualisierungsabfrage in das neue Feld eingetragen werden. Der Autowert ist umzubennen (z.B.BestID) und als Primärschlüssel beizubehalten.
Gruß Klaus

Chris_HN

Das mit DMax hat mir gefehlt. Da wäre ich 100 kalten Wintern nicht darauf gekommen.
Das Primärschlüsselfeld ist ja unverändert. Die Bestellnummer ermittle ich aktuell in einem berechneten Feld mittels "30.000"+Best_ID. Eben jenes Feld könnte ich ja beibehlaten und die Bestellnummer wie von Dir beschrieben ermitteln.

Lediglich die Abfrage müsste ich machen. Mal sehen, wie das klappt  :-\

Das Gute daran:
In meinen Berichten (wo ich das Bestellformular generiere) und den Formularen müsste ich nichts ändern, da die Datensatzherkunft der Felder dort ja gleich bliebe.

Tausend Dank - werde  ich mir zu Gemüte führen.

Eine Frage noch dazu:

Wie verhält es sich bei der Lösung, wenn im nachinein Datensätze gelöscht würden?
Das Gras wächst nicht schneller, wenn man daran zieht.
(Afrikanisches Sprichwort)

MzKlMu

Hallo,
ZitatWie verhält es sich bei der Lösung, wenn im nachinein Datensätze gelöscht würden?
Das spielt doch keine Rolle, Du ermittelst ja den Maxwert. Wenn dazwischen was gelöscht wird, bleibt die Lücke erhalten.

Ich frage mich aber immer noch, warum die Lücke stört, wenn Du einen Autowert verwendest. Zwischendrin willst Du ja die Lücken erhalten.
Gruß Klaus

Beaker s.a.

Man löscht ja auch keine Datensätze, die einmal gültig waren.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Chris_HN

Zitat von: Beaker s.a. am Oktober 26, 2023, 14:23:30Man löscht ja auch keine Datensätze, die einmal gültig waren.
Asche auf mein Haupt.... Du hast natürlich vollkommen recht. Ich wollte eben nur alle Eventualitäten ausräumen. Und es ging mir auch darum, zu verstehen, was im Hintergrund passiert, mit welchen Folgen.
Das Gras wächst nicht schneller, wenn man daran zieht.
(Afrikanisches Sprichwort)

Chris_HN

#8
Zitat von: MzKlMu am Oktober 25, 2023, 14:15:46Hallo,
Du musst wie gesagt für die Bestellnummer ein extra Feld anlegen.
Unmittelbar nach dem Füllen eines Pflichtfeldes (z.B. das BestDatum) wird mit DMax die höchste BestNummer ermittelt und 1 addiert.
Die bisherigen Bestellnummern müssen mit einer Aktualisierungsabfrage in das neue Feld eingetragen werden. Der Autowert ist umzubennen (z.B.BestID) und als Primärschlüssel beizubehalten.

Danke für den Tipp. ich habe das jetzt im VBA mittels folgendem Code umsetzen können:
Private Sub Form_BeforeInsert(Cancel As Integer)
    best_BestellNrIntern = DMax("best_BestellNrIntern", "tbl_Bestellungen") + 1
End Sub

Eine Anfügeabfrage benötige ich da (nach dem, was ich bisher gesehen habe) wohl nicht und auch beim Abbruch während der Dateneingabe funktioniert das bisher so, wie ich es gern hätte.
Ich hoffe, das passt so und ich habe nicht noch irgendeinen "Bug" drin.

Wie so oft schon hier: Herzlichen Dank für die wertvollen Tipps.
Das Gras wächst nicht schneller, wenn man daran zieht.
(Afrikanisches Sprichwort)

Beaker s.a.

Hallo Chris,
Form_BeforeInsertHalte ich für deutlich zu früh, da steht ja noch nichts im DS drin.
Bedenke dabei die Mehrbenutzerfähigkeit. Wenn da ein zweiter Benutzer eine
zweite Bestellung anlegt bekommt der die gleiche Nummer, und beim Speichern
kracht es bei einem.
Am Besten erst am Ende der Bearbeitung vergeben, - Form_BeforeUpdatesollte man das noch erledigen können.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Chris_HN

Vielen Dank für den Hinweis.
Das hatte ich nicht bedacht.....
Das Gras wächst nicht schneller, wenn man daran zieht.
(Afrikanisches Sprichwort)