A.E.Veltstra
23 Augustus 2001
Stel, je hebt een uitgebreide parameterquery, die zo groot is, dat Microsoft Access 2000 het niet toestaat zijn code in te voeren in de RecordSource-eigenschap van het formulier. Je komt er dan achter dat een parameterquery niet zomaar werkt in een formulier.
Hoewel je de parameters van een query kunt instellen door het querydef-object aan te spreken, en daarvan het gewenste parameter-object te wijzigen, heeft dat geen invloed op het formulier. Vooral niet, als je in ontwerpmodus de recordbron van het formulier al aan de query hebt gekoppeld. In dat geval vult Ac2000 wel de parameters, maar trekt zich daar niets van aan als een moment later het formulier geopend wordt.
De oplossing lijkt eenvoudig: declareer een querydef-objectvariabele, stel de parameters in, en stel de recordset van het formulier in op de OpenRecordset-functie van de querydef. Echter, dit werkt niet.
Onderstaand voorbeeld werkt wel:
Het werkt omdat de recordset van het formulier wordt ingesteld op de recordsetclone van de recordset-objectvariabele. Het lukt niet, wanneer de formulierrecordset wordt ingesteld op de recordset-objectvariabele zelf! (Toen ik dat probeerde, gaf Ac2000 de melding dat "de applicatie-icoon niet kan worden ingesteld op het bestand 'Recordset'."Er gaat dus nog ergens iets fout, daarbinnen...)
Waarom gebeurt dit? Ik vermoed samen met oud-collega Theo Schrijver, dat de recordsetclone een extra scheiding plaatst, waardoor het formulier opeens wel met de query kan omgaan. Zeker weten doen we het niet.
De oplossing lijkt eenvoudig: declareer een querydef-objectvariabele, stel de parameters in, en stel de recordset van het formulier in op de OpenRecordset-functie van de querydef. Echter, dit werkt niet.
Onderstaand voorbeeld werkt wel:
Public Function Init(ByVal strTekst As String, ByVal lngGetal As Long) As Boolean
On Error GoTo iFout
Set qdf = CurrentDb.QueryDefs("qryMijnQuery")
With qdf
.Parameters("strParameterTekst") = strTekst
.Parameters("lngParameterGetal") = lngGetal
Set rst = qdf.OpenRecordset(dbOpenDynaset)
If Not rst Is Nothing Then
Set Me.Recordset = rst.Clone ''Me' is het formulier zelf
Init = True
End If
End With
iFout:
If Err.Number <> 0 Then
MsgBox Err.Description & vbCrLf & _
"Neem contact op met de applicatie-ontwikkelaar.", _
16, "Initialiseer venster 'MijnVenster': " & Err.Number
End If
End Function
Het werkt omdat de recordset van het formulier wordt ingesteld op de recordsetclone van de recordset-objectvariabele. Het lukt niet, wanneer de formulierrecordset wordt ingesteld op de recordset-objectvariabele zelf! (Toen ik dat probeerde, gaf Ac2000 de melding dat "de applicatie-icoon niet kan worden ingesteld op het bestand 'Recordset'."Er gaat dus nog ergens iets fout, daarbinnen...)
Waarom gebeurt dit? Ik vermoed samen met oud-collega Theo Schrijver, dat de recordsetclone een extra scheiding plaatst, waardoor het formulier opeens wel met de query kan omgaan. Zeker weten doen we het niet.
Need problem solving?
Talk to me. Let's meet for coffee or over lunch. Mail me at “omegajunior at protonmail dot com”.