Liebe Access-Profis,
nun komm ich schon wieder.
In meiner DB zur Bücherverwaltung sollte eine Kennzeichnung (Klebestreifen) generiert werden, die entsprechend einer Kategoerie einen Kurznamen und entsprechend der Anzahl der in dieser Kategorie bereits vorhandenen Bücher eine um 1 erhöhte laufende Nummer ausweist.
Bsp:
- Kategorie: Landeskunde
- Kurzzeichen: 22LK
- vorhandene Anzahl: 19 Exemplare
- neue Nummer: 20
die zu generierende Kennzeichnung: 22LK20
Jetzt habe ich folgenden Code in meinem HauptFormular hinter dem Kombinationsfeld "Kategorie" unter dem Ereignis 'Nach Aktualisierung' abgelegt:
Private Sub txt_KAT_FS_AfterUpdate()
Dim strKatNameKurz As String
Dim lngKat As Long
Dim lngAnzKategorie As Long
Dim lngNummer As Long
lngKat = txt_KAT_FS.Value 'Eintrag in das Formular
lngAnzKategorie = DCount("*", "tblBuecher", "KAT_FS = " & lngKat) 'Datensätze mit diesem Eintrag werden gezählt - ohne den derzeit zum Eintrag anstehenden
BUC_Kategorie = DLookup("KAT_NameKurz", "tblKategorien", "KAT_PS =" & Forms!frm_BuchEingabe!txt_KAT_FS) 'Kurzbezeichnung wird aus der Tabelle ausgelesen
lngNummer = lngAnzKategorie + 1 'Anzahl wird um 1 erhöht
BUC_MedienNummer = BUC_Kategorie & lngNummer 'Kennzeichnung wird zusammengesetzt
End Sub
Das funktioniert bei der ersten Eingabe eines neuen Buches so, dass die Kennzeichnung unter "Medien-Nr." ausgewiesen wird! Prima!
Aber:
- Wechsele ich - aus welchen Gründen auch immer - den Eintrag zur Kategorie und wähle ich in diesem Kombinationsfeld einen anderen aus, dann erhalte beim Zurückgehen auf die vorherige Kategorie wieder eine andere Nummer (er zählt ja wieder um 1 hoch) nämlich 22LK21!
- Wenn ich zu einem anderen Bucheintrag derselben Kategorie wechsele (Bsp. 22LK10) und dort kurzzeitig eine andere Kategorie anklicke, von der aus ich wieder zur vorherigen zurückgehe, so zählt er erneut um 1 hoch und ich erhalte die bereits vergebene Zahl (22LK21) auch bei diesem Buch.
Wie kann ich denn eine Zeichenfolge übergeben, die Bestand hat bzw. zu gegebener Situation aktualisiert wird?
Viele Grüße
gromax
Hallo Gromax,
Überprüfe auf NewRecord.
If Me.Newrecord Then
lngKat = txt_KAT_FS.Value 'Eintrag in das Formular
lngAnzKategorie = DCount("*", "tblBuecher", "KAT_FS = " & lngKat) 'Datensätze mit diesem Eintrag werden gezählt - ohne den derzeit zum Eintrag anstehenden
BUC_Kategorie = DLookup("KAT_NameKurz", "tblKategorien", "KAT_PS =" & Forms!frm_BuchEingabe!txt_KAT_FS) 'Kurzbezeichnung wird aus der Tabelle ausgelesen
lngNummer = lngAnzKategorie + 1 'Anzahl wird um 1 erhöht
BUC_MedienNummer = BUC_Kategorie & lngNummer
End If
hth
gruss ekkehard
Hallo Ekkehard,
vorab vielen Dank für Deine Unterstützung. Die ,If Me.Newrecord-Bedingung' bringt mich auf alle Fälle weiter; ich habe diesen Code übernommen.
Ein Störfall bleibt weiterhin, von dessen Lösung ich noch keine Vorstellung habe:
Denken wir an die Kategorie ,22LK'; innerhalb derer haben wir 20 Bücher gespeichert – also 22LK1 bis 22LK20.
Was passiert, wenn wir eines dieser 20 Bücher (Beispiel 22LK11) aussortieren; jetzt haben wir nur noch 19 Bücher in dieser Kategorie und die DB vergibt als nächste Kennzeichnung 22LK20 – aber die hatten wir schon.
Gibt es eine Möglichkeit, die vorhandenen Kennzeichnungen (22LK1 – 22LK20) auf ihre Geschlossenheit zu überprüfen und evtl. ,,freie Kennzeichnungen" auszuwählen?
Wenn es Ideen gibt, nehme ich diese gerne und dankbar auf.
Viele Grüße
gromax
Hallo gromax,
ZitatWas passiert, wenn wir eines dieser 20 Bücher (Beispiel 22LK11) aussortieren; jetzt haben wir nur noch 19 Bücher in dieser Kategorie und die DB vergibt als nächste Kennzeichnung 22LK20 – aber die hatten wir schon.
Verwende DMax +1 anstatt DCount.
Zitatdie zu generierende Kennzeichnung: 22LK20
Wird die so abgespeichert, oder nur zur Anzeige zusammengesetzt.
In ersterem Fall ist das falsch, da dann die Daten nicht atomar wären.
Die Nummer gehört in ein eigenes Feld.
ZitatWas passiert, wenn wir eines dieser 20 Bücher (Beispiel 22LK11) aussortieren; jetzt haben wir nur noch 19 Bücher
Kennung und Anzahl sind für mich zwei paar Schuhe. Es macht IMO auch
keinen Sinn, Lücken aufzufüllen. Das Buch an sich wird ja wohl durch eine
eindeutige ID gekennzeichnet sein. Wenn das womöglich die o.a. Kennung
sein sollte, macht es noch weniger Sinn.
Aussortieren sollte i.Ü. auch nicht
löschen bedeuten, sondern die Vergabe
eines dazu bestimmten Merkmals. Ich verwende normalerweise ein Datums-
feld "geloescht". Da kommt beim "löschen" eben das Datum rein.
Abfragen kann man das dann mit IsNull. Ausserdem entstehen so keine
verwaisten DS in abhängigen Tabellen.
gruss ekkehard
Hallo Ekkehard,
Lösch-Vorgang, Atomisierung und DMax-Funktion wie angeraten umgesetzt - jetzt bin ich einen großen Schritt weitergekommen!
Vielen Dank!
Einen guten Start in die Woche
gromax
Hallo,
ZitatLösch-Vorgang....,
Einen Löschvorgang sollte gar nicht geben. Es sollte niemals ein Buch das es gab gelöscht werden. Hat ekkehard auch schon geschrieben.
Hallo Klaus,
danke für Deinen Nachtrag!
Ich habe den "Löschvorgang" entsprechend der Idee von Ekkehard umgesetzt, will heißen: Der Klick auf die Lösch-Taste setzt ein Ja/Nein-Feld auf "Ja" und in der darauf aufbauenden Abfrage werden die mit "Ja" markierten Datensätze nicht mehr angezeigt. Das Buch bleibt aber in der Tabelle gespeichert.
Vielen Dank für das Kümmern!
Viele Grüße
gromax