Rapport afdrukken

Status
Niet open voor verdere reacties.

pkuipers

Gebruiker
Lid geworden
8 jul 2014
Berichten
101
Hallo,

ik heb een formulier waarvan de gegevens opgeslagen en uitgeprint moeten worden. Dit werkte tot voor kort goed maar nu print hij een rapport uit met de gegevens van een ander record? Ziet iemand wat er fout gaat?

2016-08-03.pngDit is een voorbeeld van het formulier.

Code:
Private Sub cmdOpslaan_Click()
    Dim stDocName As String, sFilter As String
    Dim iRecord As Integer
    Dim strRecno As String
    Dim db As Database
    Dim rs As Recordset
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("tblOpmerkingen")
    rs.AddNew
    Me.txtKlantnummer.Enabled = True
    rs.Fields("klantnummer") = Me.txtKlantnummer.Value
    rs.Fields("naam") = Me.txtNaam.Value
    rs.Fields("datum") = Me.txtDatum.Value
    rs.Fields("gebit") = Me.kzrGebit.Value
    rs.Fields("gebitschoon") = Me.kzlGebit.Value
    rs.Fields("gebit_opmerking") = Me.txtGebit_opmerking.Value
    rs.Fields("oren") = Me.kzrOren.Value
    rs.Fields("orenschoon") = Me.kzlOren.Value
    rs.Fields("oren_opmerking") = Me.txtOren_opmerking.Value
    rs.Fields("nagels") = Me.kzrNagels.Value
    rs.Fields("nagelsknippen") = Me.kzlNagels.Value
    rs.Fields("nagels_opmerking") = Me.txtNagels_opmerking.Value
    rs.Fields("anaalklieren") = Me.kzrAnaal.Value
    rs.Fields("anaalklieren_opmerking") = Me.txtAnaalklieren_opmerking.Value
    rs.Fields("voetzool") = Me.kzrVoetzool.Value
    rs.Fields("voetzool_opmerking") = Me.txtVoetzool_opmerking.Value
    rs.Fields("gewassen") = Me.kzrGewassen.Value
    rs.Fields("gewassen_opmerking") = Me.txtGewassen_opmerking.Value
    rs.Fields("gefohnd") = Me.kzrGefohnd.Value
    rs.Fields("gefohnd_opmerking") = Me.txtGefohnd_opmerking.Value
    rs.Fields("geborsteld") = Me.kzrGeborsteld.Value
    rs.Fields("geborsteld_opmerking") = Me.txtGeborsteld_opmerking.Value
    rs.Fields("vacht") = Me.kzlVacht.Value
    rs.Fields("vacht_opmerking") = Me.txtVacht_opmerking.Value
    rs.Fields("geknipt") = Me.kzrGeknipt.Value
    rs.Fields("gekniptwat") = Me.kzlGeknipt.Value
    rs.Fields("benenwat") = Me.kzlBenen.Value
    rs.Fields("voetenwat") = Me.kzlVoeten.Value
    rs.Fields("geknipt_opmerking") = Me.txtGeknipt_opmerking.Value
    rs.Fields("geplukt") = Me.kzrGeplukt.Value
    rs.Fields("gepluktwat") = Me.kzlGeplukt.Value
    rs.Fields("geplukt_opmerking") = Me.txtGeplukt_opmerking.Value
    rs.Fields("geschoren") = Me.kzrGeschoren.Value
    rs.Fields("geschoren_opmerking") = Me.txtGeschoren_opmerking.Value
    rs.Fields("parasieten") = Me.kzrParasieten.Value
    rs.Fields("parasietwelke") = Me.kzlParasieten.Value
    rs.Fields("parasieten_opmerking") = Me.txtParasieten_opmerking.Value
    rs.Fields("huid_vacht") = Me.kzlHuid_vacht.Value
    rs.Fields("huid_vacht_opmerking") = Me.txtHuid_vacht_opmerking.Value
    rs.Fields("opmerking") = Me.txtOpmerking.Value
    rs.Fields("gedrag") = Me.txtGedrag.Value
    rs.Fields("kosten") = Me.txtKosten.Value
    If Me.txtAfspraak.Value <> "" Then
        rs.Fields("afspraak") = Me.txtAfspraak.Value
    End If
    rs.Fields("verzorgadvies") = Me.txtVerzorgadvies.Value
    rs.Update
    rs.MoveLast
    
    strRecno = rs.Fields("nummer").Value

    stDocName = Report_rptOpmerkingen.Name

    Call RapportCode("rptOpmerkingen", strRecno)
    DoCmd.OpenReport stDocName, acViewNormal

    Report_rptOpmerkingen.Visible = False
    Form_frmOpmerkingen.Visible = False

End Sub

Sub RapportCode(sRapport As String, sRecord As String)

    DoCmd.OpenReport sRapport, acViewDesign, , , acHidden
    sTabel = Reports(sRapport).RecordSource
    If InStr(1, UCase(sTabel), "WHERE") > 0 Then
        strSql = Left(sTabel, InStr(1, sTabel, "WHERE ") - 1)
    Else
        If InStr(1, UCase(sTabel), "SELECT") = 0 Then
            If InStr(1, sTabel, " ") > 0 And InStr(1, sTabel, "[") = 0 Then
                sTabel = "[" & sTabel & "]"
            End If
            strSql = "SELECT * FROM " & sTabel & " "
        Else
            strSql = sTabel
        End If
    End If

    'Extra loopje, om de punt-komma's te verwijderen.
    Do Until Right(strSql, 1) <> ";"
        strSql = Left(strSql, Len(strSql) - 1)
    Loop

    sFilter = " WHERE ([nummer]=" & sRecord & ");"
    strSql = strSql & sFilter
    Reports(sRapport).RecordSource = strSql
    DoCmd.Close acReport, sRapport, acSaveYes
    DoCmd.Close
    
End Sub

Met vriendelijke groet en alvast dank,

Peter
 
Ik heb het in het andere draadje ook al gezegd, maar ik herhaal het nog een keer: je opzet ziet er heel slecht genormaliseerd uit... Ik zou het zo in ieder geval nooit bouwen als ik zo'n opdracht zou krijgen :). Je bent in ieder geval niet lui, want zelfs met de huidige opzet zit er nog veel te veel code in.

Eerst een stukje van jouw code, dat je heel makkelijk kan vervangen door 2 velden.
Code:
    rs.Fields("oren") = Me.kzrOren.Value
    rs.Fields("orenschoon") = Me.kzlOren.Value
    rs.Fields("oren_opmerking") = Me.txtOren_opmerking.Value
    rs.Fields("nagels") = Me.kzrNagels.Value
    rs.Fields("nagelsknippen") = Me.kzlNagels.Value
    rs.Fields("nagels_opmerking") = Me.txtNagels_opmerking.Value
    rs.Fields("voetzool") = Me.kzrVoetzool.Value
    rs.Fields("voetzool_opmerking") = Me.txtVoetzool_opmerking.Value
    rs.Fields("gewassen") = Me.kzrGewassen.Value
    rs.Fields("gewassen_opmerking") = Me.txtGewassen_opmerking.Value
Wat je ziet is een continue herhaling van (max) 3 velden: waarvan dus altijd één opmerkingen veld en één overbodig veld. Door alles in één formulier te gooien, lijkt het wellicht makkelijker, maar eigenlijk is het een onzinnige insteek, tenzij je altijd alles invult. Dat kan ik uiteraard niet beoordelen. Als een klant alleen voor de oren komt, of alleen voor het gebit, heb je nogal wat overkill in het systeem zitten. Ik zou het dus zo maken:

Code:
    rs.Fields("BehandelID") = Me.txtBehandelID.Value
    rs.Fields("soort") = Me.cboSoort.Value
    rs.Fields("Opmerking") = Me.txtOpmerking.Value

Met een doorlopend formulier maak je voor elk te behandelen aspect een nieuw record aan; heb je 3 aspecten, dan krijg je dus 3 records. De radiobuttons zijn in mijn ogen totaal overbodig; als je een behandeling kiest, dan houdt dat automatisch in dat die behandeling is uitgevoerd. Wat voegt een Ja/Nee veld dan nog toe?

Er zal verder best een goede reden zijn waarom je een niet-gebonden formulier gebruikt, maar ik zie hem nog niet. Wellicht als ik de db zie, dat de reden wél duidelijk is. Maakt op zich niet uit overigens, er is niks mis met niet-gebonden formulieren.

De manier waarop je het rapport opent en filtert, verdient ook al geen schoonheidsprijs. Zelf werk ik tegenwoordig altijd met een rapport met een vaste query, en pas ik met VBA de SQL van die query steeds aan. Het rapport heeft dan altijd de laatste filtering, en werkt daarmee snel en foutloos.

Laatste wat ik absoluut anders zou doen: gebruik een eigen functie voor het nummerveld. Dat kun je volledig controleren, en je weet het nummer al als je een nieuw record maakt. Je hoeft dus geen trucs uit te halen om het nummer alsnog uit de tabel te vissen. Zeker als je met meerdere personen in dezelfde tabel werkt, heb je nu geen flauw idee of het laatste record ook inderdaad het gewenste nummer oplevert; als een collega ondertussen óók een record heeft ingevoerd, is dat een ander nummer als het jouwe.
 
Hallo OctaFish,

wederom bedankt voor je opmerkingen ik heb er hier enkele van gebruikt.
Zoals het zelf toekennen van een nummer. Tijdens deze zag ik ook gelijk de fout welke ik maakte door het automatisch toekennen, namelijk: het gaat fout als je records verwijderd en de automatische nummering doorgaat.

De opmerkingen over de opbouw van de formulieren en rapporten: deze zal ik zeker meenemen, alleen wil mijn dochter het nu houden zoals het is.

Nogmaals bedankt,

Peter
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan