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!
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")
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!
Hi,
was ist das denn für ein Parameter, wonach wird die Abfrage gefiltert?
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?
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.
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));
Hallo,
füge das Feld "tbl_Patientendaten.Krankenkasse" in die Select-Liste ein...
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?
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 & "'")
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 :-).
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
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
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.
Sorry, wenn die Codes schlecht zu lesen waren. Wußte nicht, dass es dafür was eigenes zur Darstellung gibt.
Zitat
Wie kommst du denn jetzt auf die Idee?! ::)
(Wo ist denn der Satz geblieben, den ich da zitieren wollte? ???)
Versuche doch bitte mal die paar Zeilen Code zu verstehen, indem du Zeile für Zeile und Befehl für Befehl durchgest und hinterfragst was da passiert.
Du kannst den Code auch im Unterbrechungsmodus testen, indem du einen Haltepunkt setzt vor dem Aufruf.
Also ich muss gestehen, dass mir VBA sehr schwer fällt und ich da nur sehr schlecht durchsteige. Und auf solche komplexen Codes würde ich alleine gar nicht kommen. Wie setze ich denn einen Haltepunkt um die DCount Funktion zu testen? Weil in der Abfrage sind die beiden Patienten drin, aber gedruckt wird dennoch nur ein Exemplar. Auch nachdem ich i+1 gesetzt habe:
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 + 1
DoCmd.Close acReport, "rpt_Anschreiben KK"
rs.MoveNext
Loop
Set rs = Nothing
End Sub
Der Bericht selber ist normal aufgebaut: Es gibt einen Kopf- und Fußbereich "Krankenkasse" mit dem Detailbereich, wo halt die Anzahl der Patienten aufgelistet werden. Somit wird für jede Krankenkasse ein neuer Bericht mit den dazugehörigen Patienten erstellt. Einen Unterbericht gibt es keinen.
Den Haltepunkt setzt du per Klick auf den Rahmen auf der linken Code-Seite im VBA-Editor.
In der Zeile muss ein ausführbarer Befehl stehen. Mit F8 springst du von Befehl zu Befehl.
Gehst du mit der Maus über die Variablen, sollte der Inhalt angezeigt werden.
Und "qry_LB_gesamt_Einzeldruck_Formular_850" ist tatsächlich die Datenquelle des Berichts??
Also ich habe den VBA Code jetzt so hin bekommen, dass alles klappt :-). Vielleicht war es doch ganz gut die Sache Schritt für Schritt durchzugehen :-)
Ich darf mich an dieser Stelle bei allen recht herzlich bedanken für die Hilfe!
Allerdings hätte ich noch eine Verständnisfrage: Bei der VBA Zeile:
DoCmd.OpenReport "rpt_Anschreiben KK", acViewPreview, , "Krankenkasse='" & rs!Krankenkasse & "'"
Wofür steht das "Krankenkasse='" & rs!Krankenkasse & "'" bzw. was hat dies für eine Funktion? Und wozu dienen die Hochkommers?
Der Ausdruck ist ein Kriterium nach dem der Bericht beim Öffnen gefiltert werden soll, so dass ein Bericht pro Krankenkasse erzeugt wird.
Die Hochkommata wurden eingefügt nachdem offensichtlich wurde, dass du nach der Krankenkassen-Bezeichnung und nicht nach deren Datensatz-ID filtern wolltest.
Ach so. Vielen Dank!
Guten Morgen,
jetzt ist doch noch ein kleiner Fehler aufgetreten, wo ich nicht weiß warum. Hier kurz der VBA-Code:
Private Sub Umschaltfläche120_Click()
Dim db As Database
Dim rst As DAO.Recordset
Dim i As Long
Set rst = CurrentDb.OpenRecordset("Select Distinct Krankenkasse from qry_LB_gesamt_Einzeldruck_Formular_850")
Do While Not rst.EOF
i = DCount("[qry_LB_gesamt_Einzeldruck_Formular_850]![Krankenkasse]", "[qry_LB_gesamt_Einzeldruck_Formular_850]")
DoCmd.OpenReport "rpt_Anschreiben KK", acViewPreview, , "Krankenkasse='" & rst!Krankenkasse & "'"
DoCmd.PrintOut acPrintAll, , , , i+1
DoCmd.Close acReport, "rpt_Anschreiben KK"
rst.MoveNext
Loop
Set rst = Nothing
DoCmd.OpenReport "rpt_Einzeldruck_850", acViewPreview
DoCmd.PrintOut acPrintAll
DoCmd.Close acReport, "rpt_Einzeldruck_850"
DoCmd.OpenQuery "Setzen des Hakens Anschreiben Krankenkasse_850", acViewNormal
End Sub
Es geht um den Ausdruck im Abschnitt "Do While Not rst.EOF". Alles läuft prima, nur druckt Access die Anzahl der Ausdrucke falsch aus. Kurz zur Erklärung:
Auf dem Anschreiben für z.B. die AOK stehen zwei Patienten. Hier sollen zwei Ausdrucke plus ein Original (Anschreiben) erstellt werden. Auf dem Anschreiben für z.B. die TKK steht ein Patient, wo dann ein Ausdruck plus ein Original erstellt werden soll.
Was tatsächlich passiert ist, dass Access scheinbar die Gesamtzahl der Patienten oder Krankenkassen in der Abfrage zählt, also drei insgesamt, und somit auch für jedes Anschreiben drei Ausdrucke macht. Das heißt egal wie viele Patienten bei der Krankenkasse vermerkt ist, er druckt jedes Anschreiben mal der Anzahl der Patienten oder Krankenkasse, obwohl bei der TKK z.B. nur einer drauf steht.
Muss ich da evtl. doch ein anderes Abgrenzungs- oder Zählkriterium wählen, damit es für Access deutlicher ist?
Hallo,
du musst beim DCount ein Kriterium einsetzen, damit du nur die Datensätze des aktuellen Krankenhauses zählst. Ich denke das wurde zuvor auch so gezeigt.
Tut mir leid, aber das verstehe ich jetzt leider nicht. Ich habe ja nur ein Krankenhaus in der Betrachtung. Und in der Abfrage stehen aktuell drei Datensätze, wobei Access aber für die Anschreiben immer die Anzahl drei nimmt und ausdruckt.
Stünden in der Abfrage fünf verschiedene Datensätze mit fünf verschiedenen Krankenkassen, würde Access jetzt für jede Krankenkasse fünf Anschreiben drucken, wobei nur eins + Original nötig wären.
Daher verstehe ich nicht, wie ich das Kriterium setzten soll, damit er erkennt, dass dann beim Wechsel der Krankenkasse neu gezählt werden muss, damit er die richtige Anzahl an Ausdrucken ermitteln kann.
Ah...sorry. Nehme alles zurück. Du hast Recht! Ich habe den Fehler gefunden.....es klappt jetzt :-).