Record aanmaken met velden uit hoofd en subform d.m.v. DAO

Status
Niet open voor verdere reacties.

patRRick900RR

Gebruiker
Lid geworden
24 jun 2013
Berichten
27
Hallo, ik heb toch weer even hulp nodig bij de laatste loodjes van mijn db.

Ik heb een formulier [frm_locatiebeheer] met daarop een subform [tbl_onderhoudscycli subform]. Het subform is gebaseerd op [tbl_onderhoudscycli].
Van het formulier gebruik ik de velden [Locatienaam] en [Onderhoudsjaar].

De bedoeling is dat op het moment dat ik via een inputbox een jaartal ingeef, de code eerst controleert of dat onderhoudsjaar aanwezig is voor de betreffende onderhoudslocatie. Zo niet dan wordt deze aangemaakt.
In de tabel [tbl_onderhoudscycli] wordt deze aangemaakt en met een autonummer wordt tevens het veld [ROLnummer] aangemaakt. Het ROL nummer is de unieke code voor een locatie en onderhoudsjaar. Eerst was dit een gecombineerde sleutel, echter om referentiële integriteit af te dwingen heb ik ROLnummer ingevoerd.

Als het onderhoudsjaar is aangemaakt in het subform [tbl_onderhoudscycli subform], worden de onderhoudsregels geschreven naar de [qry_onderhoudsregels].

In de query wordt het veld [Onderhoudsjaar] gelijksgesteld aan de waarde van de inputbox, het veld [Locatienaam] = komt van het hoofdformulier. Tot zover werkt het.

Het veld [ROLnummer] moet komen van het subformulier [tbl_onderhoudscycli subform], echter dat krijg ik niet voor elkaar. Ook als ik test d.m.v. een messagebox krijg ik foutmeldingen. Varierent van oneigenlijk gebruik van NULL, microsoft can't find the referenced form.....

Hieronder staat mijn code. Wie oh wie heeft er suggesties?

Code:
'Maakt onderhoudsjaar aan in locatiedetails, na gecontroleerd te hebben of dit jaar reeds bestaat.
Dim iPFX As DAO.Database
Set iPFX = CurrentDb
Dim strSQL As String
Dim strSQL2 As String
Dim intOnderhoudsjaar As Long
Dim rst As DAO.Recordset, rst2 As DAO.Recordset, rst3 As DAO.Recordset
intOnderhoudsjaar = InputBox("Van welk jaar wilt u het onderhoud invoeren?")

strSQL2 = "SELECT * FROM tbl_onderhoudscycli WHERE [Locatienaam] ='" & Me.Locatienaam & "' And [Onderhoudsjaar] = " & intOnderhoudsjaar & ""
Set rst3 = iPFX.OpenRecordset(strSQL2)
    If rst3.RecordCount = 0 Then
    MsgBox ("invullen rst3")
            With rst3
            .AddNew
            ![Locatienaam] = Forms![frm_Locatiebeheer]![Locatienaam]
            ![Onderhoudsjaar] = intOnderhoudsjaar
            .Update
            .Close
            End With
    Else
            MsgBox "Onderhoudsjaar reeds aanwezig voor deze locatie.", vbInformation, "Invoer Onderhoudsjaar."
    End If
    


'Schrijft onderhoudsregels voor betreffende onderhoudsjaar & locatie
strSQL = "SELECT * FROM qry_onderhoudsregels WHERE [Locatienaam] ='" & Me.Locatienaam & "' And [Onderhoudsjaar] = " & intOnderhoudsjaar & ""
Set rst = iPFX.OpenRecordset(strSQL, dbOpenDynaset)
    If rst.RecordCount > 0 Then
        MsgBox "Er zijn al onderhoudsregels aanwezig voor deze locatie en dit jaar."
    Else
        Set rst2 = iPFX.OpenRecordset("qry_onderhoudsregels")
        With rst2
            .AddNew
            ![Onderhoudsjaar] = intOnderhoudsjaar
            ![Locatienaam] = Forms![frm_Locatiebeheer]![Locatienaam]
            ![ROLnummer] = Forms![frm_Locatiebeheer]![tbl_onderhoudscycli subform].Form![ROLnummer]
            ![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
        MsgBox ("aan het eind van rst2 aangekomen")
                     
End If
          
DoCmd.Requery (qry_onderhoudsdetails)
rst.Close


End Sub

Alvast hartelijk dank! Patrick
 
Ik snap niet helemaal waarom je met een niet-gecontroleerde inputbox werkt.
Code:
intOnderhoudsjaar = InputBox("Van welk jaar wilt u het onderhoud invoeren?")
Zelf zou ik in ieder geval een keuzelijst met invoervak op het formulier zetten die de beschikbare jaartallen uit de juiste tabel haalt. Op die manier voorkom je dat er ongewenste data gekozen kan worden. Voor nieuwe jaartallen gebruik je dan de gebeurtenis <Bij niet in lijst> om het nieuwe jaar toe te voegen. Zowiezo doe je dat dan pas als de input eerst gecontroleerd is, lijkt mij. In jouw geval kun je 'dr3354' intypen in de inputbox, en gaat je check [Onderhoudsjaar] = " & intOnderhoudsjaar uiteraard de teil in. En wordt vervolgens geprobeerd om 'dr3354' toe te voegen... Ik zou niet zo afhankelijk willen zijn van de bereidwilligheid van de gebruiker om niet iets anders in te vullen als een correct jaartal.
Maar buiten dat: ik zie nergens dat je het subformulier ververst bij een nieuw ROLnummer. Dus je subformulier herkent dat nummer nooit.
Overigens is je Recordset procedure ook een beetje omslachtig:
Code:
            ![Locatienaam] = Me![Locatienaam]
            ![ROLnummer] = Me![tbl_onderhoudscycli subform].Form!ROLnummer
 
Hallo Michel, bedankt weer! Heb de volgende code toegevoegd: me![tbl_onderhoudscycli subform].Requery
Daarna werkt het inderdaad wel. Ga nu aan de slag met de keuzelijst t.b.v. jaartal, want het kan inderdaad in de soep lopen op deze wijze.
Nogmaals dank. Gr. Patrick
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan