Discussion:
Fortlaufende Rechnungsnummer - Das leidige Thema
(zu alt für eine Antwort)
Dietmar Krawinkel
2004-08-11 16:11:12 UTC
Permalink
Hallo zusammen,

nach dem ich diverse Beiträge zu diesem Thema gelesen und ausprobiert
habe, jedoch alle gescheitert sind, versuche ich mein Glück nun auf
diese Weise.

Ich möchte gerne eine eine fortlauf. Rechnungsnummer (A00) im Format
JJ-000 generieren, die ebenfalls in der Tabelle gespeichert werden
soll. Die Nummerierung sollte in jedem neuen Jahr wieder mit 1
anfangen.

Tabelle: tblRechnungen
Felder: R_ID (AutoWert), R_Datum (Datum/Zeit), R_Nr (Hier soll das
Ergebnis gespeichert werden), und andere Rechnungsdetails

Formular: HFRechnungen
Felder: Rechnungsdatum, Rechnungs-Nr

Beim Erstellen von neuen Rechnungen sollte nach Eingabe des
Rechnungsdatums automatisch im Feld Rechnungs-Nr die generierte Nummer
eingetragen werden. Dieses funktionierte bei mir allerdings nicht.

Kann mir jemand auf möglichst einfache Weise helfen? (Bin was
VBA-Codes angeht eher Anfänger!)

Gruss
Dietmar
Sascha Wostmann
2004-08-11 19:46:49 UTC
Permalink
Post by Dietmar Krawinkel
Ich möchte gerne eine eine fortlauf. Rechnungsnummer (A00) im Format
JJ-000 generieren, die ebenfalls in der Tabelle gespeichert werden
soll. Die Nummerierung sollte in jedem neuen Jahr wieder mit 1
anfangen.
Tabelle: tblRechnungen
Felder: R_ID (AutoWert), R_Datum (Datum/Zeit), R_Nr (Hier soll das
Ergebnis gespeichert werden), und andere Rechnungsdetails
Formular: HFRechnungen
Felder: Rechnungsdatum, Rechnungs-Nr
Beim Erstellen von neuen Rechnungen sollte nach Eingabe des
Rechnungsdatums automatisch im Feld Rechnungs-Nr die generierte Nummer
eingetragen werden. Dieses funktionierte bei mir allerdings nicht.
Kann mir jemand auf möglichst einfache Weise helfen? (Bin was
VBA-Codes angeht eher Anfänger!)
Du brauchst eine VBA-Funktion, die dir zu einem Jahr die nächste freie
Rechnungsnummer liefert. Z.B. so:

Function RNr(Jahr As Integer) As String
Dim R as String
Dim N as Integer
' höchste verwendete RNr. heraussuchen:
R = Jahr & "-000"
R = DMax("R_Nr","tblRechnungen","RNr like '" & Jahr & "*'"),R)
' Nummer ermitteln
N = CInt(Mid(R,4))
' Nummer erhöhen
N = N + 1
' Rechnungsnummer generieren
R = Jahr & "-" & Format$(N,"000")
' Ergebnis zurückliefern
RNr = R
End Function

Damit bekommst Du für ein gegebenes Jahr (zweistellig!) immer die
nächste freie Nummer angezeigt. Anwendung z.B.:

Debug.Print RNr(format(now,"YY"))

Im Formular HFRechnungen schreibst Du dann als Ereignis "nach
aktualisierung" vom Feld Rechnungsdatum folgendes:

Me.[Rechnungs-Nr] = RNr(format(Me.[Rechnungsdatum],"YY"))



Viele Grüße,
Sascha Wostmann
--
wichtige Informationsquellen zu Access: +----------------------
http://www.donkarl.com/ (FAQ) | Bitte keine Kopien
http://www.freeaccess.de/ (KnowHow) | oder Access-Anfragen
http://www.google.de/ (Suchmaschine) | per E-Mail.
Dietmar Krawinkel
2004-08-12 08:05:11 UTC
Permalink
Post by Sascha Wostmann
Post by Dietmar Krawinkel
Ich möchte gerne eine eine fortlauf. Rechnungsnummer (A00) im Format
JJ-000 generieren, die ebenfalls in der Tabelle gespeichert werden
soll. Die Nummerierung sollte in jedem neuen Jahr wieder mit 1
anfangen.
Tabelle: tblRechnungen
Felder: R_ID (AutoWert), R_Datum (Datum/Zeit), R_Nr (Hier soll das
Ergebnis gespeichert werden), und andere Rechnungsdetails
Formular: HFRechnungen
Felder: Rechnungsdatum, Rechnungs-Nr
Beim Erstellen von neuen Rechnungen sollte nach Eingabe des
Rechnungsdatums automatisch im Feld Rechnungs-Nr die generierte Nummer
eingetragen werden. Dieses funktionierte bei mir allerdings nicht.
Kann mir jemand auf möglichst einfache Weise helfen? (Bin was
VBA-Codes angeht eher Anfänger!)
Du brauchst eine VBA-Funktion, die dir zu einem Jahr die nächste freie
Function RNr(Jahr As Integer) As String
Dim R as String
Dim N as Integer
R = Jahr & "-000"
R = DMax("R_Nr","tblRechnungen","RNr like '" & Jahr & "*'"),R)
' Nummer ermitteln
N = CInt(Mid(R,4))
' Nummer erhöhen
N = N + 1
' Rechnungsnummer generieren
R = Jahr & "-" & Format$(N,"000")
' Ergebnis zurückliefern
RNr = R
End Function
Damit bekommst Du für ein gegebenes Jahr (zweistellig!) immer die
Debug.Print RNr(format(now,"YY"))
Im Formular HFRechnungen schreibst Du dann als Ereignis "nach
Me.[Rechnungs-Nr] = RNr(format(Me.[Rechnungsdatum],"YY"))
Hallo Sascha,

nun weiss ich zwar, wie der VBA-Code aussehen muss, aber nicht, wie er
anzuwenden ist (Makro, Modul (Standard-/Klassen-),
Formular/Bericht-Ereigniss?). Ich habe es versucht, in dem ich ein
neues Modul erzeugt habe. Ist der Modulname entscheidet? Wo u. wie
binde ich das Modul dann ein? (über ein ungebundenes Feld im Formular
HFRechnungen?)

Und wofür ist dieser Befehl gedacht?
Post by Sascha Wostmann
Debug.Print RNr(format(now,"YY"))
Wie gesagt, in puncto Codes, etc. bin ich Anfänger!

Gruss
Dietmar
Peter Steimann[MVP Access]
2004-08-12 08:34:30 UTC
Permalink
Post by Dietmar Krawinkel
nun weiss ich zwar, wie der VBA-Code aussehen muss, aber nicht, wie er
anzuwenden ist (Makro, Modul (Standard-/Klassen-),
Formular/Bericht-Ereigniss?).
Sascha hat eine Funktion gepostet. Am Vorteilhaftesten packst Du diese
in ein Modul, geht aber auch im Formular selbst.
Post by Dietmar Krawinkel
Ich habe es versucht, in dem ich ein
neues Modul erzeugt habe. Ist der Modulname entscheidet?
Nein. Er darf nur nicht dieselbe Bezeichnung haben wie die Funktion
selbst
Post by Dietmar Krawinkel
Wo u. wie
binde ich das Modul dann ein? (über ein ungebundenes Feld im Formular
HFRechnungen?)
zum Bleistift, ja. beim Button Speichern schreibst du dann den Wert in
die Tabelle weiter. Me!RechnungsNr = me.MeinUngebundenes Feld. Füllen
tust Du dieses ungebundene Feld z.B. in der Eigenschaft beim Anzeigen
des Formulars. z.B. Me. MeinungebundenesFeld = Rnr(Year(date()).
(Saschas Funktion erwartet hier die Uebergabe des Rechnungsjahres als
Parameter)
Post by Dietmar Krawinkel
Und wofür ist dieser Befehl gedacht?
Post by Sascha Wostmann
Debug.Print RNr(format(now,"YY"))
Damit Du im Direktfenster beim Testen siehst, welche Nummer die Funktion
denn nun ermittelt hat.
Post by Dietmar Krawinkel
Wie gesagt, in puncto Codes, etc. bin ich Anfänger!
Dann gibt's noch einiges zu lernen. Ich würde Dir dringend empfehlen,
dich etwas mit VBA-Literatur einzudecken.

Gruss

Peter
Jürgen Volke
2004-08-12 09:11:40 UTC
Permalink
Hallo Dietmar
Post by Dietmar Krawinkel
nun weiss ich zwar, wie der VBA-Code aussehen muss, aber nicht, wie er
anzuwenden ist (Makro, Modul (Standard-/Klassen-),
Formular/Bericht-Ereigniss?). Ich habe es versucht, in dem ich ein
neues Modul erzeugt habe. Ist der Modulname entscheidet?
entscheident ist, daß Modul und Funktion unterschiedlich heißen!
Post by Dietmar Krawinkel
Wo u. wie binde ich das Modul dann ein?
du mußt das Modul nicht einbinden sondern nur die Funktion darin benutzen.
setzte im Modul zur Sicherheit ein Public vor das Function !
Post by Dietmar Krawinkel
(über ein ungebundenes Feld im Formular
HFRechnungen?)
dort evtl. als Steuerelement inhalt = RNr(Year(DeinRechnungsDatum))
oder im AfterUpdate des Rechungsdatum:
Me!DeinRechnungsNummerFeld = RNr(Year(Me!DeinRechnungsDatum))
Post by Dietmar Krawinkel
Und wofür ist dieser Befehl gedacht?
Post by Sascha Wostmann
Debug.Print RNr(format(now,"YY"))
wie wäre es mit einem scheuen Blick in die VBA-OH ?!

HTH Jürgen
Dietmar Krawinkel
2004-08-12 15:42:17 UTC
Permalink
Hallo Sascha, Peter u. Jürgen,

erst mal vielen dank für Eure Hilfe und Geduld, aber es funkt noch
nicht:

Habe die Funktion von Sascha 1:1 in ein neues modul kopiert. Tabelle
und Form sind wie beschrieben angelegt. Schon im Direktfenster mit dem
Debug.Print-Befehl (aber auch im fertigen Form) erscheint die Meldung:
Fehler beim Kompilieren: Syntaxfehler! Es wird folgende Zeile markiert
und rot gekennzeichnet:

R = DMax("R_Nr","tblRechnungen","RNr like '" & Jahr & "*'"),R)

danach wird die 1. Zeile der Funktion gelb gekennzeichnet.

Kann das evtl. an der Eigenschaft des Feldes, welches das 2-stellige
Jahr hervorbringen muß, liegen?

gruss
Dietmar

PS. Bin damit angefangen, VBA zu lernen, ich denke ich bin in 35
Jahren damit durch!!
Anton Huber
2004-08-12 17:48:12 UTC
Permalink
Dietmar Krawinkel threw this exception:

Hi,
Post by Dietmar Krawinkel
PS. Bin damit angefangen, VBA zu lernen, ich denke ich bin in 35
Jahren damit durch!!
Nö, des geht schneller als Du denkst ;-), wichtig ist sich
die Grund(sprach)begriffe, Datenstrukturen, Kontrollstrukturen
und Funktionen deren Funktionsweise und Anwendung gut
einzuprägen, den Rest erzählt Dir die Hilfe ...
Die Spezialitäten lernst Du durch Anwenden, probieren und
google ;-).

VBA ist nicht so schwer, ich habe jetzt lange Zeit VB/VBA
programmieren dürfen/müssen. Nun wieder C/C++. Da
hat man dann schon eine gewisse Umstellungszeit. Vor
allem die Variablen und Arrays sind in VB derart einfach zu
handhaben, und dies ist ja fast immer der Kern der
Programierung ...


Gruss
Anton
--
Aber wieso? Gestern ging's doch noch!
Sascha Wostmann
2004-08-12 19:53:58 UTC
Permalink
Post by Dietmar Krawinkel
Hallo Sascha, Peter u. Jürgen,
erst mal vielen dank für Eure Hilfe und Geduld, aber es funkt noch
Habe die Funktion von Sascha 1:1 in ein neues modul kopiert. Tabelle
und Form sind wie beschrieben angelegt. Schon im Direktfenster mit dem
Fehler beim Kompilieren: Syntaxfehler!
ich hatte den Code nicht ausprobiert, kann sein, dass ich irgendwo
einen Flüchtigkeitsfehler drin habe. Einen habe ich gerade entdeckt,
in der Mitte der Zeile muss es auch "R_Nr like..." heißen, nicht "RNr
like...".
Post by Dietmar Krawinkel
Es wird folgende Zeile markiert
R = DMax("R_Nr","tblRechnungen","RNr like '" & Jahr & "*'"),R)
hier hatte ich aus Platzgründen das "R" mehrfach benutzt. Kann sein,
dass das von VBA so nicht erlaubt ist.

*genauerhinschau*

Mein Fehler! Eigentlich stand an der Stelle noch ein NZ. Richtig
lautet die Zeile also:

R = Nz(DMax("R_Nr","tblRechnungen","RNr like '" & Jahr & "*'"),R)

was man durch Klammerzählen herausfinden kann.

Wegen der Frage, wo Du das einsetzt, haben andere ja schon
geantwortet. Die Funktion kannst du in ein eigenes Modul schreiben,
oder in ein Modul, in dem Du mehrere solcher Hilfsfunktionen sammelst,
oder auch direkt im Code des Formulars. Den Aufruf der Funktion setzt
Du in eine Ereignisprozedur. Lasse Dir dazu die Eigenshcaften des
Eingabefeldes für das Datum anzeigen, dort im Reiter "Ereignisse" das
"nach Aktualisierung" klicken und dann auf den Button mit den "..."
klicken. Schließlich "Code-Editor" auswählen, um in den VBA-Editor zu
gelangen. Die Ereignisprozedur ist schon vorbereitet mit Kopf und
Ende. Du brauchst dort nur noch den Aufruf dazwischen zu schreiben.
Post by Dietmar Krawinkel
PS. Bin damit angefangen, VBA zu lernen, ich denke ich bin in 35
Jahren damit durch!!
Keine Sorge, so lange dauert es nicht. Ich bin erst 34 :) Bin aber
Basic vorbelastet durch einen PC Kurs in jungen Jahren, den ich als
Auflage bekam, bevor ich mir einen C64 kaufen durfte.



Viele Grüße,
Sascha Wostmann
--
wichtige Informationsquellen zu Access: +----------------------
http://www.donkarl.com/ (FAQ) | Bitte keine Kopien
http://www.freeaccess.de/ (KnowHow) | oder Access-Anfragen
http://www.google.de/ (Suchmaschine) | per E-Mail.
Dietmar Krawinkel
2004-08-13 16:17:25 UTC
Permalink
Hallo Sascha,

nachdem ich folgende Zeile:

R = Nz(DMax("R_Nr","tblRechnungen","R_Nr like '" & Jahr & "*'"),R)

entsprechend korrigiert habe, wurde in dieser Zeile:

N = CInt(Mid(R,4))

der Fehler "Typen unverträglich" angezeigt!
Wäre schön, Du würdest Einblick in meine db nehmen (s. Link).

Bis dahin.
Dietmar
Jürgen Volke
2004-08-13 16:30:26 UTC
Permalink
Hallo Dietmar
Post by Dietmar Krawinkel
R = Nz(DMax("R_Nr","tblRechnungen","R_Nr like '" & Jahr & "*'"),R)
N = CInt(Mid(R,4))
der Fehler "Typen unverträglich" angezeigt!
lösche mal die Sätze aus der Tabelle, dann gibt es keinen Fehler.
irgend wie steht da wohl schrott drin.

es soll ja z.B. 04001 drin stehen - oder?

HTH Jürgen
Dietmar Krawinkel
2004-08-14 09:39:30 UTC
Permalink
Jürgen Volke <***@hotmail.com> wrote in message news:<cfiq94$grr$00$***@news.t-online.com>...

Hallo Jürgen,
Post by Jürgen Volke
es soll ja z.B. 04001 drin stehen - oder?
denn, bei mir erscheint nur 4-001 statt 04-001.
Habe schon versucht, dass Problem zu beheben, jedoch zeigt sich das
Modul recht empfindlich auf unqualifizierte Vorschläge meinerseits. ;)

Hast du vielleicht noch eine Idee? (Kann ja nicht mehr viel sein,
oder?)

Gruss
Dietmar
Jürgen Volke
2004-08-14 13:22:18 UTC
Permalink
Hallo Dietmar
Post by Dietmar Krawinkel
Post by Jürgen Volke
es soll ja z.B. 04001 drin stehen - oder?
denn, bei mir erscheint nur 4-001 statt 04-001.
Habe schon versucht, dass Problem zu beheben, jedoch zeigt sich das
Modul recht empfindlich auf unqualifizierte Vorschläge meinerseits. ;)
Hast du vielleicht noch eine Idee? (Kann ja nicht mehr viel sein,
oder?)
solange das Feld Integer ist, speichert er eh nur 4001

zum Anzeigen kannst du in der Function schreiben:

R = Format(Jahr, "00") & "-" & format$(N, "000")

HTH Jürgen
Sascha Wostmann
2004-08-14 21:47:33 UTC
Permalink
Post by Dietmar Krawinkel
der Fehler "Typen unverträglich" angezeigt!
Wäre schön, Du würdest Einblick in meine db nehmen (s. Link).
alles klar. Ich habe mir das mal angesehen. Folgende Änderungen sind
nötig:

1)
Im Tabellenentwurf muss das Feld R_Nr von "Zahl" auf "Text" geändert
werden, sonst kann man darin keine formatierten Werte (04-123)
speichern.

2)
im Formular habe ich das Feld "Rechnungs-nr" umbenannt in
"RNr_generiert", damit kein "-" mehr im Namen vorkommt. Das
vereinfacht später die Programmierung

3)
der Code hinter dem Formular ist dann:
------------------------------------------------------
Private Sub Befehl11_Click()
Me.R_Nr = Me.RNr_generiert
End Sub

Private Sub Rechnungsdatum_AfterUpdate()
Me.RNr_generiert = RNr(Me.R_Datum)
End Sub
------------------------------------------------------
die Funktion Form_Current brauchst Du nicht, weil das Feld mit dem
Jahr sowieso an die Tabelle angebunden ist. Es zeigt also automatisch
immer den passenden Wert an.

4)
die Funktion RNr habe ich folgendermaßen geändert:
------------------------------------------------------
Function RNr(Dat As Variant) As String
Dim R As String
Dim Vorspann As String
Dim N As Integer

' Default-Rückgabewert der Funktion
RNr = ""
' wenn kein Datum übergeben wurde, abbrechen
If IsNull(Dat) Then Exit Function
If Not IsDate(Dat) Then Exit Function
' Vorspann der gesuchten RNr zusammenbauen
Vorspann = Format$(Dat, "yy") & "-"
' die höchste RNr mit diesem Vorspann raussuchen
' Wenn es mit diesem Vorspann nichts gibt, dann liefere
' stattdessen Leerstring
R = Nz(DMax("R_Nr", "tblRechnungen", "R_Nr like '" & Vorspann &
"*'"), "")
If R = "" Then
' es gibt in diesem Jahr noch keine Rechnung
RNr = Vorspann & "001"
Else
' die eigentliche Nummer der Rechnung bestimmen
N = Val(Mid$(R, 4))
' eins draufzählen
N = N + 1
' Rechnungsnummer zusammenbauen
RNr = Vorspann & Format$(N, "000")
End If
End Function
------------------------------------------------------
Die Zeile "R = Nz(DMax..." wurde hier leider umbrochen, Du musst das
"*'"), "") noch ans Ende ransetzen.


Ich denke, mit den Kommentaren und der Onlinehilfe solltest Du den
Code verstehen. Viel Spaß noch beim Programmieren :)


Viele Grüße,
Sascha Wostmann
--
wichtige Informationsquellen zu Access: +----------------------
http://www.donkarl.com/ (FAQ) | Bitte keine Kopien
http://www.freeaccess.de/ (KnowHow) | oder Access-Anfragen
http://www.google.de/ (Suchmaschine) | per E-Mail.
Dietmar Krawinkel
2004-08-15 08:57:41 UTC
Permalink
Hallo Sascha,

perfekt, jetzt läuft's rund! :) Danke.

Auch Dank an allen anderen, die so ausdauernd waren und viel
Gehirnschmalz geopfert haben. Ich hoffe, dass viele andere, die das
gleiche Problem wie ich haben, von dieser Programmbeschreibung lernen.

Die geänderte db ersetze ich nochmal auf meiner web. Einer der Cracks
kann die db ja auf seiner FAQ-Seite o.ä. einbinden, damit viele Leute
davon profitieren können.

http://www.architekt-krawinkel.de/Lauf_Rechnungsnr2.mdb (für A00)

Gruss
Dietmar

Dietmar Krawinkel
2004-08-12 16:17:24 UTC
Permalink
Habe das Problemkind auf meine Web gestellt:

http://www.architekt-krawinkel.de/Lauf_Rechnungsnr.mdb

Ist vielleicht einfacher!

Gruss
Dietmar
Loading...