Asserting the Ostensibly Unassertable
May 25, 2011 Hey, Ted
Assertions are great for validating conditions that can be tested with IF, DOW, SELECT, etc., but what about other types of conditions? For instance, can I use an assertion to test that a variable contains valid decimal data?
–A Nice Lady
(I’m sorry. A nice lady asked me this question in person and I forgot her name.)
Yes, it is possible to check for conditions that one cannot test with conditional OPCODES such as IF, but you must use a different method.
When something goes amiss, the system loads a five-digit, zoned-decimal status code with a non-zero value. You can access this status through file and program status data structures, but that is so 20th century. The modern way is to use the %STATUS built-in function. The status for invalid decimal data is 907. You can find a complete list of status codes in the RPG reference manual.
Here’s one possibility:
H dftactgrp(*no) actgrp(*new) H bnddir('TOOLKITBD') D AGoodPgm pr extpgm('AGOODPGM') D inDecNbr 5p 0 D AGoodPgm pi D inDecNbr 5p 0 D DecNbr s like(inDecNbr) D Status s 5s 0 /copy prototypes,assert /copy qrpglesrc,psds /free *inlr = *on; monitor; DecNbr = inDecNbr; on-error; Status = %status; endmon; assert (Status = *zero: %trimr(psdsProcName) + ' canceled with status ' + %editc(Status: 'X')); return;
Here’s another method with more specific error handling:
monitor; DecNbr = inDecNbr; on-error 907; assert (*off: 'Parameter inDecNbr has invalid decimal data'); on-error; Status = %status; assert (*off: %trimr(psdsProcName) + ' canceled with status ' + %editc(Status: 'X')); endmon;
In each case, the assertion will fail, immediately halting the program, if the inDecNbr parameter does not contain valid decimal data.