fout op query

Status
Niet open voor verdere reacties.

so10070

Gebruiker
Lid geworden
4 feb 2014
Berichten
419
Als ik de volgende code zonder tussenstop laat lopen wordt er een fout gegenereerd: "SBI-op kan het object TotaalSom niet vinden."
Code:
Set qdfPD = CurrentDb.CreateQueryDef("TotaalSom", sqlRecordSourceReportPD)
DoCmd.OpenQuery qdfPD.Name

Maar als ik hier een "Stop" tussenzet en de procedure daarna terug gewoon opstart, wordt er geen fout gegeneerd.
Code:
Set qdfPD = CurrentDb.CreateQueryDef("TotaalSom", sqlRecordSourceReportPD)
Stop
DoCmd.OpenQuery qdfPD.Name
Wat is hier aan de hand?
 
Ik zou het sowieso zo doen:
Code:
    Set qdfPD = CurrentDb.CreateQueryDef("TotaalSom")
    qdfPD.SQL =  sqlRecordSourceReportPD
    DoCmd.OpenQuery "TotaalSom"
Jouw probleem kan ik verder niet reproduceren, dus als je wilt dat we er even naar kijken, dan graag een voorbeeldje.
 
Ik denk te weten waar de fout gesitueerd moet worden, maar kan deze niet opgelost krijgen. Enkel in runtime treedt de fout op en dit heeft te maken met de tijdelijke query die aangemaakt wordt. Bij het aanmaken van deze query wordt die niet weergegeven links in de lijst van alle Access-objecten bij Queries en wordt daarom dus niet gevonden. Wanneer de applicatie later terug opgestart wordt verschijnt deze tijdelijke query wel in de lijst. Hoe slaag ik erin om de tijdelijke query in de lijst van query's op te nemen zodat deze in de volgende procedures meegenomen kan worden.
Code:
Private Sub Report_Open(Cancel As Integer)
    Dim sqlRecordSourceReportPD As String
    Dim sqlBronPD As String
    Dim qdfPD As Object

    'Vorige query verwijderen
    If ObjectBestaatNog("BronTabelPD", 2) = True Then
        DoCmd.DeleteObject acQuery, "BronTabelPD"
    End If

    sqlBronPD = "SELECT tblWerkgroepCGS.WerkgroepCGSID, tblWerkgroepCGS.WGAfdelingDivisie, tblProducten.*, tblAandachtspunten.* " & _
        "FROM tblWerkgroepCGS INNER JOIN (tblProducten LEFT JOIN tblAandachtspunten ON tblProducten.ProductenID = tblAandachtspunten.ProductenID) " & _
        "ON tblWerkgroepCGS.WerkgroepCGSID = tblProducten.WerkgroepCGSID " & _
        "WHERE (tblWerkgroepCGS.WerkgroepCGSID <> " & Me.Parent.txtWerkgroepCGSID & ") And " & _
        "(tblProducten." & Me.Parent.txtWGAfdelingDivisiePD & " = True) And (tblProducten.PKalenderjaar = " & TempVars.Item("PubKalenderjaar") & ");"
        
    Set qdfPD = CurrentDb.CreateQueryDef("BronTabelPD")
    qdfPD.SQL = sqlBronPD
'    DoCmd.OpenQuery "BronTabelPD"
'    DoCmd.Save acQuery, "BronTabelPD"
    
    Set qdfPD = Nothing
   
    'totaal aantal records tellen
    TempVars.Add "TotaalRecordsPD", Nz(DCount("*", "BronTabelPD"), 0)

    sqlRecordSourceReportPD = "SELECT tblWerkgroepCGS.WerkgroepCGSID, tblWerkgroepCGS.WGAfdelingDivisie, tblProducten.*, tblAandachtspunten.* " & _
        "FROM tblWerkgroepCGS INNER JOIN (tblProducten LEFT JOIN tblAandachtspunten ON tblProducten.ProductenID = tblAandachtspunten.ProductenID) " & _
        "ON tblWerkgroepCGS.WerkgroepCGSID = tblProducten.WerkgroepCGSID " & _
        "WHERE (tblWerkgroepCGS.WerkgroepCGSID <> " & Me.Parent.txtWerkgroepCGSID & ") And " & _
        "(tblProducten." & Me.Parent.txtWGAfdelingDivisiePD & " = True) And (tblProducten.PKalenderjaar = " & TempVars.Item("PubKalenderjaar") & ") " & _
        "ORDER BY tblWerkgroepCGS.WGAfdelingDivisie, tblProducten.PCodeActie, tblProducten.PNaam;"

    Me.RecordSource = sqlRecordSourceReportPD
End Sub
 
Ik snap niet veel van je procedure; dat begint al hier:
Code:
Dim qdfPD As Object
Waarom niet
Code:
Dim qdfPD As QueryDef
?

Maar ook je queries niet. Ik heb de indruk dat je de eerste query alleen gebruikt om één waarde op te zoeken. Maar waarom open je dan ook nog eens die query? Waarom niet in een recordset de waarde opgehaald als het alleen om het aantal records gaat? Ben je in ieder geval van je probleem af.
 
Dan moet je al helemaal geen tijdelijke query maken, maar een vaste query gebruiken. Met een QueryDef pas je dan de SQL ervan aan, en klaar is je rapport.
 
Ja, maar ik denk dat dat nu juist de reden is waarom ik die tijdelijke query aangemaakt heb. Ik gebruik hier verscheidene parameters die voor het moment van belang zijn en bepaald worden door de aangemelde gebruiker. Dat is wat in de WHERE-clausule staat.
Code:
WHERE (tblWerkgroepCGS.WerkgroepCGSID <> " & Me.Parent.txtWerkgroepCGSID & ") And " & _
        "(tblProducten." & Me.Parent.txtWGAfdelingDivisiePD & " = True) And (tblProducten.PKalenderjaar = " & TempVars.Item("PubKalenderjaar") & ");"
Ik zie niet goed in hoe ik dat in een vaste query kan zetten. Misschien dan met tijdelijke tabellen werken?
 
Zoals ik al zei: gebruik een vaste query voor je rapport, en verander de SQL ervan met de QueryDef. Werkt altijd, en perfect.
 
Ben gestart met de procedure te herschrijven naar een QueryDef en dit is in ieder geval veel korter. Maar zit nog met twee problemen: ik wil het aantal records tellen. Ik slaag er niet in om de DSum-functie correct te zetten. Tevens wil ik het aantal records tellen, maar slaag er niet in om ook hier het juiste domein (= hier de query) te vinden. Heb het ook geprobeerd om via een recordset te doen, maar krijg dan telkens de fout: kringverwijzing.
Code:
    Dim db As Object
    Dim qdfPD As QueryDef
    Dim sqlRecordSourceReportPD As String

    Set db = CurrentDb

    sqlRecordSourceReportPD = "SELECT * " & _
        "FROM qryMCAPD " & _
        "WHERE (tblWerkgroepCGS.WerkgroepCGSID <> " & Me.Parent.txtWerkgroepCGSID & ") And " & _
        "(tblProducten." & Me.Parent.txtWGAfdelingDivisiePD & " = True) And (tblProducten.PKalenderjaar = " & TempVars.Item("PubKalenderjaar") & ") " & _
        "ORDER BY tblWerkgroepCGS.WGAfdelingDivisie, tblProducten.PCodeActie, tblProducten.PNaam;"
        
    Set qdfPD = db.QueryDefs("qryMCAPD")
    qdfPD.SQL = sqlRecordSourceReportPD

    'aantal records tellen
    [COLOR="#FF0000"]TempVars.Add "TotaalAantalRecordsPD", "........"[/COLOR]

    'Sum van Veld
    [COLOR="#FF0000"]TempVars.Add "TotaalPD", DSum(Replace(Me.Parent.txtWGAfdelingDivisiePD, "P", "A", 1, 1), ".......")[/COLOR]
 
Ik snap je query niet; je gebruikt alleen de query qryMCAPD als basis, maar je vergelijkt velden uit tabellen die ik dus niet in de FROM terugvind. Waar haal je de WHERE tabellen vandaan? Gesteld dat de query correct is, moet je, als je daarop wilt tellen, wel een recordset openen. Wat mij wat meer zorgen baart: je gebruikt velden uit de query die je tegelijk ook aan het aanpassen ben. Lijkt mij onwenselijk. De query bevat velden uit tabellen, en daarop baseer je dan de SQL. En die SQL wijs je vervolgens toe aan de query.

Stel dat alles tóch klopt, dan moet je dus een recordset maken die de records telt.
Krijg je bijvoorbeeld zoiets:
Code:
Dim qdfPD As QueryDef
Dim rst As DAO.Recordset
    Set qdfPD = CurrentDb.QueryDefs("qryMCAPD")
    qdfPD.SQL = sqlRecordSourceReportPD
    Set rst = CurrentDb.OpenRecordset("qryMCAPD")
    TempVars.Add "TotaalPD", 0
    With rst
        .MoveLast
        .MoveFirst
        TempVars.Add "TotaalAantalRecordsPD", .RecordCount
        Do While Not .EOF
            Select Case !WGAfdelingDivisiePD
                Case "P"
                    TempVars("TotaalPD") = TempVars("TotaalPD") + 1
                Case "A"
                    TempVars("TotaalPD") = TempVars("TotaalPD") + 1
            End Select
            .MoveNext
        Loop
        .Close
    End With

Overigens snap ik dit ook al niet... tblProducten." & Me.Parent.txtWGAfdelingDivisiePD & " = True. Probeer je hier variabele namen uit een formulierveld te halen? Die dus op zich ook al weer in een tabel staan?
 
Juist: query WHEN-voorwaarden verkeerd :)o). Begreep ook niet goed waar ik de recordset moest zetten.
De variabele naam haal ik uit het formulierveld, dat is diegene die zich aangemeld heeft. Het rapport gaat na wie van deze dienst opdrachten vraagt/eist. In het veld waarnaar deze variabele verwijst staan de namen van de verschillende diensten. Rechtstreeks naar het veld verwijzen lukt dus niet. Ik dacht dit op deze manier te kunnen oplossen.
Maar in ieder geval: op korte termijn veel geleerd! :)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan