FindFirst in DAO op basis van een criterium uit een andere tabel.

Status
Niet open voor verdere reacties.

patRRick900RR

Gebruiker
Lid geworden
24 jun 2013
Berichten
27
Hallo, ik ben bezig met het schrijven van de code die snel een aantal records aanmaakt in qry_onderhoudsregels, zodat niet elke regel handmatig ingevoerd hoeft te worden.

Voordat ik de records d.m.v. DAO invoer, wil ik eerst controleren of er in de query al records aanwezig zijn die al waarden hebben in de velden [Onderhoudsjaar] en [Locatienaam] gelijk aan die op het formulier Locatiebeheer. Als deze niet voorkomen dan mogen de records ingevoegd worden, als ze wel aanwezig zijn dan komt er de vraag verwijderen en doorgaan, of afbreken.

Echter mijn code voor het controleren op [Locatienaam] geeft de volgende melding: "The microsoft Access Database engine does not recognize 'forms![tbl_locatiebeheer]![Locatienaam] as a valid field or expression. Als ik in VBA op de code ga staan, geeft deze echter wel de juiste locatie aan.

Code:
'Procedure om onderhoudsregels te schrijven naar qry_onderhoudsregels
'Stelt DAO in.
Dim iPFX As DAO.Database
Dim rcdonderhoudsregels As DAO.Recordset
Set iPFX = CurrentDb
Set rcdonderhoudsregels = iPFX.OpenRecordset("qry_onderhoudsregels")
    'Test of er al regels aanwezig zijn voor betreffende jaar & locatie.
    rcdonderhoudsregels.FindFirst "Locatienaam = (Forms![frm_locatiebeheer]![Locatienaam])"
        If not rcdonderhoudsregels.NoMatch Then
        MsgBox ("Er zijn al onderhoudsregels aanwezig voor deze locatie en dit jaar.")
        'Code om sub af te breken of door te gaan dmv antwoordbox.
    End If

        'Schrijft regels naar qry_onderhoudsregels
        rcdonderhoudsregels.AddNew
        rcdonderhoudsregels![Onderhoudsjaar] = "2013"
        rcdonderhoudsregels![Locatienaam] = Forms![frm_locatiebeheer]![Locatienaam]
        rcdonderhoudsregels![Regelnummer] = "10"
        rcdonderhoudsregels![Aantal] = Eenheden
            If Eenheden > 0 Then rcdonderhoudsregels![Artikelnummers] = 10 'Staffel 0 - 5
            If Eenheden > 5 Then rcdonderhoudsregels![Artikelnummers] = 20 'Staffel 6 - 10
            If Eenheden > 10 Then rcdonderhoudsregels![Artikelnummers] = 30 'Staffel 10 - 20
            'rcdonderhoudsregels![Artikelnummers] = "30"
        rcdonderhoudsregels.Update

End Sub

Wie kan me helpen bij de juiste syntax hiervoor? Alvast veel dank!
 
Ik zou het zo doen:
Code:
Dim strSQL As String
Dim rst As DAO.Recordset, rst2 As DAO.Recordset

    strSQL = "SELECT * FROM qry_onderhoudsregels WHERE [Locatienaam] '= " & Me.Locatienaam & "'"
    Set rst = CurrentDb.OpenRecordset(strSQL)
    If rst.RecordCount = 0 Then
        MsgBox "Er zijn al onderhoudsregels aanwezig voor deze locatie en dit jaar."
    Else
        Set rst2 = CurrentDb.OpenRecordset("[Tabel voor het record]")
        With rst2
            .AddNew
            ![Onderhoudsjaar] = "2013"
            ![Locatienaam] = Forms![frm_locatiebeheer]![Locatienaam]
            ![Regelnummer] = "10"
            ![Aantal] = Eenheden
            Select Case Eenheden
                Case 0 To 5
                    ![Artikelnummers] = 10 'Staffel 0 - 5
                Case 5 To 10
                    ![Artikelnummers] = 20 'Staffel 6 - 10
                Case Is > 10
                    ![Artikelnummers] = 30 'Staffel 10 - 20
            End Select
            .Update
            .Close
        End With
    End If
    rst.Close
Belangrijkste reden: waarom eerst een recordset openen, en dan pas gaan kijken of het gewenste record er in zit of niet? Veel beter (en heel wat sneller) is de recordset openen met het juiste record.
 
Hallo Michel, heel erg bedankt!
Inmiddels ben ik er ook achter waarom mijn code niet werkte. Ik heb de code opgesplitst in een verificatiedeel en een 'schrijf deel'. Het verificatiedeel bleek wel te werken. De error kwam na het schrijven van de records naar de tbl.
Ik ga jouw code gebruiken en weer wat geleerd!
Fijn weekend!
 
Hallo Michel, helaas geeft jouw code een error: syntax error missing operator in query expression.......
Als ik debug dan kom ik op de volgende regel.
Set rst = CurrentDb.OpenRecordset(strSQL)
Heb je nog suggesties? Thanks!
 
Heb je de variabele wel gedefinieerd?
 
Hoe bedoel je dat? Ik heb de code overgenomen en de current database gedeclareerd. De code ziet er nu als volgt uit:

Dim iPFX As DAO.Database
Set iPFX = CurrentDb
Dim strSQL As String
Dim rst As DAO.Recordset, rst2 As DAO.Recordset
strSQL = "SELECT * FROM qry_onderhoudsregels WHERE [Locatienaam] '= " & Me.Locatienaam & "'"
Set rst = CurrentDb.OpenRecordset(strSQL)

Hoop dat je me verder kan helpen. Thanks!
 
Je gebruikt je variabele ipFX niet, dan hoef je. 'm ook niet te declareren lijkt mij. Of je gebruikt 'm wel, i.p.v. Currentdb.openrecordset doe je dus ipFX.OpenRecordset.
Al denk ik niet dat daar het probleem ligt. Check eens met een Inputbox of de query wel klopt.
 
Laatst bewerkt:
Gevonden, 1 aanhalingsteken teveel, code loopt nu prima:
strSQL = "SELECT * FROM qry_onderhoudsregels WHERE [Locatienaam] ='" & Me.Locatienaam & "'"
In ieder geval bedankt voor je hulp, leer veel bij het bouwen van deze db!
Fijn weekend, Patrick
 
Ik zie geen verschil met jouw (en mijn) code qua aanhalingstekens. Hooguit een spatie meer of minder. Maar als dat het probleem was: prima natuurlijk :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan