Hallo Access-Profis
Habe ein ganz eigenartiges Phänomen, welches ab und zu auftritt. In einem Formular gebe ich verschiedene Datensätze ein (Artikel, Produktionsdatum, Chargen-Nr.) zu denen ich in einem nachfolgenden Bericht Etiketten erstellen lasse. Nun kommt es ab und zu vor, dass wenn ich die Etiketten der ausgewählten Datensätze via Seitenansicht drucken will, der Druckmanager anstatt die eine Seite mit Etiketten dann sämtliche Datensätze der zugrunde liegenden Tabelle tabellarisch ausdruckt ??? Dieser Fehler tritt lediglich sporadisch auf und ist auch beim Ausdruck von einem Bericht in einem anderen Zusammenhang ab und zu festzustellen (wenn's dumm kommt, werden dann da anstatt eine Seite halt bis zu 20 und mehr ausgedruckt >:(.
WEiss jemand, an was das liegen könnte? Da es bei mehreren Berichten vorkommt, frag ich mich, ob's mit der Systemumgebung vom PC oder Drucker zu tun haben könnte.
Danke für Eure Inputs.
Gruss JOG
Hallo,
hört sich mysteriös an...
1) Wie lautet die Datenherkunft des Berichtes (bei einer Abfrage deren SQl-String) ?
2) Wie wird der Bericht überhaupt aufgerufen?
3) "... die Etiketten der ausgewählten Datensätze ... " WIE werden diese Datensätze ausgewählt?
Falls die DB "zerschossen" sein sollte, hilft evtl. , eine neue leere DB anzulegen und darin alle Objekte aus der alten zu importieren.
Auch könnte der Access-Startparameter "/decompile" hilfreich sein.
Wenn nichts von all dem hilft, lad die DB hier hoch (datenreduziert und gezippt) damit man sich die Sachlage genau ansehen kann.
Hallo,
gibt es einen Unterschied im Verhalten, wenn du den Bericht zuerst in der Berichtsansicht öffnest und dann in die Seitenvorschau wechselst und wenn du den Bericht per Rechtsklick aus dem Objektfenster in die Seitenansicht beförderst und wenn der Bericht 'ganz normal' aufgerufen wird (z.B. aus einem Formular?
Enthält der Bericht irgendwelche VBA-Codes?
Wie Franz schon angemerkt hat ... wie wird der Bericht überhaupt aufgerufen?
Ist auch mitentscheidend zu meiner ersten Frage zu sehen.
Hallo und guten Abend
Ja die Berichte haben teilweise verschiedene Codes und Funktionen hinterlegt. Das verwunderliche an der Sache ist, dass beim schliessen und erneuten öffnen der DB der Fehler bis zum nächsten Mal verschwunden ist (ist auch der Fall, wenn ich kurz in die Entwurfsansicht des frm wechsle...
Das Verhalten des Fehlers in den verschiedenen Berichtsansichten muss ich erst noch testen, da kann ich noch nichts dazu sagen.
Zu Frage 1: Datenherkunft aus Abfrage
2: Der Bericht wird via Schaltfläche und docmd.-Befehl aufgerufen => "Ansicht Seitenansicht"
3: Daten werden einerseits mittels eines Kontrollfeldes ausgewählt und alle Daten mit Kontrollfeld "JA" ausgedruckt. Andererseits drucke ich im anderen Fall ein Report aus anhand eines bearbeiteten, aktuellen Datensatzes im Formular.
Helfen diese Angaben weiter?
Gruss JOG
Hallo
nur bedingt....
Wie lautet der SQL-String der Abfrage?
Benutzt Du ein Makro oder VBA-Code für den Berichtsaufruf? Wie lauten ALLE angebenen Parameterwerte für die Docmd-Methode?
Zu 3). ok.
Es bleibt: Vermutlich ist die DB zerschossen. Das kann auch nur heißen, dass lediglich eine Tabelle "unsaubere" Daten enthält, bzw. strukturell beschädigt ist.
Guten Morgen
Dies ist der SQL-String der zugehörigen Abfrage:
SELECT Bulkchargen.DatumHerstellung, Bulkchargen.ArtikelNr, Artikelliste.Artikelbezeichnung, Bulkchargen.[Chargen-Nr], Bulkchargen.EtikettenDruck
FROM Bulkchargen INNER JOIN Artikelliste ON Bulkchargen.ArtikelNr = Artikelliste.ArtikelNr
WHERE (((Bulkchargen.EtikettenDruck)=Yes));
Der VBA-Code für den Berichtsaufruf lautet:
DoCmd.OpenReport "Berichtetikettenbulk", acViewPreview, "", "", acWindowNormal
Was wäre Deiner Meinung nach das Beste, wenn die DB zerschossen sein sollte? Hast Du eine Vermutung bezüglich "unsaubere Daten" resp. "strukturell beschädigt"?
Gruss JOG
Hallo,
schreib mal im SQl-String:
WHERE Bulkchargen.EtikettenDruck <> 0
Die Antwort zur beschädigten DB hast Du schon erhalten.
Hier weitere Tipps:
http://www.donkarl.com/?FAQ1.27
Hallo
Leider auch nicht erfolgreich. Habe die Where-Klausel auf<>0 angepasst, jedoch ohne Erfolg. Das einzige scheinbar wirksame war bisher den Einbau des folgenden Codes vor dem Öffnen des Berichts:
DoCmd.OpenForm "Erfassen Bulkchargen", acDesign, "", "", , acWindowNormal
DoCmd.OpenForm "Erfassen Bulkchargen", acNormal, "", "", , acWindowNormal
Ist zwar Symptombekämpfung aber scheinbar hilfts...
Danke für die Hinweise und die Links.
Gruss JOG
Hallo,
Hast Du nun mal /decompile und/oder den Import in eine neue leere DB durchgeführt??
Hallo,
ZitatJa die Berichte haben teilweise verschiedene Codes und Funktionen hinterlegt...
Es kann sein, dass du Codes einsetzt, die eine datenbezogen richtige Darstellung des Berichts verhindern,
die Art der 'Symptombekämpfung' läßt für mich auch diesen Schluß zu.
DoCmd.OpenForm "Erfassen Bulkchargen", acDesign, "", "", , acWindowNormal
DoCmd.OpenForm "Erfassen Bulkchargen", acNormal, "", "", , acWindowNormal
Mit obigen Zeilen beförderst du das Formular in die Entwurfsansicht und danach wieder in die Normalansicht.
Hast du irgendwelche Codes 'Beim Anzeigen', 'Beim Laden' oder 'Beim Öffnen
des Formulars im Einsatz, die sich auf
die Daten des
zu öffnenden Berichts Einfluß nehmen?
WHERE (((Bulkchargen.EtikettenDruck)=Yes));oder
WHERE (((Bulkchargen.EtikettenDruck)=True));oder
WHERE (((Bulkchargen.EtikettenDruck)<>0));oder auch
WHERE (((Bulkchargen.EtikettenDruck)=-1));... wird keine Wirkung zeigen, wenn zum Zeitpunkt des Berichtsaufrufes das Tabellenfeld 'Bulkchargen.Etikettendruck' nicht oder noch nicht den gewünschten/erwarteten/aktualisierten Wert zeigt.
Setze mal einen Haltepunkt direkt vor den Berichtsaufruf und schau in die Tabelle ob die gewünschten DS mit Ja / True gekennzeichnet sind.
Eventuell kann dir dieses helfen:
http://www.donkarl.com?FAQ4.5 (http://www.donkarl.com?FAQ4.5)
Was passiert den mit diesem Tabellenfeld nachdem der Druck durchgeführt wurde?
Hallo
Das ist mir soweit klar, dass ich mit der "Symptombekämpfung" das Formular lediglich zuerst in die Entwurfs- und danach wieder in die Normalansicht stelle und erst danach den Bericht auslöse.
Muss vielleicht noch sagen, dass es immer dann auftritt wenn ich neue Datensätze ins entsprechende frm eingebe.
Der Bericht enhält im übrigen folgende Prozedur als Code:
Beim Drucken:
Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)
Dim AnzahlEtiketten As Long, I As Long, TypFeld As String, FarbeGrün As Long, FarbeRot As Long
AnzahlEtiketten = 5
FarbeRot = RGB(242, 30, 30)
FarbeGrün = RGB(0, 184, 0)
If AnzahlEtiketten = 0 Then
' Wenn Wert 0 ist, dann gar nichts drucken
Me.NextRecord = True
Me.MoveLayout = False
Me.PrintSection = False
Else
' Druckvorgang für diesen Datensatz wiederholen,
' wenn AnzahlEtiketten noch nicht erreicht ist
End If
If PrintCount < AnzahlEtiketten Then
Me.NextRecord = False
End If
For I = 1 To AnzahlEtiketten
Me.txtZusatz__txtMusterTyp = DLookup("Z_Text", "tblZusatz", "ZID=" & PrintCount Mod (AnzahlEtiketten + 1))
Me.txtZusatz__txtMusterTyp.FontBold = True
If Me.txtZusatz__txtMusterTyp = "Prüfmuster Anfang" Then
Me.txtZusatz__txtMusterTyp.ForeColor = FarbeGrün
ElseIf Me.txtZusatz__txtMusterTyp = "Prüfmuster Ende" Then
Me.txtZusatz__txtMusterTyp.ForeColor = FarbeGrün
Else: Me.txtZusatz__txtMusterTyp.ForeColor = FarbeRot
End If
Next I
End Sub
In der Seitenansicht wird der Bericht stets korrekt angezeigt. Der Fehler zeigt sich effektiv erst, wenn ich aus der Seitenansicht Drucke (via Druckermenü).
Den Tip mit dem Import der DB in eine neue leere haben ich ebenfalls ausprobiert sowie auch den Befehl in Acces "DB komprimieren und reparieren". Hat leider auch nicht das gewünschte Ergebnis erbracht...
Gruss JOG
Hi,
du legst fest:
AnzahlEtiketten = 5
und fragst dann ab:
If AnzahlEtiketten = 0 Then
Welchen Sinn hat das?
Ginge nicht auch als vereinfachte Form (hier allerdings ohne die farblichen Zuweisungen):
Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)
'wenn AnzahlEtiketten ' noch nicht erreicht ist
If Me.PrintCount < 5 Then
Me.NextRecord = False
End If
Me.txtZusatz = Nz(DLookup("Z_Text", "tblZusatz", "ZID = " & Me.PrintCount), "")
End Sub
Bei meinem Test wurde auch ohne for next beim ersten Etikett "Prüfmuster Anfang" und beim letzten "Prüfmuster Ende" gedruckt.
Harald
Hallo,
Zitat...wenn ich neue Datensätze ins entsprechende frm eingebe
Hast du schon probiert, vor dem Bereichtsaufruf den DS zu wechseln - also den neuen DS zu verlassen und danach wieder zurückzukehren?
Wenn das funktioniert dann schau mal den Link in meiner letzten Antwort an.
Hallo zusammen
Ich glaub, dass ich mit dem Hinweis den DS zu wechseln am Ziel bin. Damit konnte ich auf jeden Fall den Fehler nicht mehr provozieren. Die anderen Hinweise behalte ich auf jeden Fall im Hinterkopf.
Vielen Dank für Eure fachkundige Hilfe. :D
Gruss JOG
Hi,
ich komme noch mal auf Fragen von Peter zurück:
"Hast du irgendwelche Codes 'Beim Anzeigen', 'Beim Laden' oder 'Beim Öffnen des Formulars im Einsatz, die sich auf
die Daten des zu öffnenden Berichts Einfluß nehmen?"
Da Du schreibst, dass der Datensatzwechsel ausreicht, um die "Macke" zu vermeiden, betrachte ich "Beim Laden" und "Beim Öffnen" als im Moment nicht relevant.
Also:
1. Gibt es eine Sub zum Ereignis "Beim Anzeigen"
2. wenn ja: was steht da?
Harald
Hallo,
nur kurz, nachdem die Frage bereits mit 'gelöst' gekennzeichnet wurde...
ZitatMuss vielleicht noch sagen, dass es immer dann auftritt wenn ich neue Datensätze ins entsprechende frm eingebe.
Da der Tipp mit dem DS-Wechsel offenbar geklappt hat:
Ich vermute weiter, dass ein neuer DS angelegt wird, und OHNE dass dieser verlassen wird, der Bericht aus dem gleichen Form aufgerufen wird, denn ...
Zitat von: JOG am Dezember 20, 2012, 22:42:26
Zu Frage 1: Datenherkunft aus Abfrage
2: Der Bericht wird via Schaltfläche und docmd.-Befehl aufgerufen => "Ansicht Seitenansicht"
3: Daten werden einerseits mittels eines Kontrollfeldes ausgewählt und alle Daten mit Kontrollfeld "JA" ausgedruckt. Andererseits drucke ich im anderen Fall ein Report aus anhand eines bearbeiteten, aktuellen Datensatzes im Formular.
gemäß Pkt. 3 werden Checkboxen geklickt um die zu druckenden DS zu kennzeichnen.
Wenn es sich hierbei um einen NEUEN DS handelt und dieser nicht explizit verlassen wird, ist die Kennzeichnung in der/den Tabellen zum Zeitpunkt des Berichtsaufrufes nicht bekannt
da zu diesem Zeitpunkt die ID des neuen DS in der Mastertabelle noch nicht eingetragen ist.
Die Abfrage wird sich auf diesen neuen DS beziehen müssen - kann ihn aber wegen der vorgenannten Gründe nicht finden sondern listet stattdessen die gesamte Tabelle auf.
Somit ist wäre m.E. ein guter Lösungsansatz dahingehend zu sehen, erstens eine Aktualisierung des neuen DS zu veranlassen und zweitens dafür zu sorgen, dass
die Abfrage nur Daten liefern kann, die ausschließlich mit diesem NEUEN DS in Beziehung stehen.
Für die Aktualisierung der Formulardaten habe ich bereits den Link http://www.donkarl.com?FAQ4.5 (http://www.donkarl.com?FAQ4.5) genannt.
Hi,
hast Du den Button zum Berichtsaufruf nicht im Hauptformular und die Dateneingabe im Unterformular sondern alles in einem Formular?
Wenn das so ist, könnte eventuell helfen, bei den Button-Codezeilen am Anfang hinzuzufügen:
DoCmd.RunCommand acCmdSaveRecord
Harald
Hallo zusammen
Erstmal vielen Dank, dass Ihr nicht so rasch locker lässt - super ;).
Also es ist so, dass die Daten in einem (Hauptfrm) Formular eingegeben werden. Es werden Artikel, Lot und Datum erfasst sowie eben das Kontrollfeld, welches angibt, ob der DS auch ausgedruckt werden soll. Wenn ich das Kontrollfeld anklicke, wechselt der DS vom Status "in Bearbeitung" in den Status "markiert" dies erkenne ich anhand des DS-Markierers auf der rechten Seite. Was allerdings offensichtlich nicht heissen muss, dass der DS auch wirklich gespeichert wird. Auf jeden Fall habe ich den Code von Harald DoCmd.RunCommand acCmdSaveRecord ebenfalls getestet und auch dieser scheint zu funktionieren.
Nun sieht mein Code bei Drucken so aus ohne dass dieser den Fehler produziert:
Private Sub cmdEtikDrucken_Click()
DoCmd.RunCommand acCmdSave
DoCmd.OpenReport "Berichtetikettenbulk", acViewPreview, "", "", acWindowNormal
End Sub
Übrigens steht beim Ereignis "Beim Anzeigen" folgender Code drin (aktualisiert das Such-Textfeld mit dem aktuell gewählten DS im Frm)
Private Sub Form_Current()
Me.cboBulkchargeSuchen = Me.txtChargenNr
End Sub
Ansonsten stehen da keine relevanten Codes bei irgendeinem Ereignis des Frm.
Nun, ich glaub wir sind da am Ziel und ich bedanke mich nochmals herzlich für die Unterstützung.
Danke und bis zum nächsten Mal.:D
Gruss JOG
Hallo,
und noch einer...
Es sollte statt acCmdSave acCmdSaveRecord heißen.
Hallo
Klar, hab ich übersehen. :o
Vielen Dank.
Gruss JOG