Problemstellung:
Wenn man Etiketten drucken will steht man oft vor einigen Problemen.
1. Man möchte nur ein paar Etiketten drucken und beim nächsten Druck braucht man wieder
ein neues Blatt weil freie Etiketten z.B. erst ab 7. Postition vorhanden sind.
2. Man möchte von einer gleichen Adresse mehrere Etiketten drucken.
Für diese beiden Probleme möchte ich hier eine Lösung vorstellen.
Voraussetzungen:
Das Bsp ist ab A2002 lauffähig. (Download enthält eine mdb-Datei für A2002/A2003 und eine accdb ab A2007)
Lösung:
Als Bsp. habe ich die Kundentabelle aus der "Nordwind-DB" von MS genommen.
Die Download DB kann aber nach eigenem Ermessen angepasst werden.
Die Datenbank benötigt für die Lösung eine zusätzliche Tabelle (hier im Bsp. "tbl_KundenTmp").
Diese kann sich auch in einer anderen DB befinden und als Verknüpfung eingebunden werden.
Wichtig ist nur das diese Tabelle die gleichen Felder enthält die in der Adresstabelle vorhanden sind
bzw. für den Etikettendruck benötigt werden.
Achtung: die Felder in der "tbl_KundenTmp" dürfen nicht indiziert sein und müssen leere Zeichenfolgen zulassen.
Um das Bsp. in Eurer DB zu verwenden müsst Ihr als erstes einen Etikettenbericht mit Euren Etikettenmaßen erstellen.
In meinem Bsp. ist das Etikett mit einem Rechteck mit Rahmen hinterlegt. Dieser dient nur zu Layoutzwecken für dieses Bsp. und ist nicht erforderlich.
Kommen wir nun zum 1. Teil in dem wir den Etikettendruck an einer bestimmten Position beginnen lassen wollen.
Im Formular sehen wir die Adressliste in einem Endlosform.
Links befindet sich eine Checkbox mit der man die zu druckenden Datensätze markieren kann (gelb).
Um alle Datensätze aus- bzw. abzuwählen kann man die beiden Buttons oben benutzen (grün).
Soll der Druck an der 1. Position beginnen kann jetzt einfach der Button "Drucken" geklickt werden.
Wurde kein Datensatz markiert kommt ein Warnhinweis und der Vorgang wird abgebrochen
Jetzt kann in dem Kombifeld die Startposition des ersten zu druckenden Etiketts festgelegt werden (orange).
Hier ein Bsp: es wurden 4 Adressen markiert und der Druck soll ab der Position 4 beginnen.
Ergebnis der Druckvorschau:
Der Code ist nicht kompliziert:
Private Sub cmd_Print2_Click() Dim iMark As Integer, i As Integer, j As Integer, k As Integer Dim rs As DAO.Recordset, rsIn As DAO.Recordset, rsOut As DAO.Recordset 'Temp Tabelle leeren CurrentDb.Execute "DELETE tbl_KundenTmp.* FROM tbl_KundenTmp;" 'Prüfen ob min. ein Datensatz ausgewählt wurde iMark = fcDomWert("Firma", "tbl_Kunden", "[Print]=-1", ltDCount) 'Wenn kein Datensatz ausgewält wurde ist hier Schluss If iMark = 0 Then MsgBox "Keinen Datensatz gewählt!", vbCritical + vbOKOnly, "Fehler" Exit Sub End If 'Ist Startpostion=1 dann wird der normale Etikettenbericht angezeigt If Me.cbo_Start1 = 1 Then 'Anzahl der zu druckenden Etiketten erzeugen Set rsIn = CurrentDb.OpenRecordset("qry_Adressen") Set rsOut = CurrentDb.OpenRecordset("tbl_KundenTmp") Do While Not rsIn.EOF 'Anzahl der gewählten Datensätze durchlaufen For j = 1 To Me.cbo_Anzahl rsOut.AddNew 'Inhalt der Adressfelder in Temp Tabelle schreiben For k = 0 To 6 rsOut.Fields(k) = rsIn.Fields(k) Next k rsOut.Update Next j rsIn.MoveNext Loop rsIn.Close rsOut.Close DoCmd.OpenReport "rpt_Etikett_Start2", acViewPreview Else 'Anzahl der Dummy Datensätze erzeugen für Startpostion Set rs = CurrentDb.OpenRecordset("tbl_KundenTmp") For i = 1 To Me.cbo_Start1 - 1 rs.AddNew rs!Print = -1 rs.Update Next i rs.Close 'Anzahl der zu druckenden Etiketten erzeugen Set rsIn = CurrentDb.OpenRecordset("qry_Adressen") Set rsOut = CurrentDb.OpenRecordset("tbl_KundenTmp") Do While Not rsIn.EOF 'Anzahl der gewählten Datensätze durchlaufen For j = 1 To Me.cbo_Anzahl rsOut.AddNew 'Inhalt der Adressfelder in Temp Tabelle schreiben For k = 0 To 6 rsOut.Fields(k) = rsIn.Fields(k) Next k rsOut.Update Next j rsIn.MoveNext Loop rsIn.Close rsOut.Close DoCmd.OpenReport "rpt_Etikett_Start2", acViewPreview End If End Sub
Zuerst wird die Tabelle mit den temporären Datensätzen geleert. Dann wird geprüft ob min. ein Datensatz markiert wurde.
Ist die Startposition=1 dann wird der Bericht normal geöffnet ansonsten wird ein Anzahl (Startpostition -1) Dummy Datensätzen erstellt.
Diese Daten werden dann in Unionabfrage "qry_Output" aus der Adress- und Temptabelle zusammen gefügt
SELECT tbl_KundenTmp.Firma, tbl_KundenTmp.Kontaktperson, tbl_KundenTmp.Strasse, tbl_KundenTmp.PLZ, tbl_KundenTmp.Ort, tbl_KundenTmp.Print FROM tbl_KundenTmp WHERE (((tbl_KundenTmp.Print)=-1)) ORDER BY tbl_KundenTmp.Firma, tbl_KundenTmp.Kontaktperson UNION ALL SELECT tbl_Kunden.Firma, tbl_Kunden.Kontaktperson, tbl_Kunden.Strasse, tbl_Kunden.PLZ, tbl_Kunden.Ort, tbl_Kunden.Print FROM tbl_Kunden WHERE (((tbl_Kunden.Print)=-1));
Im 2. Teil soll das Ziel sein von einer oder mehreren Adressen mehrere Etiketten mit der gleichen Adresse zu drucken
Auch soll hier die Startposition festgelegt werden können.
In diesem Fall nehme ich ein Einzelformular. Dort können dann die zu druckenden Adressen markiert werden (gelb).
Auch kann hier wieder die Startposition gesetzt werden (grün).
Und die Anzahl der Etiketten die von der jeweiligen Adresse gedruckt werden sollen (orange).
Ergebnis der Druckvorschau bei Startpostion=3, Anzahl der Etiketten=5, gewählt ein Datensatz:
Hier wurde der Code dahin erweitert das von den markierten Adressen die gewählte Anzahl in der Temptabelle kopiert werden.
Private Sub cmd_Print2_Click() Dim iMark As Integer, i As Integer, j As Integer, k As Integer Dim rs As DAO.Recordset, rsIn As DAO.Recordset, rsOut As DAO.Recordset 'Temp Tabelle leeren CurrentDb.Execute "DELETE tbl_KundenTmp.* FROM tbl_KundenTmp;" 'Prüfen ob min. ein Datensatz ausgewählt wurde iMark = fcDomWert("Firma", "tbl_Kunden", "[Print]=-1", ltDCount) 'Wenn kein Datensatz ausgewält wurde ist hier Schluss If iMark = 0 Then MsgBox "Keinen Datensatz gewählt!", vbCritical + vbOKOnly, "Fehler" Exit Sub End If 'Ist Startpostion=1 dann wird der normale Etikettenbericht angezeigt If Me.cbo_Start1 = 1 Then 'Anzahl der zu druckenden Etiketten erzeugen Set rsIn = CurrentDb.OpenRecordset("qry_Adressen") Set rsOut = CurrentDb.OpenRecordset("tbl_KundenTmp") Do While Not rsIn.EOF 'Anzahl der gewählten Datensätze durchlaufen For j = 1 To Me.cbo_Anzahl rsOut.AddNew 'Inhalt der Adressfelder in Temp Tabelle schreiben For k = 0 To 6 rsOut.Fields(k) = rsIn.Fields(k) Next k rsOut.Update Next j rsIn.MoveNext Loop rsIn.Close rsOut.Close DoCmd.OpenReport "rpt_Etikett_Start2", acViewPreview Else 'Anzahl der Dummy Datensätze erzeugen für Startpostion Set rs = CurrentDb.OpenRecordset("tbl_KundenTmp") For i = 1 To Me.cbo_Start1 - 1 rs.AddNew rs!Print = -1 rs.Update Next i rs.Close 'Anzahl der zu druckenden Etiketten erzeugen Set rsIn = CurrentDb.OpenRecordset("qry_Adressen") Set rsOut = CurrentDb.OpenRecordset("tbl_KundenTmp") Do While Not rsIn.EOF 'Anzahl der gewählten Datensätze durchlaufen For j = 1 To Me.cbo_Anzahl rsOut.AddNew 'Inhalt der Adressfelder in Temp Tabelle schreiben For k = 0 To 6 rsOut.Fields(k) = rsIn.Fields(k) Next k rsOut.Update Next j rsIn.MoveNext Loop rsIn.Close rsOut.Close DoCmd.OpenReport "rpt_Etikett_Start2", acViewPreview End If End Sub
Ich hoffe es hilft Diesem oder Jenem weiter.
Ähnliche Artikel
Weiterlesen...