Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Bericht drucken mit variabler Anzahl an Kopien

Begonnen von Alex_80, September 17, 2014, 08:27:50

⏪ vorheriges - nächstes ⏩

Alex_80

Hallo zusammen,

ich habe einen Bericht, der gruppiert wurde nach Rechnungsempfänger (RE), so dass für jeden Rechnungsempfänger eine neue Seite erstellt wird. Auf dem Bericht erscheint nun pro Rechnungsempfänger eine unterschiedliche Anzahl an Kunden (Spiegelstriche). Und pro Kunde soll nun vom Bericht eine Kopie mit erstellt werden.

Kurzes Beispiel:

Rechnungsempfänger XYZ hat die Kunden:
- Herr Müller
- Herr Maier

Rechnungsempfänger ABC hat die Kunden
- Frau Berg
- Herr Schmidt
- Frau Müller

Somit soll für RE XYZ ein Original und zwei Kopien gedruckt werden, für RE ABC ein Original und drei Kopien.

Den einfachen Druck habe ich über das Makro "ÖffneBericht" realisiert, wo der Ausdruck sofort startet. Meine Frage wäre nun, ob ich es so einrichten kann, dass Access die Anzahl der Kunden pro RE erkennt und dann dementsprechend automatisch soviele Kopien +  das Original auswirft? Wenn ja, wie muss ich das wo machen?

Vielen Dank!

MaggieMay

Hallo,

so einfach geht das nicht, du kannst nicht einzelne Seiten eines Gesamtberichts unterschiedlich oft drucken.
Das heißt, du musst den Bericht in einer VBA-Schleife für jeden Rechnungsempfänger einzeln anfordern, feststellen wieviele Kunden dazu gehören, in der Vorschau öffnen und per PrintOut den Bericht in der benötigten Anzahl ausdrucken.

Beispiel:Dim rptQuery As String
Dim rs As DAO.Recordset
Dim i As Integer
rptQuery = "Datenquelle des Berichts"
Set rs = CurrentDB.OpenRecordset("Select Distinct RE From [" & rptQuery & "] ORDER BY RE")
Do While Not rs.EOF
    i = DCount("*", rptquery, "RE=" & rs!RE)
    DoCmd.OpenReport "berichtsname", acViewPreview, , "RE=" & rs!RE
    DoCmd.PrintOut, acPrintAll, , , , i
    DoCmd.Close acReport, "berichtsname"
    rs.MoveNext
Loop
rs.Close
("Luftcode")
Freundliche Grüße
MaggieMay

Alex_80

Hallo,

vielen Dank für die Antwort. Ich habe versucht den Code so zu hinterlegen, dass wenn ich eine Schaltfläche anklicke dieser ausgeführt wird.

Allerdings kommt bei mir die Fehlermeldung:

"Laufzeitfehler '3061': 1 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben."

Anbei mal meine Umsetzung in Access (RE = die Spalte Krankenkasse in der Tabelle):

Private Sub Umschaltfläche117_Click()
Dim rptQuery As String
Dim rs As DAO.Recordset
Dim i As Integer
rptQuery = "qry_LB_gesamt_Einzeldruck_850"
Set rs = CurrentDb.OpenRecordset("Select Distinct Krankenkasse From [" & rptQuery & "] ORDER BY Krankenkasse")
Do While Not rs.EOF
    i = DCount("*", rptQuery, "Krankenkasse=" & rs!Krankenkasse)
    DoCmd.OpenReport "rpt_Einzeldruck_850", acViewPreview, , "Krankenkasse=" & rs!Krankenkasse
    DoCmd.PrintOut , acPrintAll, , , , i
    DoCmd.Close acReport, "rpt_Einzeldruck_850"
    rs.MoveNext
Loop
rs.Close
End Sub


Danke!

MaggieMay

Hi,

was ist das denn für ein Parameter, wonach wird die Abfrage gefiltert?
Freundliche Grüße
MaggieMay

Alex_80

Ich verstehe nicht ganz die Frage. Meinst Du, welche Kriterien gesetzt wurden in der Abfrage? Das wären nämlich einige. Oder meinst Du was anderes?

MaggieMay

Es geht um den Parameter, der beim OpenRecordSet oder von der DCount-Methode nicht aufgelöst werden kann, und das war ja anscheinend nur einer.
Die fest eingetragenen Kriterien spielen hierbei keine Rolle. Gibt es bspw. einen Formularbezug in der Abfrage?

Wenn du die Frage nicht beantworten kannst, so zeige bitte den SQL-Code der Abfrage.
Freundliche Grüße
MaggieMay

Alex_80

Also ich hoffe ich beantworte Deine Frage richtig, indem ich Dir den SQL-Code der Abfrage zeige:

SELECT tbl_Patientendaten.Nachname, tbl_Patientendaten.Vorname, tbl_RechNr.Aufnahmenummer, tbl_RechNr.Erinnerung_3, tbl_RechNr.RechNr, tbl_RechNr.RechDatum, tbl_RechNr.RechStatus, tbl_RechNr.Erinnerung_1_H, tbl_RechNr.Erinnerung_2_H, tbl_RechNr.Mahnsperre, tbl_RechNr.Entlassung, tbl_RechNr.Aufnahme, tbl_RechNr.Teilzahlung, tbl_RechNr.Bezahlt, tbl_RechNr.Erfassungsdatum, tbl_RechNr.Erledigt_Kassenanschreiben, tbl_RechNr.Nur_850, tbl_Patientendaten.Anrede, tbl_RechNr.ZGUT, tbl_Kostenträger.*
FROM (tbl_Patientendaten INNER JOIN tbl_Kostenträger ON tbl_Patientendaten.Krankenkasse = tbl_Kostenträger.Krankenkasse) INNER JOIN tbl_RechNr ON tbl_Patientendaten.Mitgliedsnummer = tbl_RechNr.Mitgliedsnummer_F
WHERE (((tbl_RechNr.RechStatus)="e") AND ((tbl_RechNr.Erinnerung_1_H)=Yes) AND ((tbl_RechNr.Erinnerung_2_H)=Yes) AND ((tbl_RechNr.Mahnsperre)=No) AND ((tbl_RechNr.Teilzahlung)=No) AND ((tbl_RechNr.Bezahlt)=Yes) AND ((tbl_RechNr.Erfassungsdatum)<=Date()) AND ((tbl_RechNr.Erledigt_Kassenanschreiben)=No) AND ((tbl_RechNr.ZGUT)=No));

DF6GL

Hallo,

füge das Feld "tbl_Patientendaten.Krankenkasse"  in die Select-Liste ein...

Alex_80

Hallo,

also wenn ich in den Bereich "Select" das Feld "tbl_Patientendaten.Krankenkasse" einsetzte, dann weiß Access nicht, welche "Krankenkasse" er nehmen soll, weil dies schon in der "tbl_Kostenträger.*" drin ist. Wenn ich es draußen lasse, kommt nun der Fehler:

"Laufzeitfehler '3075': Syntaxfehler (fehlender Operator) in Abfrageausdruck 'Krankenkasse=SBK West Siemens BKK'."

Beim Debugger wird die hier fett geschriebene Zeile von Access gelb markiert:

Private Sub Umschaltfläche120_Click()
Dim rptQuery As String
Dim rs As DAO.Recordset
Dim i As Integer
rptQuery = "qry_LB_gesamt_Einzeldruck_Formular_850"
Set rs = CurrentDb.OpenRecordset("Select Distinct Krankenkasse From [" & rptQuery & "] ORDER BY Krankenkasse")
Do While Not rs.EOF
i = DCount("*", rptQuery, "Krankenkasse=" & rs!Krankenkasse)
.
.
.


Was meint der damit? Wo fehlt ihm da jetzt was?

DF6GL

#9
Hallo,

"wenn ich in den Bereich "Select" das Feld "tbl_Patientendaten.Krankenkasse" einsetzte, dann weiß Access nicht, welche "Krankenkasse" er nehmen soll, weil dies schon in der "tbl_Kostenträger.*" drin ist"

ok, dann ist das Feld nicht nötig...Ansonsten sehe ich ad hoc keinen diesbezüglichen Fehler in der SQL.



weiterhin sollte es so heißen, wenn "Krankenkasse" (offensichtlich) den Datentyp TEXT besitzt (was allerdings vom Tabellendesign und der Verwendung dieses Feldes in einer Beziehung her zu beanstanden wäre):

i = DCount("*", rptQuery, "Krankenkasse='" & rs!Krankenkasse & "'")




Alex_80

Guten Morgen!

Ich habe die Änderungen von Dir eingegeben, aber der Fehler ist immer noch da. Jetzt ist es die Zeile darunter, die Access gelb im Debugger markiert (ich hatte dort auch "Krankenkasse=" & rs!Krankenkasse durch "Krankenkasse=" & rs!Krankenkasse & "'" ersetzt):

Private Sub Umschaltfläche120_Click()
Dim rptQuery As String
Dim rs As DAO.Recordset
Dim i As Integer
rptQuery = "qry_LB_gesamt_Einzeldruck_Formular_850"
Set rs = CurrentDb.OpenRecordset("Select Distinct Krankenkasse From [" & rptQuery & "] ORDER BY Krankenkasse")
Do While Not rs.EOF
    i = DCount("*", rptQuery, "Krankenkasse='" & rs!Krankenkasse & "'")
    DoCmd.OpenReport "rpt_Einzeldruck_850", acViewPreview, , "Krankenkasse=" & rs!Krankenkasse & "'"
    DoCmd.PrintOut , acPrintAll, , , , i
    DoCmd.Close acReport, "rpt_Einzeldruck_850"
    rs.MoveNext
Loop
rs.Close
End Sub


Gibt es da noch einen anderern Fehler? Oder geht es einfach nicht? Übrigens hast Du Recht: Das Feld "Krankenkasse" ist in der Tabelle als "Text" hinterlegt. Warum ist das denn zu beanstanden? Und was wäre sinnvoller?

Einen guten Start in Woche :-).

DF6GL

Hallo,


es fehlt ein Hochkomma.

DoCmd.OpenReport "rpt_Einzeldruck_850", acViewPreview, ,"Krankenkasse='" & rs!Krankenkasse & "'"


Beziehungen über Textfelder, insbesondere wenn es sich um Namen handelt, sorgen für latente Fehlfunktionen, weil nie gewährleistet ist, dass die Schreibweise der Namen immer exakt eingehalten wird. Zudem leidet die Performance stark infolge des Textvergleiches bei der Verknüpfung. Hier ist immer ein Integer-Zahlenvergleich (Datentyp Long) vorzuziehen. Grundprinzip sollte halt auch hier die Einhaltung der Normalisierungsregeln sein (z. B. u. a.: JEDE Tabelle erhält einen Primärschlüssel mit DatenTyp Zahl/Long (Autowert), abhängige Detailtabellen zudem Fremdschlüsselfelder  mit ebenfalls Datentyp Zahl/Long. 


btw:  Besser so deklarieren: 
Dim i As Long 
und am Ende der Prozedur den Recordset "zerstören" :

Set rs = Nothing

Alex_80

Vielen Dank! Ich habe nun alles so verbessert, wie Du es geschrieben hast. Er druckt nun auch das Anschreiben an die Krankenkasse. Jedoch leider nur einmal. Kann der Code noch so abgeändert werden, dass Access merkt, wie viele Patienten auf dem Anschreiben stehen (mit Spiegelstrichen aufgeführt auf dem Formular), so dass halt ein Original + x Kopien rauskommen, wie Patienten aufgelistet sind? In meinem Beispielfall habe ich das Anschreiben mit zwei Patienten drauf, demzufolge müsste ein Original und zwei Kopien gedruckt werden.

Private Sub Umschaltfläche120_Click()
Dim rptQuery As String
Dim rs As DAO.Recordset
Dim i As Long
rptQuery = "qry_LB_gesamt_Einzeldruck_Formular_850"
Set rs = CurrentDb.OpenRecordset("Select Distinct Krankenkasse From [" & rptQuery & "] ORDER BY Krankenkasse")
Do While Not rs.EOF
    i = DCount("*", rptQuery, "Krankenkasse='" & rs!Krankenkasse & "'")
    DoCmd.OpenReport "rpt_Anschreiben KK", acViewPreview, , "Krankenkasse='" & rs!Krankenkasse & "'"
    DoCmd.PrintOut , acPrintAll, , , , i
    DoCmd.Close acReport, "rpt_Anschreiben KK"
    rs.MoveNext
Loop
Set rs = Nothing
End Sub


MaggieMay

#13
Sorry, aber die Lösung hatte ich dir doch bereits vor längerem geschrieben.  ???
Was liefert denn die DCount-Funktion?

Und wie ist der Bericht aufgebaut, gibt es evtl. einen Unterbericht?

Und gewöhne dir bitte an, Code in Code-Tags einzufügen, das ist deutlich besser lesbar.

PS:
Und wenn du ein Original und n Kopien haben willst, so musst du i+1 einsetzen.
Freundliche Grüße
MaggieMay

Alex_80

Sorry, wenn die Codes schlecht zu lesen waren. Wußte nicht, dass es dafür was eigenes zur Darstellung gibt.