View Full Version : "Fenster schließen" abfragen
Hab ich die Möglichkeit in meinem Programm darauf zu reagieren wenn ein Benutzer einfach das Fenster mit der 5250-Emulation schließt ohne das Programm ordnungsgemäß zu beenden.
Ich müsste in diesem Fall noch ein paar Dateiänderungen machen
Bei einem normalen Programmabruch mache ich die selben Dateiänderungen in der *PSSR.
Ich habs bereits mit SHTDN probiert. Funktioniert aber nicht.
Hat jemand noch eine Idee
Vielen Dank für Eure Mühe
Viele Grüsse Harald
Sieh' dir einmal die APIs CEERTX und CEEUTX (http://publib.boulder.ibm.com/infocenter/iadthelp/v7r0/topic/com.ibm.etools.iseries.pgmgd.doc/c0925076251.htm) an. Damit kann dein Programm noch bestimmte Aufgaben machen, nachdem es abnormal beendet wurde. Du mußt jedoch aufpassen, daß es dabei nicht hängenbleibt, denn es hilft kein ENDJOB, sondern nur noch ein ENDJOBABN (und den darf man erst 10 Minuten nach einem ENDJOB *IMMED machen).
Du musst einen
CHGJOB DEVRCYACN(*MSG)
durchführen.
Dann erhält das Programm bei Bildschirm-I/O eine Fehlermeldung.
Aber Achtung:
Programme, die diese Meldung ignorieren, können den Dialog schnell zu 100% belasten!
Begründung:
Nach READ/EXFMT wird die INFDS mit einem entsprechenden Fehler besetzt.
Wenn das Programm nun wie mit ENTER reagiert und ggf. nichts zu tun ist, wird sofort wieder auf den READ/EXFMT aufgesetzt, der natürlich sofort mit Fehler zurückkommt.
Ich halte meinen Job z.B. auf *DSCMSG.
Dadurch erhält das Programm erst die Nachricht, wenn der Job erneut verbunden wird, also quasi ein Wiederanlauf.
Es kann nun aber nicht unterschieden werden, ob der Job tatsächlich getrennt wurde oder eben nun doch wieder aktiv wird.
Bei *MSG musst du den Job dann ggf. selber noch beenden.
Hallo Herr Fuerchau,
wie muss ich das ganze implementieren ?
ich habe jetzt im aufrufenden CL den CHGJOB gemacht
im rpg hatte ich bereits die infds an der bildschirmdatei.
wie frage ich den status ab ?
ich habe hinter dem EXFMT abgefragt ob mein Status-Feld > 99 ist ?????
Entweder EXFMT mit Bezugszahl oder EXFMT(E).
Dann kannst du entweder die BZ oder %ERROR() abfragen.
Das gleiche gilt auch für READ(E) oder READ __ BZ.
Beim WRITE wird ggf. gar kein Fehler ausgelöst, wenn die Daten gepuffert werden, es sei denn du verwendest FRCDTA.
Bedenke, dass dein CLP ggf. den CHGJOB rückgängig macht (vorher also RTVJOBA).
Nachtrag:
Du solltest dann aber auch "Systemanfrage 2" (ENDRQS) überwachen, wenn du Abschlussarbeiten benötigst.
Hierzu muss dein CLP als "Anforderungsprozessor" eingerichtet werden:
DCL &MYKEY *CHAR 4
SNDPGMMSG MSG('/* */') TOPGMQ(*SAME) MSGTYPE(*RQS) KEYVAR(&MYKEY)
RCVMSG PGMQ(*SAME) MSGTYPE(*RQS) RMV(*NO)
Erst mit diesen Aktionen kannst du per MONMSG CPF1907 überhaupt einen ENDRQS überwachen.
Zum Schluss deines Programmes nur noch
RMVMSG MSGKEY(&MYKEY) CLEAR(*BYKEY)
Damit die "/* */"-Nachricht wieder verschwindet.
Also das mit dem exfmt(e) hat wunderbar geklappt. Das mit Systemabfrage 2 kann ich vernachlässigen da dies von den Anwendern nicht gemacht wird.
Vielen Dank für die Hilfe
Da der ENDRQS vom CL-Programm abgefangen wird, können die Abschlußarbeiten auch nur dort stattfinden, sofern das aufgerufene Programm keine eigenen "Cancel Handler" (siehe meinen Beitrag weiter oben) registriert hat.