Drucker auswählen

14. Juli 2006 12:14

hallo,

möche über Report.run bzw report.runmodal die Systemauswahl der installierten Drucker erzwingen. wie geht das ?

wenn ich im report in der reqform auf drucken klicke kommt diese auswahl doch auch ?

bei der run bzw runmodal geschichte kann ich zwar einstellen systemprinter wahr oder falsch, ich bekomme aber nicht die auswahl meiner printer ???

danke

14. Juli 2006 17:36

Schau mal in der C/SIDE Hilfe nach unter REPORT.RUN. Dort findest du viele Hinweise dazu.

Der Aufruf erfolgt mit diesem Parametern:

Code:
REPORT.RUN(Number [, ReqWindow] [, SystemPrinter] [, Record])


Wenn du den Parameter ReqWindow auf TRUE setzt, erfolgt auch die Anzeige des Druckerdialoges.

17. Juli 2006 09:07

Hallo,

diesen Aufruf benutze ich ja. Ich möchte aber nicht das Druckdialogfenster von Navision haben, sondern das Systemdruckfenter, dass bei Navision auch kommt, wenn man im Druckdialog auf drucken klick. Dann pop ein Fenster mit der Auswahl deines Druckers auf! Das Fenster benötige ich, ich möchte hier dann ein PDF-Writer auswählen.

17. Juli 2006 09:36

wenn du immer den pdf-Writer benutzen willst, kanns du doch in der Druckerauswahl diesen Drucker für diesen Report festlegen.

mfg Michael

17. Juli 2006 09:46

Der Parameter ReqWindow steuert beides. Also entweder mit RequestForm des Reports, dann kommt auch der Druckerdialog, oder eben ohne diese beiden Fenster. In dem Fall kommt entweder der Standarddrucker zum Zug, oder, wie mesplage geschrieben hat, muss der Report in der Druckerauswahl hinterlegt werden mit dem gewünschten Drucker.

17. Juli 2006 19:48

Ich habe des Öfteren mal die Anforderung umsetzen müssen, dass ein Report nach ganz anderen Kriterien als von Navision unterstützt mal auf dem einen, mal auf dem anderen Drucker ausgegeben werden muss.

Dazu habe ich (m)eine SingleInstance-Codeunit "GlobalVariableManagement" (welche ich in so ziemlich jeder Datenbank habe) um zwei Funktionen erweitert:
Code:
SetSpecialPrinter(NewPrinterName : Text[250])
Printername := NewPrinterName;

GetSpecialPrinter() : NewPrinterName : Text[250]
NewPrinterName := PrinterName;
PrinterName := '';  // Unbedingt löschen!


In der Codeunit 1 frage ich dann in der Funktion FindPrinter meine SI-Codeunit, ob ein abweichender Drucker verwendet werden soll:
Code:
FindPrinter(ReportID : Integer) : Text[250]
CLEAR(PrinterSelection);

// > TL4.00:02 >>>
"Printer Name" := GlobalVarMgt.GetSpecialPrinter;
IF "Printer Name" = '' THEN
// < TL4.00:02 <<<
IF NOT PrinterSelection.GET(USERID,ReportID) THEN
[...]


Somit kann ich jederzeit vor dem Reportaufruf festlegen, auf welchem Drucker der Report herauskommen soll.
Verwendungsmöglichkeiten dafür gibt es unglaublich viele, man muss seiner Phantasie nur freien Lauf lassen.
Nehmen wir mal an, wir wollen Berichte lagerortabhängig ausgeben, so erweitert man einfach die Tabelle Location um ein Feld "Printer Name", welches eine TableRelation zur Tabelle Printer.ID hat.
Wenn nun ein Ausdruck beim Freigeben von Aufträgen in dem jeweiligen Lager ankommen soll, so übergibt man den hinterlegten Drucker an die SI-Codeunit und setzt somit die Einstellungen in der Tabelle "Printer Selection" einmalig ausser Kraft.

18. Juli 2006 00:07

@Timo:

unter welcher ID hast du die Codeunit angelegt, und wie sorgst du dafür, dass Kunden mit ihrer Standard NfkU-Lizenz diese auch benutzen können?
Oder erzwingst du so vom Kunden, dass er zusätzliche Codeunits zukauft?

20. Juli 2006 09:01

Ich hatte bisher noch nie ein Projekt mit einer KMU-Lizenz, daher fiel eine weitere zu lizensierende Codeunit nie auf.

Ich lagere solche "Universal-Objekte" immer im 99xxx-Bereich (siehe auch die Objekte im Download-Bereich aus meiner "Tools-Sammlung").
Zuletzt geändert von Timo Lässer am 23. Februar 2007 15:04, insgesamt 1-mal geändert.

20. Juli 2006 09:58

Dein Feiertagstool zum Beispiel, kann ich mit den normalen UBP-Lizenzen nicht benutzen.... Sie haben kein Recht codeunit..... usw

Re: Drucker auswählen

9. Oktober 2008 15:56

Hei Timo ...

Ich muss einen Report zweimal ausgeben. Einmal auf dem normalen und ein zweites Mal auf
den PDF-Drucker.

Ich möchte den Report aber auf keinen Fall kopieren und ein zweites Mal aufrufen.

Also übergebe ich, über ein Codeunit, die vom Benutzer eingegebenen Optionen bei
einem zweiten automatischen Aufruf des Reports ... ich weiss aber
nicht wie ich einen anderen Drucker mitgeben kann.

Wann springt er überhaupt in die Funktion findprinter in der Codeunit 1.

Für eine Idee wäre ich dankbar.

Gruss aus Neuss

Gregor Müller

Re: Drucker auswählen

9. Oktober 2008 18:54

mueller_gregor hat geschrieben:ich weiss aber nicht wie ich einen anderen Drucker mitgeben kann.
Das habe ich in dem oben aufgeführten Beitrag beschrieben.

mueller_gregor hat geschrieben:Wann springt er überhaupt in die Funktion findprinter in der Codeunit 1.
Das geschieht automatisch durch die fin.exe, sobald ein Report gestartet wird.

Re: Drucker auswählen

10. Oktober 2008 11:04

Danke Timo ..

Ich hab es geschafft. Mein Problem bestand natürlich noch darin ... woran
erkennt die Codeunit 1, dass es sich um den zweiten Ausdruck (PDF-Ausdruck)
handelt.
Ich habe jetzt einfach in einer Tabelle vor dem zweiten Aufruf die USerid und
die Reporid weggeschrieben .. dies wird von der Codeunit 1 geprüft ... und
danach wird der Eintrag wieder gelöscht.

Ist leider ein bißchen umständlich aber ich kann dem Aufruf der findprinter-Funktion
keinen Paramterer mitgeben.

Danke noch mal für die Hilfe.

Gruss

Gregor Müller

Re: Drucker auswählen

10. Oktober 2008 11:14

Anstelle einer Tabelle könntest du auch eine SingleInstance-Codeunit verwenden und die Werte dort in globalen Variablen speichern und wieder abrufen.

Re: Drucker auswählen

13. Oktober 2008 13:04

Ich hab früher mal folgendes gecoded, um die Druckerauswahl zu manipulieren. Funktioniert, ist aber natürlich nicht schön. Inzwischen steuere ich die Drucker komplett über Automation Server. Das ist zuverlässiger und man kann aufgrund der Events NAV sogar warten lassen, bis der Druck beendet ist.

Code:
PrinterSel.RESET;
IF NOT PrinterSel.GET(_UserID,_ReportID) THEN BEGIN
  PrinterSel.INIT;
  PrinterSel."User ID" := _UserID;
  PrinterSel."Report ID" := _ReportID;
  PrinterSel."Printer Name" := CompInf."PDF Printer Name";
  PrinterSel.INSERT;
END ELSE BEGIN
  PrinterName := PrinterSel."Printer Name";
  PrinterSel."Printer Name" := CompInf."PDF Printer Name";
  PrinterSel.MODIFY;
END;

// Report drucken!

PrinterSel.GET(_UserID,_ReportID);
IF PrinterName = '' THEN
  PrinterSel.DELETE
ELSE BEGIN
  PrinterSel."Printer Name" := PrinterName;
  PrinterSel.MODIFY;
END;