Seite 1 von 1
[GRLÖST] USERID zur Laufzeit in der Printer Selection ...
Verfasst: 3. Januar 2018 15:23
von MSNAVLerner
Hey Leute,
ich stehe auf dem Schlauch.
Mein NAS-User führt regelmäßig Reports aus.
Nun habe ich einen Fall, bei dem - abhängig von verschiedenen Parameter - ein Bericht an dem einen oder anderen Drucker ausgedruckt werden soll.
Wie bekomme ich es hin, dass ich - bevor der Report ausgeführt wird - ich diesem mitgeben kann an welchem Drucker gedruckt werden soll?
Mein Plan ist zur Laufzeit dem Bericht einen andere USERID mitzugeben.
Ist dies so realisierbar?
So sieht der Eintrag in der Printer Selection Tabelle aus
- Code:
USERID Berichts-ID Druckername
HANS 50500 DruckerA
PETER 50500 DruckerB
LISE 50500 DruckerC
Grüße
Re: USERID zur Laufzeit in der Printer Selection definieren
Verfasst: 3. Januar 2018 16:14
von fiddi
Hallo,
wenn du Codeunit 1 bearbeiten darfst, kannst du eine Funktion definieren, die die nötigen Informationen in CU1 abspeichert bevor das System den Drucker in CU1 sucht. In dieser Funktion setzt du halt die nötigen Parameter und sorgst so dafür dass deine gesetzten Parameter als der Funktion FindPrinter zurück gegeben werden.
Gruß Fiddi
Re: USERID zur Laufzeit in der Printer Selection definieren
Verfasst: 3. Januar 2018 16:23
von MSNAVLerner
Zugriff auf Cun1 habe ich, geht das nur dort in meinem Fall?
Wann genau wird die Cun1 Funktion FindPrinter aufgerufen?
Würde nur ungern die Standardfunktion "FindPrinter" modifizieren, wenn sich das vermeiden lässt.
Re: USERID zur Laufzeit in der Printer Selection definieren
Verfasst: 3. Januar 2018 16:47
von MSNAVLerner
Ich denke gerade an sowas hier.
- Code:
PrinterSelection.RESET;
PrinterSelection.SETRANGE(USERID, 'HANS');
IF PrinterSelection.FINDFIRST THEN BEGIN
REPORT.RUNMODAL(PrinterSelection."Report ID", FALSE, FALSE, recSoundSo);
END;
Das müsste dann noch irgendwie hier reingewuschtelt werden
- Code:
// Bericht am Platz X drucken
reportDruck.Def(recPhaseSP);
reportDruck.USEREQUESTFORM(FALSE);
reportDruck.RUN;
Re: USERID zur Laufzeit in der Printer Selection definieren
Verfasst: 3. Januar 2018 18:45
von fiddi
Zugriff auf Cun1 habe ich, geht das nur dort in meinem Fall?
Ja
Wann genau wird die Cun1 Funktion FindPrinter aufgerufen?
Der wird vom Report.RUN aus dem System heraus aufgerufen.
Deine Funktion in muss also vor dem Aufruf von Report.RUN in CU1 die Parameter setzen. Da CU1 eine SingleInstance- Codeunit ist, kannst du CU1 lokal definieren, und die Parameter setzten. Das System wird dann auf die Werte Zugriff haben.
Würde nur ungern die Standardfunktion "FindPrinter" modifizieren, wenn sich das vermeiden lässt.
Kann ich verstehen, ist aber die einzige Möglichkeit
Der Aufruf:
- Code:
CU1.Setparam(USERID);
Report.RUN
die Funtion in CU1 (GlobalUserid ist eine globale Varible von Typ Code50):
- Code:
Function Setparm(pUserID:Code[50])
BEGIN
GlobalUserID := pUserID;
END;
die Funktion FindPrinter benötigt eine lokale Variable LocalUserid:
- Code:
BEGIN
LocalUserid := GlobalUserID; // diese zwei Zeilen sorgen dafür das GlobalUserid beim nächsten Aufruf von Report.RUN garantiert wieder gelöscht ist, egal ob ein Fehler auftritt oder nicht
GlobalUserid := '';
if LocalUserid = '' THEN
LocalUserid :=USERID;
CLEAR(PrinterSelection);
IF NOT PrinterSelection.GET(LocalUserid,ReportID) THEN
IF NOT PrinterSelection.GET('',ReportID) THEN
IF NOT PrinterSelection.GET(LocalUserid,0) THEN
IF PrinterSelection.GET('',0) THEN;
EXIT(PrinterSelection."Printer Name");
END
Du musst aber sicherstellen das du CU1.Setparm unmittelbar vor JEDEM zu ändernden Report.RUN aufrufst, damit die Userid immer gelöscht wird, bevor du einen anderen Report aufrufst, oder ein Fehler passieren kann.
Gruß Fiddi
Gruß Fiddi
Re: USERID zur Laufzeit in der Printer Selection definieren
Verfasst: 4. Januar 2018 09:32
von MSNAVLerner
Okay, also im Endeffekt funktioniert die FindPrinter wie bisher auch, außer rufe vor einem Report.RUN die SetParamID-Funktion der CUN1 auf und befülle diese mit meiner gewünschten USERID.
Ich denke so einen Eingriff in die Cun1 ist okay.
Danke vielmals!
Re: USERID zur Laufzeit in der Printer Selection ...
Verfasst: 4. Januar 2018 13:04
von MSNAVLerner
Umgesetzt, doch die globale UserID-Variable ist zur Laufzeit vom Report leer.
// Beleg drucken
repDruckAmPlatz.Def(recLBK);
repDruckAmPlatz.DefSammelkennzeichen(codNummer);
repDruckAmPlatz.USEREQUESTFORM(FALSE);
g_cun1.SetParamForModifyFindPrinter(codPlatz); // definieren welche USERID den Report ausführt
repDruckAmPlatz.RUN;
CLEAR(repDruckAmPlatz);
Habe ich irgendwas übersehen?
Re: USERID zur Laufzeit in der Printer Selection ...
Verfasst: 4. Januar 2018 16:11
von fiddi
Hallo,
die GlobalUserid wird sofort nach dem Aufruf von FindPrinter und der Zuweisung wieder gelöscht, damit auch im Fehlerfall (hier höchst unwahrscheinlich aber möglich) beim nächsten Aufruf nichts falsches in der Variable steht.
Die LocalUserid (sollte auch eine lokale Variable von FindPrinter sein) wird benutzt um den Drucker zu finden. Was in USERID steht ist belanglos, falls du den Parameter übergeben hast.
Eine Besonderheit gibt es bei den SingleInstance- Codeunits noch. Du muss den Client nach einer Änderung neu starten, damit die Änderung gezogen wird.
Gruß Fiddi
Re: USERID zur Laufzeit in der Printer Selection ...
Verfasst: 4. Januar 2018 16:51
von MSNAVLerner
Alles genauso umgesetzt.
Debugge ich, dann sehe ich wie die neue Funktion den übergebenen User in die Global reinschreibt.
Direkt danach läuft dann der Report.RUN und geht direkt zu FindPrinter und da ist die Global dann leer.
Re: USERID zur Laufzeit in der Printer Selection ...
Verfasst: 4. Januar 2018 17:16
von fiddi
Ich wäre gestern besser im Bett geblieben.
Du hast natürlich recht. aber das ändert nur wenig an der Funktionalität.
Es wird nur ein wenig komplizierter.
Damit das ganze funktioniert benötigen wir eine SingleInstance- Codeunit.
die enthält mindestens die Funktionen Setparm, die wir schon kennen, und die Funktion Getparm und die globale Variable GlobalUserID
- Code:
Procedure GETparm () ResultUserID : Code[50]
BEGIN
ResultUserID := GlobaleUserID;
GlobalUserID:= '';
END;
in FindPrinter definierst du jetzt die O.G. Cosdunit als Lokale Variable und den Code
- Code:
LocalUserid := GlobalUserID;
GlobalUserid := '';
durch
- Code:
LocalUserID := SingleInstanceCU.GetParam;
Die GlobalUserID wird jetzt natürlich nicht mehr in CU1 benötigt.
Gruß Fiddi
Re: USERID zur Laufzeit in der Printer Selection ...
Verfasst: 5. Januar 2018 11:01
von MSNAVLerner
Jetzt hat es funktioniert, prima.
Danke!