doorlopende nummering

Status
Niet open voor verdere reacties.

Artemiss

Gebruiker
Lid geworden
13 feb 2009
Berichten
130
Beste Access-goeroes,

Ik heb een database waarin ik naar aanleiding van leveringen factuurinformatie wil wegschrijven in een tabel. Een vereiste hiervoor is dat automatisch factuurnummers worden bepaald in een bepaald format.
Dit is mij in principe wel gelukt, alleen niet zo dat als ik meerdere records tegelijk aan de factuurtabel toevoeg steeds een nieuw factuurnummer wordt bepaald. Ik krijg dan bij ieder record hetzelfde eerstvolgende factuurnummer.
Ik weet bijna zeker dat dit voor een beetje VBA-kenner een algemeen bekend stukje code is en ik hoop dan ook dat jullie mij kunnen helpen, zonder dat ik de database hoef toe te voegen, want deze is gevuld met vertrouwelijke informatie.

Het factuurnummer moet als volgt opgebouwd worden:

jj-000 waarbij
jj = jaartal, dus op dit moment 10, het makkelijkst te gegeneren uit Year(Now()), denk ik
- = -
000 = oplopende nummering van 001 t/m 999

Bijvoorbaat dank voor de hulp

Frauke Stevens
 
Je kunt wel een functie maken die de nummers ophoogt, maar hoe bepaal je het aantal records, en dus het aantal factuurnummers, en waaruit haal je het laatst gebruikte factuurnummer?
 
Hoi Octafish,

Het aantal factuurnummers per keer is in principe gewoon variabel, al verwacht ik niet dat dit ooit meer dan 10 tegelijk zal zijn.
Het laatst gebruikte factuurnummer haal ik uit de eerder genoemde factuurtabel
Wat ik nu heb is een een query die de Max van factuurnummer pakt, daar vervolgens de laatste drie posities +1 van neemt. Hierdoor vallen eventuele voorloopnullen weg, dus om vervolgens het factuurnummer te bepalen gebruik ik een tweevoudige if-functie: iif("3 posities +1" < 10 dan "10-00" & "3 posities +1"; iif("3 posities +1" < 100 dan "10-0" & "3 posities +1"; "10-" & "3 posities +1"))

Is dat voldoende informatie?
 
Factuurnummers waarin een jaartal verwerkt zit zou ik nooit automatisch door NOW() de factuurdatum/jaar laten bepalen.
Het komt wel eens voor dat je een of meerdere facturen in een voorgaand boekjaar moet aanmaken. De oplossing hiervoor is simpel, maak een tabelletje met 1 rij en 1 kolom: boekjaar.
Nadeel is wel dat je handmatig moet omzetten op nieuwsjaarsdag. Hier kan wel weer een controle opbouwen die melding maakt wanneer het boekjaar niet overeenkomt met het huidige jaartal.
 
Je kunt met een inputbox met daarin de default waarde Right(Year(Date());2) om het boekjaar vragen, mocht je nog oudere facturen willen invoeren. Komt dat nauwelijks voor, dan zou ik het automatisch doen, dus met een standaardwaarde en de records die afwijken handmatig doen. Soort vuistregeltje: als de handeling voor meer dan 90% de standaardwaarde moet zijn, laat het dan automatisch doen, met de mogelijkheid om de nummers aan te passen. Overigens zou ik die check dan wil in willen bouwen op het moment dat je een ander jaar wilt boeken, want dan heb je een ander nummer nodig als hoogste waarde.
Daarentegen moet je wel een mogelijkheid hebben om automatisch het aantal records (=facturen?) te tellen, want anders kun je de nummers niet genereren.
De IIF kan overigens wat slimmer: (want weg...)
Code:
Volgnummer=cStr(Right("000" & Volgnummer;3))
 
Beste Octafish en Floor,

Dank voor jullie antwoorden, helaas ben ik er nog niet echt mee geholpen.
En ik weet ook even niet zo goed wat ik verder aan informatie kan geven, zodat jullie een antwoord kunnen geven, waar ik wel meegehopen ben...
 
Ik wil graag weten hoe je die records toevoegt aan de factuur; op enig moment in de procedure moet je toch een selectie hebben van records. Het aantal records in die selectie bepaalt het aantal factuurnummers dat moet worden aangemaakt. En vermoedelijk het moment waarop je de functie moet laten lopen.
 
Oke.
De selectie bestaat uit alle leveringsID's in de tabel Leveringen die in de Factuurtabel nog niet voorkomen.
Als ik aan deze selectie een nummering kan toevoegen, kan ik dit nummer optellen bij het huidige laatste factuurnummer. Is dat de bedoeling?
 
Je moet niet aan ons vragen wat de bedoeling is, dat dienen wij van jou te horen ;)
Je maakt dus geen selectie op basis van Leverancier?
 
Overnieuw...
Ik snap dat het aantal records in mijn selectie bepaalt hoeveel factuurnummers er aan gemaakt moeten worden, maar ik snap niet hoe ik in een formule iets opschiet met de wijsheid van het aantal facturen dat aangemaakt moet worden.

Voor mijn gevoel moet dit ook echt iets zijn wat in bijna iedere database wel aan de orde komt en (ik begin me ondertussen echt dom te voelen) ik snap niet wat er verkeerd is aan mijn vraagstelling, waardoor de vraag niet overkomt.
Komt het niet bijna dagelijks voor dat iemand zoiets als een auto-nummering wil, maar dan volgens een bepaalde format ipv alleen uit cijfers bestaat?
 
Je vraag is op zich wel helder, maar jij wilt in één keer een aantal records aanmaken en nummeren. En om dat te doen in een functie, of op een andere manier, moet je een loop kunnen maken op basis van het aantal records dat je gebruikt. En dat maakt het dus iets ingewikkelder.
 
Je kan een selectie maken van leveringen die gefactureerd moeten worden.
Kun je doen op verschillende manieren (net wat het beste bij jouw werkwijze past)

- door handmatig de te factureren te selecteren
- door leveringen een kenmerk mee te geven dat ze gefactureerd zijn en vervolgens via
code alle leveringen te factureren die nog niet gefactureerd zijn

Je hoeft niet op voorhand te weten hoeveel leveringen gefactureerd gaan worden.

Tardis
 
Ik heb nu een toevoegquery gemaakt die aan mijn facturatietabel een variabel aantal facturen toevoegt, het enige wat er aan ontbreekt is een automatisch gegenereert factuurnummer.
Er zit overigens nog een extra moeilijkheid aan, in de tabel staan facturen van 2 bedrijven, die beide hun eigen factuurreeks kennen volgens het format jj-000

Mij lijkt het het simpelste om na het draaien van de toevoegquery een VBA-procedure te starten die in normale woorden het volgende doet:

Voor alle regels zonder factuurnummer in de tabel facturatie een nieuw factuurnummer genereren obv het laatste factuurnummer van het betreffende bedrijf.
Het automatisch genereren van het jaartal vind ik overigens even niet zo belangrijk, mag gewoon "10-" zijn.

Kan ik misschien ergens een voorbeeld van zo'n loop vinden? Moet ik daarvoor een query maken die het aantal records zonder factuurnummer telt?
 
Ik heb je verwezen naar een link waarin staat hoe je een factuurnummer kunt genereren.
Als je eea aanpast naar jouw situatie in via VBA in een lus zet heb je precies wat je wilt.
Probeer dat eerst eens zelf.

Tardis
 
Nou, hier komt dan wat deze VBA-kneus er tot nu van heeft weten te maken.
Bij lange na niet toereikend, laat staan werkend, want het stukje [Bedrijf]=Bedrijf doet ook niet wat ik hoopte.
Van loops heb ik echt totaal geen kaas gegeten

Dim iVolgnr as String

iVolgnr = Right(DMax("Factuurnummer","Projectentabel",[Bedrijf]=Bedrijf),3)
iVolgnr = iVolgnr + 1

Factuurnummer = "10-" & Format(iVolgnr,000)
 
De regel zou je zo moeten aanpassen:
Code:
iVolgnr = Right(DMax("Factuurnummer","Projectentabel","[Bedrijf]=" & [Bedrijf]),3)
Overigens werkt deze methode alleen als je in een loop alle records stuk voor stuk opslaat, omdat je anders nog steeds met hetzelde volgnummer werkt. En je wilde nu juist in één keer een aantal records aan kunnen maken.
in tegenstelling tot wat tardis beweert: als je een x-aantal records wilt toevoegen met een oplopend nummer, dan moet je weten hoeveel records je gaat toevoegen. Je begint namelijk met een aantal nummers te maken op basis van de hoeveelheid benodigde records. De selectiemethoden die zijn voorgesteld resulteren ook in een bekend aantal records.
 
in tegenstelling tot wat tardis beweert: als je een x-aantal records wilt toevoegen met een oplopend nummer, dan moet je weten hoeveel records je gaat toevoegen.

Dat is dus pertinent onjuist.
Het enige wat nodig is is een kenmerk dat bepaalt welke leveringen gefactureerd kunnen worden.
Daar maak je vervolgens gebruik.
Impliciet bepaal je dus het aantal facturen, expliciet bepalen (waar jij op doelt) is niet nodig.

Tardis
 
Laatst bewerkt:
Imliciet, expliciet.... ik kan mij niet heugen dat ik heb aangegeven op welke manier het aantal records moet worden bepaald. Ik maak graag zelf uit hoe ik iets bedoel. Waar het om gaat is dat je moet kunnen determineren hoeveel nummers je nodig hebt.
 
Goeiemorgen Octafish en Tardis,

Ik hoop dat jullie een goed weekend hebben gehad en dat we deze week expliciet of impliciet een oplossing zullen vinden voor mijn vraagstuk.
Ik zelf heb eigenlijk nog steeds geen idee, al kan ik het antwoord van Tardis wel volgen, dat als ik de door mij genoemde formule wil gebruiken, dit alleen werkt als de nieuwe records tussentijds worden opgeslagen.
Wat ook in mij opkomt is dat als ik niet tussentijds wil opslaan, ik waarschijnlijk iets moet veranderen aan het "+1"stukje zodat hij voor het eerste record +1 voor het tweede record +2 voor het derde record +3 enz gaat doen. Maar het kan ook zomaar zijn dat dit nergens opslaat.

Ik zit ook te bedenken of ik iets kan met de antwoorden van Octafish, dat ik van tevoren de nieuw toe te kennen factuurnummers zou kunnen bepalen. Maar daar kom ik niet echt ver mee, ik weet niet hoe ik een tabel maak met de gewenste nummers en niet eens alleen omdat ik het per bedrijf moet bepalen. En zelfs als ik dat wel zou kunnen dan weet ik nog niet hoe ik zorg dat deze nummer aan de records toegevoegd worden.

Ondertussen nav mijn gedachtes erover nog even wat zitten proberen, en ik ben er denk ik wel uit, als jullie mij nog kunnen helpen met één klein stapje. Ik heb nu namelijk een toevoegquery die per bedrijf voor de eerste nog niet gefactureerde factuurtermijn het juiste toevoegt aan de facturatietabel. Nu kan ik dus gewoon net zo vaak deze query draaien tot dat hij niets meer toevoegt aan de facturatietabel, maar misschien dat jullie mij nog even wegwijs kunnen maken in het loopen.

Ik heb nu in een code:

Private Sub Factureren_Click()

Dim iCount As Integer

Do
DoCmd.SetWarnings (WarningsOff)
DoCmd.OpenQuery "Factureren1", , acEdit
DoCmd.SetWarnings (WarningsOn)

iCount = Factureren1_voorlquery.RecordCount

Loop While iCount > 0

End Sub


Dit loopt al vast op iCount = Factureren1_voorlquery.RecordCount, dus hij is nog niet gekomen tot de loop, ik heb dus ook geen idee of dat ergens op slaat. Hebben jullie enig idee waarom hij de recordcount niet wil doen?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan