openargs meegeven aan vba recordset

Status
Niet open voor verdere reacties.

JohanRVT

Gebruiker
Lid geworden
2 mrt 2011
Berichten
545
Beste groep,

ik doe een poging om via een recordset een aantal reports, waarvan de benamingen opgenomen in zijn in een tabel te printen (als test staat het op nog acPreview), wat best lukt, maar nu wil ik via de "open args" argumenten van bepaalde rapporten twee exemplaren laten printen en van andere niet. Het eerste exemplaar dacht ik via de open args een titel mee te geven als bv "Exemplaar WZC" en het tweede "Exemplaar familie". De recordset zou moeten in de tabel "Tbl_documenten_benamingen" opzoeken waar het veld "Directprintcontractfamilie" staat aangevinkt en van dat bijbehorend rapport een tweede maken.
Is het überhaupt mogelijk open args argumenten mee te geven via een recordset? Een voorbeeldje maken vraagt anders nogal wat tijd.
NB: Als ik het rapport buiten de recordset om print lukt het wel om de open args mee te geven.

Code:
Private Sub CmbAlleRapporten_Click()
On Error GoTo Err_CmbAlleRapporten_Click
    Dim dbsCurrent As Database
    Dim rs As Object
    Set dbsCurrent = CurrentDb
    Dim Aantal
    Dim voorwaarde
    Dim Cancel As Boolean
    Dim stDocName As String
    Dim stLinkCriteria As String
    Dim strsql As String
    Dim strfamilie As Boolean
    
'check of er een bewoner is geselecteerd:
If (IsNull(Me.TxtBNummer.Value)) Then
    MsgBox "Er is geen bewoner geselecteerd, herbegin", vbOKOnly + vbInformation, "Waarschuwing"
    DoCmd.Close
    Exit Sub
End If

If MsgBox("Wilt U alle aangevinkte Rapporten afdrukken direct naar de printer?" & vbCrLf & _
          "Het systeem kiest zelf indien er een blanco of een ingevuld rapport gestuurd wordt." _
          , vbQuestion + vbYesNo, "Bevestiging gevraagd") = vbYes Then

'check of er minstens 1 rapport is geselecteerd:
If Not IsNull(Me.TxtBNummer.Value) Then voorwaarde = " Tbl_documenten_benamingen.Directprint = -1"
    Aantal = DCount("Directprint", "Tbl_documenten_benamingen", voorwaarde)
        If Aantal = 0 Then
        MsgBox "Er zijn geen selecties van rapporten gemaakt, U moet er minstens één maken " & vbCrLf & _
        "voor U deze functie kunt gebruiken", vbOKOnly + vbCritical, "Waarschuwing"
        Me.Sub_Frm_Directprint_contracten.SetFocus
        Exit Sub
End If
Me.Visible = False
Set rs = dbsCurrent.OpenRecordset("select * from Tbl_documenten_benamingen where Directprintcontract = True And Directprint = True")
If (Not rs.EOF) Then
    rs.MoveFirst
    Do Until rs.EOF = True
    stDocName = rs("Documentnaam")
    strfamilie = rs("Directprintcontractfamilie")
    If strfamilie = True Then
        stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
        DoCmd.OpenReport stDocName, acPreview, , stLinkCriteria, , "Exemplaar familie"
    End If
    stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
    DoCmd.OpenReport stDocName, acPreview, , stLinkCriteria, , "Exemplaar WZC"
    rs.MoveNext
    Loop
Else
    MsgBox "Er zijn geen rapporten.", vbOKOnly + vbCritical, "Waarschuwing"
        Exit Sub
End If

    rs.Close
    Set rs = Nothing
    dbsCurrent.Close

' zet vinkje aan bij de rapportnaam in de Tbl_documenten
    strsql = "UPDATE Tbl_documenten SET Tbl_documenten.Direct_print_contracten_uitgevoerd = True " & vbCrLf & _
             "WHERE Tbl_documenten.BNummer=" & Me!TxtBNummer.Value & " AND Tbl_documenten.Instellingnummer=[Forms]![Frm_Instelling]![Id];"
             DoCmd.RunSQL strsql
    
    MsgBox "Alle aangevinkte rapporten werden correct naar de printer gestuurd.", vbOKOnly + vbInformation, "Bevestigingmelding van afdrukken"

Else
    MsgBox "Printopdracht geannuleerd door de gebruiker.", vbOKOnly + vbInformation, "Annulatie door de gebruiker"
    
    Exit Sub
End If

Exit_CmbAlleRapporten_Click:
    Exit Sub

Err_CmbAlleRapporten_Click:
    MsgBox Err.Description
    Resume Exit_CmbAlleRapporten_Click
End Sub
 
Ik geef regelmatig OpenArgs mee met VBA (is er een andere manier dan?) dus de code zou gewoon moeten werken. Of in ieder geval werkend te krijgen. Ik zou zeggen: loop er in de Stap modus doorheen en kijk wat er gebeurt met je OpenArgs.
 
Code werkend gekregen; ziet er nu als volgt uit met drie keuzemogelijkheden die de gebruiker kan aan/uit vinken in een form met doorlopend subform met de rapportnamen. Tevens kan de printvolgorde van de rapporten aangepast worden in een sorteer kolom. Printer spuwt nu papier dat 't een lieve lust is :)
Code:
Private Sub CmbAlleRapporten_Click()
On Error GoTo Err_CmbAlleRapporten_Click
'Uitvoerende VBA code
    Dim dbsCurrent As Database
    Dim rs As Object
    Set dbsCurrent = CurrentDb
    Dim Aantal
    Dim voorwaarde
    Dim Cancel As Boolean
    Dim stDocName As String
    Dim stLinkCriteria As String
    Dim strsql As String
    Dim strWZC As Boolean
    Dim strfamilie As Boolean
    Dim strapotheek As Boolean
    
'check of er een bewoner is geselecteerd:
If (IsNull(Me.TxtBNummer.Value)) Then
    MsgBox "Er is eerder geen bewoner geselecteerd, herbegin", vbOKOnly + vbInformation, "Waarschuwing"
        DoCmd.Close
            Exit Sub
End If

If MsgBox("Wilt U alle aangevinkte Rapporten afdrukken direct naar de printer?" & vbCrLf & _
          "Het systeem kiest zelf indien er een blanco of een ingevuld rapport gestuurd wordt." _
          , vbQuestion + vbYesNo, "Bevestiging gevraagd") = vbYes Then
Set rs = dbsCurrent.OpenRecordset("select Tbl_documenten_benamingen.* " _
                                              & "FROM Tbl_documenten_benamingen " _
                                              & "WHERE Directprintcontract = True And Directprint = True " _
                                              & "ORDER by Directprintcontractsort asc")
        If (Not rs.EOF) Then
                    rs.MoveFirst
                    Do Until rs.EOF = True
                        stDocName = rs("Documentnaam")
                        strWZC = rs("WZC")
                        strfamilie = rs("Familie")
                        strapotheek = rs("Apotheek")
                        If strWZC = True Then
                            stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
                            DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar WZC"
                            DoCmd.Close acReport, stDocName, acSaveNo
                        End If
                        If strfamilie = True Then
                            stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
                            DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar familie"
                            DoCmd.Close acReport, stDocName, acSaveNo
                        End If
                        If strapotheek = True Then
                            stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
                            DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar Apotheek"
                            DoCmd.Close acReport, stDocName, acSaveNo
                        End If
                    rs.MoveNext
                    Loop
        End If
        
            rs.Close
            Set rs = Nothing
            dbsCurrent.Close
        
        ' zet vinkje aan bij de rapportnaam in de Tbl_documenten
            strsql = "UPDATE Tbl_documenten SET Tbl_documenten.Direct_print_contracten_uitgevoerd = True " & vbCrLf & _
                     "WHERE Tbl_documenten.BNummer=" & Me!TxtBNummer.Value & " AND Tbl_documenten.Instellingnummer=[Forms]![Frm_Instelling]![Id];"
                     DoCmd.RunSQL strsql
            
            MsgBox "Alle aangevinkte rapporten werden correct naar de printer gestuurd.", vbOKOnly + vbInformation, "Bevestigingmelding van afdrukken"

Else
    MsgBox "Printopdracht geannuleerd door de gebruiker.", vbOKOnly + vbInformation, "Annulatie door de gebruiker"
    
    Exit Sub
End If

Exit_CmbAlleRapporten_Click:
     Exit Sub
Err_CmbAlleRapporten_Click:
     Select Case Err.Number
            Case 20 'Resume zonder Error
                    Resume Next
            Case 94 'Ongeldig gebruik van Null
                 MsgBox " Geen criteria, herbegin of vul het nodige veld in", vbCritical + vbOKOnly, "Opgelet!"
                    Resume Next
            Case 3021 ' Geen huidige record
                    Resume Next
            Case 3077  'Geen criteria
                    MsgBox " Geen criteria, herbegin", vbCritical + vbOKOnly, "Opgelet!"
                    Resume Next
            Case 3167  'Record is al verwijderd
                    Resume Next
            Case 9999
                   Resume Next
            Case 999
                   Resume Exit_CmbAlleRapporten_Click
            Case Else
            Call LogError(Err.Number, Err.Description, "CmbAlleRapporten_Click()")
                Resume Exit_CmbAlleRapporten_Click
     End Select
End Sub

En dan in de subform zelf via dubbelklikken kunnen ze één rapport nog 's apart doen zonder dat alles herdaan moet worden
Code:
Option Compare Database
Option Explicit
Private Sub Form_DblClick(Cancel As Integer)
On Error GoTo Err_Form_DblClick
'Uitvoerende VBA code
    Dim stDocName As String
    Dim stLinkCriteria As String
    Dim strWZC As Boolean
    Dim strfamilie As Boolean
    Dim strapotheek As Boolean
    
    If Me.Dirty Then
        Me.Dirty = False
    End If
    stDocName = "" & Me.Documentnaam.Value & ""
    strWZC = "" & Me.WZC.Value & ""
    strfamilie = "" & Me.Familie.Value & ""
    strapotheek = "" & Me.Apotheek.Value & ""
    If strWZC = False And strfamilie = False And strapotheek = False Then
            MsgBox "Niets aangevinkt! " & vbCrLf & _
                   "Dit rapport " & stDocName & " kan niet worden afgedrukt." & vbCrLf & _
                   "Vink minstens één item hiernaast aan!", vbOKOnly + vbCritical, "Opgelet"
                    Exit Sub
    End If

    If strWZC = True Then
        stLinkCriteria = "[BNummer] = " & [TempVars]![PDBNummer]
        DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar WZC"
        DoCmd.Close acReport, stDocName, acSaveNo
    End If
    If strfamilie = True Then
        stLinkCriteria = "[BNummer] = " & [TempVars]![PDBNummer]
        DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar familie"
        DoCmd.Close acReport, stDocName, acSaveNo
    End If
    If strapotheek = True Then
        stLinkCriteria = "[BNummer] = " & [TempVars]![PDBNummer]
        DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar Apotheek"
        DoCmd.Close acReport, stDocName, acSaveNo
    End If

        MsgBox "Dit rapport " & stDocName & " werd correct naar de printer gestuurd.", vbOKOnly + vbInformation, "Bevestigingmelding van afdrukken"

Exit_Form_DblClick:
     Exit Sub
Err_Form_DblClick:
     Select Case Err.Number
            Case 20 'Resume zonder Error
                    Resume Next
            Case 94 'Ongeldig gebruik van Null
                 MsgBox " Geen criteria, herbegin of vul het nodige veld in", vbCritical + vbOKOnly, "Opgelet!"
                    Resume Next
            Case 3021 ' Geen huidige record
                    Resume Next
            Case 3077  'Geen criteria
                    MsgBox " Geen criteria, herbegin", vbCritical + vbOKOnly, "Opgelet!"
                    Resume Next
            Case 3167  'Record is al verwijderd
                    Resume Next
            Case 9999
                   Resume Next
            Case 999
                   Resume Exit_Form_DblClick
            Case Else
            Call LogError(Err.Number, Err.Description, "Form_DblClick()")
                Resume Exit_Form_DblClick
     End Select
End Sub

Nu nog 's kijken om meerdere argumenten mee te geven in die open args omdat er voor de kortverblijven dezelfde contracten worden gebruikt maar met een paar woorden in aangepast.
 
Nu nog 's kijken om meerdere argumenten mee te geven in die open args omdat er voor de kortverblijven dezelfde contracten worden gebruikt maar met een paar woorden in aangepast.
Dat kan heel simpel zolang je maar een vaste structuur gebruikt. Om te beginnen: OpenArgs mag maar één string bevatten. Dus als je meerdere waarden mee wilt geven, moet je die samenvoegen tot 1 string. Dat doe je het beste door er een scheidingsteken tussen te zetten, bijvoorbeeld de pipeline: "1234|'boterham'|12|3,50" voor resp. ArtikelID, ArtikelNaam, Aantal en Prijs. Op het formulier of rapport moet je ze dan weer uit elkaar trekken. Ik gebruik daarvoor Split, maar er zijn ook mensen die Mid gebruiken. Wat je wilt... Mijn code ziet er dan zo uit:
Code:
Dim sArgs As Variant
If Not Me.OpenArgs & "" = "" Then
     sArgs = Split(Me.OpenArgs, "|")
     Me.ArtikelID = sArgs(0)
     Me.ArtikelNaam = sArgs(1)
     Me.Aantal = sArgs(2)
     Me.Prijs = sArgs(3)
End If
Etc.
 
Ik doe 't met je manier, mercikes.
Nu nog de printer telkens instellen op dubbelzijdig of enkelzijdig volgens het document.
Er is op de fora al veel over geschreven om via VBA uw printer in te stellen en dan weer terug naar de default instelling maar heb nog niet de juiste gevonden.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan