Klantnummer = datum+autonummer

Status
Niet open voor verdere reacties.

goedlichtJoost

Gebruiker
Lid geworden
7 mrt 2012
Berichten
477
Hallo Allemaal,

Ik heb een databse gemaakt waarin contactpersonen toegevoegd kunnen worden.
Deze contactpersonen krijgen een klantnummer (tevens primaire sleutel)
Hiervoor gebruik ik nu gewoon autonummer.
Maar graag zou ik willen dat het klantnummer (gewoon net zoals nu, automatisch is, en primaire sleutel voor op een ander formulier) er als volgt uitziet:

jaarmaandautonummer. bv: 20130115

Het mag gewoon doortellen, dus de autonummer hoeft niet elke maand op 0 te beginnen. maar wel graag de huidige maand en huidig jaar.

Hoe kan ik dit het beste doen?

Mvg
Joost
 
Ik weet vrij zeker dat je automatisch een tweede kolom met zo'n ID kunt vullen. Of je ook de originele ID direct kunt aanpassen via een gegeven formaat weet ik niet zeker. Ik vraag me af of autonumber dan nog wel geheel correct werkt. Dat is mogelijk specifiek voor de database (en access is niet mijn sterkste kant).
 
Waar zou ik deze tweede kolom moeten toevoegen dan? in de tabel is maar ruimte voor 1 gegevenstype, en geen DATE(NOW) achtig iets
 
In de tabel zelf.

Je krijgt dan kolommen tempID, ID, naam, etc.

tempid is dan autoincrement, ID wordt (eenmalig) gegenereerd uit ID en is primary key. Dit is een wat logge methode, maar volgens mij de enige die standaard toe te passen is.

Als alternatief kun je een stored procedure (of specifiek voor access: VBA) gebruiken om het nummer om te vormen voordat de submit gegaan wordt.
 
Een Autonummer veld kun je niet ombouwen; je kunt wel een numeriek of tekstveld maken waarin je een nummer genereert op basis van de gewenste opmaak. Je zult dan een procedure moeten maken die het nummer aanmaakt en ophoogt. Een extra veld lijkt mij niet nuttig, want dan heb je twee sleutelvelden, waarvan er een overbodig is.
 
Een tijdje geleden heb ik in Access iets vergelijkbaars gedaan met onderstaande functie. Deze maakt een debiteurnummer aan op basis van het jaar gevolgd door een volgnummer van 3 posities. Ik denk dat met een paar eenvoudige aanpassingen het aan jouw wens zou kunnen voldoen.

Code:
Public Function DebiteurVolgNummers()

Dim strDatum As String
Dim X As Integer
Dim MaxVolgNummer As String

strDatum = Format(Date, "yyyy")

X = DCount("*", "Debiteuren", "Left(DebiteurId,4) = '" & strDatum & "'")

MaxVolgNummer = Nz(DMax("DebiteurId", "Debiteuren", "Left(DebiteurId,4) = '" & strDatum & "'"), 0)

If X > 0 Then
    DebiteurVolgNummers = Format(MaxVolgNummer + 1, "000")
    Else
    DebiteurVolgNummers = Format(Date, "yyyy") & "001"
End If

MaxVolgNummer = Empty

End Function

In het formulier waar je je klanten invoert roep je de functie aan in het BeforeInsert-event van het formulier:
Code:
Private Sub Form_BeforeInsert(Cancel As Integer)
    If IsNull(Me![DebiteurId]) Then
        Me![DebiteurId] = DebiteurVolgNummers()
    End If
End Sub

Succes!
 
Deze functie gaat niet helemaal doen wat TS vraagt. Dana heb je meer zoiets als dit nodig...

Code:
Public Function VolgNummer(Veld As String, Tabel As String) As Long
Dim strDatum As String, strSQL As String
Dim x As Integer, y As Integer, z As Integer
Dim MaxVolgNummer As String

    strSQL = "SELECT DISTINCT TOP 1 [" & Veld & "] AS ZoekNummer, CInt(Left([" & Veld & "],4)) " _
        & "AS Jaar, CInt(Mid([" & Veld & "],5,2)) AS Maand " _
        & "FROM [" & Tabel & "] " _
        & "WHERE ([" & Veld & "] Is Not Null) " _
        & "GROUP BY [" & Veld & "] " _
        & "ORDER BY [" & Veld & "] DESC;"

    With CurrentDb.OpenRecordset(strSQL)
        On Error GoTo GeenData
        If .RecordCount = 1 Then
            x = CInt(.Fields("Jaar"))
            y = CInt(.Fields("Maand"))
            z = CInt(Right(.Fields("ZoekNummer"), 2)) + 1
        End If
    End With

    If x <> CInt(Year(Date)) And y <> CInt(Month(Date)) Then
        GoTo GeenData
    End If
    
VolgNummerMaken:
    VolgNummer = CLng(x & Right("00" & y, 2) & Right("00" & z, 2))
    Exit Function

GeenData:
    x = Year(Date)
    y = Month(Date)
    z = 1
    GoTo VolgNummerMaken
End Function
Deze functie gebruik je als standaardwaarde op het veld waarin je het volgnummer wilt genereren. Bijvoorbeeld zo:
Code:
=VolgNummer("Nummer";"tblTemp")
 
Mooi :thumb: ! Twee alternatieven :). Als "TS" er nu niet uitkomt, dan weet ik het ook niet meer ;).
 
Juich niet te vroeg!
Haha ik kom er toch niet helemaal uit.

Hartstikke bedankt voor de snelle reacties.

Ik weet nu niet precies wat ik moet doen als stappen zeg maar. Ik heb het volgende gedaan.
Ik heb in Visual Basic van mijn formulier waarin in contactpersonen aanmaak en toevoeg de precieze bovenste code toegevoegd van Octa Fish.

Nu heb ik in het veld welke gekoppeld is aan het klantnummer (deze wordt normaal dus automatisch gevuld vanuit autonummer, en is in mijn tabel de primaire sleutel)
de volgende code ingevuld:

Code:
 =VolgNummer("Klantnummer";"Contactpersonen_tbl")

Nu krijg ik wanneer ik een nieuwe klant open de volgende waarde in het tekst veld: #fout.

Dit is ook logisch denk ik, want ik heb in mijn tabel als ik deze in de ontwerpmodus open, niets veranderd en hier staat nog gewoon: primaire sleutel, Klantnummer; AutoNummering.

Sorry heren, ik ben echt een Acces Leek
 
Logisch, die fout. Zoals ik in een eerder bericht al zei: je kunt een autonummer niet combineren met een handmatig nummer. Autonummer is heel simpel: nummeren tot hij er bij neervalt... Te beginnen bij 1. Meer is het niet.
Wat jij wilt, is een nummering die zowiezo niet continue doorlopend, omdat je per maand en per jaar opnieuw begint. Dus als eerste zul je het veld moeten omzetten naar een Numeriek veld. Dan gaat mijn code als het goed is prima werken. Ik zou hem overigens in een aparte module zetten, en niet op het formulier. Je kunt hem dan namelijk ook voor andere formulieren gebruiken.
 
Hallo OctaFish Bedankt voor je reactie,
gelukkig sta je niet in de file door de sneeuw!:p

Even samenvattend:

-Ik krijg nu altijd een unieknummer
-elk nummer begint altijd met het jaar en maand van de eerste keer dat deze contactpersoon aangemaakt wordt. (je kunt hem dus gewoon wijzigen zonder dat het klantnummer wijzigd)
-Het nummer wordt opgeslagen in de tabel. dus in mijn formulier Obligaties (deze is gekoppeld met mijn contactpersonen tabel, met primaire sleutel) kan ik een contact persoon kiezen op het klantnummer.
-Start je elke nieuwe maand weer bij 1?

dus bijvoorbeeld zulke klantnummers krijg je:

2013011
2013012
2013013
2013021
2013022

Of loopt het door:

2013011
2013012
2013013
2013024
2013025

Hoe kan ik de visual basic code in een apparte modulle zetten? Ik heb nu gewoon rechtermuisknop op formulier en dan gekozen voor "Gebeurtenis Opbouwen", dan de text

Code:
Private Sub Details_Click()

End Sub
Vervangen door jou code.

Mvg

Joost

PS. Ik heb nu mijn Klantnummer als numeriek ingesteld (hiervoor diende ik eerst de relatie te verwijderen en vervolgens te herstellen).
Maar nu werkt het nog niet (#Fout).

Hoe dien ik de formulie in het tekst veld te zetten? Ik moet gewoon bij het tabblad Gegevens--> Besturingselementbron kiezen voor Klantnummer? of vul ik hier in: =VolgNummer("Klantnummer";"Contactpersonen_tbl")
Of dien ik de formule ergens anders neer te zetten.
 
Laatst bewerkt:
Ik zat blijkbaar in de enige trein vandaag die op tijd reed :)
Een aparte module is simpel, als je eenmaal in het VBA scherm staat. Op <Invoegen>, <Module> klikken is genoeg. Eventueel kun je de module een betere naam geven, maar nodig is dat niet.
De formule (functie) genereert een nieuw nummer. Je moet hem dus in de regel <Standaardwaarde> zetten. Het veld zelf laat je op zijn eigen veld staan middels <Besturingselementbron>. Anders heb je nog wel een waarde, maar raak je die ook gelijk weer kwijt als je het record verlaat. En dat is natuurlijk niet de bedoeling.
De functie kun je niet gebruiken om het oude autonummer om te zetten naar het nieuwe nummerformat.
 
Woehoew!:thumb:
Oke hij doet het!
Ben erg benieuwd of hij nou per maand door telt, of weer op 1 begint.
En wat gebeurt er als ik meer dan 99 klanten heb. Verlengd hij dan automatisch het nummer?

Hartstikke bedankt
 
Dat zal hij niet doen; dan begint hij weer opnieuw met 1 vrees ik. Wil je dat voor zijn, dan moet je een extra cijfer toevoegen aan je nummer, dus 201301001. Het nummer wordt gecheckt op basis van de huidige datum, dus op 1 februari zal hij geen nummer kunnen ophalen, omdat het hoogste jaar/maandnummer dan 201301 is. Hij gaat dan verder met 201302.
 
Laatst bewerkt:
Oke, dit maakt in principe niet uit als ik het maar weet. Dus elke maand begint op 1, maar er zullen nooit identieke komen omdat de maanden en jaren altijd doorlopen :) PRIMA!
Een max van 99 is wel een probleem.

Ik kan dit oplossen door deze regel:
Code:
 VolgNummer = CLng(x & Right("00" & y, 2) & Right("00" & z, 2))
te vervangen door:
Code:
VolgNummer = CLng(x & Right("00" & y, 2) & Right("000" & z, 3))

Dan kan ik 999 klanten aan maken, dit zal voldoende zijn.

Klopt dit zo?

gr

Oh, wacht haha dit is natuurlijk per maand dan... 99 zal voldoende zijn :D
20130101
20130102
20130103
20130201
20130202
20130301
 
Laatst bewerkt:
Harstikke bedankt voor de goede hulp, Vraag is voldoende beantwoord. Topic zet ik op: "Opgelost"
 
... En je aanpassing naar 3 cijfers was nog goed ook :) Kun je dus in het achterhoofd houden voor een volgende keer.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan