Offertenummer als autonummer-veld verstandig?

Status
Niet open voor verdere reacties.
Ik heb nu het probleem dat hij niet 1 optelt bij het huidige (hoogste) offertenummer in tabel "offertes"

Ik gebruik deze code in een module:

Code:
Option Compare Database

Function NieuwVolgNummer(Veld As String, Tabel As String) As String
Dim strVolgNummer As String
Dim strNieuwVolgNummer As String
Dim strSQL As String, sInit As String
Dim tmpNummer
Dim tmp

    '------------------------------------------------------------------------------------------------
    ' Huidige volgnummer uit tabel lezen die als parameter is meegegeven.
    '------------------------------------------------------------------------------------------------
    On Error Resume Next
    sInit = DLookup("Initialen", "Gebruikers", "GebruikerID=" & UserID)
    If sInit & "" = "" Then sInit = "XX"
    On Error GoTo 0
   strSQL = "SELECT TOP 1 [" & Veld & "] FROM Offertes " _
        & "GROUP BY [" & Veld & "], Left([" & Veld & "],4), Val(Right([" & Veld & "],4)) " _
        & "HAVING (CInt(Left([" & Veld & "], 4)) = " & Year(Date) & ") " _
        & "ORDER BY Left([" & Veld & "],4) DESC , Val(Right([" & Veld & "],4)) DESC;"
    
    With CurrentDb.OpenRecordset(strSQL)
        On Error Resume Next
        If .RecordCount > 0 And Nz(.Fields(0).Value, 0) <> 0 Then
            strVolgNummer = .Fields(0).Value
        Else
            strVolgNummer = Format(0, "0000")
        End If
    End With
    
    '------------------------------------------------------------------------------------------------
    ' Kijken of er een koppelteken in het volgnummer zit; vervolgens nieuw nummer maken.
    '------------------------------------------------------------------------------------------------
    If InStr(strVolgNummer, "-") > 0 Then
        tmpNummer = Split(strVolgNummer, "-")
        If CInt(Left(tmpNummer(UBound(tmpNummer)), 4)) = Year(Date) Then
            strNieuwVolgNummer = _
                CInt(Left(tmpNummer(UBound(tmpNummer)), 4)) & _
                sInit & _
                Right("0000" & CInt(Right(tmpNummer(UBound(tmpNummer)), 4)) + 1, 4)
        Else
            strNieuwVolgNummer = Year(Date) & sInit & CStr("0001")
        End If
    Else
        strNieuwVolgNummer = Year(Date) & sInit & CStr("0001")
    End If
    
    '------------------------------------------------------------------------------------------------
    ' Nieuw nummer toekennen aan de functie.
    '------------------------------------------------------------------------------------------------
    NieuwVolgNummer = strNieuwVolgNummer

End Function

In het veld "Offertenummer" van het formulier "Nieuwe offerte" gebruik ik als standaardwaarde deze formule:

Code:
=NieuwVolgNummer("Offertenummer";"Offertes")
 
En wat staat er als waarde in het veld?
 
Nou, het staat er goed:

2013XX0000

Waarbij

XX = gebruikersinitialen
0000 = volgnummer offerte

Voor het volgnummer pakt hij steeds 00001 ipv op te zoeken wat jet hoogste nummer is voor de huidige gebruiker en hier 1 bij op te tellen.
 
De functie maakt gebruik van een koppelteken in het offertenummer. Die zit er bij jou niet. Als die er wel zou zijn, gaat het nog steeds verkeerd, want het nieuwe nummer dat gemaakt wordt heeft geen koppelteken, dus een volgende zoekactie gaat al gelijk fout. Je moet de functie dus aanpassen.
 
Laatst bewerkt:
Ik begrijp dat ik dan in het deel 'kijken of er een koppelteken staat' moet zoeken. Wat moet ik hier precies in wijzigen? Het eerste if statement kan al weg denk ik?
 
Ja, dan kan weg. Er hoeft niks gesplitst te worden; je moet het linker deel (voor het jaartal) en het rechterdeel (voor het nummer) er uit vissen, en het middenstuk voor de werknemercode.
 
Ik heb dit stukje weggehaald:
Code:
    If InStr(strVolgNummer, "-") > 0 Then
        tmpNummer = Split(strVolgNummer, "-")

Ik weet nu alleen niet hoe ik het volgende stukje precies aan moet passen. Ik heb al geprobeerd om geen "Left(" en "Right(" te verwijderen maar dat vind meneer Access niet goed.
Code:
        If CInt(Left(tmpNummer(UBound(tmpNummer)), 4)) = Year(Date) Then
            strNieuwVolgNummer = _
                CInt(Left(tmpNummer(UBound(tmpNummer)), 4)) & _
                sInit & _
                Right("0000" & CInt(Right(tmpNummer(UBound(tmpNummer)), 4)) + 1, 4)
        Else
            strNieuwVolgNummer = Year(Date) & sInit & CStr("0001")
        End If
    Else
        strNieuwVolgNummer = Year(Date) & sInit & CStr("0001")
    End If

Dit is nu de code in zijn geheel:

Code:
Option Compare Database

Function NieuwVolgNummer(Veld As String, Tabel As String) As String
Dim strVolgNummer As String
Dim strNieuwVolgNummer As String
Dim strSQL As String, sInit As String
Dim tmpNummer
Dim tmp

    '------------------------------------------------------------------------------------------------
    ' Huidige volgnummer uit tabel lezen die als parameter is meegegeven.
    '------------------------------------------------------------------------------------------------
    On Error Resume Next
    sInit = DLookup("Initialen", "Gebruikers", "GebruikerID=" & UserID)
    If sInit & "" = "" Then sInit = "XX"
    On Error GoTo 0
   strSQL = "SELECT TOP 1 [" & Veld & "] FROM Offertes " _
        & "GROUP BY [" & Veld & "], Left([" & Veld & "],4), Val(Right([" & Veld & "],4)) " _
        & "HAVING (CInt(Left([" & Veld & "], 4)) = " & Year(Date) & ") " _
        & "ORDER BY Left([" & Veld & "],4) DESC , Val(Right([" & Veld & "],4)) DESC;"
    
    With CurrentDb.OpenRecordset(strSQL)
        On Error Resume Next
        If .RecordCount > 0 And Nz(.Fields(0).Value, 0) <> 0 Then
            strVolgNummer = .Fields(0).Value
        Else
            strVolgNummer = Format(0, "0000")
        End If
    End With
    
    '------------------------------------------------------------------------------------------------
    ' Kijken of er een koppelteken in het volgnummer zit; vervolgens nieuw nummer maken.
    '------------------------------------------------------------------------------------------------

        If CInt(Left(tmpNummer(UBound(tmpNummer)), 4)) = Year(Date) Then
            strNieuwVolgNummer = _
                CInt(Left(tmpNummer(UBound(tmpNummer)), 4)) & _
                sInit & _
                Right("0000" & CInt(Right(tmpNummer(UBound(tmpNummer)), 4)) + 1, 4)
        Else
            strNieuwVolgNummer = Year(Date) & sInit & CStr("0001")
        End If
    Else
        strNieuwVolgNummer = Year(Date) & sInit & CStr("0001")
    End If
    
    '------------------------------------------------------------------------------------------------
    ' Nieuw nummer toekennen aan de functie.
    '------------------------------------------------------------------------------------------------
    NieuwVolgNummer = strNieuwVolgNummer

End Function
 
Ik heb het helaas nog steeds niet werkend.

Ik heb nu de volgende code in module "NieuwVolgNummer":

Code:
Option Compare Database

Function NieuwVolgNummer(Veld As String, Tabel As String) As String
Dim strVolgNummer As String
Dim strNieuwVolgNummer As String
Dim strSQL As String, sInit As String
Dim tmpNummer
Dim tmp

    '------------------------------------------------------------------------------------------------
    ' Huidige volgnummer uit tabel lezen die als parameter is meegegeven.
    '------------------------------------------------------------------------------------------------
    On Error Resume Next
    sInit = DLookup("Gebruikers", "Initialen", "GebruikerID=" & UserID)
    If sInit & "" = "" Then sInit = "XX"
    On Error GoTo 0
   strSQL = "SELECT TOP 1 [" & Veld & "] FROM Offertes " _
        & "GROUP BY [" & Veld & "], Left([" & Veld & "],4), Val(Right([" & Veld & "],4)) " _
        & "HAVING (CInt(Left([" & Veld & "], 4)) = " & Year(Date) & ") " _
        & "ORDER BY Left([" & Veld & "],4) DESC , Val(Right([" & Veld & "],4)) DESC;"
    
    With CurrentDb.OpenRecordset(strSQL)
        On Error Resume Next
        If .RecordCount > 0 And Nz(.Fields(0).Value, 0) <> 0 Then
            strVolgNummer = .Fields(0).Value
        Else
            strVolgNummer = Format(0, "0000")
        End If
    End With
    
    '------------------------------------------------------------------------------------------------
    ' Kijken of er een koppelteken in het volgnummer zit; vervolgens nieuw nummer maken.
    '------------------------------------------------------------------------------------------------

        If CInt(Left(tmpNummer(UBound(tmpNummer)), 4)) = Year(Date) Then
            strNieuwVolgNummer = _
                CInt(Left(tmpNummer(UBound(tmpNummer)), 4)) & _
                sInit & _
                Right("0000" & CInt(Right(tmpNummer(UBound(tmpNummer)), 4)) + 1, 4)
        Else
            strNieuwVolgNummer = Year(Date) & sInit & CStr("0001")
        End If
    
    '------------------------------------------------------------------------------------------------
    ' Nieuw nummer toekennen aan de functie.
    '------------------------------------------------------------------------------------------------
    NieuwVolgNummer = strNieuwVolgNummer

End Function

Hij vult nu helaas helemaal niets in. Het veld blijft leeg.

Dit is de database:
http://www.mijnbestand.nl/Bestand-PZQXMB7XYWD8.mdb
 
Is inmiddels werkend met deze code:

Code:
Function NieuwVolgNummer(Veld As String, Tabel As String) As String
    
    Dim strVolgNummer As String
    Dim strNieuwVolgNummer As String
    Dim strSQL As String, sInit As String
    Dim tmpNummer
    Dim tmp

    
    '------------------------------------------------------------------------------------------------
    ' Huidige volgnummer uit tabel lezen die als parameter is meegegeven.
    '------------------------------------------------------------------------------------------------
    On Error Resume Next
    sInit = DLookup("Gebruikers", "Initialen", "GebruikerID=" & UserID)
    If sInit & "" = "" Then sInit = "XX"
    On Error GoTo 0
    
    strSQL = "SELECT TOP 1 [" & Veld & "] FROM Offertes " _
        & "WHERE GebruikerID = " + LTrim(Str(UserID)) + " " _
        & "GROUP BY [" & Veld & "], Left([" & Veld & "],4), Val(Right([" & Veld & "],4)) " _
        & "HAVING (CInt(Left([" & Veld & "], 4)) = " & Year(Date) & ") " _
        & "ORDER BY Left([" & Veld & "],4) DESC , Val(Right([" & Veld & "],4)) DESC;"
    
    'MsgBox strSQL
    
    With CurrentDb.OpenRecordset(strSQL)
        On Error Resume Next
        
        If .RecordCount > 0 And Nz(.Fields(0).Value, 0) <> 0 Then
            strVolgNummer = .Fields(0).Value
        Else
            strVolgNummer = Format(0, "0000")
        End If
        
        If .RecordCount = 0 Then
            strVolgNummer = Format(Year(Date), "0000") + UserInitials + Format(0, "0000")
        End If
        
    End With
    
    ' MsgBox strVolgNummer
    
    ' UserInitials
    
    NieuwVolgNummer = strVolgNummer
    ' Neem linkse deel volgnummer - 6 tekens, zonder gebruikersintitialen
    HulpString = Left(strVolgNummer, Len(strVolgNummer) - 6)
    ' Neem rechtse 4 tekens van Volgnummer en tel er 1 bij op.
    NrStr = Format(Val(Right(strVolgNummer, 4) + 1), "0000")
    ' Voeg hier de 2 hulpstrings en daartussen Userinitials
    NieuwVolgNummer = LTrim(HulpString + UserInitials + NrStr)
    
    

End Function
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan