Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Alexander W am 07.07.10 - 11:46:28
-
Hallo,
Wir haben hier eine Anwendung seit nun inzwischen 10 Jahren laufen, die ich immer wieder ein Stückchen weiter entwickle, einstmals für Version 5 geschrieben wurde und nun inzwischen auch weiter erfolgreich auf Version 8.5. Nun haben wir einen zentralen Farbdrucker angeschafft, der allerdings aus Kostengründen nicht immer alles in Farbe drucken soll.
Das übliche Drucken in der Anwendung war für die Mitarbeiter so gestaltet, dass sie in ihrer Maske (zum Briefeschreiben) einen Knopf hatten, mit dem dann als Aktion die folgenden Befehle aufgerufen wurden:
@Command([FileSave]);
@If(@DialogBox("Druckauswahl"; [AutoHorzFit] : [AutoVertFit])=1;@Do(
@Command([FilePrint];"1";"" ;"" ;"" ;"" ; "" ; "" ;"" ; "" ;"" );
@If(BKopie!="";
@Do(@Command([EditGotoField];"Bezbrf");
@Command([EditSelectAll]);
@Command([EditClear]);
@Command([EditInsertText];"Beglaubigte Kopie");
@Command([FilePrint];BKopie;"" ;"" ;"" ;"" ; "" ; "" ;"" ; "" ;"" ));
"");
@If(EKopie!="";
@Do(@Command([EditGotoField];"Bezbrf");
@Command([EditSelectAll]);
@Command([EditClear]);
@Command([EditInsertText];"Kopie");
@Command([FilePrint];EKopie;"" ;"" ;"" ;"" ; "" ; "" ;"" ; "" ;"" );
@PostedCommand([EditGotoField];"Bezbrf");
@PostedCommand([EditSelectAll]);
@PostedCommand([EditClear]);
@PostedCommand([EditInsertText];" ");
@PostedCommand([EditGotoField];"Brieftext"));
@Do(@PostedCommand([EditGotoField];"Bezbrf");
@PostedCommand([EditSelectAll]);@PostedCommand([EditClear]);
@PostedCommand([EditInsertText];" ");
@PostedCommand([EditGotoField];"Brieftext"))));"")
In der Dialogbox wurden die beiden Variablen EKopie und BKopie durch den Nutzer ausgewählt, er bekam dann ohne weiteres Zutun ein Original und die entsprechende Anzahl der verschiedenen Kopiearten ausgedruckt. Für die Zukunft habe ich mir überlegt, dass es der einfachste Weg ist, wenn ich bei den gerade mal 5 Anwendern, die die Anwendung nutzen, jeweils den Drucker zweimal installiere, einmal als Farbdrucker voreingestellt und einmal als Schwarzweißdrucker. Dann könnte ich die Anwendung hier so gestalten, dass einfach immer nur der jeweilige Drucker ausgewählt wird, an den dann der Druck gesandt wird. Also das Original an den Drucker Farbe und die beiden Kopien an den Drucker schwarz-weiß.
Nun habe ich hier im Forum gesucht und noch nichts ideales im Hinblick auf meine oben dargestellte Aktion gefunden. Außerdem habe ich entsprechend der Hilfefunktion mal einen Agenten in Script programmiert, den ich dann statt der Print-Befehle aufrufen wollte. Notes zeigt dann die Meldung an, das Dokument wäre noch nicht gespeichert. Kann mir da jemand weiterhelfen?
Vielen Dank und Grüße
Alexander W
-
Hallo,
ich wollte nur mal nachfragen, ob wir vielleicht doch jemand helfen kann?
Es wäre wirklich praktisch, wenn die Auswahl des Druckers möglich wäre. Meine weiteren Versuche, dazu einen beziehungsweise mehrere Agenten zu nutzen, sind fehlgeschlagen.
Vielen Dank für eure Mühe.
Alexander W.
-
Ein Denkansatz wäre, temporär den Standarddrucker zu verändern. Habe das einmal für ein Word-Dokument, das aus Notes erstellt und dann über einen PDF-Drucker ausgedruckt werden soll, realisiert. Dazu habe ich allerdings Word-Funktionalität mittels OLE per LotusScript verwendet. Vorgehensweise:
1. Standarddrucker merken
2. PDF-Drucker als Standarddrucker setzen
3. Dokument ausdrucken
4. Standarddrucker auf gemerkten Drucker zurücksetzen
Könnte für Dein Problem vielleicht auch brauchbar sein.
-
Standarddrucker wechseln war auch mein erster Gedanke.
Scheint aber u.U. problematisch zu sein:
http://atnotes.de/index.php/topic,20581.0.html
und
http://atnotes.de/index.php?topic=13855.0
Da findest du neben den Hinweisen auf eventuelle Risiken auch ein paar Ansätze wie man es trotzdem versuchen kann...
-
Hallo Mitch,
Du hast völlig Recht, das funktioniert mit Notes nicht. Hab das gerade mal zusammenkopiert und ausprobiert (Setzen des Standarddruckers über Word, Ausdrucken, und Standarddrucker wieder zurücksetzen). Es funktioniert alles, wie es soll, der Druckertreiber wird geändert und danach auch wieder zurückgesetzt. Nur Notes rallt nicht, dass der Standarddrucker gewechselt wurde (getestet mit Office 2003 und Notes 7.03 auf Windows XP -> ja, wir arbeiten in einem Museum :)). Poste den Code trotzdem, vielleicht geht das ja mit 8.5 oder es gibt noch einen Trick, oder, oder ...
Function SetzeStandardDrucker (drucker As String) As String
'Setzt drucker als Standarddrucker
'Gibt den derzeit gesetzten Standarddrucker zurück
Dim winword As Variant
Set winword = CreateObject ("Word.Application")
winword.Application.Visible = False
'Standarddrucker merken
Dim standarddrucker As String
standarddrucker = winword.Application.ActivePrinter
'Standarddrucker setzen
winword.Application.ActivePrinter = drucker
Call winword.Application.Quit
SetzeStandardDrucker = standarddrucker
End Function
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Dim doc As NotesDocument
Set doc = uidoc.Document
Dim standarddrucker As String
standarddrucker = SetzeStandardDrucker (doc.Drucker (0))
Call uidoc.Print
Call SetzeStandardDrucker (standarddrucker)
End Sub
-
Hallo Peter,
das ist ein bekanntes Notesfeature, dass der Wechsel des Standarddruckers bei laufendem Notesclient von diesem nicht beachtet wird.
An dem Problem haben m.W. schon etliche Entwickler ihre Tastaturen verschlissen und es nicht ans laufen bekommen.
Es gab mal -meine unter Notes 3 (ja - gabs wirklich mal)- einen API-Aufruf.
CU,
Axel
-
Man könnte den Ausdruck komplett über Word ausführen, denn dort klappt der Wechsel des Standarddruckers.
Vorgehensweise bei geöffnetem Dokument im Edit-Mode:
1. Dokument über das Frontend speichern (wg. Validierungsformeln)
2. Dokument in Lesemodus setzen
3. Alles markieren und in die Zwischenablage kopieren
4. Worddokument erstellen und Zwischenablage einfügen
5. Standarddrucker setzen, Worddokument ausdrucken, Standarddrucker zurücksetzen
6. Worddokument speichern, schließen, löschen
7. Dokument wieder in Edit-Mode setzen
Das ganze kann für den Benutzer unsichtbar ablaufen.
-
Vielen dank erstmal für die Hinweise, allerdings komm ich damit noch nicht so recht weiter.
In der Hilfe für Lotus Script gibt es ein Beispiel wie folgt:
4. This script prints one copy of the current document on the printer Printer247.
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Call uidoc.Print( 1, 0, 0, False, "Printer247" )
End Sub
Dieses hatte ich mir in einen Agenten kopiert und den Druckernamen geändert, das wollte ich aus meiner Aktion heraus aufrufen. Allerdings geht weder das noch ein direktes Aufrufen des Agenten. Das Ergebnis ist gleich null, also gar kein Ausdruck. Bei bestimmten Einstellungen zeigt Notes an "das Notes-Dokument wurde noch nicht gespeichert" und geht nicht weiter. Ist vielleicht was am Agenten falsch ?
Grüße
Alexander W.
-
Die Option mit dem Drucker ist neu, in der Hilfe zu Notes 7 steht die noch nicht. Wäre ja genau das, was Du suchst.
Ich würde jetzt erstmal nur Call uidoc.Print (1) verwenden, bis ein Ausdruck erfolgt. Und erst wenn das klappt, mit den anderen Optionen experimentieren. Den Fehler vermute ich nämlich woanders. Wie (bzw. von wo) rufst Du denn den Agenten oder das Script auf?
-
Also eigentlich soll das Drucken aus einer Aktion, die ich bisher in Formelsprache (s.o.) laufen hatte, aufgerufen werden. ich dachte, ich kann es einfach als Agent einbinden, weil ich die Aktion nicht in Script umschreiben wollte. Davon habe ich ehrlich gesagt nämlich keine Ahnung und bisher auch keine für mich verständliche Einführung gefunden.
Da ich den Agenten dann hatte, habe ich ihn testweise auch mal über das Menü Aktionen aufrufen wollen, das klappte aber nicht.
-
Dann hast Du bei Deinem Agenten nicht als Ziel "Keines" eingetragen (so heißt es zumindest unter Notes 7), sondern den Standard "Alle ausgewählten Dokumente" stehen gelassen.
-
testweise klappt inzwischen einfaches Drucken aus einer Aktion.
Bei der Benennung des Druckers muss man im Netzwerk drauf achten die richtigen Druckernamen zu verwenden, also genau so wie im Druckdialog angezeigt.
Jetzt fehlt mir nur noch die Einbindung in meine Formelfolge oben, also entweder als funktionierender Agent oder halt alles in Script. Kann mir da jemand auf die Sprünge helfen ?
PS: mit der Funktion kann man auch PDFs erstellen, das ist sehr hübsch !
-
Hallo,
jetzt funktioniert es, man sollte halt nicht einfach kopieren ! Ich habe im Agent noch das Ereignis von Click an Initialize geändert, so dass der Agent ohne Klick abläuft. Jetzt kann ich ihn aufrufen und drucken und PDFs erstellen, wie ich es gern möchte. Also es geht wohl erst ab 8.5, ob der Druckerwechsel früher möglich war, weiß ich nicht.
Grüße
Alexander W.
-
Der Parameter wurde tatsächlich erst mit 8.5.0 eingeführt.
Bernhard
-
Hallo,
Im Praxistest ist noch ein Problem aufgetaucht:
Ich muss ja noch meine beiden Variablen EKopie und BKopie an den Druckagenten übergeben. Ich habe hier jetzt mal gesucht, allerdings nichts gefunden, was mir wirklich weiterhilft. Da fehlt es noch ein Stückchen am Verständnis, wie ich in dem Lotus Skript Befehl mit solchen Variablen umgehen kann. Ich habe ja zur gleichen Zeit sozusagen eine Aktion und den Agenten laufen, also 2 verschiedene Dinge, die miteinander Daten austauschen müssen. Kann mir da jemand weiterhelfen?
Vielen Dank
Alexander W.
-
Du hast doch ein Script, dass den Agenten aufruft. Wenn Du in dem Script eine Sub erstellst, die das ausführt, was heute der Agent macht, kannst Du dort EKopie und BKopie als Parameter übergeben. Den Agenten brauchst Du dann nicht mehr.
Wenn Du allerdings noch den Formelaufruf verwendest, kannst Du EKopie und BKopie temporär in das Dokument schreiben und vom Agenten auslesen. Da Du das Dokument sowieso änderst (Kopie oder beglaubigte Kopie), sollte das kein Problem darstellen. Am Ende solltest Du die Felder aber wieder entfernen.
-
Also der Agent wird aus einer Formel auffgerufen, die variablen BKopie und EKopie aber immer im Dokument gespeichert. Deine Idee ist deshalb sehr gut und ich wollte das jetzt umsetzetn. Alllerdings kommt immer nur eine Kopie aus dem Drucker. Ich habe hier als Beispiel EKopie auf 2 im Dokument gesetzt und dann folgendes Skript im Agenten:
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim Anzahl As String
Dim Anzahl1 As Integer
Set uidoc = workspace.CurrentDocument
Anzahl = uidoc.FieldGetText ( "EKopie" )
Anzahl1 = Val ( Anzahl )
Call uidoc.Print( Anzahl1 , 0, 0, False, "FreePDF" )
Irgendwas scheint falsch zu sein. Aber im Gegensatz zum Formelbefehl brauche ich im Skript angeblich nach der Hilfe eine Integervariable für die Anzahl der Kopien beim Drucken. Vielleicht kann mir jemand auf die Sprünge helfen.
Vielen Dank
-
Val übersetzt in ein Double, probier doch mal Cint (Anzahl).
Zur Fehlersuche würde ich sonst einmal hart 2 eintragen und prüfen, ob 2 mal gedruckt wird.
-
Vielen Dank für die Hinweise, inzwischen funktioniert auch dies.
Interessant ist, dass beim Drucken auf einen echten Drucker die Kopienanzahl erkannt wird, beim Drucken in eine PDF-Datei (siehe mein Code oben) der Parameter aber ignoriert wird. Aber da braucht man ja auch meist nur eine einzige Kopie.
Nochmal vielen Dank
Alexander W.
-
Hallo,
also das setzten des Standard-druckers geht bei mir über WSH (somit auf windowsclients beschränkt).
Set WshNetwork = CreateObject("WScript.Network")
WshNetwork.SetDefaultPrinter Cstr("Druckerbezeichner"))
Die liste der möglichen Drucker kann ebenso mit der Methode ausgelesen werden.
Gruß
Armin
-
Hallo Armin,
das Problem ist aber, dass das den Notesclient ziemlich egal ist. Guckst Du (http://atnotes.de/index.php/topic,49047.msg315174.html#msg315174)
Kann die Erfahrungen nur bestätigen. Wir nennen das hier "Schneller Arbeitsplatzwechsel". Ich meine, der IE wäre ähnlich veranlagt ...
Markus
-
... Sorry, aber bei mir funktioniert das (in script, vor dem uidoc.print, den drucker wechsel, dann drucken und wieder zurück wechseln, das ganze mit nem 7er client auf XP). Ich kann die Probleme aus dem anderen Thread nicht nachvollziehen...
Gruß
Armin