Etiketten drucken

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Manu2.0.

    Etiketten drucken

    Hallo,
    hoffe ich schreibe ins richtige Forum ^^

    Aufbau:
    Ich verwende VB 2010 und als Datenbank Access 2007. Die Verbindung erfolgt per OleDB.

    Problem:
    Ich möchte gerne die Daten von Access auf Etiketten drucken. Es kommen Endlosetiketten zum Einsatz!
    Die Frage dabei ist wie stelle ich das an, die Daten über vb.net zu drucken?

    Ich habe keine Ahnung wie ich das Anstellen könnte, bin von Access nun auf vb.net umgestiegen und habe hierbei nicht mehr die Funktion Bericht um dies zu erledigen. Gibt es in vb.net ähnliche Möglichkeiten dies zu handhaben? Wie weise ich die Daten zu und wie kann ich den Drucker auswählen?

    Hab soweit alles hinbekommen, außer dem Drucken.



    Wenn Informationen fehlen könnt ihr gerne nachfragen.
    Hoffe ihr wisst rat.
    Danke schon für Antworten!


    mfg
    Manu2.0

    Geschlossen, da der User Fragen quer durch mehrere Themen stellt.
    Pro Thema eine Frage !
    Gruss

    mikeb69

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „mikeb69“ () aus folgendem Grund: Geschlossen, da der User Fragen quer durch mehrere Themen stellt. Pro Thema eine Frage !

    danke.

    Aber nach meiner recherche ist crystal report nicht mehr standmässig in vb basic studio 2010 vorhanden! Müsste nachinstalliert werden, aber gibt aktuell nur eine Beta-Version die ich nicht gerne verwenden will. Gibt es eine andere Möglichkeit dies zu realisieren?

    Vielleicht mit den vb hauseigenen funktionen?
    Ok das mit dem Etiketten zeichnen per GDI+ habe ich hinbekommen!

    Nur wie lade ich schnell die Daten aus der Datenbank und lasse diese drucken? Also, wie weise ich die Daten schnell zu? Es handelt sich um ca. 6000 Daten die gedruckt werden sollen. Habt ihr irgendwelche Ideen wie man dies macht? Muss ich dabei eine Schleife verwenden oder gibts da was besseres/schnelleres?

    Hab beim Import/Export gemerkt dass dies per Schleife sehr lange dauert und habs dann mit sql gelöst. Deshalb frag ich.
    Bei der DB handelt es sich, wie oben geschrieben um ACCESS 2007.

    Hier der Code, hab den gefunden und erweitert. Ja ich weis, ich ruf nur einen Datensatz auf, weil ich nicht weis wie ich es für alle machen kann.
    Weis auch nicht, ob man das so machen kann!

    Habs noch nicht mit dem Drucker selber probiert, da ich mit dem gerade nicht testen kann! Mit dem "Microsoft XPS Document Writer" klappt es zumindest.

    Spoiler anzeigen

    Quellcode

    1. Imports System.Drawing.Printing
    2. Public Class Form1
    3. Dim conPfad = My.Settings.Datenbank_Source
    4. Dim conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & conPfad & ";Persist Security Info=False;"
    5. Dim Person As String
    6. Dim Straße As String
    7. Dim PLZ As String
    8. Dim Ort As String
    9. Private Sub Einlesen()
    10. Dim con As New OleDb.OleDbConnection
    11. Dim cmd As New OleDb.OleDbCommand
    12. Dim reader As OleDb.OleDbDataReader
    13. con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & conPfad & ";Persist Security Info=False;"
    14. cmd.Connection = con
    15. cmd.CommandText = "SELECT * FROM tblTest WHERE ID = 1 "
    16. Try
    17. con.Open()
    18. reader = cmd.ExecuteReader()
    19. Do While reader.Read()
    20. Person= reader("Person")
    21. Straße = reader("Straße")
    22. PLZ = reader("PLZ")
    23. Ort = reader("Ort")
    24. Loop
    25. reader.Close()
    26. con.Close()
    27. Catch ex As Exception
    28. MsgBox(ex.Message)
    29. End Try
    30. End Sub
    31. Private Sub Draw(ByVal g As Graphics, ByVal x As Integer, ByVal y As Integer)
    32. Dim c As Color = Color.Black
    33. Dim f As Font = New Font("Arial", 12)
    34. g.DrawRectangle(New Pen(c), x, y, 101, 48)
    35. g.DrawString(Person & vbCrLf & Straße & vbCrLf & PLZ & vbCrLf & Ort, f, New SolidBrush(c), New Point(x + 2, y + 2))
    36. End Sub
    37. Private WithEvents doc As New PrintDocument()
    38. Private Sub Drucker(ByVal sender As Object, ByVal e As PrintPageEventArgs) _
    39. Handles doc.PrintPage
    40. Dim g As Graphics = e.Graphics
    41. g.PageUnit = GraphicsUnit.Millimeter
    42. Me.Draw(g, e.MarginBounds.X * 25.4 \ 100, e.MarginBounds.Y * 25.4 \ 100)
    43. End Sub
    44. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    45. Call Einlesen()
    46. doc.Print()
    47. End Sub
    48. End Class

    Manu2.0 schrieb:

    Ja ich weis, ich ruf nur einen Datensatz auf, weil ich nicht weis wie ich es für alle machen kann.

    Na, wenn du das "WHERE ID=1" wegläßt, nimmt er ja ALLE Datensätze. Und da du eh schon while reader.read machst, würde dein Code auch alle verarbeiten. Musst sie nur irgendwo zwischenspeichern oder gleich dort "drucken"
    da ist mir klar, hatte es wohl noch falsch geschrieben, dass man dies falsch verstanden hat ^^

    nur wie weis ich dem Etikett die Daten zu?
    Weil gerade weise ich nur 1 datensatz zu und ich möchte alle.

    die stelle wo das problem ist, das ich meine:

    Quellcode

    1. g.DrawString(Person & vbCrLf & Straße & vbCrLf & PLZ & vbCrLf & Ort, f, New SolidBrush(c), New Point(x + 2, y + 2))

    Person, Straße, PLZ und Ort sind ja als String deklariert und kann ja nur einen Datensatz annehmen

    Die ruf ich bis jetzt mit dem auf:

    Quellcode

    1. Do While reader.Read()
    2. Person= reader("Person")
    3. Straße = reader("Straße")
    4. PLZ = reader("PLZ")
    5. Ort = reader("Ort")
    6. Loop


    Da kann ich leider nicht alle zuweisen, da ja nur 1 etikett erzeugt ist. Also wie erstelle ich mehrere Etiketten?
    Hoffe ihr versteht was ich meine.
    Kann ich das irgendwie noch einrichten, dass ein Auswahlmenü kommt, wo ich den Drucker, das Papier, usw. einstellen kann?

    Funktioniert ja soweit mal, nur wie bekomm ich das hin, dass für jeden datensatz eine neue Seite genommen wird? Oder wie macht mans, wenn man ein Endlospapier nutzt? Habs versucht mit: e.HasMorePages = True , aber dies führt leider nicht zu gewünschten Ziel, da dieser weitere Seiten anlegt, auch wenn keine Daten dafür da sind und ich es nicht abbrechen kann.
    Super das funktioniert schon mal!

    Nur wie kann ich einen manuellen Seitenumbruch einleiten? Denn es wird immer nur eine Seite gedruckt!
    Wenn ich e.HasMorePages = True verwende endet dies in einer Endlosschleife und kommt nicht zum Ende! Setzte ich nach der Do-Schleife e.HasMorePages = False wird wieder nur eine Seite gedruckt!

    Hat jemand eine Idee?
    Wie gesagt, ich will einen Datensatz auf eine Seite drucken! Die Blattgröße habe ich in den Druckereinstellungen eingestellt, die ich beim Drucken manuell auswähle.
    Das Problem bei dem nachfolgenden Code ist, dass das Drucken in einer Endlosschleife endet (hab 10 Datensätze zum testen verwendet) und ich nicht weis was der Fehler ist. Vielleicht sieht einer was ich falsch mache.

    Spoiler anzeigen

    Quellcode

    1. Dim Person As String
    2. Dim Straße As String
    3. Dim PLZ As String
    4. Dim Ort As String
    5. Private WithEvents doc As New PrintDocument()
    6. Private Sub mnuDrucken_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuDrucken.Click
    7. doc.PrinterSettings = PrintDialog.PrinterSettings
    8. If (PrintDialog.ShowDialog() = DialogResult.OK) Then doc.Print()
    9. End Sub
    10. Private Sub Draw(ByVal g As Graphics, ByVal x As Integer, ByVal y As Integer)
    11. Dim c As Color = Color.Black
    12. Dim f As Font = New Font("Arial", 12)
    13. g.DrawRectangle(New Pen(c), x, y, 101, 48)
    14. g.DrawString(Person & vbCrLf & Straße & vbCrLf & PLZ & vbCrLf & Ort, f, New SolidBrush(c), New Point(x + 2, y + 2))
    15. End Sub
    16. Private Sub Drucker(ByVal sender As Object, ByVal e As PrintPageEventArgs) _
    17. Handles doc.PrintPage
    18. Dim con As New OleDb.OleDbConnection
    19. Dim cmd As New OleDb.OleDbCommand
    20. Dim reader As OleDb.OleDbDataReader
    21. Dim PositionX As Integer = e.MarginBounds.X * 25.4 \ 100 - 25
    22. Dim PositionY As Integer = e.MarginBounds.Y * 25.4 \ 100 - 25
    23. Dim g As Graphics = e.Graphics
    24. g.PageUnit = GraphicsUnit.Millimeter
    25. con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & conPfad & ";Persist Security Info=False;"
    26. cmd.Connection = con
    27. cmd.CommandText = "SELECT * FROM tblTest"
    28. e.HasMorePages = True
    29. Try
    30. con.Open()
    31. reader = cmd.ExecuteReader()
    32. Do While reader.Read()
    33. If IsDBNull(reader("Person")) Then Person = "" Else Person = reader("Person")
    34. If IsDBNull(reader("Straße")) Then Straße = "" Else Straße = reader("Straße")
    35. If IsDBNull(reader("PLZ")) Then PLZ = "" Else PLZ = reader("PLZ")
    36. If IsDBNull(reader("Ort")) Then Ort = "" Else Ort = reader("Ort")
    37. Me.Draw(g, PositionX, PositionY)
    38. 'PositionY = PositionY + 50
    39. Loop
    40. reader.Close()
    41. con.Close()
    42. Catch ex As Exception
    43. MsgBox(ex.Message)
    44. End Try
    45. End Sub