Mainframe Utility: COUNTKEY

Return to Mainframe Utilities Page

Module


/*********************************************************************/
/* CLIST COUNTKEY - COUNT THE KEY OCCURANCES WITHIN A FILE           */
/* AUTHOR : DAVID LEIGH DATE : 5-31-89                               */
/*********************************************************************/
PROC 0 HELP DSN() COL1() COL2() VIEW(E) BATCH

/**** 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 &HELP = &STR(HELP) THEN GOTO HELPSEC

ISPEXEC VGET (INVOKE) SHARED
IF &INVOKE =    THEN SET INVOKE = COUNTKEY
SET OUTDSN = &STR(&SYSUID..TEMP.&INVOKE..OUTPUT)
SET CARDDSN = &STR(&SYSUID..TEMP.&INVOKE..SYSIN)
SET OUTSYS = &STR(&SYSUID..TEMP.&INVOKE..SYSOUT)
SET DIALOG = OFF

IF &DSN =    OR &COL1 =     OR &COL2 =    THEN +
    DO
        SET DIALOG = ON
        ISPEXEC VPUT (INVOKE VIEW DSN COL1 COL2 OUTDSN) SHARED
        ISPEXEC DISPLAY PANEL(UTILCTKY)
        IF &LASTCC > 0 THEN +
            DO
                SET ZEDLMSG = &STR(EXITED "&INVOKE" UTILITY WITHOUT)+
                              &STR( PROCESSING)
                ISPEXEC SETMSG MSG(UTLZ000)
                EXIT
            END
        ISPEXEC VGET (INVOKE VIEW DSN COL1 COL2 OUTDSN) SHARED
    END

SET ZEDLMSG = &STR(*** PREPARING FOR CALL TO SYNCSORT ***)
ISPEXEC CONTROL DISPLAY LOCK
ISPEXEC DISPLAY MSG(UTLZ000W)

SET RP = &STR())
SET LP = &STR((
SET SLEN = &COL2 - &COL1 + 1

IF &SLEN > 9 THEN +
    DO
        SET LRECL = &SLEN + 12
        SET EQL = &SLEN
    END
ELSE +
    DO
        SET LRECL = 21
        SET EQL = 9
    END

SET PAD = &LRECL - &SLEN
IF &PAD < 1 THEN SET PAD = 1

SET SPCE = &SLEN - 9
IF &SPCE < 0 THEN SET SPCE = 0
SET SPCE = &SPCE + 1
SET SPCE1 = &SPCE + 9 - &SLEN + 2
SET SPCE2 = &SPCE + 3

LISTDSI '&DSN'
IF &LASTCC = 16 THEN +
    DO
        SET ZEDLMSG = &STR("&DSN" PROBLEM: &SYSDSN('&DSN'))
        ISPEXEC SETMSG MSG(UTLZ001)
        EXIT
    END

IF &SYSINDEX(&STR(V),&STR(&SYSRECFM)) = 1 THEN +
    SET RDW = 4
ELSE +
    SET RDW = 0

FREE DDNAME(SORTWK01 SYSIN SORTIN SORTOUT SYSOUT SYSPRINT SORTMSG +
            SORTWK02 SORTWK03 SORTWK04)

DELETE '&CARDDSN'
ALLOC DD(SYSIN) DSN('&CARDDSN') +
                NEW CATALOG +
                UNIT(SYSDA) VOLUME(WRK$$$) +
                SPACE(1,1) TRACKS RELEASE +
                RECFM(F B) LRECL(80) BLKSIZE(23440) DSORG(PS)

OPENFILE SYSIN  OUTPUT
IF &RDW = 4 THEN +
    SET SYSIN  = &STR( INREC FIELDS=&LP.1,4,&EVAL(&RDW+&COL1),)+
                 &STR(&SLEN,&PAD.X&RP)
ELSE +
    SET SYSIN  = &STR( INREC FIELDS=&LP&EVAL(&RDW+&COL1),)+
                 &STR(&SLEN,&PAD.X&RP)
PUTFILE SYSIN
SET SYSIN  = &STR( SORT FIELDS=&LP.&EVAL(&RDW+1),)+
             &STR(&SLEN,CH,A&RP)
PUTFILE SYSIN
SET SYSIN  = &STR( OUTFIL FILES=OUT,)
PUTFILE SYSIN
SET SYSIN  = &STR( HEADER1=&LP'KEY VALUE',&SPCE.X,'OCCURANCES',/,)
PUTFILE SYSIN
SET SYSIN  = &STR(            &EQL'=',X,'=========='&RP,)
PUTFILE SYSIN
SET SYSIN  = &STR( NODETAIL,)
PUTFILE SYSIN
SET SYSIN  = &STR( SECTIONS=&LP.&EVAL(&RDW+1),)+
             &STR(&SLEN,)
PUTFILE SYSIN
SET SYSIN  = &STR( TRAILER3=&LP.&EVAL(&RDW+1),)+
             &STR(&SLEN,&SPCE1.X,COUNT&RP&RP,)
PUTFILE SYSIN
SET SYSIN  = &STR( TRAILER1=&LP&EQL'=',X,'==========',/,)
PUTFILE SYSIN
SET SYSIN  = &STR(             'TOTAL   ',&SPCE2.X,COUNT&RP)
PUTFILE SYSIN
CLOSFILE SYSIN

IF &RDW = 0 THEN +
    DO
        ISPEXEC SELECT CMD(%BLKSIZE &LRECL 0 DEVICE(3380) BATCH)
        ISPEXEC VGET BLKSIZE SHARED
        SET RECFM = (F B A)
    END
ELSE +
    DO
        SET LRECL = &LRECL + 4
        SET BLKSIZE = 23476
        SET RECFM = (V B A)
    END
DELETE '&OUTDSN'
DELETE '&OUTSYS'
SET SSCC = 0

IF &BATCH = BATCH THEN GOTO BATCH_SECTION

ALLOC DD(SORTIN)   DSN('&DSN') +
                   SHR KEEP
ALLOC DD(SORTWK01) UNIT(SYSDA) VOLUME(WRK$$$) +
                   SPACE(1,1) CYLINDERS
ALLOC DD(SORTWK02) UNIT(SYSDA) VOLUME(WRK$$$) +
                   SPACE(1,1) CYLINDERS
ALLOC DD(SORTWK03) UNIT(SYSDA) VOLUME(WRK$$$) +
                   SPACE(1,1) CYLINDERS
ALLOC DD(SORTWK04) UNIT(SYSDA) VOLUME(WRK$$$) +
                   SPACE(1,1) CYLINDERS
ALLOC DD(SORTOUT)  DSN('&OUTDSN') +
                   NEW CATALOG +
                   UNIT(SYSDA) VOLUME(WRK$$$) +
                   SPACE(5,5) TRACKS RELEASE +
                 RECFM(&RECFM) LRECL(&LRECL) BLKSIZE(&BLKSIZE) DSORG(PS)
ALLOC DD(SYSOUT)  DSN('&OUTSYS') +
                  NEW CATALOG +
                  UNIT(SYSDA) VOLUME(WRK$$$) +
                  SPACE(1,1) TRACKS RELEASE +
                  RECFM(F B) LRECL(121) BLKSIZE(23474) DSORG(PS)

SET ZEDLMSG = &STR(*** TALLYING UNIQUE VALUES BETWEEN +
                   &COL1 AND &COL2 ***)
ISPEXEC CONTROL DISPLAY LOCK
ISPEXEC DISPLAY MSG(UTLZ000W)

ISPEXEC SELECT PGM(SYNCSORT) PARM('CORE=MAX')

SET SSCC = &LASTCC

IF &SSCC ¬= 0 THEN +
    DO
        SET ZEDLMSG = &STR(*** SYNCSORT UNSUCCESSFUL. RC = &SSCC ***)
        ISPEXEC SETMSG MSG(UTLZ001)
        ISPEXEC EDIT DATASET('&OUTSYS')
        GOTO FINAL
    END

IF &VIEW = E THEN +
    ISPEXEC EDIT DATASET('&OUTDSN')
    IF &LASTCC > 8 THEN +
        ISPEXEC BROWSE DATASET('&OUTDSN')
ELSE +
    IF &VIEW = B THEN +
        ISPEXEC BROWSE DATASET('&OUTDSN')
GOTO FINAL

BATCH_SECTION: +
FREE DDNAME(SORTWK01 SYSIN SORTIN SORTOUT SYSOUT SYSPRINT SORTMSG +
            SORTWK02 SORTWK03 SORTWK04)
SET TEMPJCL = &STR(&SYSUID..TEMP.&INVOKE..JCL)
DELETE '&TEMPJCL'
FREE DD(TEMPDD)
ALLOC DD(TEMPDD) DSN('&TEMPJCL') +
                 NEW CATALOG +
                 UNIT(SYSDA) VOLUME(WRK$$$) +
                 SPACE(1,1) TRACKS RELEASE +
                 RECFM(F B) LRECL(80) BLKSIZE(23440) DSORG(PS)
FREE DD(TEMPDD ISPFILE)
ALLOC DD(ISPFILE) DSN('&TEMPJCL') OLD
ISPEXEC FTOPEN
ISPEXEC FTINCL COUNTKEY
SET INCLCC = &LASTCC
ISPEXEC FTCLOSE
FREE DD(ISPFILE)

IF &INCLCC = 0 THEN +
    DO
        SET ZEDSMSG = &STR(&INVOKE JOB SUBMITTED)
        SET ZEDLMSG = &STR(A BATCH JOB WAS SUBMITTED TO PROCESS YOUR +
                           "&INVOKE" REQUEST)
        ISPEXEC SETMSG MSG(UTLZ000)
        SUBMIT '&TEMPJCL'
    END
ELSE +
    DO
        SET ZEDSMSG = &STR(COULD NOT CREATE JCL)
        SET ZEDLMSG = &STR(CC "&INCLCC" RETURNED FROM JCL CREATION +
                           PROCESS)
        ISPEXEC SETMSG MSG(UTLZ001)
    END

FINAL: +
FREE DDNAME(SORTWK01 SYSIN SORTIN SORTOUT SYSOUT SYSPRINT SORTMSG +
            SORTWK02 SORTWK03 SORTWK04)
EXIT

HELPSEC: +
CLEAR
WRITE *** HELP FOR CLIST 'COUNTKEY' ***
WRITE
WRITE THE COUNTKEY CLIST ALLOWS THE USER TO SEARCH THROUGH SPECIFIED
WRITE COLUMNS WITHIN A DATASET AND COUNT THE NUMBER OF OCCURANCES OF
WRITE EACH UNIQUE STRING FOUND WITHIN THE SPECIFIED COLUMNS.  THE
WRITE RESULTS ARE PLACED IN A FILE AND THE USER IS THEN TAKEN INTO THAT
WRITE FILE.
WRITE
WRITE BASIC SYNTAX :
WRITE
WRITE COMMAND ===> TSO COUNTKEY
WRITE
WRITE THIS EXAMPLE WILL TAKE YOU INTO AN ISPF PANEL WHERE YOU MAY ENTER
WRITE A DATASET NAME, TWO COLUMN NUMBERS AND CHANGE OR LEAVE THE DEFAULT
WRITE VALUES FOR THE OUTPUT DATASET AND HOW OR IF YOU WANT TO
WRITE AUTOMATICALLY VIEW THE OUTPUT FROM THE UTILITY.
WRITE
WRITE OTHER EXAMPLES :
WRITE
WRITE COMMAND ===> TSO COUNTKEY DSN(XXXXX.XXXXXX.XXXXX)
WRITE
WRITE THIS EXAMPLE WILL TAKE YOU INTO THE ISPF PANEL WHERE THE DATASET
WRITE NAME WILL BE PREPOPULATED BUT YOU WILL HAVE TO ENTER THE COLUMN
WRITE NUMBERS.
WRITE
WRITE COMMAND ===> TSO COUNTKEY DSN(XXXXX.XXXXXX.XXXXX) COL1(1) COL2(2)
WRITE
WRITE THIS EXAMPLE WILL INVOKE THE UTILITY WITHOUT THE ISPF PANEL.  IN
WRITE THIS MODE, YOU WILL HAVE NO CHOICE AS TO THE OUTPUT VIEWING MODE,
WRITE OR THE OUTPUT DATASET.
WRITE
WRITE IF A DATASET CONTAINED THE FOLLOWING :
WRITE
WRITE =COLS> ----+----1----+
WRITE 000001 A9999BBBC888
WRITE 000002 A9999BBBC888
WRITE 000003 A9999BCBC888
WRITE 000004 A9999BDBC888
WRITE 000005 B9999BEBC888
WRITE 000006 B9999BFBC888
WRITE 000007 B9999BBBC888
WRITE 000008 B9999BABC888
WRITE 000009 C9999BSBC888
WRITE 000010 D9999BEBC888
WRITE 000011 D9999BSBC888
WRITE 000012 E9999BBBC888
WRITE
WRITE YOU COULD RUN COUNT KEY ON COLUMNS 1 5 AND GET THE FOLLOWING :
WRITE
WRITE KEY VALUE           NUMBER OF OCCURANCES
WRITE ---------           --------------------
WRITE A9999               0000000000000004
WRITE B9999               0000000000000004
WRITE C9999               0000000000000001
WRITE D9999               0000000000000002
WRITE E9999               0000000000000001
WRITE ----------------------------------------
WRITE TOTAL               0000000000000011
WRITE
WRITE FOR HELP WITH THE PANEL, EXECUTE COUNTKEY IN SUCH A WAY AS TO
WRITE ACCESS THE COUNTKEY PANEL AND THEN TYPE "HELP" IN THE COMMAND
WRITE LINE.
WRITE
WRITE YOU MAY ALSO EXECUTE THIS FUNCTION AS AN EDIT MACRO NAMED
WRITE "KEYCOUNT".  WHILE IN AN EDIT SESSION, TYPE "KEYCOUNT HELP" ON THE
WRITE COMMAND LINE FOR HELP IN HOW TO USE IT.
WRITE
WRITE *** END OF HELP *** NO PROCESSING PERFORMED ***
EXIT
            


Documentation


 This utility takes input of a dataset name (on an input panel) and two column
 numbers.  The two column numbers represent the beginning and ending columns of
 a physical 'field' within the record.  The unique string combinations found
 within this field are then tallied up, and the results placed in a dataset.
 The 'results' dataset will be automatically edited upon completion of the 'key
 count'.
            


Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.