[Gelöst]Druckeransteuerung nach Aufruf eines Berichts setzen

13. April 2010 16:09

Hallo zusammen,

ich stehe derzeit vor folgendem Problem:

Für einen unserer Kunden müssen wir zukünftig Rechnungen mittels eines EDI-Druckers versenden.
Das Kriterium, welche Rechnungen dies sind, wird durch die Rechnungstellung beim Aufruf der Rechnung gesetzt [Optionen => EDI (Checkbox)] => Mit EDI = true soll nun der EDI-Drucker angesteuert werden.

Im Forum habe ich verschiedene Diskussionen zu dem Thema „Druckeransteuerung“ gelesen. Wenn ich das richtig verstanden habe, so wird die Funktion „findprinter“ aus der Codeunit 1 VOR dem Reportaufruf durchlaufen.

Meine Frage
Da ich die Druckeransteuerung mit dem Bestätigen des Druckbuttons aufrufen bzw. wahrscheinlich vorher setzen muss, stellt sich mir die Frage, wo im Report das ganze zu hinterlegen ist.

Mein Ansatz für den Code wäre (richtig?)

Code:
PrinterSelection.RESET;
IF EDIPrinter THEN BEGIN
  PrinterSelection.INIT;
  PrinterSelection."User ID" := [USERID];
  PrinterSelection."Report ID" := [ReportID];
  PrinterSelection."Printer Name" := [EDI-Printer];
  PrinterSelection.INSERT;
END;
Zuletzt geändert von sp81 am 15. April 2010 15:21, insgesamt 1-mal geändert.

Re: Druckeransteuerung nach Aufruf eines Berichts setzen

14. April 2010 09:59

Du kannst einen Report mit den gleichen DataItems und den gleichen Einstellmöglichkeiten auf der RequestForm vorschalten, der die Filter und Einstellungen an den Originalreport übergibt und dann den eigentlichen Druck aufruft. Aber achte darauf, daß in der Druckerauswahl schon ein Datensatz für den Benutzer und den Report existieren kann. Wenn das Kunden abhängig ist, auf welchem Drucker die Ausgabe erfolgt, dann mußt du dir außerdem den aktuell eingestellten Drucker aus der Druckerauswahl merken, um den Datensatz nachher wieder zurückzustellen. Sollte das Ganze auch als Massenausdruck angedacht sein, dann mußt du pro Datensatz die Druckerauswahl "manipulieren" und den Originalreport aufrufen. Ist eigentlich nicht schwierig, aber man muß schon genau aufpassen, was man macht, und sehr exakt arbeiten. UND: Testen, Testen, Testen!

Re: Druckeransteuerung nach Aufruf eines Berichts setzen

14. April 2010 10:42

Oder du nutzt den von mir gerne verwendeten Trick mittels SingleInstance-Codeunit.

Re: Druckeransteuerung nach Aufruf eines Berichts setzen

15. April 2010 09:27

@HattrickHorst
Vielen Dank für die ausführliche Info. Da ich im Bereich der Programmierung noch Leihe bin, muss ich gestehen, hört sich das ein wenig kompliziert an. :-)

Timo Lässer's Vorschlag ist ein wenig übersichtlicher.
Timo Lässer hat geschrieben:Oder du nutzt den von mir gerne verwendeten Trick mittels SingleInstance-Codeunit.

@Timo
Eine Verständnisfrage habe ich noch: Wo in meinem Bericht (in welchem Trigger) muss ich die Funktion SetSpecialPrinter aufrufen?

Re: Druckeransteuerung nach Aufruf eines Berichts setzen

15. April 2010 10:14

Steht doch da... :wink:
Timo Lässer hat geschrieben:Somit kann ich jederzeit vor dem Reportaufruf festlegen, auf welchem Drucker der Report herauskommen soll.

Re: Druckeransteuerung nach Aufruf eines Berichts setzen

15. April 2010 10:32

HattrickHorst hat geschrieben:Steht doch da... :wink:
Timo Lässer hat geschrieben:Somit kann ich jederzeit vor dem Reportaufruf festlegen, auf welchem Drucker der Report herauskommen soll.


Eventuell besteht noch ein Knoten in meinen Gedanken :-( ... Wenn ich in einer geb. Rechnung bin und Drucken anklicke, wird derzeit mein Report (geb. Rechnung) aufgerufen. Muss ich nun im Code beim Aufruf des Reports den Wert an mein Report übergeben? :?: :?:

Re: Druckeransteuerung nach Aufruf eines Berichts setzen

15. April 2010 10:44

sp81 hat geschrieben:Das Kriterium, welche Rechnungen dies sind, wird durch die Rechnungstellung beim Aufruf der Rechnung gesetzt [Optionen => EDI (Checkbox)] => Mit EDI = true soll nun der EDI-Drucker angesteuert werden.
....
Eventuell besteht noch ein Knoten in meinen Gedanken :-( ... Wenn ich in einer geb. Rechnung bin und Drucken anklicke, wird derzeit mein Report (geb. Rechnung) aufgerufen. Muss ich nun im Code beim Aufruf des Reports den Wert an mein Report übergeben? :?: :?:

Wenn die Option auf deiner gebuchten Rechnung ist, kannst du diese Funktion starten bevor der Report angestossen wird.

Da es allerdings so klingt als würdest du die Funktion in Report erst setzen fällt mir folgendes ein:
Checkbox (Validate)
Code:
IF EDI THEN BEGIN
// Funktion nutzen um Drucker zu überschreiben
END ELSE BEGIN
// Falls Drucker überschrieben werden soll, globale Variable der Codeunit wieder löschen
END;


In diesem Fall solltest du dafür sorgen das der Haken beim Start des Reports nie gesetzt ist.
Zuletzt geändert von Danjo am 15. April 2010 10:45, insgesamt 1-mal geändert.

Re: Druckeransteuerung nach Aufruf eines Berichts setzen

15. April 2010 10:45

  1. Vor dem Aufruf des Reports DeineSingleInstanceCodeunit.SetSpecialPrinter(NeuerDrucker); aufrufen.
  2. Report aufrufen

[Edit]
Da NAV den Drucker direkt mit dem Aufruf des Reports ermittelt, bringt es nichts mehr, wenn man versucht, die Druckerauswahl (auf welchem Weg auch immer) zu verändern.
NAV hat sich schon für einen Drucker entschieden.
Man muss also vor dem Reportaufruf wissen, an welchen Drucker es gehen soll.
[/Edit]

Re: Druckeransteuerung nach Aufruf eines Berichts setzen

15. April 2010 15:21

Timo Lässer hat geschrieben:
  1. Vor dem Aufruf des Reports DeineSingleInstanceCodeunit.SetSpecialPrinter(NeuerDrucker); aufrufen.
  2. Report aufrufen

[Edit]
Da NAV den Drucker direkt mit dem Aufruf des Reports ermittelt, bringt es nichts mehr, wenn man versucht, die Druckerauswahl (auf welchem Weg auch immer) zu verändern.
NAV hat sich schon für einen Drucker entschieden.
Man muss also vor dem Reportaufruf wissen, an welchen Drucker es gehen soll.
[/Edit]


Super, vielen Dank!

Re: [Gelöst]Druckeransteuerung nach Aufruf eines Berichts se

21. April 2010 12:27

Ist es vielleicht auch möglich, einen Report per RUNMODAL (o.ä.) zu starten, sodass danach direkt die Druckerauswahl zu sehen ist? Also ohne nochmals auf "Drucken" klicken zu müssen?

Wenn man einen Report mit vorherigem "USEREQUESTFORM(FALSE)" aufruft, wird leider auch sofort auf dem Standard-Drucker ausgedruckt.

Hört sich nach einer überflüssigen Frage an, da auf diese Weise augenscheinlich nur ein Mausklick oder ein Tastenkürzel gespart wird, aber - ohne zu tief auf die Gründe eingehen zu wollen - die Lösung ist extrem individualisiert.....

Re: [Gelöst]Druckeransteuerung nach Aufruf eines Berichts se

21. April 2010 12:54

Es ist mit Sendkeys machbar. Allerdings sieht man die Requestform des Reports ganzganzganz kurz.

Re: [Gelöst]Druckeransteuerung nach Aufruf eines Berichts se

21. April 2010 13:19

Wenn keine RequestForm angezeigt wird, erscheint auch keine Druckerauswahl.
Also entweder RequestForm und Druckerauswahl oder nichts dergleichen.

Ob der Report auf dem Windows-Standarddrucker oder dem aus der Tabelle Druckerauswahl ausgedruckt werden soll, wird über einen Parameter beim Reportaufruf gesteuert:
Code:
Report.RUN(ReportID,UseReqForm,SystemPrinter,Rec);
// bzw.
Report.RUNMODAL(ReportID,UseReqForm,SystemPrinter,Rec);

Damit der Drucker über die Codeunit 1 - FindPrinter ermittelt wird, muss der Parameter SystemPrinter auf FALSE stehen.
Dies gilt auch, wenn mittels des von mir weiter oben beschriebenen Trick ein "SpecialPrinter" in die Codeunit 1 geschleust wird, da ja die Funktion FindPrinter nur aufgerufen wird, wenn es eben nicht auf dem Windows-Standarddrucker ausgegeben werden soll.

Re: [Gelöst]Druckeransteuerung nach Aufruf eines Berichts se

21. April 2010 14:48

Vielen Dank für Eure Antworten!