regels verwijderen uit een tabel

Status
Niet open voor verdere reacties.

BartSr

Gebruiker
Lid geworden
26 aug 2008
Berichten
240
Hallo,
Ik werk al jaren met ms-access, maar loop nu tegen een probleem aan waar ik niet uitkom.
Code:
            Set tabel1 = CurrentDb.OpenRecordset("qComprimeren")
            Do Until tabel1.EOF
            If Right(tabel1!Datum, 4) >= Gsng1 Then GoTo volg1
            DoCmd.SetWarnings False
            DoCmd.RunSQL "DELETE FROM qComprimeren WHERE !Regelnr = " & qComprimeren!Regelnr & ";" '
            DoCmd.SetWarnings True
volg1:
    tabel1.MoveNext
Loop
    tabel1.Close
Dit zou automatisch oude records -ouder dan het jaar dat in Gsng1 staat- moeten verwijderen
Maar het werkt niet; er verschijnt een melding "fout 424 Object vereist"
Wat doe ik fout?
Bart
 
Ik snap je constructie niet helemaal; waarom niet op Jaar filteren? Er vanuit gaande dat Gsng1 een getal is met een jaartal, zou je dat zo kunnen doen.
Twee varianten, waarvan de tweede waarschijnlijk wat teveel opdrachten heeft :). Zelf zou ik altijd voor de eerste gaan.

Code:
Sub VerwijderRecords()
Dim strSQL As String

    strSQL = "DELETE FROM qComprimeren WHERE Year(Datum) = " & Gsng1
    DoCmd.SetWarnings False
    CurrentDb.Execute strSQL, dbFailOnError
    DoCmd.SetWarnings True
End Sub

Code:
Sub VerwijderRecords()
Dim Tabel1 As DAO.Recordset
    strSQL = "SELECT * FROM qComprimeren WHERE Year(Datum) = " & Gsng1
    Set Tabel1 = CurrentDb.OpenRecordset(strSQL)
    With Tabel1
        Do While Not .EOF
            .Delete
            .Update
            .MoveNext
        Loop
        .Close
    End With
End Sub
 
Ik begrijp niet wat er nu misgaat.:evil:
Hier volgt de complete code. De bedoeling is om per rekening de daarop gedane boekingen te verdichten tot 1 boeking.Maar alles gaat in de regel If tabel2.RecordCount < 2 Then GoTo Verder naar Verder:shocked:, m.a.w.tabel2 werkt niet goed.
Code:
Sub comprimeren()
gstr1 = "Deze functie maakt de huidige administratie kleiner, door de boekingen van elke rekening tot 1 regel terug te brengen."
gstr1 = gstr1 + vbNewLine & "Wil je dit?"
If MsgBox(gstr1, vbYesNo, "Comprimeren") = 7 Then Exit Sub
    Set Tabel1 = CurrentDb.OpenRecordset("t_grootboek"): Gint2 = 0
    Tabel1.MoveFirst
    Do Until Tabel1.EOF
        gstr1 = "SELECT T_Boekingen.*, T_Grootboek.RekNr FROM T_Boekingen INNER JOIN T_Grootboek ON T_Boekingen.RekNr = T_Grootboek.RekNr WHERE (T_Grootboek.RekNr)=" & Tabel1!RekNr & ";"
        Set tabel2 = CurrentDb.OpenRecordset(gstr1): Gcur1 = 0
      [B]  If tabel2.RecordCount < 2 Then GoTo Verder[/B]
        Do Until tabel2.EOF
            For Gint1 = 1 To tabel2.EOF
                Gcur1 = Gcur1 + tabel2!Bedrag
                tabel2.Edit: tabel2!Groepsrekening = False: tabel2.Update
            Next Gint1
tabel2.MoveNext
Loop
[B]'Hier komt ie nooit[/B]
            tabel2.MoveFirst
            tabel2.Edit: tabel2!Groepsrekening = True
            If Tabel1!DC = "D" Then tabel2!Bedrag = Gcur1:
            If Tabel1!DC = "C" Then tabel2!Bedrag = -1 * Gcur1
            tabel2!Omschrijving = "Verdichte boeking"
            Gcur1 = 0: Gint2 = Gint2 + 1
            tabel2.Update
            tabel2.Close
Verder:
    Tabel1.MoveNext
    Loop
    Tabel1.Close
        
        gstr1 = "DELETE FROM t_boekingen WHERE T_Boekingen.Groepsrekening =  FALSE; "
        DoCmd.SetWarnings False
        CurrentDb.Execute gstr1, dbFailOnError
        DoCmd.SetWarnings True


End Sub
Sub VerwijderRecords()
Gsng1 = 2018
    gstr1 = "DELETE FROM t_boekingen WHERE T_Boekingen.Groepsrekening = FALSE; "
    DoCmd.SetWarnings False
    CurrentDb.Execute gstr1, dbFailOnError
    DoCmd.SetWarnings True
End Sub
 
Ik kan je situatie niet naspelen, want in de voorbeeldadministratie zitten geen/te weinig records. Je doet in je code een telling (If tabel2.RecordCount < 2 Then GoTo Verder) die inderdaad in een oneindige loop eindigt. Ik weet niet of jij records hebt toegevoegd in de tabel [T_Boekingen], maar zolang die leeg is, gebeurt er inderdaad niet veel. Op zijn minst zou de loop moeten controleren dat er tenmiste één record in de tabel zit. Of je moet een andere loop maken.
 
Die boekingen zijn er wel, op meerdere rekeningen. Dus de query die als bron voor tabel2 geldt is wel goed?
Da's toch vreemd want hij geeft voor de meeste rekeningen 0 en voor enkelen 1, wat ook niet klopt
Zal ik anders een administratie opsturen, zodat je het daar op kunt testen?
 
Ik ben er al uit.
Mogelijk is het in een latere versie van Access al opgelost maar in mijn versie -office 2018- geeft recordcount pas de juiste waarde als je eerst een movelast hebt uitgevoerd:p
Dit programmadeel
Code:
Set tabel2 = CurrentDb.OpenRecordset(gstr1): Gcur1 = 0
If tabel2.RecordCount < 2 Then GoTo Verder
moet worden veranderd in
Code:
Set tabel2 = CurrentDb.OpenRecordset(gstr1):
[B]If tabel2.RecordCount > 0 Then tabel2.MoveLast[/B]
If tabel2.RecordCount < 2 Then GoTo Verder
Dit vond ik later in de access-documentatie:
Using the MoveLast method to populate a newly opened Recordset negatively impacts performance. Unless it is necessary to have an accurate RecordCount as soon as you open a Recordset, it's better to wait until you populate the Recordset with other portions of code before checking the RecordCount property.
Maar je verwacht dat toch niet...:p
Bart
 
Mogelijk is het in een latere versie van Access al opgelost maar in mijn versie -office 2018- geeft recordcount pas de juiste waarde als je eerst een movelast hebt uitgevoerd:p
Nee, dat is een eigenschap van DAO. Met ADO kun je, als je de juiste cursor instellingen gebruikt, wél in één keer de RecordCount krijgen. Ik zou trouwens een andere oplossing hebben gebruikt:
Code:
With Tabel2
     If Not .BOF=.EOF Then
          .MoveLast
          .MoveFirst
          If .RecordCount = 1 Then GoTo Verder
     End If
Ik zie niet zoveel nut in de vergelijking If tabel2.RecordCount <2.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan