Report.Runmodal wirkungslos

12. März 2010 19:21

In einer Codeunit werden innerhalb einer Funktion diverse Reports aufgerufen, alle mit RUNMODAL. Die Funktion läuft jedoch einfach durch, ohne dass die nächsten Reports warten würden, bis der jeweils vorangehende ausgeführt wurde.

Kann es sein, dass im RTC Reports nicht mehr mit RUNMODAL ausgeführt werden können?

Re: Report.Runmodal wirkungslos

12. März 2010 19:49

Bist du dir sicher, dass der restliche Quelltext nicht wartet? Wie hast du das festgestellt?
Hast du zum Vergleich den gleichen Vorgang mit dem CC ausgeführt?

Re: Report.Runmodal wirkungslos

11. Juni 2010 11:34

das gleiche problem tritt bei mir auch auf.
nach der reportausführung soll der entsprechende datensatz gelöscht werden.
nun wird zwar dem report noch der richtige satz übergeben, zur laufzeit ist der satz aber schon weg.

wollte ausweichen auf temp. record, doch einen temp. record darf man nicht mit settableview übergeben,
und eine globale funktion vor ausführen des reports darf man auch nicht aufrufen.

microsoft hat sich da mal wieder sehr wenig gedanken gemacht bei der entwicklung:
hauptsache bunt, obs richtig funktioniert ist egal

Re: Report.Runmodal wirkungslos

11. Juni 2010 14:39

rotsch hat geschrieben:In einer Codeunit werden innerhalb einer Funktion diverse Reports aufgerufen, alle mit RUNMODAL. Die Funktion läuft jedoch einfach durch, ohne dass die nächsten Reports warten würden, bis der jeweils vorangehende ausgeführt wurde.

Kann es sein, dass im RTC Reports nicht mehr mit RUNMODAL ausgeführt werden können?


Ich glaube das geht für RTC's nicht mehr.
Im Classic Client bringt er beim kompilieren ja auch einige Warnungen zu bisher gebräuchlichen Befehlen.

Code:
Funktion 'RUNMODAL' ist für Microsoft Dynamics NAV Server veraltet.
Funktion 'SETTABLEVIEW' ist für Microsoft Dynamics NAV Server veraltet.
Funktion 'FILENAME' ist für Microsoft Dynamics NAV Server veraltet.
Funktion 'SHELL' ist für Microsoft Dynamics NAV Server veraltet.
Funktion 'OSVERSION' ist für Microsoft Dynamics NAV Server veraltet.
Funktion 'BEEP' ist für Microsoft Dynamics NAV Server veraltet.


Gruß,
winfy

Re: Report.Runmodal wirkungslos

12. Juni 2010 08:16

Hmm, für RUNMODAL und/oder SETTABLEVIEW kann ich unter NAV 2009 SP1 nicht bestätigen, dass sie als veraltet markiert werden, für die anderen Befehle stimmt das.

Zum eigentlichen Problem:

By Design ist es aktuell so, dass aus dem RTC gestartete modale Reports mit (neuem) RDL-Design wie erwartet funktionieren. Bei Reports mit klassischem Design, bei denen also ein automatisches Fallback auf den klassischen Report und damit den Classic Client durchgeführt wird, ist das verhalten anders: Diese Reports werden nicht modal ausgeführt, dahinter liegender Programmcode wird also trotz modalem Aufruf ausgeführt. Weniger praktikabel ist allerdings, dass per RUNMODAL über den RTC aufgerufene Classic-Reports auch nicht asynchron starten, bis programmintern im RTC ein bestimmter Status erreicht ist - nennen wir das mal interne Transaktion.

Code:
REPORT.RUNMODAL(50000); // Classic Layout
SLEEP(10000);

Obiger Code wartet 10 Sekunden und startet dann, vorausgesetzt es gibt keinen weiteren Code in dieser Transaktion, den Report. Eine Quasi-synchrone Ausführung ist nur durch forcieren des Transaktionsendes möglich.

Ich empfehle auf jeden Fall die Nutzung von RDL-Reports.

Ich hoffe das dient zur Klarstellung des Problems.

Re: Report.Runmodal wirkungslos

14. Juni 2010 12:50

Hallo silverx

erst mal danke für die Hinweise.
Wie meinst Du: "Eine Quasi-synchrone Ausführung ist nur durch forcieren des Transaktionsendes möglich."?

Kann ich das Ende eines Reports abfangen?

Oder anders gefragt, könnte man nach dem Aufruf eines Classic Reports in RTC eine Schleife anbauen,
die solange wartet, bis der Report fertig ist?

Gruß
Gollum
Zuletzt geändert von Gollum83 am 14. Juni 2010 13:44, insgesamt 1-mal geändert.

Re: Report.Runmodal wirkungslos

14. Juni 2010 13:19

Gollum83 hat geschrieben:Oder anders gefragt, könnte man nach dem Aufruf eines Classic Reports in RTC eine Schleife anbauen,
die solange wartet, bis der Report fertig ist?

Hallo Gollum,

eine denkbare Möglichkeit wäre, im OnPostReport einen Boolean-Wert an eine SingleInstance-Codeunit zu übergeben, durch welchen mitgeteilt wird, dass der Report nun durchgelaufen ist.
Code:
OnPostReport()
SingleInstanceCU.SetEOT;


In deinem aufrufenden Programmcode baust du dann hinter deinem Report-Aufruf eine Schleife ein, welche so lange immer und immer wieder einen SLEEP ausführt, bis von der Codeunit die Rückmeldung kommt.
Code:
REPORT.RUN(Report::"54711");
REPEAT
  SLEEP(1000);
UNTIL SingleInstanceCU.EOT;  // EOT=End of Transaction = Name einer Funktion

Re: Report.Runmodal wirkungslos

14. Juni 2010 13:46

Hallo Timo,

das ist ja genial.So werd ich es machen.
Großes merci

Gruß
Gollum

Re: Report.Runmodal wirkungslos

14. Juni 2010 17:56

Warten per SLEEP ist in einer solchen Konstellation (Classic Layout im RTC) wirkungslos. Einzig und allein der (folgende, zusätzliche) Aufruf einer modalen Page oder eines modalen RDL-Reports funktioniert und startet den Report.

Re: Report.Runmodal wirkungslos

15. Juni 2010 08:12

Hallo SilverX,

meinst du man soll erst irgendeinen Hilfs RDL Report modal aufrufen,
der dann wiederum einen Classic Report startet?

Re: Report.Runmodal wirkungslos

15. Juni 2010 14:09

Niccht ganz. Nach dem RUNMODAL welcher bei Reports mit Classic Layout aus dem RTC nicht modal ist, musst du dafür sorgen, dass der Report im Programmfluss überhaupt angestartet wird. Das kann man durch den modalen Aufruf (hinter Report.RUNMODAL) einer Page erreichen. Damit diese Page dann aber nicht angezeigt wird, sondern nur den Trigger liefert, damit der Report startet, kannst du im OnOpenPage() einen ERROR setzen. Damit allerdings der ERROR nichts unterbricht, musst du diesen Aufruf wiederum in ein CODEUNIT.RUN mit Abfrage des Rückgabewertes einbetten.

Obiges führt nicht zur modalen Ausführung des Reports, aber zumindest schonmal dazu, dass der Report überhaupt innerhalb eines Programmflusses angestartet wird. Es ist weitere logik erforderlich, um auf die Beendigung des Reports zu warten.

Re: Report.Runmodal wirkungslos

15. Juni 2010 14:26

das hört sich ja mächtig kompliziert an...
da wir mehrere classic reports dringend behalten müssen,
wär das natürlich ein gewaltiger aufwand

muss bei gelegenheit wirklich den Tip von Timo testen

Re: Report.Runmodal wirkungslos

15. Juni 2010 18:19

Ja, der Tipp von Timo ist vollkommen OK und sinnvoll. Leider wird ein REPORT.RUNMODAL() mit einem Classic Layout aus dem RTC heraus gar nicht erst gestartet und die Schleife wartet endlos, da die Bedingung niemals zutrifft.

Re: Report.Runmodal wirkungslos

15. Juni 2010 20:43

SilverX hat geschrieben:Ja, der Tipp von Timo ist vollkommen OK und sinnvoll. Leider wird ein REPORT.RUNMODAL() mit einem Classic Layout aus dem RTC heraus gar nicht erst gestartet und die Schleife wartet endlos, da die Bedingung niemals zutrifft.

Wenn du dir meinen Programmcode ansiehst, dann erkennst du, dass dort ein REPORT.RUN(...) steht. Somit müsste der Report dann doch ganz normal gestartet werden und NAV wartet in der Schleife, bis der Report das EOT gesetzt hat. Oder?

Re: Report.Runmodal wirkungslos

15. Juni 2010 22:42

Timo Lässer hat geschrieben:Wenn du dir meinen Programmcode ansiehst, dann erkennst du, dass dort ein REPORT.RUN(...) steht. Somit müsste der Report dann doch ganz normal gestartet werden und NAV wartet in der Schleife, bis der Report das EOT gesetzt hat. Oder?

Das hatte ich tatsächlich übersehen. Allerdings ändert das nichts am falschen Verhalten. Ich versuchs mal so darzustellen:
Code:
SalesHeader.SETRANGE("Document Type", SalesHeader."Document Type"::Order);
SalesHeader.SETRANGE("No.", '101005');
REPORT.RUN(205, TRUE, FALSE, SalesHeader); // Report 205 wurde das RDL-Layout entfernt, so dass aus dem RTC ein Fallback stattfinden muss

SLEEP(10000);

MESSAGE('End');

Erwartungsgemäß sollte obiger Code den Report starten und die ReqForm öffnen. Ca. 10 Sekunden später sollte "End" in einer MessageBox angezeigt werden. Tatsächlich allerdings wird nach ca. 10 Sekunden zunächst die MessageBox angezeigt, kurz danach öffnet sich die ReqForm des Reports.
Enthält der obige Report aber RDL-Layout, dann funktioniert das Konstrukt wie erwartet, auch RUNMODAL wird modal ausgeführt, was ohne RDL-Layout ebenfalls nicht der Fall ist.

Das betrifft wie geschrieben nur den RTC, im Classic Client funktioniert obiger Code wie gewünscht.

Re: Report.Runmodal wirkungslos

18. Juni 2010 10:10

SilverX hat geschrieben:Hmm, für RUNMODAL und/oder SETTABLEVIEW kann ich unter NAV 2009 SP1 nicht bestätigen, dass sie als veraltet markiert werden, für die anderen Befehle stimmt das.


Bei mir bringt er das zumindestens in der NAV 2009 SP1 Fehlerliste vom Compiler als Warnung mit (siehe Bild).
Meine Vermutung war das diese Funktionen beim RTC ein unerwünschtes Verhalten hervorrufen können.
Was ja auch hier in den vorherigen Beiträgen festgestellt wurde.

Report.Run war übrigens auch dabei!

Gruß winfy
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Report.Runmodal wirkungslos

22. Oktober 2010 09:14

rotsch hat geschrieben:Kann es sein, dass im RTC Reports nicht mehr mit RUNMODAL ausgeführt werden können?


Wenn sie kein RTC-Layout haben, dann ja.
Hierzu nun ein MS-Statement in Form eines Blog-Eintrags: Running classic reports in RTC (RUNMODAL and a few other things)