November 30, 2020, 03:03:41

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Laufende Nummer und Jahreswechsel

Begonnen von shinoda70, November 17, 2020, 10:05:14

⏪ vorheriges - nächstes ⏩

shinoda70

November 17, 2020, 10:05:14 Letzte Bearbeitung: November 17, 2020, 14:37:03 von MzKlMu
Hallo Gemeinde, ich benötige mal wieder dringend Eure Hilfe.

In einem Formulartextfeld generiere ich durch drücken auf eine Befehlsschaltfläche eine laufende Nummer die sich aus dem Kalenderjahr (nur die zehner Stelle aus dem Jahr) und einer dreistelligen Nummer zusammensetzt.

Beispiel:
20001, 20002, 20003, usw.

Zum anstehenden Jahreswechsel möchte ich, dass sich aus der 20 die 21 bildet und die laufenden Nummer wieder von vorn beginnt (gleiche Tabelle).

Also so:
21001, 21002, 21003, usw.

Anmerkung: In einem zweiten Textfeld (MADatum) wird das aktuelle Datum im Formular generiert.

leider finde ich keinen Code Ansatz  :-\       

Mein bisheriger Code:
Private Sub MANummer_Click()

Dim MaterialNr As Variant
MaterialNr = DMax("MANummer", "08WKZBMatAnf")

If IsNull(MaterialNr) Then
  MaterialNr = Right(Date, 2) & "001"
    Else
    MaterialNr = MaterialNr + 1
End If

Me!MANummer = MaterialNr
Me.MADatum = Format(Date, "dd.mm.yyyy")
End Sub

Hat jemand eine Idee bzw. einen Ansatz ???

Vorab vielen Dank

Gruß, Michael

MzKlMu

November 17, 2020, 12:26:29 #1 Letzte Bearbeitung: November 17, 2020, 14:37:42 von MzKlMu
Hallo,
das Vorhaben ist in dieser Form überflüssig und falsch.
Du brauchst nur ein Feld in der Tabelle für die reine Zahl und nur diese Zahl wird gespeichert und Hochgezählt. Die Materialnummer als ganzes wird nicht gespeichert., sondern immer in einer Abfrage zusammengesetzt.

Wenn ein MADatum eingetragen wird, wird diese LfdNr automatisch hochgezählt. Das ist der Code dazu:
Private Sub MADatum_AfterUpdate()
    Me.LfdNrJahr = Nz(DMax("LfdNrJahr", "08WKZBMatAnf", "year(MADatum) = " & Year(Me.MADatum)), 0) + 1
End Sub
Dieser Einzeiler erledigt das Hochzählen. Das Feld in der Tabelle 08WKZBMatAnf habe ich jetzt LfdNrJahr genannt.
Datenbais für das Formular wird jetzt eine Abfrage (was ohnehin die Regel sein sollte).
In der Abfrage wird jetzt die MaterialNr erzeugt:
MaterialNr: Format([MADatum];"jj") & Format([LfdNrJahr];"000")Die in der Abfrage erzeugte Materialnummer ist ohne Einschränkung das Gleiche als ob diese in der Tabelle gespeichert wäre.

PS:So etwas
Me.MADatum = Format(Date, "dd.mm.yyyy")ist ziemlicher Unsinn (sorry), Date ist per Definition ein Datum und muss nicht extra als solches formatiert werden. Das Format ist ohnehin ziemlich egal, das Format stellt man nur dort ein wo man es braucht.
Wenn dann reicht einfach so:
Me.MADatum = Date
Gruß
Klaus

shinoda70

November 17, 2020, 12:43:56 #2 Letzte Bearbeitung: November 17, 2020, 14:37:56 von MzKlMu
Hallo Klaus,

vielen Dank für Deine schnelle Antwort und den ausführlich erklärten Lösungsansatz  :)

Aber noch eine kurze Frage:
Wird bei Deinem Lösungsansatz die reine Zahl (die hochgezählt wird) in 2021 neu bei 001 beginnen?
Habe das noch nicht ganz geschnallt bzw. aus Deinem Lösungsansatz herauslesen können.


Übrigens danke für den Hinweis mit dem Datum, bin leider kein Access-Profi, daher solche "Schnitzer"... 
Me.MADatum = Format(Date, "dd.mm.yyyy")

Aber durch solche Themen und Eure Hilfe lernt man schnell dazu.

Danke und bis bald.

Gruß, Michael

ebs17

November 17, 2020, 13:30:34 #3 Letzte Bearbeitung: November 17, 2020, 14:39:05 von MzKlMu
Zitat von: undefinedHabe das noch nicht ganz geschnallt
Praktisches Ausprobieren ist recht oft wirkungsvoller als Kopfkino. Schon probiert?
Private Sub MADatum_AfterUpdate()
    If Me.NewRecord Then _
        Me.LfdNrJahr = Nz(DMax("LfdNrJahr", "08WKZBMatAnf", "year(MADatum) = " & Year(Me.MADatum)), 0) + 1
End Sub
Ich würde eine neue Nummer nur bei einem neuen Datensatz erzeugen wollen.

Daneben würde ich sehr rasch das Jahr in einem eigenen Feld führen statt laufend aus dem Datum zu berechnen. Das hat mit Indexnutzung und Performance zu tun. Die meisten brauchen das aber nicht.
Mit freundlichem Glück Auf!

Eberhard

MzKlMu

November 17, 2020, 13:35:48 #4 Letzte Bearbeitung: November 17, 2020, 14:38:08 von MzKlMu
Hallo,
Zitat von: undefinedWird bei Deinem Lösungsansatz die reine Zahl (die hochgezählt wird) in 2021 neu bei 001 beginnen?
Ja, natürlich, das war ja der Sinn der Sache. Die eine Zeile oben in dem Code erledigt das alles.
Zitat von: undefinedneu bei 001 beginnen?
Es geginnt bei 1 und nicht bei 001, 001 ist keine Zahl sondern ein Text (Zeichenfolge). Eine Zahl kennt keine führenden 0en.
Die werden durch das Format hinzugefügt, aber dann ist es keine Zahl mehr.
Formatfunktionen erzeugen immer Text.
Gruß
Klaus

MzKlMu

November 17, 2020, 13:40:55 #5 Letzte Bearbeitung: November 17, 2020, 14:38:32 von MzKlMu
Hallo,
Zitat von: undefinedIch würde eine neue Nummer nur bei einem neuen Datensatz erzeugen wollen.
Das hat aber den Nachteil, dass die Nr nicht korrigiert wird, wenn man mal aus Versehen ein falsches Jahr gewählt hat.
Gruß
Klaus

ebs17

Was ein richtiges Jahr für die laufende Nummer ist, müsste man separat definieren. Oben wurde es von einem MADatum angeleitet, aber auch vom aktuellen Datum. Das würde man dann auch gleich an dieser Stelle verifizieren lassen.
Mit freundlichem Glück Auf!

Eberhard

shinoda70

Hallo Leute,

die Lösung von Klaus funktioniert tadellos. Vielen Dank nochmal!

Hab tatsächlich viel zu quer gedacht, bzw. mir hat das Wissen gefehlt an dieser Stelle.
Einfach nur die laufende Nummer in einer Tabelle speichern, in der Abfrage ein Ausdrucksfeld generieren und im Formular ggf noch eine Eingabeformatierung und man hat das gewünschte Ergebnis. PErfekt!

@Eberhard: Vielen Dank auch für Deinen Tipp.


Beste Grüße,
Michael