Uniek volnummer maken doormiddel van VBA

Status
Niet open voor verdere reacties.

Mydo

Nieuwe gebruiker
Lid geworden
10 apr 2011
Berichten
1
Ik probeer in een acces database 2007 een uniek nummer te genereren die bestaat uit datum notatie jaar (yyyy) en 4 cijfers oplopend (0000). Dit als bedoeling om een uniek nummer te maken die per jaar oplopend is van 1 tot in 9999.

Na wat speur werk op forums blijkt dat, dat niet gaat met een autonummer veld en toevoegen met Dmax als standaardwaarde in een tabel werkt ook niet.

Ik heb onderstaande VBA gevonden op dit voorbeeld http://www.helpmij.nl/forum/showthr...onummering-quot-YY.MM.0000-per-maand-resetten forum en naar mijn idee aangepast.
Code:
Option Compare Database
Option Explicit

Function VolgNummer(veld As String, Tabel As String) As String
Dim strSQL As String
Dim sFilter As String
Dim sNum As String
Dim iNum As Integer

If InStr(1, veld, " ") > 0 And Left(veld, 1) <> "[" Then veld = "[" & veld & "]"
If InStr(1, Tabel, " ") > 0 And Left(Tabel, 1) <> "[" Then Tabel = "[" & Tabel & "]"

sFilter = Format(Date, "yyyy") & "."
strSQL = Nz(DMax(" & Veld & ", " & Tabel & ", Left(" & Veld & ", 5) = " & sFilter & "))

With CurrentDb.OpenRecordset(strSQL)
If .RecordCount > 0 Then
On Error Resume Next
sNum = Mid(.Fields(0), InStrRev(.Fields(0), ".") + 1)
iNum = CInt(sNum) + 1
sNum = Right("0000" & iNum, 4)
VolgNummer = sFilter & sNum
Else
VolgNummer = sFilter & "0001"
End If
End With

End Function

De functie heb ik in mijn formulierveld als standaardwaarde = VolgNummer(“naam veld”;”naam table”)

als ik de functie toevoeg in het formulier standaardwaarde zie ik alleen VolgNummer() staan en niet VolgNummer («Veld»; «Tabel»)

Echter geeft hij bij een nieuw veld het resultaat “#Naam?”. Ik vraag me af waar ik moet zoeken om het werkend te krijgen?
 
Je roept hem verkeerd aan:
Me.Volgnummer= VolgNummer([Naam veld];[Naam tabel])
Zonder aanhalingstekens dus.
 
Ik denk dat je de code verkeerd hebt aangepast. Hieronder de code nog eens met mijn commentaar in een andere kleur.

Code:
Option Compare Database
Option Explicit

Function VolgNummer(veld As String, Tabel As String) As String
Dim strSQL As String
Dim sFilter As String
Dim sNum As String
Dim iNum As Integer

If InStr(1, veld, " ") > 0 And Left(veld, 1) <> "[" Then veld = "[" & veld & "]"
If InStr(1, Tabel, " ") > 0 And Left(Tabel, 1) <> "[" Then Tabel = "[" & Tabel & "]"

sFilter = Format(Date, "yyyy") & "."
strSQL = Nz(DMax(" & Veld & ", " & Tabel & ", Left(" & Veld & ", 5) = " & sFilter & "))

[COLOR="darkred"]'resultaat van bovenstaand statement is waarschijnlijk NULL,
' ware het niet dat de Nz functie dit voorkomt.
'strSQL is waarschijnlijk een lege string. Dus alles wat hieronder volgt is zinloos.[/COLOR]

With CurrentDb.OpenRecordset(strSQL)
If .RecordCount > 0 Then
On Error Resume Next
sNum = Mid(.Fields(0), InStrRev(.Fields(0), ".") + 1)
iNum = CInt(sNum) + 1
sNum = Right("0000" & iNum, 4)
VolgNummer = sFilter & sNum
Else
VolgNummer = sFilter & "0001"
End If
End With

End Function
Zo zou ik het doen:

Je volgnummer is gescheiden door een punt? Dus 2011.0001 bijvoorbeeld.

Stel dat die in de TabelX is opgeslagen in kolom Volgnummer.

Dan is DMax("Volgnummer","TabelX") 'Het laatste(hoogste) volgnummer.
Als we die waarde in een variabele stoppen:

strVolgnummer = DMax("Volgnummer","TabelX") 'Het laatste(hoogste) volgnummer.

Het volgende volgnummer is Year(date) & "." & format(cint(split(strVolgnummer,".")(1))+1,"000#")

In een functie en rekening gehouden met het nieuwe jaar:
Code:
public function Volgnummer(strField as string, strTableName as string) as string

    dim strVolgNummer as string
    dim arrVolgnummer() as string

    strVolgnummer = DMax(strfield,strtablename)  'Het laatste(hoogste) volgnummer.
    arrVolgnummer = split(strvolgnummer, ".")

    if arrvolgnummer(0) <> Year(Date) then 'Nieuwe jaar is begonnen
        Volgnummer = Year(Date) & ".0001" 
    else
        Volgnummer = Year(date) & "." & format(cint(arrVolgnummer(1))+1,"000#")
    endif

end function
Ik neem hier aan dat je geen spaties hebt in je veldnamen. Anders moet je de code een beetje aanpassen.

Share & Enjoy!
 
De SQL opbouw is verkeerd. Met deze string doet de functie het wel:

Code:
strSQL = "SELECT DISTINCT Max(" & Veld & ") AS MaxNummer FROM " & Tabel _
    & " GROUP BY Nz(Left(" & Veld & ",4))" _
    & " HAVING Nz(Left(" & Veld & ",4))=Year(Date())"
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan