Hallo,
mir raufen sich die Haare.... Ich bekomme die Kriese mit der OutputTo Funktion.....
Ziel: ich möchte einen Bericht speichern. Jedoch funktioniert OutputTo nicht zuverlässig. Die Funktion läuft Wochenlang ohne Probleme und dann schlagartig bricht sie immer mit der alles sagenden Fehlermeldung ab: 2501: Die Aktion OutputTo wurde abgebrochen.
Ich habe in meiner Programmierung alle Fehlerquellen beseitigt, achte auf korrekte Dateinamen, das Ausgabeziel ist immer gleich. Dennoch, wenn die Fehlermeldung auftaucht hilft nur das Beenden der kompletten Access Datenbank. Nach einem Neustart der Datenbank läuft OutputTo wieder für ein/zwei mal um dann wieder den Dienst mit o.g. Fehler zu quittieren und das Spiel beginnt von vorn.
Gibt es eine Alternative zu OutputTo, denn ich kann diese Funktion bald nicht mehr sehen. Seit nem halben Jahr habe ich immer wieder Probleme damit. Wenn alles läuft, macht OutputTo Stress. Das kann doch nicht sein.... >:( >:( >:(
Hallo,
zeig halt mal die (komplette) Prozedur....
Wird denn der Bericht selber bei manuellen Aufruf mit den entspr. Kriterien korrekt "gespeichert" (was meinst Du damit? Als PDF exportiert, in eine Druckdatei gespeichert, oder einfach ausgedruckt?).
Hallo Franz,
DoCmd.OpenReport "Auftragsformular", acViewPreview, , "AngebotAuftrag_ID =" & v_DatensatzID, acHidden, Me.Formularwahl
Wait 1
DoCmd.OutputTo acOutputReport, "Auftragsformular", acFormatPDF, strDateiPfadundName, False
Das Problem ist, dass es mal geht und mal nicht. Kann man OutputTo nicht irgendwie anders Programmieren?
Hallo,
wozu brauchst Du Wait 1?
Ist sichergestellt, dass "v_DatensatzID" immer richtigen Inhalt (also kein NULL z. B) hat? (Wie und Wo ist diese Variable deklariert?)
Ist sichergestellt , dass "Me.Formularwahl" immer einen Wert enthält und der auch richtig im Bericht verarbeitet wird?
Ist sichergestellt, dass der Report auch wieder geschlossen (entladen) wird?
Ansonsten schreib mal:
DoCmd.OpenReport "Auftragsformular", acViewPreview, , "AngebotAuftrag_ID =" & v_DatensatzID, acHidden, Me.Formularwahl
Wait 1
Docmd.SelectObject acReport ,"Auftragsformular"
DoCmd.OutputTo acOutputReport, "Auftragsformular", acFormatPDF, strDateiPfadundName, False
Docmd.Close acReport, ,"Auftragsformular"
Ich gehe jetzt mal davon aus, dass
-- in ALLEN Modulköpfen "Option Explicit" steht
-- Die DB unter VBA/Debuggen/ Kompilieren fehlerfrei kompiliert wurde.
Tipps: eindeutige Prefixe bei Namen verwenden ("Auftragsformular" --> "rpt_Auftragsformular", etc)
... und wenn im Bericht z. Bsp. bei beim Ereignis NoData gecancelt wird, tritt besagter Fehler 2501 auch auf, um dem Benutzer die Möglichkeit zu geben, im aufrufenden Code darauf zu reagieren.
Wait 1: Das habe ich mal rein gemacht um sicher zu gehen, dass der Bericht seine Daten vollständig laden kann. Dieser läd auch Grafiken anhand von Berichtsdaten. Daher das Wait. Der Bericht soll ja auch Zeit zum speichern haben und nicht sofort wieder geschlossen werden. Das Wait ist ein Versuch OutputTo fehlerfrei durchzuführen.. Mit mäßigem bzw. ohne Erfolg. Hab auch schon Wait 5 probiert... hilft nix.
Weiterhin ist alles sichergestellt was Du geschrieben hast. Ich arbeite am gleichen Datensatz! Einmal geht es, einmal nicht, dann starte ich Access neu, rufe wieder den gleichen Datensatz auf und es geht wieder... Ich habe mir auch zur Fehlersuche alle Werte vorab mit debug.print ausgeben lassen. Der Bericht wird auch immer richtig entwickelt. Ich habe auch eine Vorschau-Funktion.. Der Fehler tritt nur bei OutputTo - also beim speichern auf. Es könnte ein Speicherfehler sein. Vor einiger Zeit erhielt ich noch die Meldung, dass zu wenig Speicher vorhanden ist. Aber auch hier konnte ich nicht feststellen, welcher Speicher gemeint ist. Ggf. nutzt die OutputTo Methode einen Speicherbereich, der irgendwie und irgendwann voll läuft. Manchmal hilft es auch, Programme wie Browser oder so zu schließen, dann läuft es wieder. Es ist halt total seltsam. Auch habe ich die Datenbank bereits in eine neue Datenbank geladen - mehrfach... Irgendwann kommt immer dieser Fehler.
Das Vorgehen ist immer gleich, die Reaktion von OutputTo aber nicht. Wie gesagt, ich arbeite seit einem halben Jahr an der Lösung und bin schon alles mögliche durchgegangen. Mal läuft es über Wochen fehlerfrei, dann beginnt wieder die Fehlerserie. Daher nochmal die Frage: kann man die OutputTo Funktion anderweitig nachstellen?
Falls es keinen Weg mit Access / VBA geben sollte, wäre auch das Erstellen, Abrufen und Speichern eines Berichts direkt über den SQL Server möglich? Mein Backend beruht nämlich auf einen SQL Server. Die Tabellen sind über OLEDB eingebunden.
Hallo,
hast Du den Code-Vorschlag mal getestet?
Speziell die Close-Methode angewendet?
Access benutzt tatsächlich einen bestimmten und begrenzten (wie groß weiß ich jetzt nicht) RAM-Speicherbereich, um die Berichte aufzubauen und zwischen zu speichern. Dieser Speicher läuft über , wenn zu viele Bericht-Instanzen generiert werden oder massenhaft große Bilder im Bericht enthalten sind.
Deshalb ist die Close-Methode unbedingt erforderlich. Das Wait hat m. E. keinen Einfluss auf den Ladevorgang des Berichtes.
Nutzt Du an anderen Stellen auch die Methodik, einen Bericht versteckt zu laden und ihn dann auszudrucken, ohne den Bericht anschließend wieder zu schließen (entladen)?
Möglichweise haben auch an anderer Stelle nicht geschlossene und "zerstörte" Recordsets Einfluss.
Hi,
welche access-Version nimmst Du?
Harald
Hallo Franz,
ja, ich habe den Bericht schon immer geclosed, hatte die Zeile nur nicht mit kopiert. Allerdings hatte ich nicht vorher die Select-Anweisung. Das probiere ich mal aus. Es werden auch nicht massenhaft riesen Bilder reingeladen sondern lediglich kleine GIF-Grafiken / Piktogramme. An anderen Stellen wird der Bericht nicht versteckt geöffnet, das mache ich nur, um Ihn gleich als fertige PDF auch anzeigen zu lassen.
Zitat
DoCmd.OpenReport "Auftragsformular_nach_Ausgabe", acViewPreview, , "AngebotAuftrag_ID =" & v_DatensatzID, acHidden, Me.Formularwahl
Wait 1
DoCmd.OutputTo acOutputReport, "Auftragsformular_nach_Ausgabe", acFormatPDF, strDateiPfadundName, False
Wait 1
DoCmd.Close acReport, "Auftragsformular_nach_Ausgabe"
Wait
FollowHyperlink strDateiPfadundName
@Harald: Access 2016
Hi,
Zitat von: datekk am März 09, 2017, 09:20:03
mir raufen sich die Haare....
dann hast Du ja wenigstens noch welche ...
Ich schlage mich mit dem gleichen Problem unter a2007 rum, wobei das bereits bei der normalen Anzeige des Berichtes auftritt.
Habe eben etwas gefunden, aber noch nicht getestet:
http://www.access-basics.de/index.php/Bericht_als_PDF_speichern.html
Dort wird u.a. auf Lebans verweisen, was schon mal recht viel versprechend klingt.
Vielleicht ist diese Convert-Methode auch bei >a2003 brauchbar.
Harald
Zitat von: datekk am März 09, 2017, 16:53:20
Wait 1: Das habe ich mal rein gemacht um sicher zu gehen, dass der Bericht seine Daten vollständig laden kann. Dieser läd auch Grafiken anhand von Berichtsdaten. Daher das Wait. Der Bericht soll ja auch Zeit zum speichern haben und nicht sofort wieder geschlossen werden. Das Wait ist ein Versuch OutputTo fehlerfrei durchzuführen.. Mit mäßigem bzw. ohne Erfolg. Hab auch schon Wait 5 probiert... hilft nix.
Das WAIT bringt wirklich nichts, weil die Verarbeitung der Reports im gleichen Thread stattfindet und er sowie erst wieder zurückkehrt, wenn die DOCMD-Anweisung verarbeitet ist.
Hi,
Nachtrag zum obigen Eintrag:
Die Lebans Routinen http://www.lebans.com/reporttopdf.htm (http://www.lebans.com/reporttopdf.htm) funktionieren unter access2003 und win7 (64Bit).
Auch Bilder werden in die erstellte pdf-Datei übertragen.
Als weitere Alternative ist es u.U. auch möglich, einen pdf-Druckertreiber zu verwenden, um den Bericht als pdf-Datei zu speichern.
Harald
Also Danke für Eure Antworten, aber es wird immer kurioser:
Ich habe die OutputTo Funktion durch die "Lebans" Funktion ersetzt. Dennoch erhalte ich wieder die Fehlermeldung "OutputTo wurde abgebrochen". Setze ich einen Haltepunkt und gehe die Funktion Schritt für Schritt durch, wird die Lesbans Funktion ausgeführt. Allerdings wird dann von meinem etwa 3-seitigen Bericht nur die erste halbe Seite ausgegeben.
Hat jemand eine Erklärung für dieses merkwürdige Verhalten?
Okayyyy, bin gerade den Code der Lebans-Funktion durchgegangen und musste feststellen, dass diese Funktion auch auf die OutputTo Funktion zurückgreift, und diese auch an dieser Stelle den Fehler wohl verursacht...
' Export the selected Report to SnapShot format
DoCmd.OutputTo acOutputReport, RptName, "SnapshotFormat(*.snp)", _
strPathandFileName
' Make sure the process has time to complete
DoEvents
Schon mal probiert, die pdf-Datei vorher zu löschen?
https://www.mrexcel.com/forum/microsoft-access/678270-run-time-error-2501-outputto-action-canceled.html (https://www.mrexcel.com/forum/microsoft-access/678270-run-time-error-2501-outputto-action-canceled.html)
Ich probier es aus und melde mich.
Also das Problem tritt immer noch auf. Auch wenn die Datei vorher gar nicht existiert. Noch immer tritt der Fehler willkürlich auf, besonders dann, wenn die Datenbank schon etwas läuft. Nach einem Neustart der Datenbank lässt sich OutputTo eigentlich immer Fehlerfrei zur Arbeit zwingen. Habt Ihr noch Ideen dazu?
Hallo,
wie groß ist denn der Bericht überhaupt? D. h. die Größe der erzeugten PDF-Datei?
Ist die (stark) abhängig von den jeweiligen Ds, bzw. der Anzahl der DS, die bearbeitet werden?
Wie viele Grafiken (Bilder) sind da durchschnittlich drin und welche Größe haben die einzelnen Bilder?
Zudem mal mit der Einstellung unter Access-Optionen/aktuelle DB/Anwendungsoptionen/Bildeigenschaften-Speicherformat spielen...
Hi,
Deine Aussage zu den Abstürzen deckt sich mit den Erlebnissen in meiner Datenbank.
Diese Abstürze sind um so eher da,
- je mehr Datensätze,
- je mehr Bilder,
- je größer die Bilder und
- um so neuer das access (2007 stürzt noch öfter ab als 2003) und
- je mehr ich mit Unterberichten arbeite (ohne Unterberichte ist das System bedeutend stabiler)
Hast Du schon mal den gemachten Vorschlag - einen pdf-Druckertreiber zu verwenden - ausprobiert?
Harald
Also die Berichte sind bei mir um die 500kb groß. Die Bilder sind nur Gif-Dateien in zweistelligen KB Größen, also wirklich nur Stempel, Unterschrift und mal ein kleines Bild. Keine Unterberichte.
Ein Muster oder eine Abhängigkeit von der Anzahl der Datensätze kann ich nicht erkennen.
Das Thema Druckertreiber habe ich noch nicht getestet da ich bei Bordmitteln bleiben will um nicht auf allen Rechnern noch ein PDF Drucker installieren zu müssen.
Hallo,
bei den neueren Office-Versionen wird grundsätzlich immer der MS Print to Pdf Drucker installiert.
Ok. Wie wäre es möglich genau diesen Treiber via VBA anzusteuern? Also es wäre nicht toll, jedesmal den Drucker wählen zu müssen. Wäre es in diesem Fall auch möglich, gleich einen Dateinamen zu übermitteln und den Pfad?
Yay, jetzt hab ich sogar wieder den Speicherfehler bei OutputTo: "Fehler 2004: Nicht genügend Speicherplatz zum Ausführen der Operation. Schließen Sie alle Anwendungen, die Sie nicht benötigen, und versuchen Sie es erneut."
Laut Taskmanager benötigt mein System allerdings aktuell nur 49% des Arbeitsspeichers.
Oder kann Access, da nur 32bit, nur auf die ersten 8GB von den 16GB Systemspeicher zugreifen?
Hallo,
hier wird doch alles erklärt:
http://www.donkarl.com?FAQ5.1
und FAQ5.17
Zitat von: datekk am April 18, 2017, 13:53:34Oder kann Access, da nur 32bit, nur auf die ersten 8GB von den 16GB Systemspeicher zugreifen?
In der Regel kann ein 32-Bit-System nur auf (theoretisch) 4GB RAM zugreifen. In der Praxis sind es meist nochmal deutlich weniger. Siehe: The 3 GB barrier (https://en.wikipedia.org/wiki/3_GB_barrier)
@dfgl: besten Dank das werd ich mal checken.
@PhilS: Mein System ist 64bit, mein Office ist 32bit wegen der allgemeinen Empfehlung von MS vorrangig diese Version zu installieren.
Hallo, ich krame das Thema nochmal aus. Heute habe ich wieder das Problem mit dem Abbruch der OutputTo-Funktion. Nach dem Erscheinen der Fehlermeldung "2501: Die Aktion OutputTo wurde abgebrochen" erscheint bei mir (schon immer) der Bericht in der Seitenansicht. Diese habe ich sonst immer nach dem Fehler geschlossen, diesmal aber habe ich mal die Berichtsseiten durchgeklickt.
Bei der 3. Seite erhalte ich erneut eine Fehlermeldung. Diesmal meldet sich Access: "Nicht genügend freier Arbeitsspeicher zum Aktualisieren der Anzeige. Schließen Sie nicht benötigte Programme, und versuchen Sie es erneut."
Ich checkte darauf hin im Taskmanager meinen Arbeitsspeicher. Dieser ist aber nur zu 57% ausgelastet - auch zum Zeitpunkt der Erstellung des Berichts. Auch befinden sich auf der 3. Seite keine Bilder oder Grafiken.
Welchen Speicher nutzt Access, warum ist dieser voll und wie bekomme ich den vor OutputTo wieder leer?`
Ein schließen von anderen Anwendungen wie Firefox, Outlook usw. hilft übrigens gar nicht. Das einzige was Abhilfe schafft, ist das beenden und neu starten der Access Datenbank selbst. :o ??? >:(
Das mit dem PDF Drucker habe ich noch nicht weiter verfolgt, da mir noch nicht klar ist, wie ich von Access aus dann einen Dateinamen vergeben kann. Es soll ja für den Benutzer kein weiterer Dialog kommen. Weiterhin wird die Datenbank auf verschiedenen Computern ausgeführt und hier existieren unterschiedliche Anzahlen von Druckern, was die Zuweisung als Standarddrucker für Access erschwert.
Hallo datekk,
ZitatDas mit dem PDF Drucker habe ich noch nicht weiter verfolgt, da mir noch nicht klar ist, wie ich von Access aus dann einen Dateinamen vergeben kann.
Den bestimmst du weiterhin mit "OutputTo".
Du musst nur vorher den Drucker festlegen (siehe Franz' Hinweis).
gruss ekkehard
Also wenn die Option OutputTo immer noch zur Anwendung kommt, dann wird sich auch der Fehler dadurch nicht einstellen. Die Frage ist doch, was den Fehler hervorruft und wie man das vermeiden oder ausprogrammieren kann.
Hallo,
ist doch alles schon bequakt und wir drehen uns im Kreis.
Wenn der Fehler durch Überlauf eines accessinternen Speicherbereiches entsteht, kann Du nix daran ändern.
Warum probierst Du nicht mal, und wenn es nur testweise ist, den Bericht auf einem PDF-Drucker auszugeben??
Kann sein, dass es schon beantwortet ist, aber kann der Gesamtbericht als solches nicht in Einzelberichte (z. B. 20 Rechnungen als Gesamtbericht in 20 * EinzelRechnung zu je einer Berichtsausgabe) aufgedröselt werden?
Realisierbar mit einer Recordset-Schleife, die pro Einzelrechnung einen Ausdruck veranlasst..
Hi Franz,
ich habe es noch nicht umgesetzt, da ich hier Schwierigkeiten beim Verteilen der DB sehe:
- jeder Nutzer gibt seine Berichte in einen individuell FESTGELEGTEN Pfad aus
- jeder Nutzer hat eine andere Rechnerkonfiguration
- jeder Bericht wird mit einem FESTGELEGTEN, pro Bericht programmatisch individualisierten Dateinamen abgelegt z.B. Angebot_Firmenname_AngebotsNummer.pdf
- der Bericht ist von Access aus (VBA) auffindbar und lässt sich via Schaltfläche öffnen
Bei Benutzung eines PDF Druckers wird doch ein Fenster eingeblendet, wo der Benutzer den Pfad und den Dateiname selbst wählen kann. Dieses und die o.g. Probleme sind in meinem Kopf noch nicht klar via PDF Drucker zu lösen. Daher habe ich mir bisher die Programmierung gespart.
Bezüglich der Recordset-Schleife ist es halt auch eben nicht so, dass wir über zig Rechnungen sprechen, sonder um ein einziges Angebot für einen einzigen Datensatz im Umfang von 2 bis 7 Seiten. Die Größe der PDF Datei beläuft sich zwischen 500kb und 1,1 Mb.
LG
Hallo,
bei allen Deinen Argumenten kann ich sagen: Ja, und... ;)
ZitatBei Benutzung eines PDF Druckers wird doch ein Fenster eingeblendet, wo der Benutzer den Pfad und den Dateiname selbst wählen kann.
Wer sag das denn? Klar, wenn Du den Drucker manuell aufrufst, wird das so sein.
Es gibt aber (die meisten?) PDF-Drucker, die programmierbar sind, sei es per API oder über eine INI-Datei-Einstellung.
Schau mal auf dem Sites der Anbieter, da findest Du Programm-Beispiele, wie die Dinger per VBA in den Griff zu bekommen sind.
(Freepdf, PDfCreator, PDF24 Creator, usw..)
Zitat von: datekk am Mai 29, 2017, 15:12:48Diese habe ich sonst immer nach dem Fehler geschlossen, diesmal aber habe ich mal die Berichtsseiten durchgeklickt.
Bei der 3. Seite erhalte ich erneut eine Fehlermeldung. Diesmal meldet sich Access: "Nicht genügend freier Arbeitsspeicher zum Aktualisieren der Anzeige. Schließen Sie nicht benötigte Programme, und versuchen Sie es erneut."
Hast du schon mal probiert den Bericht auf einem normalen Drucker oder manuell auf einem PDF-Drucker auszudrucken, wenn diese Situation eingetreten ist?
Ich zweifle etwas daran, das OuputTo hier wirklich die Ursache ist und das dein Problem komplett gelöst ist, wenn du eine Alternative dazu findest. - Ich befürchte eher, dass generell die Darstellung des Berichts das Problem ist und du es mit einem PDF-Drucker genauso haben wirst.
Welche Access-Version verwendest du überhaupt?
Sind alle Updates dafür installiert?
Tritt das Problem auf mehreren Rechnern auf, oder nur auf einem einzelnen?
Ich erinnere mich dunkel an ein bekanntes Problem mit Reports und darin eingebundenen Bildern. Nach einigen Öffnen/Schließen-Zyklen des Berichts wurde reproduzierbar diese Fehlermeldung ausgelöst. - War sicher in einer älteren Version von Access. Details weiß ich nicht mehr.
In dieser Richtung würde ich mal experimentieren, ob du das Problem bewusst herbeiführen kannst. Dass würde es einfacher machen Lösungsansätze zu finden.