ACCESS VBA registratie uren opvragen en weergeven in rapport

Status
Niet open voor verdere reacties.

fde

Gebruiker
Lid geworden
31 aug 2017
Berichten
110
Opzet.
Met het formulier frm_uitvoerder_uurregistratie_oa worden de gepresteerde (werk)uren weggeschreven naar de tabel tbl_uitvoerder_uurregistratie_oa.
ts.JPG
Met de knop opslaan worden de uren affectief weg geschreven in zijn desbetreffende tabel. Deze tabel is genormaliseerd al weet ik niet of de code voor het wegschrijven ingekort of aangepast dient te worden.
Code:
Private Sub cmdOpslaan_Click()
Dim i As Integer, iDag As Integer
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim rs3 As Recordset
Dim rs4 As Recordset
   

    Set rs1 = CurrentDb.OpenRecordset("tbl_uitvoerder_uurregistratie_oa", dbOpenDynaset)
    For i = 1 To 42
        If Not Nz(Me("txtVmV" & i).Value, 0) = 0 Then
            Select Case i
                Case 1 To 6
                    iDag = 1
                Case 7 To 12
                    iDag = 2
                Case 13 To 18
                    iDag = 3
                Case 19 To 24
                    iDag = 4
                Case 25 To 30
                    iDag = 5
                Case 31 To 36
                    iDag = 6
                Case Else
                    iDag = 7
            End Select
            With rs1
                .AddNew
                !ID_UITVOERDER = Me.cboSelecteerUitvoerder.Column(4)
                !ID_WERF = Me.cboSelecteerUitvoerder.Column(5)
                !UITVOERDER_DATUM = Me("txtDatum" & iDag).Value
                !UITVOERDER_UREN_VM_VAN = Me("txtVmV" & i).Value
                !UUR_TYPE = Me("txtVmV" & i).Tag
                !AANGEMAAKT_OP = Date
                !ID_AANGEMAAKT_DOOR = Me.cboMedewAangemaakt.Column(0)
                !AANGEPAST_OP = Date
                !ID_AANGEPAST_DOOR = Me.cboMedewAangepast.Column(0)
                .Update
            End With
        End If
    Next i
    rs1.Close

Set rs2 = CurrentDb.OpenRecordset("tbl_uitvoerder_uurregistratie_oa", dbOpenDynaset)
    For i = 1 To 42
        If Not Nz(Me("txtVmT" & i).Value, 0) = 0 Then
            Select Case i
                Case 1 To 6
                    iDag = 1
                Case 7 To 12
                    iDag = 2
                Case 13 To 18
                    iDag = 3
                Case 19 To 24
                    iDag = 4
                Case 25 To 30
                    iDag = 5
                Case 31 To 36
                    iDag = 6
                Case Else
                    iDag = 7
            End Select
            With rs2
                .AddNew
                !ID_UITVOERDER = Me.cboSelecteerUitvoerder.Column(4)
                !ID_WERF = Me.cboSelecteerUitvoerder.Column(5)
                !UITVOERDER_DATUM = Me("txtDatum" & iDag).Value
                !UITVOERDER_UREN_VM_TOT = Me("txtVmT" & i).Value
                !UUR_TYPE = Me("txtVmT" & i).Tag
                !AANGEMAAKT_OP = Date
                !ID_AANGEMAAKT_DOOR = Me.cboMedewAangemaakt.Column(0)
                !AANGEPAST_OP = Date
                !ID_AANGEPAST_DOOR = Me.cboMedewAangepast.Column(0)
                .Update
            End With
        End If
    Next i
    rs2.Close

Set rs3 = CurrentDb.OpenRecordset("tbl_uitvoerder_uurregistratie_oa", dbOpenDynaset)
    For i = 1 To 42
        If Not Nz(Me("txtNmV" & i).Value, 0) = 0 Then
            Select Case i
                Case 1 To 6
                    iDag = 1
                Case 7 To 12
                    iDag = 2
                Case 13 To 18
                    iDag = 3
                Case 19 To 24
                    iDag = 4
                Case 25 To 30
                    iDag = 5
                Case 31 To 36
                    iDag = 6
                Case Else
                    iDag = 7
            End Select
            With rs3
                .AddNew
                !ID_UITVOERDER = Me.cboSelecteerUitvoerder.Column(4)
                !ID_WERF = Me.cboSelecteerUitvoerder.Column(5)
                !UITVOERDER_DATUM = Me("txtDatum" & iDag).Value
                !UITVOERDER_UREN_NM_VAN = Me("txtNmV" & i).Value
                !UUR_TYPE = Me("txtNmV" & i).Tag
                !AANGEMAAKT_OP = Date
                !ID_AANGEMAAKT_DOOR = Me.cboMedewAangemaakt.Column(0)
                !AANGEPAST_OP = Date
                !ID_AANGEPAST_DOOR = Me.cboMedewAangepast.Column(0)
                .Update
            End With
        End If
    Next i
    rs3.Close

Set rs4 = CurrentDb.OpenRecordset("tbl_uitvoerder_uurregistratie_oa", dbOpenDynaset)
    For i = 1 To 42
        If Not Nz(Me("txtNmT" & i).Value, 0) = 0 Then
            Select Case i
                Case 1 To 6
                    iDag = 1
                Case 7 To 12
                    iDag = 2
                Case 13 To 18
                    iDag = 3
                Case 19 To 24
                    iDag = 4
                Case 25 To 30
                    iDag = 5
                Case 31 To 36
                    iDag = 6
                Case Else
                    iDag = 7
            End Select
            With rs4
                .AddNew
                !ID_UITVOERDER = Me.cboSelecteerUitvoerder.Column(4)
                !ID_WERF = Me.cboSelecteerUitvoerder.Column(5)
                !UITVOERDER_DATUM = Me("txtDatum" & iDag).Value
                !UITVOERDER_UREN_NM_TOT = Me("txtNmT" & i).Value
                !UUR_TYPE = Me("txtNmT" & i).Tag
                !AANGEMAAKT_OP = Date
                !ID_AANGEMAAKT_DOOR = Me.cboMedewAangemaakt.Column(0)
                !AANGEPAST_OP = Date
                !ID_AANGEPAST_DOOR = Me.cboMedewAangepast.Column(0)
                .Update
            End With
        End If
    Next i
    rs4.Close


DoCmd.Close acForm, "frm_uitvoerder_uurregistratie_oa"

End Sub

Mijn vraag:
Met welke vba-code krijg ik de data opgeslagen in de tabel tbl_uitvoerder_uurregistratie_oa terug zichtbaar op de form frm-uitvoerder_uurregistratie_oa?
Hoe krijg ik de de ingegeven data op de frm_uitvoerder_uurregistratie_oa naar m'n rapport rpt_uitvoerder_urenbriefje_oa?
(dit rapport is benodigd ter ondertekening bij de klant om te kunnen factureren).

Als bijlage: zie testcase

Kan iemand me hiermee op weg helpen.
Met dank.
 

Bijlagen

  • test_uurregistratie.zip
    465,6 KB · Weergaven: 29
Ik ben er naar aan het kijken, maar ik snap niet wat je aan het doen bent. Ik zie 4 recordsets voorbijkomen die volgens mij identiek zijn:
Code:
    Set rs1 = CurrentDb.OpenRecordset("tbl_uitvoerder_uurregistratie_oa", dbOpenDynaset)
    Set rs2 = CurrentDb.OpenRecordset("tbl_uitvoerder_uurregistratie_oa", dbOpenDynaset)
    Set rs3 = CurrentDb.OpenRecordset("tbl_uitvoerder_uurregistratie_oa", dbOpenDynaset)
    Set rs4 = CurrentDb.OpenRecordset("tbl_uitvoerder_uurregistratie_oa", dbOpenDynaset)
Vervolgens voer je, tenzij ik scheel kijk, 4 keer dezelfde routine uit. Om te beginnen kun je dan gewoon dezelfde recordset gebruiken (rs1), maar wat is het nut hiervan?
Daarnaast kun je records opslaan zonder eerst een uitvoerder te selecteren. Dat zou ik zeker afvangen.

Wat betreft je vragen: je formulier is niet-afhankelijk, dus je ziet altijd een leeg formulier. Wil je een bestaand record kunnen zien, dan moet je die gegevens dus inlezen als recordbron. En dat kan dan alleen als je, al dan niet via VBA, de recordbron onder het formulier hangt. Omdat de tekstvelden óók niet gebonden zijn, moet je de records (week per uitvoerder neem ik aan) op omgekeerde manier toewijzen aan de tekstvelden.

Voor je rapport geldt ongeveer hetzelfde, omdat je daar ook de velden moet vullen op basis van dezelfde techniek. Ik vind het een nogal omslachtige manier trouwens, zeker voor het rapport. Omdat je tabel redelijk genormaliseerd is, kun je op basis van een selectie prima een nette lijst opmaken. Dat ziet er dan niet uit als een draaitabel, maar wat maakt dat uit? Je hoeft er niks voor te doen, anders dan het rapport koppelen aan de tabel en de velden en het rapport netjes opmaken.
 
Wat je sowieso fout doet (vandaar denk ik de 4 recordsets) is dat je voor elke tijd een apart record maakt. Dat moet natuurlijk niet; voor elke dag leg je 4 tijdsblokken vast in 4 velden in je tabel. Dat moet dan gewoon één record zijn. Door de code te combineren, gaat dat prima. Daarnaast kan het bepalen van de dag ook simpeler.
Code:
    iDag = 0
    Set rs = CurrentDb.OpenRecordset("tbl_uitvoerder_uurregistratie_oa", dbOpenDynaset)
    For i = 1 To 42
        iDag = iDag + IIf(i Mod 6 = 1, 1, 0)
            With rs
                .AddNew
                !ID_UITVOERDER = Me.cboSelecteerUitvoerder.Column(4)
                !ID_WERF = Me.cboSelecteerUitvoerder.Column(5)
                !UITVOERDER_DATUM = Me("txtDatum" & iDag).Value
                !UITVOERDER_UREN_VM_VAN = Me("txtVmV" & i).Value
                !UITVOERDER_UREN_VM_TOT = Me("txtVmT" & i).Value
                !UITVOERDER_UREN_NM_VAN = Me("txtNmV" & i).Value
                !UITVOERDER_UREN_NM_TOT = Me("txtNmT" & i).Value
                !UUR_TYPE = Me("txtVmV" & i).Tag
                !AANGEMAAKT_OP = Date
                !ID_AANGEMAAKT_DOOR = Me.cboMedewAangemaakt.Column(0)
                !AANGEPAST_OP = Date
                !ID_AANGEPAST_DOOR = Me.cboMedewAangepast.Column(0)
                .Update
            End With
        End If
    Next i
    rs.Close
 
Met deze aangepaste code krijg ik 42 lege records. Althans de uurwaarden werden niet me opgenomen naar de tabel_uitvoerder-uurregistratie_oa.
Dus blijkbaar iets niet correct in de code.



Wat je sowieso fout doet (vandaar denk ik de 4 recordsets) is dat je voor elke tijd een apart record maakt. Dat moet natuurlijk niet; voor elke dag leg je 4 tijdsblokken vast in 4 velden in je tabel. Dat moet dan gewoon één record zijn. Door de code te combineren, gaat dat prima. Daarnaast kan het bepalen van de dag ook simpeler.
Vervolgens voer je, tenzij ik scheel kijk, 4 keer dezelfde routine uit. Om te beginnen kun je dan gewoon dezelfde recordset gebruiken (rs1), maar wat is het nut hiervan?
Dat is 100% correct wat je zei. Maar ik wist ook niet beter. Daarom dat ik vroeg om deze code te verbeteren.


Daarnaast kun je records opslaan zonder eerst een uitvoerder te selecteren. Dat zou ik zeker afvangen.
Dat wordt gedaan doch dit stukje code dat bovenin de knop opslaan stond/staat had ik even verwijderd om het overzichtelijker te houden.
Code:
If IsNull(Me!txtUitvoerderNaam) Then
MsgBox "Opgelet! De uitvoerder en werf zijn niet geselecteerd.", vbOKCancel, "Selecteer de juiste uitvoerder/werf"
Else ........ End If
 
Laatst bewerkt:
Ik heb nog geen tijd gehad om de code te testen, maar ik kijk er dit weekend wel even naar. Tenzij je het zelf al hebt opgelost :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan