Stapeldruck, auch mit mehreren Seiten

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Westerwälder.

    Stapeldruck, auch mit mehreren Seiten

    Hallo,

    bin gerade am überlegen wie ich folgendes umsetzen kann.

    In der Nacht wird eine Datentabelle gefüllt, in der die aktuellen offenen Posten (unbezahlte Rechnungen) stehen.
    Am Morgen soll dann für diese Datensätze eine Mahnung gedruckt werden.

    Mein Problem ist nun gerade das umsetzen des Ausdrucks:

    Ich hab mehrere Kunden (je Kunde eine Mahnung) und evtl. je Kunde auch mehrere Seiten.

    Mit e.HasMorePages kann ich zwar das steuern, dass mehrere Seiten ausgedruckt werden, aber e.HasMorePages ist ja in diesem Fall dafür da, dass wenn je Kunde mehrere Seiten gedruckt werden sollen.

    Wie bringe ich das PrintDocument1.Print() Ereignis dazu, sich für jeden Datensatz (je Kunde) auszulösen.

    Ein Versuch war es mal so:

    VB.NET-Quellcode

    1. If PrintPreviewDialog1.ShowDialog() = DialogResult.OK Then
    2. For i As Integer = 0 To Page
    3. PrintDocument1.Print()
    4. Next
    5. End If
    6. ...
    7. Private _DS As Integer = -1
    8. Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    9. _DS += 1
    10. ...
    11. Dim _m As OrgafirmDataSet.mandantRow
    12. ' Firma1
    13. _m = OrgafirmDataSet.mandant.FindBykun_id( _
    14. Me.OrgafirmDataSet.DT_DruckenMahnungen.Rows(_DS).Item("op_mid"))
    15. g.DrawString(_m.kun_firma1, FA10n, Brushes.Black, RL, AnfangsZeile)
    16. AnfangsZeile = AnfangsZeile + Zeilenhoehe


    Ich weis das ich da n Denkfehler drinnen habe, aber irgendwie komme ich da gerade nicht weiter ...

    Eine Mahnung wird erstellt, aber immer nur 1 Seite - 1 Kunde, nämlich der erste Datensatz nur.
    Keine weiteren Seiten werden erstellt.

    michl75 schrieb:

    Wie bringe ich das PrintDocument1.Print() Ereignis dazu, sich für jeden Datensatz (je Kunde) auszulösen.
    So:

    VB.NET-Quellcode

    1. Private myName As String
    2. Private aktPage As Integer
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim liste() = {"Müller", "Meier", "Lehmann"}
    5. For Each aktName In liste
    6. myName = aktName
    7. aktPage = 1
    8. Me.PrintDocument1.DocumentName = aktName & ".pdf"
    9. Me.PrintDocument1.Print()
    10. Next
    11. End Sub
    12. Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    13. If aktPage = 1 Then
    14. e.Graphics.DrawString(Me.myName, New Font("Arial", 20), Brushes.Black, New Point(30, 30))
    15. e.HasMorePages = True
    16. Else
    17. e.Graphics.DrawString("hat noch nicht bezahlt", New Font("Arial", 20), Brushes.Black, New Point(30, 30))
    18. e.HasMorePages = False
    19. End If
    20. aktPage += 1
    21. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe dazu auch eine Frage: Mein Code löst keinen Seitenvorschub aus:

    VB.NET-Quellcode

    1. Private Sub PrintDocument_Ausdruck_PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument_Ausdruck.PrintPage
    2. e.Graphics.PageUnit = GraphicsUnit.Millimeter
    3. ' Test für Zahlendruck: rechtsbündig
    4. ' 44 Zeilen sollen pro Seite gedruckt werden
    5. Dim font As New Font("Courier", 14)
    6. Dim sf As New StringFormat() With {.Alignment = StringAlignment.Far}
    7. Dim Zeilenschritt As Integer = 10
    8. Dim Rpos As Integer = 150
    9. Dim Wert As Double = 10
    10. Dim Zaehler As Integer = 0
    11. Dim morePage As Boolean = False
    12. For i As Integer = 0 To 120
    13. Zeilenschritt += 10
    14. Zaehler += 1
    15. If Zaehler = 43 Then
    16. morePage = True
    17. Zaehler = 0
    18. Else
    19. morePage = False
    20. End If
    21. Wert = (Wert * 1.5454)
    22. e.Graphics.DrawString(Wert.ToString("N2"), font, Brushes.Black, Rpos, Zeilenschritt, sf)
    23. e.HasMorePages = morePage
    24. Next
    25. End Sub
    Gruß Markus

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Westerwälder“ ()

    Westerwälder schrieb:

    VB.NET-Quellcode

    1. If Zaehler = 43 Then
    2. morePage = True
    3. Zaehler = 0
    4. Else
    5. morePage = False
    6. End If
    Tausch da mal True und False
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann setz da einen Haltepunkt rein und überzeuge Dich, dass Dein Code das macht, was er soll.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Irgendwas läuft hier daneben:
    Mit diesem Code

    VB.NET-Quellcode

    1. Private Sub PrintDocument_Ausdruck_PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument_Ausdruck.PrintPage
    2. e.Graphics.PageUnit = GraphicsUnit.Millimeter
    3. ' Test für Zahlendruck: rechtsbündig
    4. Dim font As New Font("Courier", 10)
    5. Dim sf As New StringFormat() With {.Alignment = StringAlignment.Far}
    6. Dim Zeilenschritt As Integer = 10
    7. Dim Rpos As Integer = 150
    8. Dim Wert As Double = 10
    9. Dim Zaehler As Integer = 0
    10. Dim morePage As Boolean = False
    11. For i As Integer = 0 To 50
    12. Zeilenschritt += 10
    13. Zaehler += 1
    14. If Zaehler = 23 Then
    15. Zaehler = 0
    16. morePage = True
    17. Else
    18. morePage = False
    19. End If
    20. Wert = (Wert * 1.5454)
    21. e.Graphics.DrawString(i.ToString, font, Brushes.Black, 5, Zeilenschritt)
    22. e.Graphics.DrawString(e.HasMorePages.ToString, font, Brushes.Black, 25, Zeilenschritt)
    23. e.Graphics.DrawString(Zaehler.ToString, font, Brushes.Black, 65, Zeilenschritt)
    24. e.Graphics.DrawString(Wert.ToString("N2"), font, Brushes.Black, Rpos, Zeilenschritt, sf)
    25. e.HasMorePages = morePage
    26. Next
    27. End Sub


    erhalte ich folgendes Ergebnis:
    Bilder
    • Ausgabe.jpg

      115,78 kB, 1.600×900, 87 mal angesehen
    Gruß Markus
    @Westerwälder:: Ich glaube, Du hast die Philosophie noch nicht verstanden.
    Pro Aufruf von PrintPage wird genau eine Seite gedruckt. So musst Du Deinen Code einrichten.
    Wenn das Blatt voll ist, musst Du Dir die Dokument-Position merken und e.HasMorePages auf True setzen und beim nächsten Aufruf an der gemerkten Position weitermachen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So, habe mir nun was gebastelt, funktioniert auch, aber mache ich das nun vom Prinzip her auch richtig?

    VB.NET-Quellcode

    1. Private Sub Druckdokument_PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles Druckdokument.PrintPage
    2. Me.DruckPos_Zeile = (Me.DruckPos_ErsteZeile - Me.DruckPos_Zeilenschritt)
    3. Me.Seitenzahl += 1
    4. For I As Integer = 0 To Me.Auftrag.Count - 1
    5. With Me.Auftrag(I)
    6. Me.DruckPos_Zeile = Me.Zeilenschaltung
    7. e.Graphics.DrawString(.DText, Me.SchriftArt, .DSchriftFarbe, .DPosLinks, Me.DruckPos_Zeile, Me.FormatZeile)
    8. If I = Me.Auftrag.Count - 1 Then ' Vermeiden von Leerblätter
    9. e.HasMorePages = False
    10. Exit Sub
    11. End If
    12. If Me.Auftrag(I).DFolgeSeite = True Then
    13. Me.Auftrag.RemoveAt(I)
    14. I -= 1
    15. e.HasMorePages = True
    16. Exit Sub
    17. Else
    18. Me.Auftrag.RemoveAt(I)
    19. I -= 1
    20. e.HasMorePages = False
    21. End If
    22. End With
    23. Next
    24. End Sub
    Gruß Markus