PDA

View Full Version : "Fenster schließen" abfragen



harkne
23-01-08, 14:50
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

Pikachu
23-01-08, 15:11
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).

Fuerchau
23-01-08, 15:16
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.

harkne
23-01-08, 15:26
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 ?????

Fuerchau
23-01-08, 15:57
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).

Fuerchau
23-01-08, 16:03
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.

harkne
24-01-08, 08:03
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

Pikachu
24-01-08, 09:29
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.