Neuigkeiten:

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

Mobiles Hauptmenü

Bericht mit mindestens einem Datensatz auf letzter Seite

Begonnen von Hamsterbacke, Juli 12, 2015, 07:50:20

⏪ vorheriges - nächstes ⏩

Hamsterbacke

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.

bahasu

#1
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?
Servus

Hamsterbacke

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

MaggieMay

Hi,

vielleicht kannst du deinen Lösungsversuch auch noch zeigen?
Freundliche Grüße
MaggieMay

Hamsterbacke

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

bahasu

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
Servus

Hamsterbacke

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

MaggieMay

Freundliche Grüße
MaggieMay

bahasu

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
Servus

Hamsterbacke

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").

MaggieMay

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.
Freundliche Grüße
MaggieMay

bahasu

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
Servus

MaggieMay

#12
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. ;-)
Freundliche Grüße
MaggieMay

Hamsterbacke

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

bahasu

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
Servus