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.