Autonummering DMax text veld

Status
Niet open voor verdere reacties.

miicker

Gebruiker
Lid geworden
1 jul 2010
Berichten
87
Hallo,

Ik heb een vraag: Ik heb een DB. In deze DB staan facturen. Deze wil ik autnummeren zodat de nummering op elkaar volgt. Ik heb nu het volgende:

Code:
=DMax("[FacNr] ";"[tblFactuur]")+1

Dit werkt, ik heb de notatie zo ingesteld dat er staat: FAC2013/"Nummmer"
Dus notatie:
Code:
"Fac2013/"00000

Waardoor factuur 1 er zo uit ziet:
Fac2013/00001

Dit werkt allemaal prima, alleen wil ik deze gegevens ook op die manier in de DB opslaan. Volgend jaar wil ik namelijk voor het factuur "Fac2014/" zetten, en opnieuw beginnen bij 0001.

Ik wil dus van het veld in de tabel een tekstveld maken. Alleen werkt de DMax functie dan niet.

Is er een manier zodat ik dit wel kan doen?

Alvast erg bedankt!

PS: Ik wil het op deze manier, of iig op die manier opslaan. AUB geen reacties zoals "Het is dom dat je het zo doet."
 
Dit werkt niet. Autonummering nummert altijd door, wat je ook doet. Je zult dus een aangepaste functie moeten maken die het nummer bij elk nieuw jaar opnieuw aanmaakt.
Sowieso werkt autonummering niet omdat het nummer weg is als je een record weggooit. Dus als je per abuis een record aanmaakt en weggooit, is het nummer ook foetsie.
 
Ik maak nu al gebruik van DMax. Dus nu werkt het maar ik wil het opslaan in de DB op deze manier: Fac2013/00001
Nu wordt het alleen in het form zo weergegeven: Fac2013/00001, maar opgeslagen als "1"
 
Ook al gebruik je DMAX, dat betekent nog niet dat het systeem werkt. Dat doet het namelijk niet. Autonummers kun je niet resetten. Dus ik zou de functie Volgnummer die op het forum al een paar keer is uitgelegd er eens bij opzoeken :)
 
Daar heb ik op gezocht, kon niets vinden, heb je miss een linkje?
 
Een stukje code om je op weg te helpen...
Code:
Function Volgnummer(Veldnaam As String, Tabelnaam As String) As String
Dim strSQL As String
Dim arr As Variant
Dim Nummer As Integer, Jaar As Integer
Dim rst As ADODB.Recordset
Dim cnConn As ADODB.Connection

    strSQL = "SELECT TOP 1 [" & Veldnaam & "] FROM [" & Tabelnaam & "] " _
        & " WHERE ([" & Veldnaam & "] Is Not Null) ORDER BY [" & Veldnaam & "] DESC"
    
    Set cnConn = CurrentProject.Connection
    Set rst = New ADODB.Recordset
    rst.Open strSQL, cnConn, adOpenKeyset, adLockOptimistic, adCmdText
    With rst
        If Not .BOF And Not .EOF Then sWaarde = .Fields(0).Value
        .Close
    End With
    
    If sWaarde & "" = "" Then GoTo GeenNummer
    arr = Split(sWaarde, "-")
    Jaar = CInt(arr(0))
    If Jaar = Year(Date) Then
        Nummer = CInt(arr(1)) + 1
    Else
        Nummer = 1
    End If
    Volgnummer = Jaar & Format(Nummer, "-0000")
    Exit Function
    
GeenNummer:
    Volgnummer = Year(Date) & "-0001"

End Function
Deze functie maakt een volgnummer dat per jaar opnieuw begint te nummeren. Niet helemaal de lay-out die jij wilt, maar dat kun je vast aanpassen.
 
Laatst bewerkt:
Oke bedankt, hier kan ik denk ik wel iets mee, nog een vraagje: waar koppel ik de code aan? Welke property? En een property van de tabel of het form?
 
Zelf zet ik 'm op de standaardwaarde van het autonummerveld. Je wilt tenslotte dat het nieuwe nummer gegenereerd wordt als je een nieuw record maakt.
 
Autonummerveld? Er is geen autonummerveld. Dat is de hele grap: je wilt dat niet, en je hebt dat ook niet nodig.
 
Oke haha verkeerd begrepen, maar oke ik ga er eens mee stoeien
 
Hoe krijg ik de code bij de standaardwaarde van het veld? Ik neem aan op tabelniveau? Want volgens mij dat niet bedoeld voor deze code, alleen formulies en functies als ik het goed heb. Hoe stel je de code precies in?
 
We hebben het over formulieren. Daar hoort-ie dan ook thuis. Ik heb overigens de code aangepast, daar zat nog een klein foutje in. Is nu opgelost.
Op je formulier gebruik je hem dan zo:
Code:
=VolgNummer("Volgnummer";"Tabel1")
Waarbij in dit voorbeeld Volgnummer het veld is, en Tabel1 de tabel. De formule is dus de standaardwaarde van het veld.
 
Ik heb nu dit in de programmacode gezet:

Code:
Private Sub FacNr_DefaultValue()
Function VolgNummer(Veldnaam As String, Tabelnaam As String) As String
Dim sVeld As String, sTabel As String, sWaarde As String, strSQL As String
Dim arr As Variant
Dim Nummer As Integer, Jaar As Integer
Dim rst As ADODB.Recordset
Dim cnConn As ADODB.Connection

    sVeld = "[FacNr]"            'Hier het veld dat je gebruikt voor het volgnummer.
    sTabel = "[tblFactuur]"          'Hier de tabelnaam waar het volgnummer in staat.
    
    strSQL = "SELECT TOP 1 " & sVeld & " FROM " & sTabel _
        & " WHERE (" & sVeld & " Is Not Null) ORDER BY " & sVeld & " DESC"
    
    Set cnConn = CurrentProject.Connection
    Set rst = New ADODB.Recordset
    rst.Open strSQL, cnConn, adOpenKeyset, adLockOptimistic, adCmdText
    With rst
        If Not .BOF And Not .EOF Then sWaarde = .Fields(0).Value
        .Close
    End With
    
    If sWaarde & "" = "" Then GoTo GeenNummer
    arr = Split(sWaarde, "-")
    Jaar = CInt(arr(0))
    If Jaar = Year(Date) Then
        Nummer = CInt(arr(1)) + 1
    Else
        Nummer = 1
    End If
    VolgNummer = Jaar & Format(Nummer, "-0000")
    Exit Function
    
GeenNummer:
    VolgNummer = Year(Date) & "-0001"

End Function

End Sub

Enig idee waarom dit niet werkt? Het veld is gewoon leeg.
 
Een functie mag je nooit binnen een Sub zetten. Dus begin eens met de eerste en laatste regel te verwijderen. Best zet je de functie ook in een aparte module.
 
Ik heb echt geen idee waar ik de code moet neerzetten. Ik kan dit niet zomaar doen bij de property "Standaardwaarde" Waar moet ik het dan wel neerzetten? Of wat moet ik toevoegen/veranderen aan de code?
 
Oke ik heb even gekeken, en heb deze code los neergezet:

Code:
Function VolgNummer(Veldnaam As String, Tabelnaam As String) As String
Dim sVeld As String, sTabel As String, sWaarde As String, strSQL As String
Dim arr As Variant
Dim Nummer As Integer, Jaar As Integer
Dim rst As ADODB.Recordset
Dim cnConn As ADODB.Connection

    sVeld = "[FacNr]"            'Hier het veld dat je gebruikt voor het volgnummer.
    sTabel = "[tblFactuur]"          'Hier de tabelnaam waar het volgnummer in staat.
    
    strSQL = "SELECT TOP 1 " & sVeld & " FROM " & sTabel _
        & " WHERE (" & sVeld & " Is Not Null) ORDER BY " & sVeld & " DESC"
    
    Set cnConn = CurrentProject.Connection
    Set rst = New ADODB.Recordset
    rst.Open strSQL, cnConn, adOpenKeyset, adLockOptimistic, adCmdText
    With rst
        If Not .BOF And Not .EOF Then sWaarde = .Fields(0).Value
        .Close
    End With
    
    If sWaarde & "" = "" Then GoTo GeenNummer
    arr = Split(sWaarde, "-")
    Jaar = CInt(arr(0))
    If Jaar = Year(Date) Then
        Nummer = CInt(arr(1)) + 1
    Else
        Nummer = 1
    End If
    VolgNummer = Jaar & Format(Nummer, "-0000")
    Exit Function
    
GeenNummer:
    VolgNummer = Year(Date) & "-0001"

Vervolgens heb ik in de standaardwaarde de tekst "=VolgNummer("FacNr";"tblFactuur")" gezet.
Ik krijg nu de melding als ik het form open:

Code:
Compileer fout:

Een door de gebruiker gedefineerd gegevenstype is niet gedefineerd.

Hij verwijst naar deze regel:
Code:
Function VolgNummer(Veldnaam As String, Tabelnaam As String) As String

Ik heb dit ook al veranderd naar:
Code:
Function VolgNummer(FacNr As String, tblFactuur As String) As String
Maar dan werkt het ook niet.

Enig idee wat ik moet doen?
 
Kijk eens naar berichtje #13...
 
ja weet ik, maar waar moet ik dat zetten? (sorry weet echt niets van programmeren)
 
Wat je net hebt gedaan, maar nu met de goede code. De huidige code dus vervangen door de goede.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan