Probleem met vba code voor sortering volgens datum in ms access

Status
Niet open voor verdere reacties.

JohanRVT

Gebruiker
Lid geworden
2 mrt 2011
Berichten
545
Situatie: via een VBA functie in een ms access 2003 (idem 2007) kan men in een subformulier iemand selecteren en bij klikken van een button wordt in een “Tbl_Wachtlijst” een kolom “prior” hernummerd volgens een aantal criteria waaraan een record moet voldoen waardoor het mogelijk gemaakt wordt om records op hun juiste plaats te zetten. Eerste criterium is als de record is van iemand van de woonplaats zelf en het tweede criterium is de categorie. Tot daar toe gaat alles goed maar dan is het derde criterium de datum. Normaal zou de nieuwste datum onderaan de lijst moeten komen (de oudste aanvraag heeft nml voorrang op een jongere aanvraag) maar nu gebeurd dat ergens bovenaan .
Enig idee waar de fout zit?

Code:
Private Sub cmdToevoegen_Click()

    'Zoek de correcte plaats:
    'De gemeente heeft voorrang, gevolgd door categorie en dan volgens datum
    
    Dim dbsCurrent As Database
    Dim rs As Object
    Dim currNr, currBVWoonplaats, PriorGemeente, reden As String
    Dim currcat, currInst, currPrior, newPrior As Long
    Dim currDatum As Date
        
    Set dbsCurrent = CurrentDb
    
    'geef de inwoners met dezelfde gemeente als de instelling prioriteit
    Set rs = dbsCurrent.OpenRecordset("select IPlaats from Tbl_Instelling where IHuidig = true")
    If (Not rs.EOF) Then
        PriorGemeente = rs(0)
    Else
        MsgBox "Geen gemeente van de huidige instelling gevonden", vbExclamation
        Exit Sub
    End If
    
    currNr = Me.SubWachtlijst_Niet_Actief.Form!Nr.Value
    Set rs = dbsCurrent.OpenRecordset("select Instellingsnummer from Tbl_Wachtlijst where [Nr Wachtlijst] = '" & currNr & "'")
    If (Not rs.EOF) Then
        currInst = rs(0)
    End If
    
    Set rs = dbsCurrent.OpenRecordset("SELECT Prior, BVWoonplaats, [Datum aanvraag] as datum, Nz(Sorteernummer,6) as Sorteernr " & _
                "FROM Tbl_Wachtlijst LEFT JOIN Categorie ON Tbl_Wachtlijst.Categorie = Categorie.Categorie " & _
                "WHERE [Nr Wachtlijst] = '" & currNr & "'")
    If (Not rs.EOF) Then
        rs.MoveFirst
        currPrior = rs("Prior")
        currBVWoonplaats = rs("BVWoonplaats")
        currBVWoonplaats = Nz(currBVWoonplaats, "Onbekend")
        currDatum = rs("Datum")
        currDatum = Nz(currDatum, Date)
        currcat = rs("Sorteernr")
    End If
    
    Set rs = dbsCurrent.OpenRecordset("SELECT [Nr Wachtlijst], Prior, BVWoonplaats, [Datum aanvraag] as datum, Nz(Sorteernummer,6) as Sorteernr " & _
                    "FROM Tbl_Wachtlijst LEFT JOIN Categorie ON Tbl_Wachtlijst.Categorie = Categorie.Categorie " & _
                    "WHERE Prior > 0 ORDER BY Prior;")
    rs.MoveFirst
    Do While (Not rs.EOF)
        newPrior = rs("Prior")
        If (rs("BVWoonplaats") <> PriorGemeente And currBVWoonplaats = PriorGemeente) Then
            Exit Do
        End If
        If ((rs("BVWoonplaats") = PriorGemeente And currBVWoonplaats = PriorGemeente) Or (rs("BVWoonplaats") <> PriorGemeente And currBVWoonplaats <> PriorGemeente)) Then
            'volgens categorie
            If (currcat < rs("Sorteernr")) Then
                Exit Do
            End If
            If (currcat = rs("Sorteernr")) Then
                'volgens datum
                If (rs("datum") > currDatum) Then
                    Exit Do
                End If
            End If
        End If
        rs.MoveNext
    Loop
    
    Query = "update Tbl_Wachtlijst set Prior = Prior + 1 where Prior >= " & _
            newPrior & " and instellingsnummer = " & currInst
    dbsCurrent.Execute (Query)
    
    Query = "update Tbl_Wachtlijst set Prior = " & newPrior & ", Act = true, Pas = false, Geschrapt = false " & _
            " where [Nr Wachtlijst] = '" & currNr & "'"
    dbsCurrent.Execute (Query)
    
    reden = InputBox("Reden toevoeging:")
    
    Query = "insert into Tbl_prioriteitwijzigingen([Nr wachtlijst],[Reden wijziging],[Datum wijziging],Instellingsnummer,Oude_PriorNr,Oude_Wachtlijst,Nieuwe_PriorNr,Nieuwe_Wachtlijst) " & _
            "values('" & currNr & "','" & reden & "',#" & Format(Date, "mm/dd/yyyy") & "#," & currInst & ",0,'Passief'," & newPrior & ",'Actief')"
    dbsCurrent.Execute (Query)
    
    Me.SubWachtlijst_Actief.Requery
    Me.SubWachtlijst_Geschrapt.Requery
    Me.SubWachtlijst_Niet_Actief.Requery
    
End Sub

Ik probeer de database ook nog eens te strippen zodat hij plaatsbaar is op dit forum.
 
Je bent er inderdaad een beetje ingestonken :) VBA werkt volgens een amerikaanse datumnotatie, dus de manier waarop je de datum toevoegt, gaat niet werken. Voeg een extra constante toe, en verander de query in dit:

Code:
    Const strcJetDate = "\#mm\/dd\/yyyy\#"
    Query = "insert into Tbl_prioriteitwijzigingen([Nr wachtlijst],[Reden wijziging],[Datum wijziging],Instellingsnummer," _
        & "Oude_PriorNr,Oude_Wachtlijst,Nieuwe_PriorNr,Nieuwe_Wachtlijst) "  _
        & "values('" & currNr & "','" & reden & "',#" & Format(Date, strcJetDate) & "#," & currInst & ",0,'Passief'," & newPrior & ",'Actief')"
    dbsCurrent.Execute (Query)
 
syntaxisfout (operator ontbreekt)

Heb de constante toegevoegd en de query veranderd maar krijg volgende foutmelding bij de Ms Access 2007 hier op 't werk:

Fout 3075 tijdens uitvoering:
Syntaxisfout (operator ontbreekt) in query-expressie ##06/09/2011##.

Geen idee of 't werkt onder 2003 versie.
foutmelding.JPG


Code:
Private Sub cmdToevoegen_Click()

    'Zoek de correcte plaats:
    'De gemeente heeft voorrang, gevolgd door categorie en dan volgens datum
    
    Dim dbsCurrent As Database
    Dim rs As Object
    Dim currNr, currBVWoonplaats, PriorGemeente, reden As String
    Dim currcat, currInst, currPrior, newPrior As Long
    Dim currDatum As Date
    Const strcJetDate = "\#mm\/dd\/yyyy\#"
        
    Set dbsCurrent = CurrentDb
    
    'geef de inwoners met dezelfde gemeente als de instelling prioriteit
    Set rs = dbsCurrent.OpenRecordset("select IPlaats from Tbl_Instelling where IHuidig = true")
    If (Not rs.EOF) Then
        PriorGemeente = rs(0)
    Else
        MsgBox "Geen gemeente van de huidige instelling gevonden", vbExclamation
        Exit Sub
    End If
    
    currNr = Me.SubWachtlijst_Niet_Actief.Form!Nr.Value
    Set rs = dbsCurrent.OpenRecordset("select Instellingsnummer from Tbl_Wachtlijst where [Nr Wachtlijst] = '" & currNr & "'")
    If (Not rs.EOF) Then
        currInst = rs(0)
    End If
    
    Set rs = dbsCurrent.OpenRecordset("SELECT Prior, BVWoonplaats, [Datum aanvraag] as datum, Nz(Sorteernummer,6) as Sorteernr " & _
                "FROM Tbl_Wachtlijst LEFT JOIN Categorie ON Tbl_Wachtlijst.Categorie = Categorie.Categorie " & _
                "WHERE [Nr Wachtlijst] = '" & currNr & "'")
    If (Not rs.EOF) Then
        rs.MoveFirst
        currPrior = rs("Prior")
        currBVWoonplaats = rs("BVWoonplaats")
        currBVWoonplaats = Nz(currBVWoonplaats, "Onbekend")
        currDatum = rs("Datum")
        currDatum = Nz(currDatum, Date)
        currcat = rs("Sorteernr")
    End If
    
    Set rs = dbsCurrent.OpenRecordset("SELECT [Nr Wachtlijst], Prior, BVWoonplaats, [Datum aanvraag] as datum, Nz(Sorteernummer,6) as Sorteernr " & _
                    "FROM Tbl_Wachtlijst LEFT JOIN Categorie ON Tbl_Wachtlijst.Categorie = Categorie.Categorie " & _
                    "WHERE Prior > 0 ORDER BY Prior;")
    rs.MoveFirst
    Do While (Not rs.EOF)
        newPrior = rs("Prior")
        If (rs("BVWoonplaats") <> PriorGemeente And currBVWoonplaats = PriorGemeente) Then
            Exit Do
        End If
        If ((rs("BVWoonplaats") = PriorGemeente And currBVWoonplaats = PriorGemeente) Or (rs("BVWoonplaats") <> PriorGemeente And currBVWoonplaats <> PriorGemeente)) Then
            'volgens categorie
            If (currcat < rs("Sorteernr")) Then
                Exit Do
            End If
            If (currcat = rs("Sorteernr")) Then
                'volgens datum
                If (rs("datum") > currDatum) Then
                    Exit Do
                End If
            End If
        End If
        rs.MoveNext
    Loop
    
    Query = "update Tbl_Wachtlijst set Prior = Prior + 1 where Prior >= " & _
            newPrior & " and instellingsnummer = " & currInst
    dbsCurrent.Execute (Query)
    
    Query = "update Tbl_Wachtlijst set Prior = " & newPrior & ", Act = true, Pas = false, Geschrapt = false " & _
            " where [Nr Wachtlijst] = '" & currNr & "'"
    dbsCurrent.Execute (Query)
    
    reden = InputBox("Reden toevoeging:")
    
    Query = "insert into Tbl_prioriteitwijzigingen([Nr wachtlijst],[Reden wijziging],[Datum wijziging],Instellingsnummer,Oude_PriorNr,Oude_Wachtlijst,Nieuwe_PriorNr,Nieuwe_Wachtlijst) " & _
            "values('" & currNr & "','" & reden & "',#" & Format(Date, strcJetDate) & "#," & currInst & ",0,'Passief'," & newPrior & ",'Actief')"
    dbsCurrent.Execute (Query)
    
    
    'Query = "insert into Tbl_prioriteitwijzigingen([Nr wachtlijst],[Reden wijziging],[Datum wijziging],Instellingsnummer,Oude_PriorNr,Oude_Wachtlijst,Nieuwe_PriorNr,Nieuwe_Wachtlijst) " & _
            '"values('" & currNr & "','" & reden & "',#" & Format(Date, "mm/dd/yyyy") & "#," & currInst & ",0,'Passief'," & newPrior & ",'Actief')"
    'dbsCurrent.Execute (Query)
    
    Me.SubWachtlijst_Actief.Requery
    Me.SubWachtlijst_Geschrapt.Requery
    Me.SubWachtlijst_Niet_Actief.Requery
    
End Sub
 
De fout die je nu krijgt wordt veroorzaakt doordat je de hekjes (#) niet hebt weggehaald, zodat ze nu twee keer terugkomen.

Dit: ',#" & Format(Date, "mm/dd/yyyy") & "#," moet zo: '," & Format(Date, "mm/dd/yyyy") & ","
 
Ik heb geleerd dat gebruik van aparte queries als recordsource van formulieren en rapporten niet zo handig is. Je kan dan wel de eigenschappen gebruiken die je nu ook gebruikt. Wat ik meestal doe is de recordsource direct in het formulier/rapport te zetten , dat betekent een 1 op 1 relatie. Kan je ook direct zien wat het resultaat is . Een refresh of requery is natuurlijk op gezette tijden nodig.

In jou geval heb je nu een sortering in je query en in je eigenschappen, dat gaat botsen.
 
@TS: Wat moet ik precies doen om het probleem te reproduceren? Het is een redelijk ingewikkeld formulier...
 
Je kan dus in access queries bouwen die een deel van je data relationeel laten zien.
Vervolgens kan je op basis van die queries rapporten en formulieren gaan maken.
Als je echter om een of andere reden queries vaker gaat gebruiken kom je soms in de problemen omdat je criteria cq. inhoud gaat wijzigen.
Daarom vind ik het handiger om de losse queries te vermijden en ze in te voegen in de formulieren/rapporten ( sql commando's ).

Wat er in dit geval gebeurd is, denk ik , heb je een query ( met sortering ) die basis is voor een formulier ( of subformulier ) en dat je daarnaast in de eigenschappen ook nog een sortering gaat gebruiken. Een van de twee krijgt voorrang.

Groeten
Erwin
 
Sortering op het formulier heeft altijd voorrang boven sortering in een query. Of die query dus gesorteerd is of niet, maakt niet uit. Ook een SELECT query die je als basis voor een formulier maakt, kun je sorteren, en daar geldt dus hetzelfde voor. Bij een opgeslagen query of tabel heb je de mogelijkheid om een keuzelijst te maken waarmee je records kunt opzoeken; die optie heb je niet als je een SELECT gebruikt als basis voor een formulier. Ik zie dus alleen maar nadelen.... Overigens heb ik nog nooit problemen gehad met opgeslagen queries onder een formulier; ik gebruik beide varianten, al naar gelang het uitkomt...
En deze zin:
Je kan dus in access queries bouwen die een deel van je data relationeel laten zien.
snap ik dus ècht niet....
 
ik zou eens goed kijken wat je allemaal kunt doen. Je verhaal klopt niet helemaal , waarom zou je geen keuzelijsten kunnen maken van dingen die in je select statement zit. Trouwens ook van zaken die niet in je select statement zit kan dat ... vergt wel wat vba code.
Met een paar stukjes vba code kan je hele dynamische formulieren bouwen, bvb een selectielijst laat je een andere selectielijst perfect filteren en sorteren, probeer maar eens. Data hoeft dan zelfs niet in je primaire query te zitten ( kan uit heel andere dingen bestaan ) .
 
jij kent mijn reputatie op het forum geloof ik nog niet, dan wel hebt nog nooit iets van mij gelezen (bijvoorbeeld de cursus Access) :) En lezen blijkt ook een beetje lastig.... Ik bedoelde dat je in een formulier dat is gebaseerd op een SELECT statement geen opzoek keuzelijst met de wizard kunt maken. (En dat is ook zo.... blijkbaar doe je dat zelf nooit, anders had je dat wel geweten). Toevallig een topic dat hier vandaag parallel aan loopt. Vandaar dat ik hierboven het woord Wizard niet heb gebruikt...
 
en wat denk je dan van mijn oplossing van het originele probleem ( van johan ) ....
 
Wat er in dit geval gebeurd is, denk ik , heb je een query ( met sortering ) die basis is voor een formulier ( of subformulier ) en dat je daarnaast in de eigenschappen ook nog een sortering gaat gebruiken. Een van de twee krijgt voorrang.

Groeten
Erwin

@etraas, de bedoeling van de onderliggende VBA code is om (na het aanduiden van een aanvrager en drukken op de knop 'toevoegen op de juiste plaats") de tabel "Tbl_wachtlijst" zelf te hernummeren in de kolom "Prior" en dus geen querie of iets anders
 
Laatst bewerkt:
Meer uitleg

@iedereen,
Beetje meer uitleg voor wie die dit meevolgt: bedoeling is dus om in de tabel "Tbl_wachtlijst" bij enkel de "actieve" aanvragers (diegenen bij wie de kolom "Act" aangevinkt is, de aanvragers uit de kolom "Pa"s en "Geschrapt" wordt genegeerd ) de kolom "Prior" te hernummeren in een bepaalde sortering waarbij dat er eerst voorrang wordt gegeven aan de mensen van de eigen gemeente (die worden aangeduid in de tabel in de kolom "PrioriteitGemeente" met een cijfer 1, de andere gemeenten hebben een waarde 0), dan is het tweede criteria de prioriteitCategorie (de zozegde Katzschaal categorie die wordt aangeduid in de kolom "PrioriteitCategorie", hoe lager het cijfer hoe hoger de prioriteit, dus 0 geeft voorrang op 1, etc... 12 is de laatste in de rij) en pas als laatste komt het criterium "datum aanvraag" (hoe ouder de aanvraag is hoe hoger de prioriteit).

Daarnaast er rekening moet gehouden worden met de bestaande nummering van de "prior" kolom; maw als er iemand bv op plaats 19 terecht moet komen als de knop" toevoegen op de correcte plaats" wordt gedrukt moet de nummering erboven behouden blijven en de aanvragers eronder schuiven één plaats op.

Bijkomend probleem is dat er van deze algemene regels van nummering kan afgeweken worden en iemand hoger of helemaal bovenaan geplaatst door de knop "verplaatsen naar" wegens bv dringende reden (bv het gebeurt wel eens dat er iemand vanuit het Ziekenhuis plots wordt ontslagen; wij krijgen dan doodleuk een telefoontje dat we die persoon "gedwongen" de dag zelf moet opnemen). Dus als deze "afwijkende" persoon hoger in de prioriteitslijst komt te staan mag er niets veranderen aan deze nummering als er achteraf iemand wordt "toegevoegd op de correcte plaats"

De querie die je kan raadplegen via het formulier 'Frm_Controle_Prioriteit" (op het formulier "Frm_Wachtlijst_Aanpassen" via de knop bovenaan te bereiken) is gewoon om te controleren of de functies die je uitvoert via de andere knoppen wel kloppen. Tot nu toe behelpen onze dames van de administratie zich dus als ze iemand toegevoegd hebbben op de juiste plaats door dat controleformulier even te openen en de kolom prior eventjes naar Excel te kopiëren, daar te hernummeren via slepen en dan die nieuwe waarden terug te kopiëren om de nummering in de kolom Prior zo goed te brengen. Dat is natuurlijk geen nette manier maar het werkt wel.

Waarom al deze moeite?
Het is al gebeurd dat er van bepaalde kanten uit in processen voor de rechtbank zinsspelingen en beschuldigingen worden gemaakt van vriendjespolitiek, voortrekkerij van mensen met geld, etc.... bij het toekennen van wie in aanmerking komt voor de volgende vrije kamer in het Rusthuis. Met dit systeem heb je een veel betere opvolging en rapportering.
Bedankt op voorhand voor het denkwerk.
 
Laatst bewerkt:
database toegevoegd

een nieuwe database toegeveogd; foutmelding op de knop "toeveogen op correcte plaats........." is nu weg maar krijg foutmeldingen nu op andere knoppen (kan ook zijn door het strippen want in origineel heb ik die fout niet). Sortering probleem volgens datum is verbeterd maar lijkt zich nu te situeren in de categorie; er lijken zich mensen van een hogere categorie vooraan in de lijst te nestelen
 

Bijlagen

  • wachtlijst.rar
    95,7 KB · Weergaven: 29
Kan je het laten zien met veel minder data ? Geef daarbij , evt. in excel aan wat je wilt. Met zoveel data is het voor ons moeilijk te volgen.
 
Db met minder data

Even een database met 10 aanvragers; 7 actieve links en 3 passieve rechts die we dus actief willen maken "op hun correcte plaats". Wullaert Rachel is automatisch al geselecteerd als eerste en klikken we "toevoegen op de correcte plaats in de actieve wachtlijst" dan komt ze op plaats 5 terecht (wat correct is), doen we dat nu voor Decuypere Peter komt deze (bij mij althans) op plaats 8 terecht (is niet correct gezien zijn lagere Cat. dan zijn voorganger Van Holder Aimée), doen we het voor Demuynck Simonne komt zij op plaats 6 terecht (niet correct, het zou moeten de laatste plaats zijn gezien haar Cat. 12 en haar hogere datum van de aanvraag van Regolle Laurent met zelfde Cat.

Knop linksboven; de juiste sortering zou de volgorde moeten zijn zoals de records in Frm_controle_prioriteit wordt weergegeven terwijl je ziet dat in de kolom prior de volgorde niet klopt.
 

Bijlagen

  • wachtlijst_met_10.rar
    87,6 KB · Weergaven: 29
Als alles zo simpel was als het verwijderen van een paar records, dan had ik het al voor je opgelost ;)
 
Johan,

is het niet zo dat Demuynck Simone voor Van holder en Regoole komt op basis van het veld prior ??

Je hebt het over hernummeren van het veld prior, waar doe je dat ??

Is dit de correcte volgorde met prior even buiten beschouwing gelaten ??

Nr wachtlijst PrioriteitCategorie Datum aanvraag Prior Naam_voornaam
11090ML 0 26-5-2011 4 Glorieux Zoë
11101ML 0 11-6-2011 1 Tack Remi
11094ML 1 10-5-2011 2 Moreels Agnes
11100ML 1 10-6-2011 3 Vandepoele Bertha
11087ML 2 24-5-2011 5 Wullaert Rachel
11091ML 7 26-5-2011 7 Taelman Benaïssa
11092ML 7 30-5-2011 9 Decuypere Pieter
11089ML 12 25-5-2011 10 Regolle Laurent
11088ML 12 25-5-2011 8 Van Holder Aimée
11093ML 12 30-5-2011 6 Demuynck Simonne

Erwin


Even een database met 10 aanvragers; 7 actieve links en 3 passieve rechts die we dus actief willen maken "op hun correcte plaats". Wullaert Rachel is automatisch al geselecteerd als eerste en klikken we "toevoegen op de correcte plaats in de actieve wachtlijst" dan komt ze op plaats 5 terecht (wat correct is), doen we dat nu voor Decuypere Peter komt deze (bij mij althans) op plaats 8 terecht (is niet correct gezien zijn lagere Cat. dan zijn voorganger Van Holder Aimée), doen we het voor Demuynck Simonne komt zij op plaats 6 terecht (niet correct, het zou moeten de laatste plaats zijn gezien haar Cat. 12 en haar hogere datum van de aanvraag van Regolle Laurent met zelfde Cat.

Knop linksboven; de juiste sortering zou de volgorde moeten zijn zoals de records in Frm_controle_prioriteit wordt weergegeven terwijl je ziet dat in de kolom prior de volgorde niet klopt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan