Huidig record via formulier in rapport afdrukken

Status
Niet open voor verdere reacties.

Chantie83

Nieuwe gebruiker
Lid geworden
6 mrt 2010
Berichten
4
Goedenavond,

Net nieuw op het forum; heb al diverse vraagstukken bekeken, maar nog geen antwoord voor mijn probleem kunnen vinden. In de hoop dat iemand mij kan helpen;

Ik heb in mijn database een query aangemaakt, waarop gefilterd wordt. Via deze query heb ik mijn formulier gemaakt; bij het openen van het formulier wordt de vraag gesteld om deze filter uit te voeren. Vervolgens wordt het betreffende rapport geopend, maar als ik nu alleen het huidige record (van het formulier) wil afdrukken worden toch alle records afgedrukt.

Kan ik dit oplossen met een macro, of ontkom ik er niet aan om in VBA te duiken (weet daar dus echt helemaal niets vanaf :( )

Alvast bedankt als iemand me kan helpen!

~Chantie83~
 
Je ontkomt er waarschijnlijk niet aan om de code waarmee je het rapport opent aan te passen. Afdrukken heeft namelijk de gewoonte om niet naar het ingestelde filter te kijken, met als gevolg dat je alle records afdrukt. Ik gebruik zelf daarom onderstaande routine als ik één record wil afdrukken:

Code:
Sub RapportCode(sRapport As String, sRecord As String) Dim tmp

    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 ([B][COLOR="Blue"][RecordID][/COLOR][/B]=" & sRecord & ");"
    strSQL = strSQL & sFilter
    Reports(sRapport).RecordSource = strSQL
    DoCmd.Close acReport, sRapport, acSaveYes

End Sub

Deze routine roep je aan met een knop op je formulier, waar je eerst als variabele de rapportnaam ingeeft, en als tweede het RecordID van het formulierrecord.
Dus bijvoorbeeld:

Private Sub cmdRapport_Click()
Call RapportCode("MijnRapport",Me.RecordID)

Hiermee geef je de variabelen door aan de routine hierboven, die vervolgens de query van het rapport aanpast. Daarvoor wordt het rapport in Hidden Designview geopend, de bron van het rapport aangepast, en het rapport gesloten.
In de regel onder Call staat dan de normale afdrukopdracht die je al had.

Ik kan me voorstellen dat het ingewikkeld overkomt, dus als je er hulp bij nodig hebt, dan is een voorbeeldbestandje wel handig, dan maken we het gelijk goed in orde. Als ik zelf een voorbeeld maak, moet je alsnog alles zelf overzetten...
 
Oei dat ziet er inderdaad ingewikkeld uit. Ik heb nu het volgende in de editor staan:

Function Macro11()
On Error GoTo Macro11_Err

DoCmd.OpenQuery "Ovenchargelijst selectie", acViewNormal, acEdit
DoCmd.RunCommand acCmdFilterBySelection
DoCmd.OpenReport "Transportbon", acViewReport, "", "", acNormal
DoCmd.RunCommand acCmdPrint


Macro11_Exit:
Exit Function

Macro11_Err:
MsgBox Error$
Resume Macro11_Exit

End Function

Private Sub Knop133_Click()
Sub RapportCode(sRapport As String, sRecord As String) Dim tmp
Private Sub cmdRapport_Click()
Call RapportCode("Transportbon", Me.RecordID)

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 ([RecordID]=" & sRecord & ");"
strSQL = strSQL & sFilter
Reports(sRapport).RecordSource = strSQL
DoCmd.Close acReport, sRapport, acSaveYes

End Sub

Door de query wordt reeds een filter gevraagd, maar dien ik dat dan nog aan te passen in de editor qua bestandsnamen?

Haha, echt erg... snap van dat VBA echt niets :evil:
 
Dan is het hele proces behoorlijk ingewikkeld.... Snap ik!
Wat je gedaan hebt, is een procedure plakken in een andere procedure. Dat geeft, als je hem zou uitvoeren, allerlei foutmeldingen.
Het deel onder de Macrofunctie zou er zou uit moeten zien:


Code:
Private Sub Knop133_Click()

Call RapportCode("Transportbon", Me.RecordID)

End Sub

Sub RapportCode(sRapport As String, sRecord As String)
Dim tmp

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 ([RecordID]=" & sRecord & ");"
strSQL = strSQL & sFilter
Reports(sRapport).RecordSource = strSQL
DoCmd.Close acReport, sRapport, acSaveYes

End Sub

Mijn voorbeeldje maakte gebruik van een knop die bij jou (uiteraard) anders heet. Vandaar dat de code er zomaar tussen plakken niet zomaar kan.
Ik zie dat je de naam van het rapport hebt veranderd, wat uiteraard prima is. Alleen de tweede variabele zou je denk ik nog moeten aanpassen, want die heb ik ook maar een willekeurige naam gegeven. Daar moet je het veld voor nemen dat je zelf gebruikt als Sleutelveld op het formulier. Meestal is dat een veld dat je ....ID hebt genoemd, of als je het Access laat doen, dan het het veld ID.
De query die je nu gebruikt als basis voor het rapport, en dat dus een filter vraagt, zou je eigenlijk moeten aanpassen. De filtering gebeurt nu namelijk op het formulier, en niet meer in de query. Je wilt uiteraard niet dat er een onnodige handeling in de procedure blijft zitten.
 
Re:

Thanks voor de uitleg!! :thumb:

Ik ga dit de query aanpassen en de VBA code aanpassen. Daarna eerst maar eens verdiepen in VBA :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan