Hallo Maniacs,
ich Access Anfänger brauch ein Wunder zu Weihnachten.
Ich habe eine Tabelle in Access, wo unsere Messen und Veranstaltungen hinterlegt sind.
Jeder Messe muss nun eine eindeutige Positionsnummer zugeteilt werden. Diese Positionsnummer generiert sich wie folgt:
800.[AbrechnungsMonat].[AbrechnungsJahr].[Position].00
Hintergrund: Der Benutzer erstellt eine neue Messe im Formular. Er wählt den [AbrechnungsMonat] und das [Jahr]. Danach klickt er auf einen Button und generiert so die entsprechende Positionsnummer.
Beispiel:
800.01.15.03.00
d.h. die Messe wird zu Januar abgerechnet, im Jahr 2015 und ist die 3te Messe im gleichen Monat.
Jetzt kann ich alle Parameter an die Generierung der Positionsnummer übergeben, AUSSER der Position selbst! Denn diese muss von selbst hochgezählt werden.
Ich hab jetzt wie folgt gebastelt:
Private Sub btnMesseNr_Click()
Dim PositionNr As String
Dim intLenStr As Integer
Dim strBedingung As String
Dim StrMax As Integer
Dim strNo As String
Dim PoNr As String
Dim strFeldName As String
Dim strTabName As String
strFeldName = "MesseNr"
strTabName = "tblMessen"
On Error GoTo ErrHandler
'Prüfung ob Monat oder Jahr eingetragen ist
If IsNull(Me!MesseMonat) Or IsNull(Me!MesseJahr) Then
MsgBox "Bitte Monat und / oder Jahr eingeben."
Exit Sub
Else
PositionNr = "800." & Me!MesseMonat.Column(0) & "." & Right(Me!MesseJahr, 2) & "."
'Länge des Datumsstrings
intLenStr = Len(PositionNr)
'Bedingung für den letzten Wert festlegen
strBedingung = "LEFT([" & strFeldName & "], " & intLenStr & ")='" & PositionNr & "'"
'Letzten Wert suchen
StrMax = DMax(strFeldName, strTabName, strBedingung)
If IsNull(StrMax) Then
'Start mit 1
strNo = String$(1, "0") & "1"
Else
'Zähler links
strNo = Right(StrMax, 2)
End If
'Zähler setzen
strNo = Format$(Val(strNo) + 1, String$(2, "0"))
Me!MesseNr = PositionNr & strNo
End If
ExitHere:
Exit Sub
ErrHandler:
Dim strErrString As String
strErrString = "Error Information..." & vbCrLf
strErrString = strErrString & "Error#: " & Err.Number & vbCrLf
strErrString = strErrString & "Description: " & Err.Description
MsgBox strErrString, vbCritical + vbOKOnly, "Function: WeekCounter"
Resume ExitHere
End Sub
Es kommt eine Fehlermeldung mit Überlauf.. und zwar beim DMax. Ich nehme an, dass das Hochzählen nicht funktioniert.
Vielleicht hat jemand von euch eine alt. Lösung. Bin auch für andere Ansatzwege zur Lösung des Problems bereit.
Ich hab mir schon überlegt vllt. die Positionsnummer in zwei Tabellen zu trennen
Sprich:
PositionsNr
800.01.15.
Position
01
(Die '.00' am Ende ist mir egal)
Aber...dann muss der Wert [PositionsNr] gefiltert werden und die [Position] hochzählt (bei 01 anfangen). Die Lösung ist wohl aber an sich unschön (für mich zumindest].
:) Danke!
Hallo,
für den Monat und Jahr sollte man einfach ein Datum eintragen, wenn nicht bereits vorhanden.
In der Tabelle selbst sollte nur die Position als reine Zahl gespeichert werden und nicht der komplette Positionstext. In einer Abfrage kann man das dann darstellen.
Der von Dir gezeigte VBA Code schrumpft bei korrektem Aufbau auf ein Einzeiler.
Beginnt die Position jeden Monat bei 1 oder jedes Jahr ?
Hallo,
eine Integer-Variable kann nicht den Wert NULL annehmen, du solltest also noch die NZ-Funktion in Verbindung mit DMax zum Einsatz bringen:
StrMax = NZ(DMax(strFeldName, strTabName, strBedingung), 0)
Im übrigen würde ich eine Integer-Variable auch gar nicht erst "strMax" nennen. ;-)
Hallo!
Vielen Dank erst mal! Sorry, ich bin erst jetzt dazu gekommen, wieder zu proggen. Daher konnte ich erst jetzt antworten...
@MzKlMu: Das wäre auch eine Lösung. Dann müsste ich eine Aktualisierungsabfrage starten, die alle Zahlen hochzählt und die letzte lehre Position generiert und in die Tabelle übernimmt? Die Position beginnt jeden Monat bei 1.
@Maggie: Nz werde ich versuchen, meld mich dann :) <---Leider immer noch ein Überlauf Fehler
Hallo,
nein, dazu benötigst Du keine Aktualisierungsabfrage.
Das ist einfach der Befehl (ganz allgemein):
Nz(DMax("Feldname","Tabellenname","Kriterien"),0) +1
Als Kriterien wird der Monat und das Jahr übergeben.
Hast Du ein Datum aus dem sich Monat und Jahr ableiten lassen ?
Wenn ja, wie heißt das Feld ?
Zitat von: MzKlMu am Dezember 22, 2014, 10:24:31
Hallo,
nein, dazu benötigst Du keine Aktualisierungsabfrage.
Das ist einfach der Befehl (ganz allgemein):
Nz(DMax("Feldname","Tabellenname","Kriterien"),0) +1
Als Kriterien wird der Monat und das Jahr übergeben.
Hast Du ein Datum aus dem sich Monat und Jahr ableiten lassen ?
Wenn ja, wie heißt das Feld ?
Ja, der Monat wird vom Benutzer im Kombinationsfeld ausgesucht. Das Jahr gibt der Benutzer selbst ein. Das wird dann auf die letzten zwei Stellen gekürzt.
Danke!
PositionNr = "800." & Me!MesseMonat.Column(0) & "." & Right(Me!MesseJahr, 2) & "."
Hallo,
ich hatte nach einem
Datum gefragt.
ZitatHast Du ein Datum aus dem sich Monat und Jahr ableiten lassen ?
Die von Dir gezeigte Formel berücksichtigt nicht meinen Vorschlag.
PS:
Bitte keine vollständigen Beiträge als Zitat. Das verlängert nur unnötig die Themen.
Versteh vllt die Frage immer noch nicht...
Der Benutzer ordnet die Messe dem Monat und dem Jahr zu. Daher wird der Monat und das Jahr keinem "Datum" abgeleitet, sondern durch die Auswahl des Benutzers erst festgelegt, da viele Messen erst halbes Jahr später statt finden.
Dadurch soll dem Benutzer die Möglichkeit gegeben werden den Abrechnungsmonat und -Jahr selbst festzulegen (siehe Bild)
@_@ Pardon...? Den Vorschlag konnte ich noch nicht berücksichtigen. Das ist die Generierung der ersten Stellen nur, die mit Nz, Dmax nichts zu tun hatten. Sie haben ja nur nach dem Feldnamen gefragt.
Viele Grüße
Vllt hilft noch ein Bild der Tabelle... :)
Die Positionsnummer wird nur dann eingefügt, wenn der Benutzer diese auch per Button generiert.
In dieser Tabelle ist die Nummer in diesem Fall unvollständig, weil die Position noch nicht generiert wurde.....daher
Hallo,
Du hast 3 Datumsfelder in der Tabelle.
Wieso ist da 2014 und Januar drin und bei Messemonat steht 02 und bei Jahr 2015 ?
Diese Datumsfelder haben keine Aussage, die habe ich nur zum Test eingefügt. Das wichtigste ist nur Monatsauswahl per Kombinationsfeld und Jahr. Nur durch diese Eingaben wird die Positionsnummer genegiert. Hintergrund ist, weil die Abbau- und Aufbau-Zeiten immer variieren und manchmal mit anderem Monat überschneiden (z.B. Laufzeit vom 28.02 bis 15.03). Daher muss der Benutzer selbst eindeutig definieren zu welchen Monat er es abrechnen möchte.
Danke!
Hallo
lt. deines Bildes sind die MesseNr ähnlich aufgebaut wie "800.01.15.01.". Sind also eher ein String
dim strMax as integer
StrMax = DMax(strFeldName, strTabName, strBedingung)
Kann daher nicht funktionieren weil selbst bei einer erfolgreichen Umwandlung dieses Stringes in eine Zahl, diese Zahl nicht in ein Integer passt. dieser kann nur Werte zw -32tausendirgendwas und +32tausendIrgendwas einnehmen. Daher ist ein Überlauf irgendwie logisch.
Ändere StrMax in einen String.
Hallo,
wie kommst du bei Eingabe von Messemonat=02 und Messejahr=2014 auf die Messenr. 800.01.15.01?
Es muss schon das eingegeben werden, was auch zur Generierung der Messenummer herangezogen wird, wie sonst soll das funktionieren?!
Da du die beiden Werte bereits in der Tabelle speicherst, sollte sich eine neue Messenummer folgendermaßen erstellen lassen:
MesseNr = "800." & Me!MesseMonat.Column(0) & "." & Right(Me!MesseJahr, 2) & "." &
Format(Nz(DMax("Right(MesseNr,2)","Tabellenname","MesseMonat='" & Me!MesseMonat.Column(0) & "' AND MesseJahr='" & Right(Me!MesseJahr, 2) & "'"),0) +1, "00")
@Daolix:
Gesucht wird nicht die höchste MesseNr, sondern die höchste PositionsNr je Monat und Jahr, und dazu reicht ein Integer völlig aus.
@daolix: OMG....das hab ich ganz übersehen! Jetzt funktioniert es! Super vielen lieben Dank für den Hinweis! Vor lauter Bäumen den Wald nicht mehr gesehen!
@Maggie: Hat damit zu tun, dass ich bei verschiedenen Testzwecken, die Nummern mehrmals überschrieben und geändert habe. Nur durch den Button soll die Nummer generiert werden. Da ich Felder geändert habe ohne Generierung, wurde natürlich die Positionsnummer noch nicht zugeteilt. Aber du hast Recht, ich muss es nun abfangen. Wenn der Benutzer den Monat ändert aber die Positionsnummer nicht generiert, dann kann es bei der Filterung SPÄTER zur Verwirrung kommen...
Zitat von: MaggieMay am Dezember 22, 2014, 14:30:39
@Daolix:
Gesucht wird nicht die höchste MesseNr, sondern die höchste PositionsNr je Monat und Jahr, und dazu reicht ein Integer völlig aus.
Das mag jetzt für deine eben gepostete Zeile für DMax stimmen, im Ursprugscode aber nicht.
Sorry, aber...
Zitat von: daolix am Dezember 22, 2014, 14:21:34
dim strMax as integer
StrMax = DMax(strFeldName, strTabName, strBedingung)
Kann daher nicht funktionieren
Das kommt ganz darauf an, was sich hinter strFeldname verbirgt, denn nach der kompletten Messenummer zu suchen macht ja aus o.g. Gründen gar keinen Sinn.
Hallo
schau dir doch einfach den Code im Eingangspost an.
ich weiß jetzt echt nicht auf was für eine Diskusion du hinaus willst.
Habe eigentlich alles klar gesagt, wie ich das meine.
Es soll eine lfd. Positionsnummer nach Monat und Jahr erzeugt werden,
da macht es keinen Sinn, DMax auf die komplette Messenummer anzuwenden.
Was auch immer der Code im Eingangspost macht, er wurde ja lediglich auf der Suche nach einer besseren/einfacheren Lösung gezeigt.
Oder kann es sein, dass wir aneinander vorbeireden und du die bisherige Diskussion vor deinem ersten Beitrag nicht ganz verfolgt hast?
ja, denn ich habe nur erklärt, mit Zeile des Orginalcodes, warum es zum Überlauf kommt.