Return to Mainframe Utilities Page
Module
ISREDIT MACRO (COLUMN1,COLUMN2,COLUMN3) 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 /**********************************************************************/ /* UTILITY NAME : ADDCOL */ /* DATE WRITTEN : 4-19-89 */ /* AUTHOR : DAVE LEIGH */ /* DESCRIPTION : ADD UP THE NUMBERS IN A COLUMN OF NUMBERS WITHIN A */ /* : FILE BEING EDITED IN ISPF */ /*========================== MODIFICATIONS ===========================*/ /* WHO ¦WHEN ¦WHY */ /* --- ¦---- ¦--- */ /* DAVE LEIGH ¦3-26-90 ¦ADDED CODE TO DETERMINE THE NUMBERING MODE */ /* ¦ ¦TO SEE IF IT'S COBOL OR NOT BECAUSE THIS */ /* ¦ ¦AFFECTS THE COLUMNS THAT ARE RETURNED TO */ /* ¦ ¦THE MACRO FOR COMPUTATION. */ /**********************************************************************/ IF &LENGTH(&STR(&COLUMN2)) = 0 THEN + IF &STR(&COLUMN1) = &STR(HELP) THEN GOTO HELPSEC ELSE + DO SET ZEDSMSG = &STR(2ND COLUMN MISSING) SET ZEDLMSG = &STR(YOU MUST PASS A BEGINNING AND ENDING + COLUMN # TO THE ADDCOL MACRO (E.G. " + ADDCOL 35 40")) ISPEXEC SETMSG MSG(UTLZ001) EXIT END IF &LENGTH(&STR(&COLUMN3)) > 0 AND + &COLUMN1 > &COLUMN3 AND + &COLUMN3 > &COLUMN2 THEN + DO SET ZEDLMSG = &STR(THE DECIMAL POINT COLUMN MUST BE > THE 1ST + COLUMN AND < THE 2ND COLUMN) ISPEXEC SETMSG MSG(UTLZ001) EXIT END ISREDIT (NUMVAR1,NUMVAR2) = NUMBER IF &NUMVAR2 = &STR(NOSTD COBOL NODISPL) THEN + DO SET COLUMN1 = &COLUMN1 - 6 SET COLUMN2 = &COLUMN2 - 6 IF &STR(&COLUMN3) > THEN SET COLUMN3 = &COLUMN3 - 6 END ISREDIT (SLINE,SCOL) = CURSOR SET COUNT = 0 SET NUMCOUNT = 0 SET CHARCOUNT = 0 SET AMOUNT = 0 ISREDIT CURSOR = 1 0 SET SAVECC = 0 ISREDIT FIND NEXT P'=' 1 X SET SAVECC = &LASTCC SET XCOLUMN1 = 1 SET XCOLUMN2 = &COLUMN2 - &COLUMN1 + 1 SET XCOLUMN3 = &COLUMN3 - &COLUMN1 + 1 SET LENDATA = &COLUMN2 - &COLUMN1 + 1 DO WHILE &SAVECC = 0 ISREDIT (DATA) = LINE .ZCSR SET XDATA = &SUBSTR(&COLUMN1:&COLUMN2,&STR(&SYSNSUB(1,&DATA))) SET NDX = 1 DO WHILE &NDX <= &LENDATA IF &SYSINDEX(&STR( ),&STR(&SYSNSUB(1,&XDATA))) = &NDX THEN + DO SET A = &NDX - 1 SET B = &NDX + 1 SET XDATA1 = SET XDATA2 = IF &A > 0 THEN + SET XDATA1 = &SUBSTR(1:&A,&STR(&SYSNSUB(1,&XDATA))) IF &B <= &LENDATA THEN + SET XDATA2 = &SUBSTR(&B:&LENDATA,+ &STR(&SYSNSUB(1,&XDATA))) SET XDATA = &STR(&SYSNSUB(1,&XDATA1))+ &STR(0)+ &STR(&SYSNSUB(1,&XDATA2)) END SET NDX = &NDX + 1 END IF &LENGTH(&STR(&COLUMN3)) > 0 THEN + DO SET A = &XCOLUMN3 - 1 SET B = &XCOLUMN3 + 1 SET XDATA1 = &SUBSTR(&XCOLUMN1:&A,&STR(&XDATA)) SET XDATA2 = &SUBSTR(&B:&XCOLUMN2,&STR(&XDATA)) SET XDATA = &STR(&XDATA1)&STR(&XDATA2) END ELSE SET XDATA = &SUBSTR(&XCOLUMN1:&XCOLUMN2,&STR(&XDATA)) IF &DATATYPE(&STR(&XDATA)) = CHAR THEN + SET CHARCOUNT = &CHARCOUNT + 1 ELSE + DO SET NUMCOUNT = &NUMCOUNT + 1 SET AMOUNT = &AMOUNT + &XDATA END SET COUNT = &COUNT + 1 ISREDIT FIND NEXT P'=' 1 X SET SAVECC = &LASTCC END ISREDIT CURSOR = &SLINE &SCOL IF &COUNT = 0 THEN + DO SET ZEDLMSG = &STR(LINES TO BE ACCUMULATED MUST BE "EXCLUDED" + WITH AN "X" IN THE LINE NUMBER) ISPEXEC SETMSG MSG(UTLZ001) END ELSE + DO IF &LENGTH(&STR(&COLUMN3)) > 0 THEN + DO SET POINT = &COLUMN2 - &COLUMN3 SET LENAMT = &LENGTH(&STR(&AMOUNT)) SET POINT = &LENAMT - &POINT SET AMT1 = &SUBSTR(1:&POINT,&STR(&AMOUNT)) SET POINT = &POINT + 1 SET AMT2 = &SUBSTR(&POINT:&LENAMT,&STR(&AMOUNT)) SET AMOUNT = &STR(&AMT1).&STR(&AMT2) END SET ZEDSMSG = &STR(TOTAL AMT = &AMOUNT) SET ZEDLMSG = &STR(TOTAL LINES READ = &COUNT NON-NUMERIC + = &CHARCOUNT NUMERIC = &NUMCOUNT + TOTAL AMOUNT = &AMOUNT) ISPEXEC SETMSG MSG(UTLZ000) ISPEXEC VGET ADDCOL SHARED IF &STR(&ADDCOL) = BATCH THEN + DO SET ADDCOL = &STR(&AMOUNT) ISPEXEC VPUT ADDCOL SHARED END END EXIT CODE(&MAXCC) HELPSEC: + WRITE *** HELP FOR EDIT MACRO 'ADDCOL' *** WRITE WRITE THE 'ADDCOL' EDIT MACRO WILL AUTOMATICALLY ADD UP A COLUMN OF WRITE NUMBERS IN A BLOCK OF LINES IN A COLUMN THAT YOU ARE EDITING. WRITE THE EDIT MACRO WILL TAKE INTO ACCOUNT ZERO-FILLING WHERE NECESSARY WRITE AND ANY NON-NUMERIC LINES THAT MAY FALL INTO THE SELECTED BLOCK OF WRITE LINES. IF THERE ARE DECIMAL POINTS, AN ADDITIONAL PARAMETER MAY WRITE BE PASSED TO THE MACRO TO TAKE THEM INTO ACCOUNT. POSSIBLE USES WRITE FOR THIS MACRO INCLUDE ADDING UP A COLUMN OF NUMBERS IN A REPORT WRITE OR EXTRACT FILE, OR ADDING UP FILE OR PRINT LINE LAYOUTS IN A WRITE PROGRAM. THE BASIC METHOD OF USING IT IS TO DETERMIN THE COLUMNS WRITE IN THE FILE THAT BEGIN AND END THE NUMERIC AREA TO ACCUMULATE WRITE (THIS CAN BE ACCOMPLISED VIA THE "COLS" EDIT LINE COMMAND). THEN WRITE "EXCLUDE" THE BLOCK OF LINES TO BE ACCUMULATED. (THIS CAN BE WRITE ACCOMPLISHED VIA THE "X" OR "XX" EDIT LINE COMMANDS). THEN INVOKE WRITE THE MACRO AS FOLLOWS: (THE OUTPUT IS AN ISPF MESSAGE LINE). WRITE WRITE BASIC SYNTAX : WRITE WRITE COMMAND ===> ADDCOL 1 3 2 WRITE (WHERE "1" = BEGINNING COLUMN OF NUMERIC AREA TO ACCUMULATE) WRITE (WHERE "3" = ENDING COLUMN OF NUMERIC AREA TO ACCUMULATE) WRITE (WHERE "2" IS AN OPTIONAL PARAMETER INDICATING THE COLUMN POSITION WRITE OF THE DECIMAL POINT IN THIS NUMERIC AREA...IF THERE IS ONE) WRITE WRITE EXAMPLE #1 WRITE WRITE COMMAND ===> ADDCOL 10 12 WRITE ****** ***************************** TOP OF DATA ***************** WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE XX0100 111 WRITE 000200 111 WRITE 000300 111 WRITE 000400 111 WRITE XX0500 111 WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE MESSAGE AFTER COMMAND EXECUTION : WRITE WRITE COMMAND ===> WRITE TOTAL LINES READ = 5 NON-NUM = 0 NUM = 5 TOTAL AMOUNT = 555 WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE 000100 111 WRITE 000200 111 WRITE 000300 111 WRITE 000400 111 WRITE 000500 111 WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE EXAMPLE #2 - NUMBERS WITH DECIMAL POINTS WRITE WRITE COMMAND ===> ADDCOL 10 15 13 WRITE ****** ***************************** TOP OF DATA ***************** WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE XX0100 111.11 WRITE 000200 111.11 WRITE 000300 111.11 WRITE 000400 111.11 WRITE XX0500 111.11 WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE MESSAGE AFTER COMMAND EXECUTION : WRITE WRITE COMMAND ===> WRITE TOTAL LINES READ = 5 NON-NUM = 0 NUM = 5 TOTAL AMOUNT = 555.55 WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE 000100 111.11 WRITE 000200 111.11 WRITE 000300 111.11 WRITE 000400 111.11 WRITE 000500 111.11 WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE EXAMPLE #3 - NUMBERS WITH DECIMAL POINTS AND LETTING THE "ADDCOL" WRITE MACRO "ZERO FILL" SPACES WHERE NECESSARY. WRITE WRITE COMMAND ===> ADDCOL 10 15 13 WRITE ****** ***************************** TOP OF DATA ***************** WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE XX0100 111.1 WRITE 000200 111. WRITE 000300 111 WRITE 000400 11.11 WRITE XX0500 1 WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE MESSAGE AFTER COMMAND EXECUTION : WRITE WRITE COMMAND ===> WRITE TOTAL LINES READ = 5 NON-NUM = 0 NUM = 5 TOTAL AMOUNT = 345.21 WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE 000100 111.1 WRITE 000200 111. WRITE 000300 111 WRITE 000400 11.11 WRITE 000500 1 WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE EXAMPLE #4 - NUMBERS WITH DECIMAL POINTS AND LETTING THE "ADDCOL" WRITE MACRO "ZERO FILL" SPACES WHERE NECESSARY AND INTER- WRITE SPERSING NON-NUMERIC DATA LINES WITHIN THE BLOCK OF WRITE NUMERIC DATA LINES. WRITE WRITE COMMAND ===> ADDCOL 10 15 13 WRITE ****** ***************************** TOP OF DATA ***************** WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE XX0100 111.11 WRITE 000200 XXXXXXXXXX WRITE 000300 111 WRITE 000400 XXXXXXXXXXX WRITE XX0500 1 WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE MESSAGE AFTER COMMAND EXECUTION : (NOTICE DIFFERENCE IN COUNTS OF WRITE NUMERIC AND NON-NUMERIC LINES.) WRITE WRITE COMMAND ===> WRITE TOTAL LINES READ = 5 NON-NUM = 2 NUM = 3 TOTAL AMOUNT = 223.11 WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE 000100 111.11 WRITE 000200 XXXXXXXXXX WRITE 000300 111 WRITE 000400 XXXXXXXXXXX WRITE 000500 1 WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE EXAMPLE #5 - PRACTICAL USE FOR ADDING UP RECORD LAYOUTS. WRITE WRITE COMMAND ===> ADDCOL 44 45 WRITE ****** ***************************** TOP OF DATA ***************** WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE 000100 01 PRINT-LINE-1. WRITE XX0200 05 PRINT-DATE PIC 9(06) WRITE 000300 VALUE ZEROS. WRITE 000200 05 FILLER PIC X(20) WRITE 000300 VALUE SPACES. WRITE 000200 05 FILLER PIC X(29) WRITE 000300 VALUE 'THIS IS THE LONG REPORT TITLE'. WRITE 000200 05 FILLER PIC X(21) WRITE 000300 VALUE ' PAGE '. WRITE XX0200 05 PRINT-PAGE PIC 9(04) WRITE 000300 VALUE ZEROS. WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE MESSAGE AFTER COMMAND EXECUTION : (NOTICE THAT ONLY THE REPORT WRITE TITLE IS CONSIDERED NON-NUMERIC WRITE IN THIS GROUP OF LINES. THAT WRITE IS BECAUSE THE LINES IN WHICH WRITE COLUMNS 44 AND 45 BOTH CONTAIN WRITE SPACES ARE "ZERO-FILLED" AND WRITE AND THUS BECOME THE NUMERIC WRITE VALUE '00'. WRITE WRITE COMMAND ===> WRITE TOTAL LINES READ = 9 NON-NUM = 1 NUM = 8 TOTAL AMOUNT = 80 WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE 000100 01 PRINT-LINE-1. WRITE XX0200 05 PRINT-DATE PIC 9(06) WRITE 000300 VALUE ZEROS. WRITE 000400 05 FILLER PIC X(20) WRITE 000500 VALUE SPACES. WRITE 000600 05 FILLER PIC X(29) WRITE 000700 VALUE 'THIS IS THE LONG REPORT TITLE'. WRITE 000800 05 FILLER PIC X(21) WRITE 000900 VALUE ' PAGE '. WRITE XX1000 05 PRINT-PAGE PIC 9(04) WRITE 001100 VALUE ZEROS. WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE SPECIAL NOTES : MORE INFORMATION ON "EXCLUDING" LINES CAN BE FOUND WRITE BY TYPING "HELP" FROM ANY ISPF "EDIT" SESSION AND WRITE CHOOSING OPTION "11 EDIT LINE COMMANDS". WRITE WRITE ADDCOL WILL ONLY ZERO-FILL "SPACES" IN THE WRITE SPECIFIED COLUMNS. THEREFORE, THE FOLLOWING WRITE NUMBERS WOULD NOT BE ADDED CORRECTLY : WRITE WRITE COMMAND ===> ADDCOL 10 15 13 WRITE ****** ***************************** TOP OF DATA ***************** WRITE =COLS> ....+....1....+....2....+....3....+....4....+....5....+.... WRITE XX0100 $111.11 WRITE 000200 $11.11 WRITE 000300 $1.11 WRITE 000400 111.1X WRITE XX0500 1 WRITE ****** **************************** BOTTOM OF DATA *************** WRITE WRITE ONLY LINES 000100, AND 000500 ABOVE WOULD BE CONSIDERED WRITE NUMERIC AND WOULD BE ADDED. WRITE WRITE *** END OF HELP *** NO PROCESSING PERFORMED *** EXIT
Documentation
This is an edit macro which will add up a column of numbers in a file you're editing. You must exclude the lines you wish to tally, and specify which columns are to be included in the operation. In the columns selected, spaces will be converted to zeros, but any other non-numeric character will cause the line to be identified as non-numeric and not counted. Example follows : COMMAND ===> addcol 58 61 <== This example would add up the excluded numeric lines between columns 58 and 61 inclusive. Notes : trailing spaces will be made zeros as well as leading spaces, so your numbers should be right justified. If the numbers contain decimal points,specifiy the column of the decimal point as a 3rd parameter.