[GRLÖST] USERID zur Laufzeit in der Printer Selection ...

3. Januar 2018 15:23

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
Zuletzt geändert von MSNAVLerner am 5. Januar 2018 11:02, insgesamt 3-mal geändert.

Re: USERID zur Laufzeit in der Printer Selection definieren

3. Januar 2018 16:14

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

3. Januar 2018 16:23

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

3. Januar 2018 16:47

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

3. Januar 2018 18:45

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

4. Januar 2018 09:32

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 ...

4. Januar 2018 13:04

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 ...

4. Januar 2018 16:11

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 ...

4. Januar 2018 16:51

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 ...

4. Januar 2018 17:16

Ich wäre gestern besser im Bett geblieben. :oops:

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 ...

5. Januar 2018 11:01

Jetzt hat es funktioniert, prima.
Danke!