Hallo erst einmal an alle
Ich habe mich hier neu angemeldet da ich bei meiner Accessdatenbank nicht mehr weiter komme und mit internetsuche und Hilfe seit Tagen an meinem letzten Problem nicht mehr weiter komme. Vielleicht kann mir hier ja einer helfen.
Wie ich in der Überschrift schon angedeutet habe, hab ich beim drucken meines Berichtes ein unschönes Problem. Wenn im Bericht auf einer Seite die maximale Anzahl an Datensätzen erreicht ist, erschein der Berichtsfuß auf der nächsten Seite ohne weiteren Datensatz. Im Prinzip eigentlich kein großes Ding, aber da im Berichtsfuß eine Gesamtsumme erscheint, schaut das irgendwie doof aus wenn auf der letzten Seite nur die Gesamtsumme ohne zumindest einem Datensatz steht.
Ich habe auch schon wie schon geschrieben einiges an Internetrecherche geleistet aber nur so Sachen wie
- Ein Datensatz pro Seite
- x Datensätze pro Seite
gefunden, die mir aber nicht wirklich weiterhelfen.
Ich würde es gerne so schaffen, das Access erkennt das der Berichtsfuß allein auf einer Seite steht und dann automatisch mindestens einen Datensatz (meinetwegen auch 2) mit auf die letzte Seite nimmt.
Ich hänge auch mal eine Musterdatenbank mit an.
Hi,
vielleicht hilft:
http://microsoft.public.de.access.narkive.com/CEc79Fjf/bericht-anzahl-datensatze-pro-seite
Harald
Nachtrag:
Um welchen report Deiner Beispiel-Datenbank geht es denn?
Hi danke für die Antwort.
Sorry das ich mich erst jetzt melde. Waren ein Paar Tage in der Türkei.
Ja die Seite hab ich schon gefunden aber so richtig funktioniert das nicht. Vor allem wenn ich die Option Bemerkung Drucken auswähle dann scheißt mir dieser Code den kompletten Bericht durcheinander. Das heißt mit der Option Bemerkung Drucken hab ich nur 2 Datensätze auf einer Seite, wenn ich die Option nicht gewählt habe dann interessiert Access der Code nicht.
Es geht eigentlich um alle Berichte außer die Adressberichte.
Gruß Markus
Hi,
vielleicht kannst du deinen Lösungsversuch auch noch zeigen?
Hallo
Ja gerne. Ich hab es einmal mit diesem Code probiert.
If Int(Me!txtCounter / 23) = Me.Pages - 1 Then
Me!brkDetails.Visible = True
Else
Me!brkDetails.Visible = False
End If
Hier ist es so das er auf die erste und die 2 Seite 23 Datensätze schreibt und wenn es mehr als 46 sind jeden weiteren Datensatz auf eine eigene Seite schiebt.
Ich habe auch schon -1 gegen 2 und 3 usw. ausgetauscht. Hier passiert nur das er den 2 "Block" mit 23 Datensätzen um eine Seite verschiebt.
Dann hab ich noch folgenden Code:
If Int(Me!txtCounter / 23) = Me!txtCounter / 23 Then
Me!brkDetails.Visible = True
Else
Me!brkDetails.Visible = False
End If
Dazu hab ich noch ein Textfeld im Seitenfuß (nicht im Berichtsfuß) der mir die Datensätze auf der Seite zählt. Funktioniert soweit gut nur wenn ich auf einer Seite mehr als 2 Datensätze habe die mit Bemerkung gedruckt werden dann ignoriert er die Bedingung. Oder wenn ich die Datensatzmenge von 23 auf 24,25 oder sonst etwas ändere und dann doch wieder zu viele auf einem Datenblatt sind schieb er mir wieder ein Blatt mir nur einem Datensatz dazwischen. dann hab ich noch einen Seitenumbruch mit drinnen. Den hab ich mal oben mal unten Platziert im Detailbereich. Egal wo er sitz es Passiert nicht das was ich mir Vorstelle.
Gruß Markus
Hi,
noch an einer Lösung interessiert?
Dann nenn bitte den Bericht (siehe 13.07.2015) und gib Kriterien für die Datenauswahl vor und ich kann versuchen, den bei mir verwendeten Lösungsansatz an Deinen Daten auszuprobieren.
Ein Beispieldatenbank im access2003-Format erhöht die Chancen auf Hilfe. Es wäre also gut, wenn Du diese zur Verfügung stellen kannst.
Harald
Hallo,
ja ich suche immer noch nach einer Lösung. Mittlerweile habe ich schon rausgefunden das es wahrscheinlich daran liegt das mein Deteilbereich "dynamisch" ist. Das heißt ich hab ein Feld Bemerkung das ich nach bedarf aktivieren kann. Ich habe die Datenbank jetzt in einem älteren Format mit Angehängt.
Gruß Markus
Hi,
kann die Bemerkung auch mehrzeilig werden?
Hi Markus,
war doch etwas umfangreicher als ich aufgrund der Erfahrungen bei einer früheren Anwendung gedacht hatte.
Änderungen habe ich im Formular "frmStart" und im Bericht "rptArztbesuche" gemacht und zwei neue Module angelegt: "Deklarationen" und eine Alternative für "SendKeys", weil es ansonsten früher oder später zu weiteren "interessanten" Effekten beim Einsatz von SendKeys kommen würde.
Das Prinzip beruht darauf, dass in einem ersten Durchlauf der letzte Datensatz im Bericht ermittelt wird und dann beim zweiten Berichtsaufruf überprüft wird, ob dieser auf der vorletzten Seite steht. Wenn das der Fall ist, wird ein Seitenvorschub beim Erreichen vom letzten Datensatz initiiert.
1.
In einem Modul deklarieren
Public letzter_Datensatz As Long
2.
Im Ereignis, das den Bericht aufruft, eintragen:
DoCmd.Echo False
letzter_Datensatz = 0
DoCmd.OpenReport "rptArztbesuche", acPreview, , , , letzter_Datensatz
DoEvents
Call mySendKeys("{END}", True)
DoEvents
DoCmd.Close acReport, "rptArztbesuche"
DoEvents
DoCmd.Echo True
DoCmd.OpenReport "rptArztbesuche", acPreview, , , , letzter_Datensatz
3.
Eindeutige Identifizierung vom Datensatz im Bericht festlegen:
In Deinem Fall habe ich "ArztTerminID" in die Abfrage aufgenommen.
Die Bedingung (Jahr kleiner xxxx) in der Abfrage des Berichtes habe ich nur für Testzwecke eingebaut und kann wieder entfernt werden.
4.
Im Detailbereich das Feld "ArztTerminID" hinzufügen und unsichtbar machen.
Das Steuerelement zur Seitensteuerung entfernen!
5.
Weitere Zeilen im VBA-Bereich bei " Detailbereich_Format" hinzufügen:
If Me.OpenArgs = 0 Then
letzter_Datensatz = Me.ArztTerminID
Else
Me.Detailbereich.ForceNewPage = 0 ' kein Seitenvorschub
If letzter_Datensatz > 0 Then
If Me.ArztTerminID = letzter_Datensatz Then
If Me.Page = Me.Pages - 1 Then
Me.Detailbereich.ForceNewPage = 1 ' vor Bereich
End If
End If
End If
End If
Generell gilt:
Am Anfang eines jeden Moduls einbauen:
Option Compare Database
Option Explicit
Das vereinfacht das Finden von Fehlern.
Hilft das?
Harald
Hallo,
@ MaggieMay: Nein mehr als eine zusätzliche Zeile kann die Bemerkung nicht werden.
@ Harald: Hut ab. Jetzt hab ich mir das was ich bis jetzt schon Programmiert habe, selbst erlern, angelesen und zusammenkopiert, was sehr viel Zeit und Kopfzerbrechen gekostet hat, aber das ist kaum zu beschreiben. Es Funktioniert. Respekt. Nochmals Hut ab.
Nur eine Sache gibt's noch. Ich hab jetzt heute Nachmittag die Arbeit von dir Studiert und versucht an die richtige stelle zu kopieren. Ich kann Ihn zwar an der stelle einfügen nur es funktioniert meine Datumsabfrage und die Namensfilterung nicht mehr. Und da wäre das zweite, wenn ich zwei Personen im Bericht habe funktioniert der Code nicht mehr (Wir sind 5Personen). Mein Code zur Personen und Datumsauswahl lautet:
Private Sub btn_PreView_Click()
' Bericht öffnen
On Error GoTo Err_rptArztbesuche_Click
Dim querry As String
querry = "True "
If (Len(Me.cboPerson) <> 0) Then
querry = querry & "AND personid=" & Me.cboPerson
End If
If (Len(gesperrtArzt) <> 1) Then
querry = querry & "AND gesperrt=1" & Me.gesperrtArzt
End If
querry = querry & " AND (Besuchsdatum Between [Datum von] And [Datum bis] OR [Datum von] Is Null And [Datum bis] Is Null)"
DoCmd.OpenReport "rptArztbesuche", acViewPreview, , querry
Exit_rptArztbesuche_Click:
Exit Sub
Err_rptArztbesuche_Click:
MsgBox Err.Description
Resume Exit_rptArztbesuche_Click
End Sub
Wie schaff ich es die beiden Funktionen zusammen zu fügen?
Ich werde mich morgen in der Mittagspause auch noch einmal damit auseinandersetzen da ich dort 3 Bildschirme zur Verfügung habe was einfacher ist als mit einem Laptop. ;-)
Wenn ich noch eine Kurze Beschreibung der Funktion der Datenbank schreiben soll bitte bescheid geben.
Anbei noch die Datei mit 2 Personen und ein Bild wo ich markiert habe auf welche 2 Bedingungen sich der Bericht noch Bezieht (sie oben "Mein Code zur Personen und Datumsauswahl").
Hallo,
ZitatWie schaff ich es die beiden Funktionen zusammen zu fügen?
was hindert dich daran, den Filterstring beim Öffnen des Berichts zu übergeben, genauso wie du es vorher auch gemacht hast? Nun hast du nur noch einen weiteren Parameter - das ist alles.
BTW:
Anstelle vom Einsatz von "Echo = False" solltest du den Bericht beim ersten Mal lieber verborgen öffnen.
Auch dafür gibt es einen Parameter im
OpenReport-Befehl. Einfach mal die Access-Hilfe dazu studieren.
Hi Maggy,
Zitat von: MaggieMay am Juli 29, 2015, 12:44:29
Anstelle vom Einsatz von "Echo = False" solltest du den Bericht beim ersten Mal lieber verborgen öffnen.
Auch dafür gibt es einen Parameter im OpenReport-Befehl. Einfach mal die Access-Hilfe dazu studieren.
Hatte ich ausprobiert, funktioniert aber nicht, da vermutlich das Senden von "Ende" nicht korrekt erfolgt (gilt zumindestens für a2003, a2007)
Zu dem anderen Thema komme ich, wenn ich etwas mehr Zeit habe.
Harald
Welches andere Thema? Es ist doch so, dass der Bericht bisher mit Filterkriterium geöffnet wurde, was in deinem Beispiel wohl nicht enthalten ist. Der Filterstring wird weiterhin erzeugt, nur beim Öffnen nicht weitergegeben. Diesen "Lapsus" sollte eigentlich auch ein Laie bei genauerem Hinsehen bemerken - und beheben! - können. ;-)
Hallo Harald
Ich habe es jetzt geschafft den Code so anzupassen das meine Filterkriterien auch mit berücksichtigt werden und es Funktioniert jetzt auch mit jeder Person.
Nun hab ich das ganze auf den zweiten Bericht anwenden wollen aber es klappt nicht. Ich habe es alles eins zu eins so Kopiert und gemacht wie du es beschrieben hast. Nur es funktioniert nicht. Hat es vielleicht mit Punkt 3 zu tun "In Deinem Fall habe ich "ArztTerminID" in die Abfrage aufgenommen." Welche Abfrage genau meinst du? Hat es vielleicht etwas mit dem "ArztterminID - Kopfbereich" im Bericht zu tun. Wie kann ich den, wenn es daran liegt, einfügen?
Oder liegt es an Punkt 4 "Das Steuerelement zur Seitensteuerung entfernen!" Wo finde ich diese Einstellung?
Mit Freundlichen Grüßen
Markus
Hallo Markus,
da Ferndiagnosen fehleranfällig sind, schlage ich vor, dass Du die aktuelle Datenbank (access2003) zur Verfügung stellst und beschreibst, was der zweite Bericht ist und wie Du diesen aufrufst.
Harald
Hallo Harald.
Sorry zweiter Bereich war etwas unglücklich ausgedrückt. Ich meinte damit das ich das ganze auf den zweiten Bericht -> Apothekenbesuche, anwenden wollte.
Ich hab den Code eingefügt im Bericht und zur Schaltfläche (Lupe Steuerausgleich). Hab diese noch auf die entsprechenden Felder angepasst so das der richtige Bericht öffnen. Kurz gesagt ich habe mich an deine Anleitung gehalten.
Nun ist es so das die Bedingung das auf der letzten Seite mindestens ein Datensatz steht beim öffnen des Berichtes ignoriert wird. (Datenbank öffnen -> klick auf die Drucker Schaltfläche-> auf der rechten Seite "Apotheke" -> klick auf Steuerausgleich). Ich glaube es hängt mit den Punkten 3 und 4 zusammen das ich da etwas verkehrt gemacht oder vergessen habe.
Gruß Markus
Hallo Markus,
geänderte Datenbank siehe Anhang.
1.
Generel gilt:
Verwende an jedem VBA-Anfang:
Option Compare Database
Option Explicit
2.
Den Bericht "tblApothekeBesuch" habe ich umbenannt in "rptApothekeBesuch".
3.
Im Formular "frmStart" habe ich beim Button "Fahrten zur Apotheke" dessen Namen von "Befehl2" umgeändert in "Fahrten_zur_Apotheke".
Für mich als Außenstehenden ist ein Programm noch schwerer verständlich, wenn keine verständlichen Namen verwendet werden. Das erfordert zeitaufwändiges Suchen.
Dort habe ich eingebaut:
Private Sub Fahrten_zur_Apotheke_Click()
DoCmd.Echo False
letzter_Datensatz = 0
DoCmd.OpenReport "rptApothekeBesuch", acPreview, , , , letzter_Datensatz
DoEvents
Call mySendKeys("{END}", True)
DoEvents
DoCmd.Close acReport, "rptApothekeBesuch"
DoEvents
DoCmd.Echo True
DoCmd.OpenReport "rptApothekeBesuch", acPreview, , , , letzter_Datensatz
End Sub
4.
Im Bericht "rptApothekeBesuch" habe ich die Gruppierung "ApoTerminID" inkl. Gruppenkopf hinzugefügt.
Diese hat das Ereignis "Beim Formatieren".
Dort habe ich eingetragen:
Private Sub Gruppenkopf0_Format(Cancel As Integer, FormatCount As Integer)
If Me.OpenArgs = 0 Then
letzter_Datensatz = Me.ApoTerminID
Else
Me.Detailbereich.ForceNewPage = 0 ' kein Seitenvorschub
If letzter_Datensatz > 0 Then
If Me.ApoTerminID = letzter_Datensatz Then
If Me.Page = Me.Pages - 1 Then
Me.Detailbereich.ForceNewPage = 1 ' vor Bereich
End If
End If
End If
End If
End Sub
Zur Zeit werden zweimal Parameter-Eingaben angefordert. Das habe ich nicht abstellen können, da mir nicht klar ist, wann und womit Du Deine Datenauswahl vornimmst (siehe auch 5).
5. Mit Deiner "querry"-Zuweisung (siehe Befehl_35_Click) bin ich nicht klar gekommen.
Vor dem ersten "DoCmd.OpenReport" wird in "querry" etwas anderes eingetragen als vor dem zweiten "DoCmd.OpenReport"
Achtung: Dort wird noch die alte Berichts-Bezeichnung "tblApothekeBesuch" verwendet.
Diese habe ich dort nicht umgeändert.
Vielleicht helfen Dir aber diese Angaben, dass Du selber Deine Datenbank Deinen Wünschen entsprechend anpassen kannst.
Harald
Hi,
was das betrifft:
Zitat von: bahasu am August 08, 2015, 18:16:28
Verwende an jedem VBA-Anfang:
Option Compare Database
Option Explicit
so setze
einmalig den Haken bei der VBA-Option "Variablendeklaration erforderlich", dann wird dieser Eintrag bei allen neuen Modulen (jeglicher Art) automatisch hinzugefügt. Bei bereits vorhandenen Modulen muss das allerdings manuell nachgetragen werden.
Guten Morgen Harald
In deiner neuen Beschreibung Punkt 4 war's was ich vergessen habe. Deshalb hat es nicht funktionier. Jetzt funktioniert es auch bei den restlichen Berichten. Danke nochmal für die Hilfe.
Das die Datenbank so unsauber aufgebaut ist liegt daran das ich diese als blutiger Anfänger angefangen haben. Da wusste ich nicht viel mehr als das es Access gibt.http://www.access-o-mania.de/forum/Smileys/default/smiley.gif
Jedenfalls hab ich mich mir die halbe Nacht um die Ohren geschlagen und die Datenbank nochmal sauber (mit Schaltflächenbeschriftung usw.) neu aufzubauen.
Somit würde ich Sagen ist das Thema abgeschlossen.
Hallo Harald
jetzt bräuchte ich doch nochmal deine Hilfe.
Wenn ich den Bericht mir Filterkriterien öffne z. b. eine Person X auswähle und hier keine Daten hinterlegt sind Bricht Access mit dem Laufzeitfehler 2427 Sie haben einen Ausdruck ohne Wert eingegeben. Drücke ich dann auf Debuggen zeigt er mir das er bei dem im Foto angehängten Befehl hängen bleibt.
Ich habe selber schon etwas gesucht und ausprobiert:
im Bericht beim Öffnen ohne Datensatz den folgenden VBA Code Ausprobiert.
MsgBox "Der Bericht enthält keine Daten.", _
vbInformation + vbOKOnly, "Keine Daten"
Cancel = True
Dann hab ich auch noch folgenden Code gefunden
If Dcount("*", "Datenherkunft_des_Berichtes") > 0 Then
DoCmd.OpenReport "Berichtsname"
Else
MsgBox "Der Bericht enthält keine Daten.", _
vbInformation + vbOKOnly, "Keine Daten"
End If
Beide funktionieren super solang die Tabelle mit Datensatzherkunft komplett leer ist. Sobald aber auch nur ein Datensatz drinsteht und ich etwas auswähle was nicht "vorhanden" ist wie z. B. Person dann kommt der Fehler. Zusätzlich hängt sich dann auch das ganze Accessprogramm auf.
Kannst du mir hier nochmal helfen.
Hi Markus,
vielleicht hilft:
letzter_Datensatz = nz(Me.ArztterminID, 0)
Dann wären auch Plausibilitätsanfragen möglich z.B. bei:
Private Sub Fahrten_zur_Apotheke_Click()
DoCmd.Echo False
letzter_Datensatz = 0
DoCmd.OpenReport "rptApothekeBesuch", acPreview, , , , letzter_Datensatz
If letzter_Datensatz > 0 then
DoEvents
Call mySendKeys("{END}", True)
DoEvents
DoCmd.Close acReport, "rptApothekeBesuch"
DoEvents
DoCmd.Echo True
DoCmd.OpenReport "rptApothekeBesuch", acPreview, , , , letzter_Datensatz
else
msgbox "keine Daten vorhanden"
end if
End Sub
Das ganze ist ungetestet.
Ansonsten muss ich mir das noch mal genauer anschauen, sobald ich Zeit habe.
Harald
Hallo Harald
Danke für die schnelle Antwort.
Ich hab das jetzt so gut es geht bei mir zuhause am Laptop eingefügt. Access bringt zwar immer noch einen Fehler aber es hängt sich zumindest nicht mehr auf. Ich werde mir das Morgen in der Arbeit noch einmal genauer Anschauen. Dort hab ich wieder 3 Monitore zur Verfügung was wesentlich einfacher ist als mit einen 14" Laptop :-). Vielleicht hab ich auch nur einen Tip oder Copy Fehler.
Ich gebe auf jeden Fall bescheid sobald ich es mir Morgen in ruhe angeschaut habe.
Danke Markus
Hallo Markus,
Zitat von: Hamsterbacke am August 12, 2015, 19:59:54
... Access bringt zwar immer noch einen Fehler ...
welchen Fehler an welcher Stelle?
Harald
Guten Morgen
Also wie schon geschrieben bei mir zuhause mit AC2013 hängt er sich zumindest nicht mehr auf.
Bringt aber immer noch eine Fehlermeldung.
Ich habe das ganze hier in der Arbeit jetzt noch einmal angeschaut. beim kopieren des Codes und einfügen hab ich keinen Fehler gemacht. Hier bringt er auch immer noch einen Fehler und AC2010 hängt sich auf.
Den Fehler was er bringt scheint der Gleiche zu sein:
Laufzeitfehler '-2147352567 (80020009)':
Sie haben einen Ausdruck ohne Wert eingegeben.
Gruß Markus
Hallo,
ZitatWenn ich den Bericht mir Filterkriterien öffne z. b. eine Person X auswähle und hier keine Daten hinterlegt sind Bricht Access mit dem Laufzeitfehler 2427 Sie haben einen Ausdruck ohne Wert eingegeben.
So etwas passiert, wenn auf ein (gebundenes) Steuerelement referenziert wird, das bei "keinen Daten" gar nicht existiert. D. h. die Steuerelemente werden erst dann erzeugt , wenn damit auch Daten angezeigt werden können.
Hallo DF6GL
Ja das ist mir soweit klar. Wenn keine Daten zum öffnen des Berichtes vorliegen, z. B. bei Person X noch keine Daten hinterlegt sind, kann der Bericht natürlich nicht geöffnet werden. Das hängt mit dem Code zusammen den ich im Beitrag vom August 12, 2015, 10:35:35 schon einmal als Bild angehängt habe.
Ich hab jetzt noch eine ältere Datenbankversion geöffnet und dort geschaut was passiert wenn keine Daten vorhanden sind. Hier bricht er mir zwar auch mit dem Fehler 2427 ab (logisch wenn keine Daten vorhanden sind) aber Access stürzt nicht ab wie eben bei der neueren Version wo die Funktion schon eingebaut ist Bericht mit mindestens einem Datensatz auf letzter Seite. (keine Reaktion mehr, eingefroren). Bei dieser Datenbankversion kann ich dann bei Berichtereignis den Code
MsgBox "Der Bericht enthält keine Daten.", _
vbInformation + vbOKOnly, "Keine Daten"
einfügen und Access bringt mir dann ein Textfeld "keine Datenvorhanden" und nicht das unschöne Debugg Fenster.
Gruß Markus
Hallo,
naja, man kann halt den Teufel nicht mit dem Beelzebub austreiben..
Fehlersituation ist Fehlersituation, und die kann durchaus von den unterschiedlichen Access-Version unterschiedlich "behandelt" werden.
Der Bericht darf halt nicht geöffnet werden, wenn keine Daten vorliegen... Dafür gibt es das Ereignis "Bei keinen Daten" oder eine Prüfung der Datensatzzanzahl vor dem Öffnen des Berichtes...
Hi,
ZitatDer Bericht darf halt nicht geöffnet werden, wenn keine Daten vorliegen...
Sorry, aber genau dafür gibt es doch das Berichtsereignis "Bei ohne Daten".
Dann gibt man eine Meldung aus, ala "Bericht ohne Daten" und beendet die Aktion mit
Cancel = TrueUnter Umständen muss noch ein Folgefehler im aufrufenden Formular abgefangen bzw. behandelt werden.
So sieht "Fehlerbehandlung" bei mir aus: nicht verhindern, sondern reagieren und bei Bedarf kommentieren.
Hallo MaggieMay
Danke für deine Antwort. Leider hab ich das mit der Option ala "Bericht ohne Daten" und beendet die Aktion mit Cancel = True und weiteren VBA Codes Probiert. Ohne Erfolg.
Ich hab jetzt nach längerem Probieren eine Lösung gefunden. Ich hab den Code der für das einfrieren von Access verantwortlich war, wenn keine Daten zum öffnen vorhanden sind, mit
On Error GoTo Err_rptApothekeBesuchPrivat
am Anfang und
Exit_rptApothekeBesuchPrivat:
Exit Sub
Err_rptApothekeBesuch:
Resume Exit_rptApothekeBesuchPrivat
am Ende ergänzt. Und schon funktioniert alles Wunderbar.
Danke an alle für eure Hilfe.
Gruß Markus