Vraagjes over invoerformulier en zoekfunctie

Status
Niet open voor verdere reacties.

Leonie25

Gebruiker
Lid geworden
23 sep 2011
Berichten
32
Hallo iedereen,

Ik had wat vraagjes over de access database die ik gemaakt heb. Ik heb twee vragen: de eerste gaat over de zoekfunctie die ik in de database gezet heb. Ik krijg namelijke een foutmelding, terwijl ik exact dezelfde functie wel werkend heb in een andere database. Ik krijg de foutmelding:
De expressie bij klikken die u hebt opgegeven als instelling voor de gebeurteniseigenschap, heeft de volgende fout veroorzaakt: Er is een fout opgetreden in de communicatie tussen Microsoft Office Access en het OLE-bronprogramma of het ActiveX-besturingselement.
De expressie geeft niet de naam van een macro, de naam van een door de gebruiker gedefinieerde functie of een [gebeurtenisprocedure] als resultaat
Er is een fout opgetreden bij het evalueren van een functie, gebeurtenis of macro.

Heeft iemand enig idee wat deze fout kan veroorzaken?
Dit is de code die gebruikt wordt als ik de zoek-knop indruk:

Code:
Private Sub Knop12_Click()

Dim strVondstNummer As String 'wordt gebruikt om het huidige vondstnummer uit te lezen
Dim strFilter As String 'een zoekfilter dat over de recordset gegooid kan worden om het juiste record te vinden
Dim rstVondsten As ADODB.Recordset 'een lijst met vondsten
Dim lngRecordId As Long 'het vondstnummer dat de te tonen vondst identificeert

On Error GoTo OpenFormulier
strVondstNummer = Forms("Vondsten").vondstnummer
On Error GoTo 0

GaZoeken:
'Bouw eeen zoekfilter
strFilter = ""
If Me.vondstnummer <> "" Then
  strFilter = "vondstnummer = " & CStr(Me.vonstnummer)
End If
If Me.werkput <> "" Then
  If strFilter = "" Then
    strFilter = "werkput = " & CStr(Me.werkput)
  Else
    strFilter = "(" & strFilter & ") AND (werkput = " & Me.werkput & ")"
  End If
End If
If Me.vlak <> "" Then
  If strFilter = "" Then
    strFilter = "vlak = " & CStr(Me.vlak)
  Else
    strFilter = "(" & strFilter & ") AND (vlak = " & Me.vlak & ")"
  End If
End If

If Me.spoornummer <> "" Then
  If strFilter = "" Then
    strFilter = "spoornummer = " & CStr(Me.spoornummer)
  Else
    strFilter = "(" & strFilter & ") AND (spoornummer = " & Me.spoornummer & ")"
  End If
End If
If Me.categorie <> "" Then
  If strFilter = "" Then
    strFilter = "categorie = " & CStr(Me.categorie)
  Else
    strFilter = "(" & strFilter & ") AND (categorie = " & Me.categorie & ")"
  End If
End If

'Open de database tabel met vondsten
Set rstVondsten = New ADODB.Recordset
rstVondsten.LockType = adLockOptimistic
rstVondsten.Open "Vondsten", CurrentProject.Connection, adOpenStatic
rstVondsten.MoveFirst

'Filter nu de records en zoek het vondstnummer van de vondst die getoond moet worden
lngRecordId = -1
If rstVondsten.RecordCount > 0 Then
  If Me.vonstnummer <> "" Then
    rstVondsten.Filter = strFilter 'maak een subselectie van alle vondsten, om gericht te zoeken naar het toepasselijke vondstnummer
    If rstVondsten.RecordCount > 0 Then
      rstVondsten.MoveFirst
      lngRecordId = rstVondsten.Fields(0)
      If CStr(lngRecordId) = Trim(strVondstNummer) Then
        If MsgBox("Alle vondsten zijn doorzocht. Opnieuw zoeken vanaf het begin?", vbQuestion + vbYesNo, "Altijd maar weer die keuzes...") = vbNo Then
          Exit Sub
        End If
      End If
    End If
  Else
    If strFilter = "" Then 'hou rekening met de huidig geselecteerde vondst
      rstVondsten.Filter = "vonstnummer > " & strVondstNummer
    Else
      rstVondsten.Filter = "(" & strFilter & ") AND (vonstnummer > " & strVondstNummer & ")"
    End If

    If rstVondsten.RecordCount <= 0 Then 'als er geen records zijn vanaf de huidige vondst, begin dan weer met zoeken aan het begin
      If MsgBox("Alle vondsten zijn doorzocht. Opnieuw zoeken vanaf het begin?", vbQuestion + vbYesNo, "Altijd maar weer die keuzes...") = vbYes Then
        rstVondsten.Filter = strFilter
      Else
        Exit Sub
      End If
    End If
    
    If rstVondsten.RecordCount > 0 Then 'als er records gevonden zijn, ga dan naar het eerste record
      rstVondsten.MoveFirst
      lngRecordId = rstVondsten.Fields(0)
    End If
  End If
End If

'Sluit de database weer netjes
rstVondsten.Close

If lngRecordId < 0 Then 'als er geen resultaten konden worden gevonden
  MsgBox "De zoekopdracht heeft geen resultaten opgeleverd.", vbInformation + vbOKOnly, "That is illogical captain."
Else
  DoCmd.OpenForm "Vondsten", acNormal 'nodig om fouten met FindRecord te voorkomen
  Forms("Vondsten").vonstnummer.SetFocus
  DoCmd.FindRecord CStr(lngRecordId), acEntire, False, acSearchAll, , acCurrent
End If

Exit Sub

OpenFormulier:
DoCmd.OpenForm "Vondsten", acNormal
strVondstNummer = Forms("Vondsten").vonstnummer
GoTo GaZoeken
End Sub

Mocht er nog iets anders nodig zijn om het probleem op te lossen dan kan ik eventueel ook de rest van de database uploaden.

De tweede vraag die ik heb gaat over het invoeren van een formulier. Ik wil graag als een bepaalde waarde geselecteerd wordt in een lijst (opzoektabel), in een volgend selectieveld daaraan gekoppelde waarden selecteren. Dus bijvoorbeeld als in de materiaallijst Keramiek geselecteerd wordt, in de lijst daarna de soorten keramiek geselecteerd kunnen worden, en bij Steen, de steensoorten etc. Hoe zou ik dit kunnen doen?

Alvast bedankt!
 
Typfoutje ;)

If Me.vondstnummer <> "" Then
strFilter = "vondstnummer = " & CStr(Me.vonstnummer)
End If
 
Bedankt, die had ik inderdaad gemist, maar hij geeft na correctie nog steeds dezelfde error....
 
Je gebruikt ook een ADO verwijzing; heb je de ADO bibliotheek wel geladen? Oveigens maak ik regelmatig filters, en daar komt zelden (of nooit) een recordset aan te pas. Ik krijg de indruk dat je eerst een filter maakt, en dan pas het formulier opent. Zelf maak ik mijn filters dus op het formulier, en laat ze direct op het formulier werken.
 
Ja de Microsoft ActiveX Data Objects 2.5 Library is geladen, heeft iemand enig idee waarom hij dan dit probleem kan geven?
 
Wat mij wel eens wil helpen is decompileren en/of van de 'on error ...' regels even commentaarregels maken. Als het goed is loopt het programma dan vast in een bepaalde regel.

Jan
 
Hmm hij geeft nu opeens een andere error:
Fout -2146500594 (800f000e) tijdens uitvoering:
Methode Item van object Forms is mislukt

Dit is de code van de knop waar ik het zoekformulier mee open:

Code:
Private Sub Knop49_Click()

'Selecteer eerst het voorgaande actieve invoerveld
Screen.PreviousControl.SetFocus

'Open het zoekformulier
DoCmd.OpenForm "Zoekformulier", acNormal

'Neem de geselecteerde waarde uit het vondstenformulier over in het zoekformulier en verwijder alle andere waarden
With Forms("Zoekformulier")
  .vondstnummer = ""
  .werkput = ""
  .vlak = ""
  .spoornummer = ""
  .categorie = ""

  On Error Resume Next
  '.Controls(Me.ActiveControl.Name) = Me.ActiveControl.Value
  On Error GoTo 0
 .vondstnummer.SetFocus 'verplaatst de focus naar het eerste veld van het formulier
End With
End Sub

Hij blijft hangen op: With Forms("Zoekformulier")
 
Laatst bewerkt:
En gelijk heeft-ie, want dat is niet zoveel...

Code:
Dim frm As Form
Set frm = Me

With frm
     .Vondstnummer=""
etc.
 
Laatst bewerkt:
Hm in mijn vorige database werkte dit wel, hoe moet ik dit dan aanpassen? Met een verwijzing naar het 'Zoekformulier"?
 
Zou je me nog even willen helpen met het oplossen van het probleem want ik begrijp het nog niet. Hoe kan ik het oplossen?

Ik heb nu de zoekknop gewijzigd naar deze code:

Code:
Private Sub Knop49_Click()

'Selecteer eerst het voorgaande actieve invoerveld
Screen.PreviousControl.SetFocus

'Open het zoekformulier
DoCmd.OpenForm "Zoekformulier", acNormal

'Neem de geselecteerde waarde uit het vondstenformulier over in het zoekformulier en verwijder alle andere waarden
'With Form("Zoekformulier")
  Me.vondstnummer = ""
  Me.werkput = ""
  Me.vlak = ""
  Me.spoornummer = ""
  Me.categorie = ""

  On Error Resume Next
  .Controls(Me.ActiveControl.Name) = Me.ActiveControl.Value
  On Error GoTo 0
 Me.vondstnummer.SetFocus 'verplaatst de focus naar het eerste veld van het formulier
'End With
End Sub

maar nu blijft hij hangen op:

.Controls(Me.ActiveControl.Name) = Me.ActiveControl.Value

hij zegt dan: Compileerfout: ongeldige of niet-gekwalificeerde verwijzing?
 
Laatst bewerkt:
Als je het zoekformulier apart wilt openen, kun je beter de zoekwaarde meegeven bij het openen via de OpenArgs variabele. Dus zoiets:

Code:
Private Sub Knop49_Click()
'Selecteer eerst het voorgaande actieve invoerveld
Dim sArgs As Variant
Dim obj As Object
    
    Set obj = Screen.PreviousControl.SetFocus
    sArgs = obj.Value

    'Open het zoekformulier met OpenArgs variabele
    DoCmd.OpenForm "fArtikelen", acNormal, , , , , sArgs

    If Not IsNull(Me.OpenArgs) Then
        Me.vondstnummer.SetFocus
        Me.vondstnummer.Value = sArgs
    End If

End Sub
 
Hmm ik heb die code geprobeerd, alleen nu geeft hij weer een error op:

Set obj = Screen.PreviousControl.SetFocus

Compileerfout: Er wordt een Function of variabele verwacht?

In elk geval alvast heel erg bedankt voor de hulp, want ik ben echt heel slecht met VB :)
 
Laatst bewerkt:
Setfocus moet er af.
 
Ok nu opent hij het zoekformulier zonder foutmelding, alleen als ik een vondstnummer invoer en op zoeken klik in het zoekformulier krijg ik opnieuw een foutmelding. *ik word er inmiddels echt gek van*:
De expressie bij klikken die u hebt opgegeven als instelling voor de gebeurteniseigenschap, heeft de volgende fout veroorzaakt: Er is een fout opgetreden in de communicatie tussen Microsoft Office Access en het OLE-bronprogramma of het ActiveX-besturingselement.
*de expressie geeft niet de naam van een macro, de naam van een door de gebruiker gedefinieerde functie of een [gebeurtenisprocedure] als resultaat.
*er is een fout opgetreden bij het evalueren van een functie, gebeurtenis of macro.???
 
Loop er eens met <F9> doorheen, en kijk of de variabele sArgs goed gevuld wordt. Eventueel kan de regel Me.vondstnummer.SetFocus er uit.
 
Heb ik geprobeerd, zonder resultaat, ook als ik setfocus eruit haal. Pfff ik weet nu echt niet meer wat ik eraan moet doen...
 
Voorbeeldje posten :D
 
Code:
Option Compare Database
Option Explicit

Private Sub Knop12_Click()

Dim strVondstNummer As String 'wordt gebruikt om het huidige vondstnummer uit te lezen
Dim strFilter As String 'een zoekfilter dat over de recordset gegooid kan worden om het juiste record te vinden
Dim rstVondsten As ADODB.Recordset 'een lijst met vondsten
Dim lngRecordId As Long 'het vondstnummer dat de te tonen vondst identificeert

On Error GoTo OpenFormulier
strVondstNummer = Forms("Vondsten").vondstnummer
On Error GoTo 0

GaZoeken:
'Bouw eeen zoekfilter
strFilter = ""
If Me.vondstnummer <> "" Then
  strFilter = "vondstnummer = " & CStr(Me.vondstnummer)
End If
If Me.werkput <> "" Then
  If strFilter = "" Then
    strFilter = "werkput = " & CStr(Me.werkput)
  Else
    strFilter = "(" & strFilter & ") AND (werkput = " & Me.werkput & ")"
  End If
End If
If Me.vlak <> "" Then
  If strFilter = "" Then
    strFilter = "vlak = " & CStr(Me.vlak)
  Else
    strFilter = "(" & strFilter & ") AND (vlak = " & Me.vlak & ")"
  End If
End If

If Me.spoornummer <> "" Then
  If strFilter = "" Then
    strFilter = "spoornummer = " & CStr(Me.spoornummer)
  Else
    strFilter = "(" & strFilter & ") AND (spoornummer = " & Me.spoornummer & ")"
  End If
End If
If Me.categorie <> "" Then
  If strFilter = "" Then
    strFilter = "categorie = " & CStr(Me.categorie)
  Else
    strFilter = "(" & strFilter & ") AND (categorie = " & Me.categorie & ")"
  End If
End If

'Open de database tabel met vondsten
Set rstVondsten = New ADODB.Recordset
rstVondsten.LockType = adLockOptimistic
rstVondsten.Open "Vondsten", CurrentProject.Connection, adOpenStatic
rstVondsten.MoveFirst

'Filter nu de records en zoek het vondstnummer van de vondst die getoond moet worden
lngRecordId = -1
If rstVondsten.RecordCount > 0 Then
  If Me.vondstnummer <> "" Then
    rstVondsten.Filter = strFilter 'maak een subselectie van alle vondsten, om gericht te zoeken naar het toepasselijke vondstnummer
    If rstVondsten.RecordCount > 0 Then
      rstVondsten.MoveFirst
      lngRecordId = rstVondsten.Fields(0)
      If CStr(lngRecordId) = Trim(strVondstNummer) Then
        If MsgBox("Alle vondsten zijn doorzocht. Opnieuw zoeken vanaf het begin?", vbQuestion + vbYesNo, "Altijd maar weer die keuzes...") = vbNo Then
          Exit Sub
        End If
      End If
    End If
  Else
    If strFilter = "" Then 'hou rekening met de huidig geselecteerde vondst
      rstVondsten.Filter = "vondstnummer > " & strVondstNummer
    Else
      rstVondsten.Filter = "(" & strFilter & ") AND (vondstnummer > " & strVondstNummer & ")"
    End If

    If rstVondsten.RecordCount <= 0 Then 'als er geen records zijn vanaf de huidige vondst, begin dan weer met zoeken aan het begin
      If MsgBox("Alle vondsten zijn doorzocht. Opnieuw zoeken vanaf het begin?", vbQuestion + vbYesNo, "Altijd maar weer die keuzes...") = vbYes Then
        rstVondsten.Filter = strFilter
      Else
        Exit Sub
      End If
    End If
    
    If rstVondsten.RecordCount > 0 Then 'als er records gevonden zijn, ga dan naar het eerste record
      rstVondsten.MoveFirst
      lngRecordId = rstVondsten.Fields(0)
    End If
  End If
End If

'Sluit de database weer netjes
rstVondsten.Close

If lngRecordId < 0 Then 'als er geen resultaten konden worden gevonden
  MsgBox "De zoekopdracht heeft geen resultaten opgeleverd.", vbInformation + vbOKOnly, "That is illogical captain."
Else
  DoCmd.OpenForm "Vondsten", acNormal 'nodig om fouten met FindRecord te voorkomen
 ' Forms("Vondsten").vondstnummer.SetFocus
  DoCmd.FindRecord CStr(lngRecordId), acEntire, False, acSearchAll, , acCurrent
End If

Exit Sub

OpenFormulier:
DoCmd.OpenForm "Vondsten", acNormal
strVondstNummer = Forms("Vondsten").vondstnummer
GoTo GaZoeken
End Sub

Alvast bedankt weer!
 
Wat mij opvalt in je code is het volgende: je maakt van alle waarden een string met <CStr> (wat op zich niet hoeft, want elk tekstvak is van zichzelf al een tekstveld...) maar je filters maak je op alsof het om getallen gaat. Ik zou zeggen: één van twee: ofwel je filtert op getallen, ofwel je filtert op tekst.
 
Hmm ik kom er nog steeds niet helemaal uit, maar ik heb momenteel een belangrijker probleem met de database. Alles werkt op zich naar behoren, er is slechts 1 formulier dat niet doet wat ik wil: het formulier geeft de records uit de tabel niet weer. Als de waarden in de tabel invul via het formulier worden ze wel in de tabel gezet, en kan ik er met de pijltjes ook tussendoor navigeren. Echter sluit ik het formulier en heropen ik het, dan krijg ik een leeg formulier. Er zijn dan helemaal geen records te zien, terwijl ze wel degelijk in de tabel staan.

Ik heb nu ontdekt dat de records wel weergegeven worden als er een waarde in het subformulier is ingevuld. Als er niets in het subformulier staat, is de hele record niet te zien. Heeft iemand hier een oplossing voor?

Heel graag hulp, want zonder dit onderdeel is mijn database nutteloos :(
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan