PDA

View Full Version : Exception (nach Sql-Error) werfen



tarkusch
22-01-17, 08:09
Hallo,

ich hätte vor in ein Programm, das im Batch läuft, diverse Dateioperationen mittels Sql abzulösen.
Im Programm wird ja bei einem Write, bei einem doppelten Schlüssel, eine Nachricht an den Sysopr geschickt.

Ich hätte nun versucht beim Insert den Sqlstate abzufragen und mit Hilfe der API QMHSNDPM eine Msg zu schicken.

Ich bekomme aber keine Nachricht auf den SYSOPR.



DQMHSNDPM PR ExtPgm('QMHSNDPM')
D MsgID 7A Const
D MsgFile 20A Const
D MsgData 256A Const
D MsgDtaLen 10I 0 Const
D MsgType 10A Const
D StackEntry 10A Const
D StackCount 10I 0 Const
D MsgKey 4A Const
D ErrorCode 16A Const
D
D$MsgId S 10A Inz('CPF9898 ')
D$MsgFile S 20A Inz('QCPFMSG QSYS ')
D$MsgDta S 80A Inz
D$MsgDtaLen S 10I 0 Inz
D
D ErrorCode ds
D BytesProv 10I 0 inz(0)
D BytesAvail 10I 0






$MsgDta = 'SQL ERROR: '
+ %trimr(SDSPGM)
+ ' Fehler beim Import aufgetreten';

QMHSNDPM( $MsgId
: $MsgFile
: $MsgDta
: %len( %trimr($MsgDta))
: '*ESCAPE'
: '*'
: 2
: *blanks : ErrorCode );





SBMJOB CMD(CALL PGM(TEST01) PARM(' '))

Der Aufruf an *LIBL/QMHSNDPM wurde fehlerhaft beendet (C G D F).


Das Programm hat einen *ENTRY Parameter.
Was mache ich falsch?

Kann ich eleganter eine exception auf den Sysopr werfen?

Dank im Voraus

Tarki

Fuerchau
22-01-17, 17:03
Es ist das falsche API.
Du kannst nur Nachrichten an die diversen Ebenen des Callstacks versenden.
QMHSNDPM entspricht dem SNDPGMMSG. Eine MSGQ kannst du damit nicht erreichen.
Das richtige API ist QMHSNDM (ohne P):
http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/apis/QMHSNDM.htm

tarkusch
25-01-17, 07:36
Morgen,

ich habe das api QMHSNDM ausprobiert:



// Message = 'Fehler aufgetreten! Test';
// QMHSNDM( *blanks
// : *blanks
// : Message
// : %len(Message)
// : '*INQ'
// : MsgQ
// : %elem(MsgQ)
// : '*PGMQ'
// : MsgKey
// : ErrorCode );


Ich prüfe Daten für den Import, nur wenn die ok sind möchte ich eine weitere Verarbeitung, ansonsten muss der Import-File bearbeitet werden und noch einmal eingespielt werden.

Mein Rpg programm wird von einem CL aufgerufen und ich hätte gerne das das Rpg Programm "stürzt" und das aufrufende CL auch.

Habt ihr Vorschläge für mich?

Dank im Voraus

Tarki

Fuerchau
25-01-17, 07:41
Dies ist dann wieder eine SNDPGMMSG (QMHSNDPM) vom Typ *ESCAPE.
Hier gibst du den Callstack an, an den die Nachricht geht.
* = Du selbst (das geht auch, allerdings bekommt das CLP dann eine RPG-Nachricht und nicht deine)
1 = nächst höhere (bei ILE ist das die aufrufende Prozedur oder die RPG-Main)
2 = noch höher ...