fout 2046 actie naar record gaan is momenteel niet beschikbaar

Status
Niet open voor verdere reacties.

Wibodata

Gebruiker
Lid geworden
10 mei 2016
Berichten
11
Hallo Access-liefhebbers,
Reeds behoorlijk lang gebruik ik in een project de instructies DoCmd.GoToRecord , , acGoTo, t en DoCmd.GoToRecord , , acNext op verschillende plaatsen in het programma met groot succes en zonder problemen. Nu ben ik bezig een en ander te herzien en op één programmaregel goToRecord krijg ik de foutmelding " actie naar record gaan is momenteel niet beschikbaar" (fout 2046) terwijl de andere zonder probleem correct werken.
Ik heb verschillende suggesties uitgeprobeerd om dat euvel te verhelpen maar zonder succes.
Wie kan mij hier aan een oplossing helpen?
Met dank bij voorbaat,
Wibo
 
Je geeft te weinig informatie, vrees ik. Het beste is natuurlijk om de db mee te posten, want er kunnen verschillende oorzaken zijn. En gokken doe ik wel op het Songfestival :).
 
Beste Octafish,

Ik geef hier een stuk uit de module die komt uit een programma van 83Mb en meer dan duizend records beheert in een gekoppelde DB. De foutmelding doet zich alleen voor in deze module.

Option Compare Database
Option Explicit

Private Sub Form_Current()

On Error GoTo Err_Afhandeling


Dim t, r, n, x, y As Integer
Dim KeuzeID, Voorwaarde As String
Dim KeuzeVar(600) As Variant

KeuzeID = "AuteurID = "
n = DCount("[auteurID]", "qryAuteurKeuzerondje")
r = 0
x = 1
y = 0

For t = 1 To n

DoCmd.GoToRecord , , acGoTo, t 'Hier doet zich de foutmelding voor

Select Case True
Case groepsvak1 = varLetter
If varLetter = groepsvak1 Then
KeuzeID = "AuteurID = " & Forms![frmKeuzeAlfa].[AuteurID]
KeuzeVar(t) = KeuzeID
y = y + 1

End If

Case Else
If MsgBox("Er zijn geen auteurs gevonden met deze beginletter," _
& Chr(13) & Chr(10) & "Druk 'OK' om nieuwe beginletter te proberen." _
& Chr(13) & Chr(10) & "Druk 'Annuleren' om te stoppen en terug te keren.", _
vbOKCancel, "") = vbCancel Then
Exit Sub

End If

End Select
Next

For x = 1 To y
If Not IsEmpty(KeuzeVar(x)) Then
Voorwaarde = " or " & (KeuzeVar(x))
KeuzeID = KeuzeID & Voorwaarde
KeuzeVar(x) = KeuzeAuteur
End If
Next


KeuzeID = Right(KeuzeID, Len(KeuzeID) - 4)

DoCmd.OpenForm "frmKeuzeAlfabet", , , KeuzeID, , acDialog

If MsgBox("Er zijn geen auteurs gevonden met deze beginletter," _
& Chr(13) & Chr(10) & "Druk 'OK' om opnieuw te proberen." _
& Chr(13) & Chr(10) & "Druk 'Annuleren' om te stoppen en terug te keren.", _
vbOKCancel, "") = vbCancel Then
Exit Sub

End If



Andere modules hebben dezelfde structuur en zijn perfect vergelijkbaar en daar doet zich de fout niet voor.
 
Eerst een stukje instructie, aangezien je nieuw bent bij HelpMij :). Code zetten we altijd tussen CODE tags zodat de opmaak van de code goed leesbaar is. Dat is jouw code zo niet. Ik doe dat zelf door de code [/CODE] achter de code te typen en
Code:
[B]voor[/B] de code, maar er is er een aparte knop voor ( [B]#[/B] ). Hoe dan ook: maak je code netjes op :).
Ik snap deze regel niet:
[CODE]        DoCmd.GoToRecord , , acGoTo, t 'Hier doet zich de foutmelding voor
Wat zit er in t? Ik zie niet dat het een (getal)variabele is, dus staat er wel een getal in?
 
de t is inderdaad een variabele, die de plaats van de record bepaalt waar naartoe gegaan wordt.

Het effect is dezelfde als met acNext maar met die t kan je sprongen maken.
Hopelijk is dat duidelijk.
 
Ik snap het commando :). Maar in je code wordt die nergens gevuld, dus ik vraag me af wat er dan in staat. Is de variabele leeg, dan kan hij hooguit hoog of laag springen, maar niet vooruit :D.
Dus loop er eens stapsgewijs doorheen en kijk of hij inderdaad op de juiste manier vult. Overigens vraag ik me af wat het nut is van door records lopen met sprongen die steeds een hoger aantal records overslaan....
 
Laatst bewerkt:
Hallo,

Ik heb na het lezen van Artikel-id: 244695 uit de Microsoft forumdatabase, een oplossing gevonden nl door het onderliggende formulier (via variabele varForm) met een run commando op te staren vanuit een andere module.

Code:
    Run "OpenAccForm", varForm
is het commando dat in module1 volgende code activeert

Code:
Public Sub OpenAccForm(ByVal varForm As String)
    Application.DoCmd.OpenForm varForm
End Sub


Dank alvast voor uw tussenkomst, met een vriendelijke groet van
WiBoData
 
Laatst bewerkt:
Huh? De 'oplossing' die je hier geeft heeft toch helemaal niks met je vraag te maken? Sowieso is die functie (volslagen) overbodig; hij doet helemaal niks aan welk probleem dan ook! Behalve dat je nu een code hebt die minder gestructureerd en overzichtelijk is als wat je daarvoor had! Als ik moet kiezen tussen jouw oplossing, die dan wel zoiets zal zijn:
Code:
Dim varForm as String
    varForm = "MijnFormulier"
    Run "OpenAccForm", varForm
    etc. (hier dan die bladercode?)
Code:
Public Sub OpenAccForm(ByVal varForm As String)
    Application.DoCmd.OpenForm varForm
End Sub

Of mijn werkwijze:

Code:
    DoCmd.OpenForm "MijnFormulier"
Dan lijkt mij de keuze niet zo moelijk...
De opdracht Application. bijvoorbeeld doet niks en kan sowieso weg, Daarnaast kun je, als je de opdracht 'los' geeft altijd parameters meegeven als dat nodig mocht zijn. Jouw 'functie' doet dat niet. Maar afgezien daarvan: daar ging je vraag helemaal niet over :).

Om nog even op die vraag terug te komen: ik had in eerste instantie niet goed gelezen en dus niet gezien dat je wel degelijk een variabele t hebt gedeclareerd. Alleen: de manier waarop je de declaraties hebt gemaakt is fout. Of je moet met opzet slechts één variabele als Integer hebben willen declareren. Nog even ter opfrissing jouw code:
Code:
Dim t, r, n, x, y As Integer
Dim KeuzeID, Voorwaarde As String
Hier declareer je in de eerste regel alleen y als Integer, de rest is variant. In de tweede regel is KeuzeID weer variant, en Voorwaarde is String. Een veldnaam als KeuzeID suggereert Integer of Long, niet Variant.

De declaraties zouden er dus zo uit moeten zien:
Code:
Dim t As Integer, r As Integer, n As Integer, x As Integer, y As Integer
Dim KeuzeID As Integer, Voorwaarde As String
En dan was je misschien ook al gelijk van het bladerprobleem verlost, omdat ik vermoed dat t dan wel een getalsveld is. Hoewel een variant dus ook prima als getal gebruikt zou moeten kunnen worden. Daarnaast is jouw code vergelijkbaar met:
Code:
For t = 1 To n
    DoCmd.GoToRecord , , acNext
Want je doet niks anders dan door de eerste n records lopen. Maar dat terzijde :).
 
Beste OctaFish,
Hartelijk dank voor uw suggesties, ik zal die zeker grondig bekijken en toepassen waar ik kan want er zit wat verbetering in.
Access doet rare dingen met de instructies want na het invoeren van mijn nieuwe regels werkt die module wel weer als voorheen, laat ik application-structuur weg dan doet het programma het weer niet meer! Ook als ik een variabele als een array definieer of niet moet ik application gebruiken of weglaten. Daar zit waarschijnlijk een bug achter?

Alvast bedankt en groeten van
WiBoData
 
Het riekt er naar dat je problemen hebt binnen de database die je nog niet hebt gevonden :). Probeer de db eerst te compileren (vanuit VBA venster naar <Foutopsporing>, <db compileren>. Access springt dan naar de eerste fout die het vindt. Die moet je uiteraard dan oplossen. Pas als de db volledig foutvrij is, zullen alle commando's en opdrachten correct werken. Doordat er (vermoedelijk dus) ergens in je db een fout zit, genereert Access op andere plekken fouten die niets met dat probleem te maken hebben. Heel raar, maar wel een goede indicatie, als je iets vreemds merkt, dat er dus ergens iets niet klopt. Voorbeeldje waar ik zelf regelmatig mee te maken krijg: in een query wil ik op Date() filteren. En dat lukt dan niet: Access kent de opdracht Date() niet meer! Yeah right... Even compileren, fout herstellen en alles draait weer als een zonnetje :).
Het probleem hoeft dan dus niet eens een code fout te zijn; het kan ook een ontbrekende bibliotheek zijn. Als je die dan ergens aanroept, heb je dus een probleem.
 
Beste OctaFish en andere Access-gebruikers,

Ik was er even tussenuit, daarom komt dit antwoord ruim na de vervaldatum.
Je had gelijk, er zat nog een syntaxfout ergens op een totaal andere plaats. En na nog een paar andere aanpassingen doet het probleem zich niet meer voor.
Het programmaonderdeel ziet er nu als volgt uit:

Code:
    Dim t, r, n, m, x, y As Integer
    Dim KeuzeID, Voorwaarde As String
    Dim KeuzeVar(600) As Variant
    Dim var1steLetter(600) As Variant

    KeuzeID = "AuteurID = "
    n = DCount("[AuteurID]", "qryAuteurKeuzerondje")
    r = 0
    x = 1
    y = 0
    m = 0
    varForm = "frmKeuzeAlfa"
    DoCmd.OpenForm varForm, , , , acFormReadOnly
    
    For t = 1 To n
         DoCmd.GoToRecord acDataForm, varForm, acGoTo, t
         var1steLetter(t) = Forms![frmkeuzealfa].[1steLetter]

    Next

        For t = 1 To n
            If var1steLetter(t) = varGroepsVak Then
                DoCmd.GoToRecord , , acGoTo, t
                y = y + 1
          
                KeuzeVar(y) = "AuteurID = " & Forms![frmkeuzealfa].[AuteurID]
            End If
      Next
      RecordTeller = y
      KeuzeID = Empty
      For x = 1 To y
      
        If Not IsEmpty(KeuzeVar(x)) Then
           Voorwaarde = " or " & (KeuzeVar(x))
           KeuzeID = KeuzeID & Voorwaarde
        End If
      Next

    Forms![frmKeuzeAlfabet].[groepsvak1] = Empty
    Forms![frmKeuzeAlfabet].[groepsvak2] = Empty
    Forms![frmKeuzeAlfabet].[groepsvak3] = Empty
    Forms![frmKeuzeAlfabet].[groepsvak4] = Empty
  
    DoCmd.Close acForm, varForm

    KeuzeID = Right(KeuzeID, Len(KeuzeID) - 4)

    DoCmd.OpenForm "frmKeuzeAlfa", , , KeuzeID, , acDialog
    DoCmd.Close acForm, "frmKeuzeAlfabet"


Dank voor de suggesties en het meedenken.
Misschien tot een volgend problem en
Groeten van
Wibodata
 
Je hebt nog steeds je variabelen verkeerd gedeclareerd. Met name dit stuk:
Code:
    Dim t, r, n, m, x, y As Integer
    Dim KeuzeID, Voorwaarde As String
Declareer niks als je toch alles als variant gebruikt, of doe het correct zoals ik in bericht #8 heb aangegeven. Halfslachtige declaraties helpen nooit echt... Daarnaast is het nooit slim om een matrix zo'n vast bereik te geven. Dat kan ook veel slimmer.
Mijns inziens valt er dus nog veel te verbeteren aan je code (al heb ik de db niet om het écht te controleren) maar dit zou mijn insteek zijn:
Code:
Dim t As Integer, r As Integer, n As Integer, m As Integer, x As Integer, y As Integer
Dim KeuzeID As String, Voorwaarde As String, varForm As String
Dim KeuzeVar() As Variant, var1steLetter() As Variant

    n = DCount("[AuteurID]", "qryAuteurKeuzerondje")
    r = 0:    x = 1:    y = 0:    m = 0
    varForm = "frmKeuzeAlfa"
    DoCmd.OpenForm varForm, , , , acFormReadOnly
    
    For t = 1 To n
        DoCmd.GoToRecord acDataForm, "frmKeuzeAlfa", acGoTo, t
        ReDim Preserve var1steLetter(t)
        var1steLetter(t) = Me![1steLetter].Value
        If var1steLetter(t) = varGroepsVak Then
            DoCmd.GoToRecord , , acGoTo, t
            y = y + 1
            ReDim Preserve KeuzeVar(y)
            KeuzeVar(y) = "AuteurID = " & Me.AuteurID
    Next
    For x = LBound(KeuzeVar) To UBound(KeuzeVar)
        If Not KeuzeID = vbNullString Then KeuzeID = KeuzeID & " Or "
        KeuzeID = KeuzeID & (KeuzeVar(x))
    Next
    For i = 1 To 4
        Me("groepsvak" & i) = Empty
    Next i
    If KeuzeID = vbNullString Then
        Me.Filter = ""
        Me.FilterOn = False
    Else
        Me.Filter = KeuzeID
        Me.FilterOn = True
    End If
    DoCmd.Close acForm, "frmKeuzeAlfabet"
 
Beste OctaFish, je bent een crack! Op een paar kleinigheden na (o.a. Me! werd als niet geoorloofd verworpen) past jou insteek perfect in het programma.
Ik heb genoten van je programmatie en zou van je nog veel kunnen leren, ik ben trouwens maar een autodidactische amateur.
Hartelijk dank!
WiboData
 
Je hebt het zeker over deze regel:
Code:
var1steLetter(t) = Me![1steLetter].Value
Dat kan ik mij namelijk wel voorstellen. Doorgaans gebruik ik dit:
Code:
var1steLetter(t) = Me.1steLetter.Value
Me. gebruik je op formulieren om naar objecten te verwijzen op dat formulier. Rechte haken om (veld)namen gebruik ik alleen als er spaties in een naam zitten. Die vermijd ik overigens, levert alleen maar problemen op. Me!Veldnaam is ongeveer hetzelfde als Me.Veldnaam, met dit verschil dat Me. verwijst naar het sec het formulier, en me! verwijst naar de volledige collectie, waar het formulier onderdeel van is. Bij het 'componeren' van de code gaf Me.1steLetter.Value een foutmelding, vandaar dat ik de andere variant maar gepost heb. Ik vermoed dat objectnamen die met een cijfer beginnen de handel door de war gooien. Normaal gesproken krijg ik op die constructie namelijk geen foutmelding, en nu wel. Het andere veld gaf die melding namelijk niet.
Maar je hebt het opgelost, en daar gaat het om :).

...ben trouwens maar een autodidactische amateur.
Wat denk je dat ik ben? :D.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan