Dmax +1 geen optie meer

Status
Niet open voor verdere reacties.

oxiepoxie

Gebruiker
Lid geworden
25 feb 2013
Berichten
5
Beste gebruikers,

Ik loop tegen een probleem aan in ons registratiesysteem. Toen we het in gebruik namen was een klantnummer standaard viercijferig; 0001, 0002 tot 0063. Daarna is op een of andere manier de database verder gegaan met 64, 65 etc. Dit is te laat opgemerkt, en nu lopen we tegen het probleem dat we 99 hebben gehad en 100 is aangemaakt.

Het klantnummer werd altijd opgehoogd via Dmax+1. Dit werkt prima, ware het niet dat Dmax naar de onderste regel kijkt. Hij ziet daar 99 staan en wil dan 100 aanmaken. Met opslaan komt hij dan met de melding dat er duplicate content is. Logisch, want hij zet 100 na 0063.

Is er een mogelijkheid dat ik de automatische nummering op een soortgelijke manier voortzet, maar dat er gekeken wordt naar het hoogste getal en niet naar de onderste rij?

Ik hoor graag een reactie.

Met vriendelijke groet,
Oxiepoxie
 
Ik snap het probleem niet; DMAx kan wel degelijk het hoogste nummer opzoeken. En na 99 komt nu eenmaal 100. Jij wilt dus niet dat DMax het hoogste nummer opzoekt, maar het eerstvolgende vrije nummer (blijkbaar 64?). Dat gaat niet lukken zonder hernummeren.
 
je kunt eventueel een extra veld aan maken met een nummering dat gelijk is aan je klantnummer.
En vervolgens hierop kijken met DMax
 
Hallo OctaFish,

Het probleem is dat wanneer ik Dmax gebruik hij bij mij naar de onderste regel kijkt. Door de logische volgorde die hij maakt 0001-0063,100,64,65-99, kijkt hij dus steeds naar het getal 99. Hij zoekt dus de onderste rij op en komt niet met het hoogste getal naar voren, wat dus tussen 0063 en 64 staat. Ik wil dus wel degelijk dat Dmax naar het hoogste getal kijkt, maar hij kijkt nu naar de onderste rij.

Hij zou dus moeten kijken naar nummer 100, die ergens in het midden staat, maar kijkt naar nummer 99, die onderaan staat. Hierdoor maakt hij via Dmax+1 steeds nummer 100 aan, maar hij zou dus nummer 101 etc aan moeten maken.

Opnieuw nummeren is geen optie omdat de klanttabel onderlinge relaties onderhoud met orders en facturen.
 
en als je van je klantennummers 0001-0063 nu eens een nummeriek getal maakt ipv tekst en dan middels een funktie zoals
Code:
'-------------------------------------------------------------------------------
' BepaalFaktuurnumer
'
' Zet het faktuurnummer om naar het juiste formaat.
' Bijv: BMC-0000001
'-------------------------------------------------------------------------------
Public Function BepaalFaktuurnummer(Faktuurnummer As Long) As String
Const LengteNummer = 7
Dim i As Integer

    i = LengteNummer - Len(CStr(Faktuurnummer))
    If IsNull(Faktuurnummer) Then
        Exit Function
    Else
        BepaalFaktuurnummer = "BMC-" + String(i, "0") + CStr(Faktuurnummer)
    End If
End Function
kun je dan je klantnummer weer naar 4 cijfers zetten
 
plaats anders ff je database erbij zonder vertrouwelijke gegevens.
Kunnen we meekijken da's altijd een stuk makkelijker
 
DMax kijkt niet naar een rij, zoals je ten onrechte stelt, maar naar de hoogste waarde waarop je zoekt. Ik krijg de indruk dat je nummertechniek is gebaseerd op een tekstveld waarbij je voorloopnullen gebruikt, en dat op de een of andere manier dat tekstveld is 'overgestapt' naar numeriek. Dat zou zowiezo al niet moeten kunnen als je al relaties tussen die tabel en andere tabellen hebt, want een relatie moet van hetzelfde type zijn: je kunt dus niet een tekstveld omzetten naar een numeriek veld zonder dat ook in de gekoppelde tabellen aan te passen.
Anders is het als het altijd al een numeriek veld was, en je alleen middels notatie voorloopnullen laat zien. Maar in dat geval zou DMax altijd de juiste hoogste waarde moeten ophalen. Je verhaal blijft dus op zijn minst verwarrend.
Als je Volgnummer nog steeds een tekstveld is, en je de relaties hebt ingesteld op [Gerelateerde velden trapsgewijs bijwerken] dan kun je met een update query simpel de nummers aanpassen; in dat geval hoef je alleen maar de voorloopnullen toe te voegen aan de bestaande records. Daarna zal ook je DMAx het weer goed doen, omdat er dan weer een correcte nummering is.
 
Je stelde voor om van klantnummers een ander veldtype te maken; dat kan dus niet :)
Maar ik vermoed dat de functie geen voorloopnullen meer toevoegt, waar hij dat vroeger wel deed. Maar TS blijft wel èrg rustig...
 
Veldtype is inderdaad tekst. Door middel van een update query zou ik dus de nummers allemaal weer viercijferig moeten kunnen krijgen. Echter wanneer ik dit handmatig wil doen geeft hij aan dat er een probleem is omdat de klanten al aan diverse orders gekoppeld zijn en ik ze dus niet kan wijzigen vanwege onderlinge relaties.

Ik kan dus, lijkt het, geen wijzigingen aanpassen in de klantnummers...
 
Zoals ik al zei: je moet wel de optie <Gerelateerde records trapsgewijs bijwerken> aan hebben staan, anders kan je de records niet bijwerken.
 
Klopt inderdaad, er was alleen 1 relatie die niet goed stond waardoor leek of het niet werkte. Die aanpassing moet dus inderdaad goed te doen zijn. Dan de volgende stap, Hoe krijg ik nu weer voor elkaar dat hij standaard vier cijfers gaat gebruiken in het tekstveld.
instellingen.png

dat is zoals het veld is ingesteld. Hier is de bijbehorende code, die wordt gerund wanneer je het formulier nieuwe relatie opent.:

Private Sub Form_Current()
'If Me.cdRelatie.Value <> "" or IsNull(Me.cdRelatie) = False Then
' Me.cdRelatie.Enabled = False
' End If
If Me.cdRelatie.Value = "" Or IsNull(Me.cdRelatie) = True Then
If IsNull(DMax("cdrelatie", "tblRelatie")) = True Then
Me.cdRelatie.Value = "1001"
Else
Me.cdRelatie.Value = DMax("cdrelatie", "tblRelatie") + 1
End If
End If
' MsgBox "relatiecode " & Me.cdRelatie.Value

Me.cdRelatie.Enabled = False
End Sub

Kan iemand mij vertellen waar het dan nog mis gaat? Of hebben jullie meer info nodig?
 
Het bijwerken kun je simpel doen met een bijwerkquery:
Code:
Right("0000" & [EmployeeID];4)
Overigens heeft een veldlengte van 50 karakters, en een notatie van 0000 natuurlijk bar weinig nut. En je DMAx functie zal ook geen voorloopnullen genereren, dus straks heb je weer hetzelfde euvel.
Je moet dus je code minstens zo aanpassen:
Code:
NewRecord Then
    If Me.cdRelatie.Value = "" Or IsNull(Me.cdRelatie) = True Then
        If IsNull(DMax("cdrelatie", "tblRelatie")) = True Then
            Me.cdRelatie.Value = "1001"
        Else
            Me.cdRelatie.Value = Right("0000", DMax("cdrelatie", "tblRelatie") + 1, 4)
        End If
    End If
End If
Zoals je kunt zien, ziet code er een stuk netter uit als je hem opmaakt met de CODE knop. Graag dus de volgende keer de code ook netjes opmaken :)
 
Bedankt, Klinkt logisch. Echter krijg ik nu een fout op "Right":

Naamloos.png

Wat is het probleem?
 
Right is een standaard commando; ik zou zeggen: compileer de db eens, er zit geheid wat verkeerde code in de db.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan