Neuigkeiten:

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

Mobiles Hauptmenü

Ich brauch ein Wunder...

Begonnen von Nadeshiko, Dezember 18, 2014, 15:45:40

⏪ vorheriges - nächstes ⏩

Nadeshiko

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!

MzKlMu

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 ?
Gruß Klaus

MaggieMay

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. ;-)
Freundliche Grüße
MaggieMay

Nadeshiko

#3
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


MzKlMu

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 ?
Gruß Klaus

Nadeshiko

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) & "."

MzKlMu

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.
Gruß Klaus

Nadeshiko

#7
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


Nadeshiko

#8
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

MzKlMu

Hallo,
Du hast 3 Datumsfelder in der Tabelle.
Wieso ist da 2014 und Januar drin und bei Messemonat steht 02 und bei Jahr 2015 ?
Gruß Klaus

Nadeshiko

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!

daolix

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.

MaggieMay

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.
Freundliche Grüße
MaggieMay

Nadeshiko

@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...

daolix

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.