Return to Mainframe Utilities Page
Module
ISREDIT MACRO (COLUMN1,COLUMN2,OPT1,OPT2,OPT3,OPT4,OPT5,OPT6,OPT7,OPT8)
ISPEXEC CONTROL ERRORS RETURN
/**** SET MESSAGE DISPLAY ON/OFF BASED ON THE DEBUG SWITCH ***/
ISPEXEC VGET (DBGSWTCH) PROFILE
IF &DBGSWTCH = &STR(ON) THEN CONTROL MSG LIST CONLIST SYMLIST NOFLUSH
ELSE CONTROL NOMSG NOLIST NOFLUSH NOPROMPT
IF &STR(&COLUMN1) = HELP THEN GOTO HELPSEC
/**********************************************************************/
/* UTILITY NAME : MISSING# */
/* AUTHOR : DAVE LEIGH */
/* DESCRIPTION : ADD MESSAGE LINES WHERE A MISSING SEQUENCE NUMBER */
/* : SHOULD BE. */
/**********************************************************************/
/**********************************************************************
/* SET SOME INITIAL VARIABLES. *
/**********************************************************************
ISREDIT (LRECL) = LRECL
ISREDIT (LN,CL) = CURSOR
SET LINES_ADDED = 0
SET COUNTER_VALUE = 0
SET LINETYPE = MSGLINE
DO &I = 1 TO 8
SET X = &&OPT&I
SET X = &X
IF &STR(&X) > THEN +
IF &STR(&X) = WRITE THEN SET LINETYPE = DATALINE
ELSE SET OPTIONS = &STR(&OPTIONS &X)
END
/**********************************************************************
/* PARSE, VALIDATE THE USER'S INPUT *
/**********************************************************************
IF &DATATYPE(&STR(&COLUMN1)) = CHAR OR +
&DATATYPE(&STR(&COLUMN2)) = CHAR OR +
&STR(&COLUMN1) = 0 OR +
&STR(&COLUMN2) = 0 OR +
&STR(&COLUMN1) = OR +
&STR(&COLUMN2) = OR +
&COLUMN2 < &COLUMN1 OR +
&COLUMN1 > &LRECL OR +
&COLUMN2 > &LRECL THEN +
DO
SET ZEDSMSG = &STR(INVALID PARAMETERS)
SET ZEDLMSG = &STR(YOU MUST PASS A BEGINNING AND ENDING COLUMN +
# TO THE MISSING# MACRO (E.G. "MISSING# 35 +
40"))
ISPEXEC SETMSG MSG(UTLZ001)
EXIT CODE(12)
END
/**********************************************************************
/* SET SOME MORE PROCESS VARIABLES. *
/**********************************************************************
SET A1 =
SET A2 =
DO &I = 1 TO &EVAL(&COLUMN1 - 2)
SET A1 = &STR(&A1>)
END
DO &I = &EVAL(&COLUMN2 - 2) TO &LRECL
SET A2 = &STR(&A2<)
END
SET NUMLEN = &COLUMN2 - &COLUMN1 + 1
/**********************************************************************
/* GO THROUGH THE LINES SPECIFIED BY THE USER *
/**********************************************************************
ISREDIT FIND FIRST P'=' &STR(&OPTIONS)
DO WHILE &LASTCC = 0
ISREDIT (LINE) = LINE .ZCSR
SET NUMBER = &SUBSTR(&COLUMN1:&COLUMN2,&STR(&SYSNSUB(1,&LINE)))
ERROR RETURN
SET NUMBER = &NUMBER
ERROR OFF
IF &DATATYPE(&STR(&NUMBER)) = NUM THEN +
IF &NUMBER > 0 THEN +
IF &COUNTER_VALUE = 0 THEN +
SET &COUNTER_VALUE = &NUMBER
ELSE +
DO
DO WHILE &EVAL(&NUMBER - &COUNTER_VALUE) > 1
SET COUNTER_VALUE = &COUNTER_VALUE + 1
SET X = &COUNTER_VALUE
SELECT
WHEN (&COUNTER_VALUE < 10) DO
DO &I = 1 TO &EVAL(&NUMLEN - 1)
SET X = &STR(0&X)
END
END
WHEN (&COUNTER_VALUE < 100) DO
DO &I = 1 TO &EVAL(&NUMLEN - 2)
SET X = &STR(0&X)
END
END
WHEN (&COUNTER_VALUE < 1000) DO
DO &I = 1 TO &EVAL(&NUMLEN - 3)
SET X = &STR(0&X)
END
END
WHEN (&COUNTER_VALUE < 10000) DO
DO &I = 1 TO &EVAL(&NUMLEN - 4)
SET X = &STR(0&X)
END
END
WHEN (&COUNTER_VALUE < 100000) DO
DO &I = 1 TO &EVAL(&NUMLEN - 5)
SET X = &STR(0&X)
END
END
WHEN (&COUNTER_VALUE < 1000000) DO
DO &I = 1 TO &EVAL(&NUMLEN - 6)
SET X = &STR(0&X)
END
END
WHEN (&COUNTER_VALUE < 10000000) DO
DO &I = 1 TO &EVAL(&NUMLEN - 7)
SET X = &STR(0&X)
END
END
WHEN (&COUNTER_VALUE < 100000000) DO
DO &I = 1 TO &EVAL(&NUMLEN - 8)
SET X = &STR(0&X)
END
END
WHEN (&COUNTER_VALUE < 1000000000) DO
DO &I = 1 TO &EVAL(&NUMLEN - 9)
SET X = &STR(0&X)
END
END
WHEN (&COUNTER_VALUE < 10000000000) DO
DO &I = 1 TO &EVAL(&NUMLEN - 10)
SET X = &STR(0&X)
END
END
OTHERWISE DO
SET ZEDLMSG = &STR(THE NUMBER WIDTH +
IS TOO BIG TO HANDLE)
ISPEXEC SETMSG MSG(UTLZ001)
EXIT CODE(12)
END
END
SET LINES_ADDED = &LINES_ADDED + 1
ISREDIT LINE_BEFORE .ZCSR = &LINETYPE +
<1 (A1) (COLUMN1) (X) +
&STR(&EVAL(&COLUMN2 + 2)) (A2)>
END
SET &COUNTER_VALUE = &NUMBER
END
ISREDIT FIND LAST P'=' .ZCSR .ZCSR
ISREDIT FIND NEXT P'=' &STR(&OPTIONS)
END
/**********************************************************************
/* WRAP UP *
/**********************************************************************
IF &LINETYPE = DATALINE THEN +
DO
SET ZEDSMSG = &STR(&LINES_ADDED LINES INSERTED)
SET ZEDLMSG = &STR(&LINES_ADDED SEQUENCE SKIPS FOUND.+
"F '<<<<<<' TO SEE INSERTED LINES)
END
ELSE +
DO
SET ZEDSMSG = &STR(&LINES_ADDED SKIPS MARKED)
SET ZEDLMSG = &STR(&LINES_ADDED SEQUENCE SKIPS FOUND.+
"L SPECIAL" TO SEE EACH ONE)
END
ISPEXEC SETMSG MSG(UTLZ000)
ISREDIT CURSOR = &LN &CL
EXIT
HELPSEC: + 02480000
ISPEXEC SELECT PGM(ISPTUTOR) PARM(HELPSHEL) 02490000
SET ZEDLMSG = &STR(*** HELP DISPLAYED FOR MISSING# UTILITY + 02490000
*** NO PROCESSING PERFORMED ***) 02490000
ISPEXEC SETMSG MSG(UTLZ000) 02490000
EXIT
Documentation
MISSING# is an edit macro which helps you find missing numbers in a column
which is supposed to have numbers in sequence. For instance, if you are
working on a document of some type where you have numbered bullets. If those
numbers are in a consistent column (right or left justified), MISSING# can tell
you if you missed any numbers in your sequencing process. If, for example, you
numbered one item "23" and the next item "27" accidently, MISSING# would insert
ISPF/PDF editor "message lines" before item "27" which told you that sequence
numbers "24", "25", and "26" were missing.
Syntax is as follows:
COMMAND ===> missing# n1 n2 {other operands}
"n1" is the beginning column of the number and "n2" is the ending column of the
number. "other operands" would be things like "x" or an edit label range to
limit the processing. The operands are optional and the whole file is
processed if no operands are specified.

0 Comments