Lege kopie van dB maken met alle tellertjes op 0.

Status
Niet open voor verdere reacties.

Johgs

Gebruiker
Lid geworden
19 mei 2011
Berichten
337
Vreemd genoeg kan Google op deze op zich eenvoudige vraag nergens een antwoord vinden, maar hoe maak ik een lege kopie van een dB met alle tellertjes weer keurig op 0?
Kopie maken en vervolgens tabel voor tabel gaan kopiëren met optie alleen structuur lijkt me wat omslachtig met veel tabellen, hier moet toch een mogelijkheid voor zijn?

Na alles getest te hebben zou ik nu graag "live" gaan met een schone kopie (al was het maar om te voorkomen dat de belastingdienst gaat vragen naar al die gewiste factuurnummers). :)
 
(al was het maar om te voorkomen dat de belastingdienst gaat vragen naar al die gewiste factuurnummers). :)
Dat riekt er naar alsof je de factuurnummers automatisch genereert. Dat moet je uiteraard nooit doen, want factuurnummers dienen per decreet oplopend genummerd te zijn zonder gaten. En hoe dacht je dat te doen met een Autonummer veld?
ALs antwoord op je vraag: als alle tabellen leeg zijn, kun je de db comprimeren en herstellen. Alle autonummervelden worden dan gereset. Dus ik maak meestal een kopie van de werkende definitieve db, gebruik een procedure die alle tabellen leegmaakt en comprimeer vervolgens het geheel. Klaar voor gebruik!
 
Factuurnummers bouw ik deels op via autonummering. Gebruik al jaren jaartal - maandnummer - oplopend volgnummer. Aparte tabel met autonummering, cliënt Id en datum als kolommen. Met jaarlijks maar een beperkt aantal facturen lijkt me dat geen probleem. Heb wel even zitten stoeien met een query die het laatst gebruikte nummer opzocht en dat met één verhoogde, maar dan kreeg je een vrijwel identieke tabel. Gemakshalve toch maar voor autonummering gekozen ondanks dat ik diverse artikelen over de risico's hiervan gelezen heb. Een andere dB van mij draait al jaren met diverse tabellen met autonummering voor een variatie aan data, ondanks vele duizenden records tot op heden geen probleem.
Bovendien, met uitvallende factuurnummers moet je met welk systeem dan ook een goede verklaring hebben voor de heren die het niet leuker kunnen maken.

Maar helaas, er bestaat dus geen simpele éénklik methode om een lege kopie te maken. Moeten overigens alle tabellen leeg zijn om de nummers te resetten? Heb er enkele kleine tabellen in staan die mogen blijven (zoals met BTW %'s, zonder auto Id ;-) ).
 
Ik maak al jaren factuurnummers zonder tabel. En ik heb de functie die ik daarvoor gebruik al talloze keren gepost (in diverse varianten) hier in het forum. Kortom: de functie is makkelijk te maken, en een tabel is echt niet nodig. En het voordeel is: de functie werkt foutloos.

Moeten overigens alle tabellen leeg zijn om de nummers te resetten?
Ja, als je alles op 0 wilt laten beginnen. Nee, als je alleen het eerstvolgende vrije nummer wilt hebben. Comprimeren zorgt er voor dat elke tabel met het eerstvolgende vrije nummer begint.
 
Was al enkele van je posts over factuurnummers gevonden, nog maar even naar gekeken en vond deze:
Function FactuurNummer() As String
Dim strSQL As String, sWaarde As String, iWaarde As Double

strSQL = "SELECT TOP 1 Factuurnummer FROM tFacturen ORDER BY Factuurnummer DESC"
With CurrentDb.OpenRecordset(strSQL)
If Not .BOF And Not .EOF Then sWaarde = !FactuurNummer.Value
.Close
End With
If sWaarde & "" = "" Then GoTo GeenNummer
iWaarde = CDbl(sWaarde)
sWaarde = Left(iWaarde, 4)
If sWaarde = CStr(Year(Date)) Then
FactuurNummer = CStr(iWaarde + 1)
Else
FactuurNummer = CStr(Year(Date) & "001")
End If
Exit Function

GeenNummer:
FactuurNummer = CStr(Year(Date) & "001")

End Function

Ziet er simpel uit, dus maar even getest. Heb het alleen nog niet werkend, er wordt nu FactuurNummer() ingevuld. Klooi nog wat verder.

Maar feitelijk doet jouw module hetzelfde als wat ik nu doe met query's; zodra een factuur definitief is, zoekt een query het hoogste nummer dat vervolgens wordt toegevoegd tegelijk met een extra vinkje dat de factuur nu ook een nummer heeft. Ietwat omslachtiger dan die enkele regels code, maar facturen moeten toch op definitief gezet worden, een extra query zet ze dan over naar een andere tabel.
 
De functie werkt redelijk 'zelfstandig', als je de tabelnaam en Veldnaam correct hebt aangepast. Ik heb, op basis van de functie hierboven, 2 versies gemaakt die ook het maandnummer meenemen.
Code:
Function FactuurNummerMaand1() As String
Dim strSQL As String, sWaarde As String, iJaar As Integer

    On Error GoTo GeenNummer
    strSQL = "SELECT TOP 1 Factuurnummer1 FROM tFacturen ORDER BY Factuurnummer1 DESC"
    With CurrentDb.OpenRecordset(strSQL)
        If Not .BOF And Not .EOF Then sWaarde = !FactuurNummer1.Value
            .Close
    End With
    If sWaarde & "" = "" Then GoTo GeenNummer
    iJaar = CInt(Left(sWaarde, 4))
    If iJaar = Year(Date) Then
        FactuurNummerMaand1 = CStr(CDbl(sWaarde) + 1)
    Else
        FactuurNummerMaand1 = CStr(Year(Date) & Right("00" & Month(Date), 2) & "001")
    End If
    Exit Function

GeenNummer:
    FactuurNummerMaand1 = CStr(Year(Date) & Right("00" & Month(Date), 2) & "001")

End Function

Code:
Function FactuurNummerMaand2() As String
Dim strSQL As String, sWaarde As String, iMaand As String, iJaar As Integer, iNum As Integer

    On Error GoTo GeenNummer
    strSQL = "SELECT TOP 1 Factuurnummer2 FROM tFacturen ORDER BY Factuurnummer2 DESC"
    With CurrentDb.OpenRecordset(strSQL)
        If Not .BOF And Not .EOF Then sWaarde = !FactuurNummer2.Value
            .Close
    End With
    If sWaarde & "" = "" Then GoTo GeenNummer
    iJaar = CInt(Left(sWaarde, 4))
    iMaand = CInt(Mid(sWaarde, 5, 2))
    iNum = CInt(Right(sWaarde, 3))
    If iJaar = Year(Date) And iMaand = Month(Date) Then
        FactuurNummerMaand2 = CStr(iJaar & Right("00" & iMaand, 2) & Right("000" & (iNum + 1), 3))
    ElseIf iJaar = Year(Date) Then
        FactuurNummerMaand2 = CStr(iJaar & Right("00" & Month(Date), 2) & "001")
    Else
        FactuurNummerMaand2 = CStr(Year(Date) & Right("00" & Month(Date), 2) & "001")
    End If
    Exit Function
    
GeenNummer:
    FactuurNummerMaand2 = CStr(Year(Date) & Right("00" & Month(Date), 2) & "001")

End Function

De eerste functie neemt wel het maandnummer mee, maar telt het hele jaar gewoon door. Dus dan krijg je nummers als: 201709067, 201709068 en 201710069, 201710070 etc. De tweede begint bij elke maand opnieuw. Dus dit: 201709001, 201709002 en 201710001, 201710002 etc. Kijk maar welke versie je nodig hebt.

Het gebruik is heel simpel: in een tekstvak zet je bij <Standaardwaarde> deze respectievelijke formules: =FactuurNummerMaand1() en =FactuurNummerMaand2(). Bij het maken van een nieuw record wordt de functie getriggerd, en krijg je het eerstvolgende nummer. Sla je het record niet op, is er niks aan de hand want de functie pakt dan gewoon het laatste dat wél is opgeslagen. Er worden dus alleen nieuwe nummers gemaakt als er ook daadwerkelijk een nieuw record is opgeslagen.
 
Heb het werkend in een test dB. Inderdaad simpele methode, ga ik zeker bewaren. Nu loopt 't zoals ik het gemaakt had via een macro (Yep, kan het niet laten) die 2 query's start waarna via rapport de factuur er uit rolt en daarna nog 2 query's draaien om de posten op gefactureerd te zetten, moest even flink puzzelen om uit te zoeken hoe ik 't ook al weer gerealiseerd had. :-(
(Heb nu wel de mogelijkheid om bij deelbetalingen enkel de wel betaalde posten op betaald te zetten, tsja, komt voor, klanten die zelf vinden dat een bepaalde post onterecht is)
Zal even flink puzzelen worden om jouw methode toe te passen.
Ik neem aan dat jouw methode ook toepasbaar is met rapporten ipv formulier en meerdere facturen in serie gegenereerd kunnen worden.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan