Volgnummer-verzendadviesnummer

Status
Niet open voor verdere reacties.

Sporkie

Gebruiker
Lid geworden
12 nov 2015
Berichten
16
Na een week of 3 het forum door te hebben gespit. Heb ik uit eindelijk toch maar besloten om de vraag te stellen.
Mijn voorganger heeft een soort van dbase ontwikkelt voor het versturen van artikelen naar klanten. Hier bij wordt via autonummer een volgnummer aangemaakt. Echter willen ze elk jaar weer opnieuw beginnen met volgnummer 1.

Diegene die het programma heeft gemaakt is niet meer bij machte om dit op te lossen. (overleden)

Helaas is het bestand te groot om hier te neer te zetten. Ook in gepakt en uitgedund heeft het nog 830 kb.

Wat er gebeurd is dat als ik een regel toevoeg via formulier invoer hij de regel wel toevoegt maar niet ophoogt met een volgde advies nummer. Als ik dan de tabel ga bekijken ziet dat er dan zo uit (zie afbeelding bijlage.)
tbl VZA-Gallagher 2012
frm-VZA-Gallagher 2015
Ook als ik via formulier, nadat ik alles heb afgesloten en op nieuw open en een nieuwe regel toe voeg neem hij eerst de regel over en daarna pas gaat hij verder met de het op hogen van nummer. Onderste VBA heb ik opgenomen in een module en gekoppeld aan het formulier via de standaardwaarde. Ik zou eventueel het bestand via e-nail kunnen toesturen.

Function NieuwVolgNummer() As String
Dim strSQL As String, Num As Integer
Dim tmp As Variant
strSQL = "SELECT Top 1 [Verzendadviesnummer] FROM [VZA-Gallagher 2015] WHERE Left([Verzendadviesnummer], 4)=" _
& Year(Date) & " ORDER BY [Verzendadviesnummer] DESC"
With CurrentDb.OpenRecordset(strSQL)
If .RecordCount > 0 Then
Num = CInt(Right(.Fields(0), 4)) + 1
sNum = Year(Date) & Right("0000" & Num, 4)
NieuwVolgNummer = sNum
Else
NieuwVolgNummer = (Year(Date)) & "0001"
End If
End With
End Function
 

Bijlagen

  • tbl VZA.jpg
    tbl VZA.jpg
    103,2 KB · Weergaven: 52
Laatst bewerkt:
Ziet er uit als een bekende functie ;). Aan de functie mankeert niks, dus daar hoef je het niet te zoeken. Normaal gesproken moet je ook een nieuw nummer krijgen als je een record toevoegt, dus ik zou het probleem daar zoeken. Wat heb je ingesteld als standaarwaarde voor het veld Adviesnummer?
 
Dat klopt inderdaad dat het bekend is heb hem dan ook overgenomen van jouw. :rolleyes:

In frm VZA-Gallagher heb ik bij eigenschappen standaard waarde het volgende ing gevuld

=NieuwVolgNummer()

Neem aan dat je dit bedoelde.

Aanvullende info.
Aan het begin heb ik via formulier regels 20150001 t/m 2015009 toegevoegd pas bij regel nummer 20150005 begon hij gewoon te tellen. Vervolgens formulier afgesloten opnieuw geopend.
De eerst volgende regel die werd toegevooegd was de zefde als 20150009 en de volgende regel was dus weer 1 hoger.
 
Laatst bewerkt:
Als u het prettiger vindt om de gehele db in uw mail te ontvangen kan dat natuurlijk ook. Dan kunt u er op uw gemak even naar kijken.
 
Dat mag ook, maar voor je vraag is het denk ik voldoende als we een db hebben met het formulier en de tabel waar de functie het niet goed op doet. Die kun je dan met een paar records vullen zodat we wat kunnen testen. Maar als ik het zo ze doe je niks verkeerds; ook de functie op Standaardwaarde is goed. Ik heb toevallig vandaag bij een vriend eenzelfde functie neergezet en het principe is behoorlijk foutloos :). Kortom ik zie je db er graag even bij.
 
Ben zelf ook nog even wat aan het bekijken. En heb prestatie analyse gedaan. Acces kwam daar met een opmerking om de module te optimaliseren. Deze opmerking kwamen ze mee.

- Module Volgnummer: Gebruik een instructie Option Explicit

Maar denk zelf dat dat niet de oorzaak kan zijn van het probleem
 
Nee, dat is zeker het probleem niet. Dat is overigens vrij simpel te pinpointen: je gebruikt een doorlopend formulier. Dit soort functies blijkt alleen goed te werken op een enkelvoudig formulier. Is ook wel verklaarbaar (hoop ik): op een doorlopend formulier zie je altijd meerdere records. De standaardwaarde wordt gelijk ingevuld voor een nieuw record, maar is dan nog niet opgeslagen. Het record staat ook nog niet in de bewerkingsmodus. Nu ga je daadwerkelijk het formulier invullen: en wat gebeurt er? Je triggert daarmee de gebeurtenis die het volgnummer op de standaardwaarde invult. Die zoekt dan in de tabel, en vindt dezelfde hoogste waarde als de vorige keer: het zojuist door jou aangemaakte record is namelijk nog niet opgeslagen en staat nog niet in de tabel. Resultaat: je nieuwe volgnummer is identiek aan het zojuist verkregen volgnummer.

Zoals gezegd is de oplossing simpel: gebruik de functie niet in een doorlopend formulier maar op een enkelvoudig formulier.
 
Inderdaad als het formulier is aangepast naar enkelvoudig werkt het prima. Nu rijst bij mij de vraag waarom het is ontworpen als doorlopend formulier. Hier zou ik de personen moeten vragen die er mee werken.

Bij enkelvoudig zijn de rijen niet meer zichtbaar en dit zou misschien wel moeten. Als het goed is kom ik hier volgende week even op terug.

In elk geval alvast bedankt voor het meedenken. Had niet verwacht de oplossing zo eenvoudig zou zijn.
 
Ik gebruik doorlopende formulieren (bijna) alleen als subfomulier.
Je kunt zo'n functie overigens wel gebruiken op een doorlopend formulier, maar niet als standaardwaarde.
 
Oké, maar zoals al gezegd heb ik deze db niet gemaakt. Er zitten meer tabellen en formulieren enz. in. En ik weet niet helemaal welke verbindingen/koppelingen er onderling zijn. Heb zelf vorig jaar een cursus VBA gevolgd, maar dat stelt in wezen niet veel voor. Omdat er oppervlakkig over coderen in uitleg van benaming en het formuleren van code matig wordt behandeld. Ook is mijn Engels niet echt optimaal. Wilde dus eigenlijk zo weinig mogelijk veranderen in de orginele DB.

Heb er wel een kopie van gemaakt, waar ik mee kan stoeien en hij staat op het netwerk waar elke dag een kopie van gemaakt wordt.

Dus als ik wel een doorlopend formulier moet blijven gebruiken. Dan moet ik zeker bij Eigenschappen/tab gebeurtenis een code in voeren bij bijvoorbeeld
na klikken-

Me.Verzendadvies = [NieuwVolgNummer()]

Maar hier ben ik niet helemaal zeker van
 
Je denkt in de goede richting. Ik zit dan meer in een AfterUpdate van een ander veld of een (verplichte) keuzelijst te denken. Maar in ieder geval niet als standaardwaarde gebruiken, maar vullen vanuit een ander (bij voorkeur dus verplicht) veld.
 
Het veld ordernr is een verplicht veld. Zou u me een voorbeeld kunnen geven van het daar in te voeren code bij eigenschappen. Ik zou u daar zeer dankbaar voor zijn.
 
Volgens mij had je 'm al bijna :).
Code:
Private Sub ordernr _AfterUpdate()
    Me.Verzendadvies = NieuwVolgNummer()
End Sub
 
Klopt had alleen nog [] erbij staan en die horen er niet bij.

:thumb:

O ja nog even een opmerking over die eerste code die ik gevonden had op het forum

Daar had je staan
NieuwVolgNummer = Year(Date)) & "0001"

maar die geeft een fout weer namelijk er is maar een HAAKJE OPEN terwijl er TWEE HAAKJES sluiten staat. zie onderstaand link

http://www.helpmij.nl/forum/showthread.php/857677-Factuurnummer-resetten-m-i-v-nieuwe-jaar?highlight=volgnummer


Nu ga ik verder met stoeien van de DB. Nogmaals bedankt
 
Laatst bewerkt:
Ik typ een Date code uit gewoonte meestal als Date(). Deze code is daar een (foute) variant op. Dus dat moet dan dit zijn:
Code:
NieuwVolgNummer = Year(Date) & "0001"
 
Heb nu formulier aangepast naar doorlopen en getest alles werkt. Had het ook niet anders verwacht.:thumb:
 
Neem aan dat als het volgnummer uit 5 cijfers bestaat en wil beginnen aan het begin van het jaar 18000 ik de code
Num = CInt(Right(.Fields(0), 4)) + 1
sNum = Year(Date) & Right("0000" & Num, 4) ->
NieuwVolgNummer = sNum
Else
NieuwVolgNummer = (Year(Date)) & "0001" ->


Aangepast
Num = CInt(Right(.Fields(0), 5)) + 1
sNum = Year(Date) & Right("18000" & Num, 5) ->
NieuwVolgNummer = sNum
Else
NieuwVolgNummer = (Year(Date)) & "18001" ->


Ik vraag het maar even voor de zekerheid
 
Laatst bewerkt:
... en wil beginnen aan het begin van het jaar 18000 ik de code ...
Ik zal het even voor je uitschrijven in woorden: beginnen in het jaar achttien duizend. Access zal nog wel een paar jaar meegaan, en jij en ik vast ook wel, maar je weet dat we nu pas in de 21e eeuw zitten? :).
Een vergelijkbare opmerking natuurlijk ook voor het jaar achttien honderd. Ik hou mijn records graag up to date, maar dat gaat wel heel ver terug :D

Maar probeer maar uit; kijk maar of-tie het doet. Maar ik zou 'm zo aanpassen (want jouw code doet het niet goed):
Code:
     sNum = Year(Date) & Num
 
:d Had het kunnen weten.

Nee, de bedoeling is dat ik meerdere VZA=verzendadviesnr heb voor verschillende bedrijven (8 stuks in totaal) en de opbouw is als het ware
Jaar/code bedrijf/vza
xxxx/xx/xxxx

Bedrijf X heeft een VZA die begint met 18xxxx
Bedrijf Y heeft een VZA die begint met 15xxxx


Dus voor bdrijf X zie het VZA er als volgt uit
2015
1e vza 2015180001 zou nog mooier zijn 2015-180001
2e vza 2015180002 zou nog mooier zijn 2015-180002
2016
1e vza 2016180001 ->2016-180001
2e vza 2011618002 ->2016-180002
Code
VzaBedrijf X = Year(Date) & "18001" ->


Bedrijf Y
2015
1e vza 2015150001 mooier 2015-150001
2e vza 2015150002 mooier 2015-150002
2016
1e vza 2016150001 mooier is 2016-150001
Code
VzaBedrijf Y = Year(Date) & "15001" ->
Enz.


Function NieuwVolgNummer() As String
Hier opm. NieuwVolgNummer vervangen door VzaBedrijf X
Heb alles werkende behalve het streepje er tussen wil nog niet vlotten. Maar dat is niet zo belangrijk. Ben en blijf gewoon even stoeien tot het wel lukt heb tenslotte de tijd tot 1-1-2016 dan moet het werkende zijn.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan