/* REXX */ /********************************************************************/ /* THIS IS AN AUTHORIZED COPY FOR ALL MXG-USERS AND MAY */ /* BE IMPROVED BY MERRILL CONSULTANTS DALLAS TEXAS USA. */ /********************************************************************/ /* */ /* REXX EXEC: WLMREXX */ /* */ /********************************************************************/ /* */ /* AUTHOR: K.M. (SAM) BASS */ /* BITS@KMBASS.COM */ /* */ /********************************************************************/ /* PURPOSE: */ /* REXX EXEC TO READ THE WLM ISPF TABLE PDS AND EXTRACT THE */ /* NAMES OF THE TABLES, THE KEYS AND VARIABLE NAMES AND */ /* GENERATE SAS CODE TO LOAD THE WLM INTO A SAS DATABASE */ /********************************************************************/ /* */ /* K.M. (SAM) BASS PROVIDES THIS PROGRAM "AS IS" WITHOUT */ /* WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, */ /* BUT NOT LIMITED TO, THE DOCUMENTATION, THE FUNCTIONS, THE */ /* TECHNICAL ACCURACY OR PERFORMANCE OF THE PROGRAM. */ /* */ /*---> PLEASE UNDERSTAND THAT YOU ARE USING THIS PROGRAM <---*/ /*---> AT YOUR OWN RISKS. <---*/ /* */ /* ALL USERS ARE EXPECTED TO INSPECT, EVALUATE AND MAKE FINAL */ /* DECISION CAREFULLY AS TO THE USEFULNESS OF THIS PROGRAM IN */ /* HIS/HER OWN INSTALLATION. */ /* */ /*---> PLEASE UNDERSTAND THAT YOU ARE USING THIS PROGRAM <---*/ /*---> AT YOUR OWN RISKS. <---*/ /* */ /* ACCEPTANCE AND USE OF THIS PROGRAM AUTOMATICALLY RELEASES */ /* K.M. (SAM) BASS FROM LIABILITY FOR ANY PROBLEMS CAUSED */ /* BY THE USE OF THIS PROGRAM. */ /* */ /*---> PLEASE UNDERSTAND THAT YOU ARE USING THIS PROGRAM <---*/ /*---> AT YOUR OWN RISKS. <---*/ /* */ /* */ /********************************************************************/ MAINLINE: /*-------------------------------------------------------------*/ /* JCL TO BUILD THE SAS TABLES IS AS FOLLOWS */ /* //SASJOB JOB 1,WLMREXX,NOTIFY=&SYSUID,REGION=4M, */ /* // CLASS=X,MSGCLASS=X,MSGLEVEL=(1,1) */ /* //*------- ----------------------------------------------*/ */ /* //DELETE EXEC PGM=IDCAMS */ /* //SYSPRINT DD SYSOUT=* */ /* //SYSIN DD * */ /* DELETE YOUR.MXG.WLM */ /* SET MAXCC=0 */ /* //*------- ----------------------------------------------*/ */ /* //S1 EXEC SAS */ /* //PDB DD DISP=(NEW,CATLG),DSN=YOUR.MXG.WLM, */ /* // SPACE=(CYL,(1,1)),UNIT=(SYSDA,1) */ /* //SYSIN DD DISP=SHR,DSN=KBASS.PERM.SAS(WLMDATA) */ /*-------------------------------------------------------------*/ /*-------------------------------------------------------------*/ /* WLMDEF IS THE INPUT PDS CONTAINING THE WLM DEFINITIONS */ /* SASOUT IS THE OUTPUT FILE THAT WILL CONTAIN THE GENERATED */ /* SAS CODE */ /*-------------------------------------------------------------*/ WLMDEF="'KBASS.PERM.WLMDEF'"; SASOUT="'KBASS.PERM.SAS(WLMDATA)'"; "ISPEXEC CONTROL ERRORS RETURN" CALL INITIAL; CALL READMBRS; CALL TBQUERY; CALL GETROWS; CALL CLEANUP; EXIT /*=============================================================*/ /*-------------------------------------------------------------*/ /* INITIAL */ /*-------------------------------------------------------------*/ /*=============================================================*/ INITIAL: RETURN; /*=============================================================*/ /*-------------------------------------------------------------*/ /* READ MEMBERS */ /*-------------------------------------------------------------*/ /*=============================================================*/ READMBRS: "ISPEXEC LMINIT DATAID(IDWLM) DATASET("WLMDEF") ENQ(SHR)" "ISPEXEC LMOPEN DATAID("IDWLM") OPTION(INPUT)" /*-------------------------------------------------------------*/ /* READ THROUGH THE WLM PDS AND GET THE MEMBERS NAMES AND */ /* STORE THEM IN MBRS.IMBR */ /*-------------------------------------------------------------*/ MEMBER=""; "ISPEXEC LMMLIST DATAID("IDWLM") OPTION(LIST) MEMBER(MEMBER)" LRC=RC; IMBR=0; DO UNTIL(LRC>0); IMBR=IMBR+1; MBR.IMBR=MEMBER; "ISPEXEC LMMLIST DATAID("IDWLM") OPTION(LIST) MEMBER(MEMBER)" LRC=RC; END; MBR.0=IMBR; "ISPEXEC LMCLOSE DATAID("IDWLM")" "ISPEXEC LMMLIST DATAID("IDWLM") OPTION(FREE)" "ISPEXEC LMFREE DATAID("IDWLM")" RETURN; /*=============================================================*/ /*-------------------------------------------------------------*/ /* TBDISPLAY */ /*-------------------------------------------------------------*/ /*=============================================================*/ TBQUERY: "ISPEXEC LIBDEF WLMDEF DATASET ID("WLMDEF")" /*-------------------------------------------------------------*/ /* GO THROUGH EACH OF THE TABLE NAMES GENERATED BY 'READMBRS' */ /* AND DO A TBQUERY TO GET THE 'KEY NAMES' AND THE COUNT ', */ /* 'VARIABLE NAMES' AND THE COUNT, AND A COUNT OF THE ROWS */ /*-------------------------------------------------------------*/ DO IMBR = 1 TO MBR.0; "ISPEXEC TBOPEN "MBR.IMBR" NOWRITE LIBRARY(WLMDEF)" "ISPEXEC TBQUERY "MBR.IMBR" KEYS(KEYS) NAMES(NAMES) ", "ROWNUM(NUMROWS) KEYNUM(NUMKEYS) NAMENUM(NUMNAMES)"; /*SAY MBR.IMBR NUMROWS NUMKEYS NUMNAMES KEYS; */ /*SAY " " NAMES; */ KEYS.IMBR=KEYS; NAMES.IMBR=NAMES; NUMROWS.IMBR=NUMROWS; NUMKEYS.IMBR=NUMKEYS; NUMNAMES.IMBR=NUMNAMES; "ISPEXEC TBCLOSE "MBR.IMBR" LIBRARY(WLMDEF)" END; RETURN; /*=============================================================*/ /*-------------------------------------------------------------*/ /* GETROWS */ /*-------------------------------------------------------------*/ /*=============================================================*/ GETROWS: /*-------------------------------------------------------------*/ /* THIS GENERATES TWO STEM VARIABLES */ /* FMT.* IS THE SAS CODE TO INITIALIZE THE SAS TABLES */ /* SAS.* IS THE SAS CODE TO PUT DATA IN THE SAS TABLES */ /* II IS THE COUNTER FOR SAS.* */ /* JJ IS THE COUNTER FOR FMT.* */ /*-------------------------------------------------------------*/ "ISPEXEC LIBDEF WLMDEF DATASET ID("WLMDEF")" II=0; JJ=0; II=II+1; SAS.II="OPTIONS USER=PDB;"; JJ=JJ+1; FMT.JJ="OPTIONS USER=PDB;"; DO IMBR = 1 TO MBR.0; SAY "PROCESSING TABLE " MBR.IMBR; "ISPEXEC TBOPEN "MBR.IMBR" NOWRITE LIBRARY(WLMDEF)" "ISPEXEC TBTOP "MBR.IMBR; SAY "TABLE "MBR.IMBR" KEYS " KEYS.IMBR; /**/ SAY "TABLE "MBR.IMBR" NAMES " NAMES.IMBR; /**/ /*-------------------------------------------------------------*/ /* KEYS.IMBR HAS A LIST OF VARIABLE GOTTEN FROM TBQUERY IN THE */ /* FORM ' (KEY1 KEY2 KEY3 ... KEYN)' */ /*-------------------------------------------------------------*/ /* LETS STRIP OFF THE ( ) AND THEN */ /* PARSE EACH VARIABLE NAME INTO ZK.J */ /* I KNOW, I COULD HAVE USED WORDS() AND WORD() FUNCTION... */ /*-------------------------------------------------------------*/ PARSE UPPER VAR KEYS.IMBR "(" XKEYS ")"; XXKEYS=XKEYS; DO J = 1 TO NUMKEYS.IMBR; PARSE UPPER VAR XKEYS ZK.J XKEYS; END; /*-------------------------------------------------------------*/ /* NAMES.IMBR HAS A LIST OF VARIABLE GOTTEN FROM TBQUERY IN THE*/ /* FORM ' (VAR1 VAR2 VAR3 ... VARN)' */ /*-------------------------------------------------------------*/ /* LETS STRIP OFF THE ( ) AND THEN */ /* PARSE EACH VARIABLE NAME INTO ZN.J */ /*-------------------------------------------------------------*/ PARSE UPPER VAR NAMES.IMBR "(" XNAMES ")"; XXNAMES=XNAMES; XXVARS = XXKEYS||' '||XXNAMES; DO J = 1 TO NUMNAMES.IMBR; PARSE UPPER VAR XNAMES ZN.J XNAMES; END; /*-------------------------------------------------------------*/ /* GENERATE DATA MBR.IMBR (KEEP= ....); FOR SAS DATA STEP */ /* GENERATE DATA MBR.IMBR (KEEP= ....); FOR THE FMT DATA STEP */ /*-------------------------------------------------------------*/ II=II+1; SAS.II="DATA "||MBR.IMBR||" (KEEP="; JJ=JJ+1; FMT.JJ="DATA "||MBR.IMBR||" (KEEP="; DO IWORD = 1 TO WORDS(XXVARS); II=II+1; SAS.II=" "WORD(XXVARS,IWORD); JJ=JJ+1; FMT.JJ=" "WORD(XXVARS,IWORD); END II=II+1; SAS.II=");"; JJ=JJ+1; FMT.JJ=");"; /*-------------------------------------------------------------*/ /* GENERATE SET MBR.IMBR (NULL TABLE) THAT HAS THE VARIABLE LENGS*/ /*-------------------------------------------------------------*/ II=II+1; SAS.II=" SET "||MBR.IMBR||";"; /*-------------------------------------------------------------*/ /* GET THE KEY VARIABLES AND THEIR VALUE */ /* ALSO SAVE THE MAX LENGTH OF EACH KEYS VARIABLE IN LENK.IMBR.K */ /* I USE THE INTERPRET TO TAKE THE VARIABLE NAME IN ZK.K AND */ /* INDIRECT ACCESS THE DATA ASSOCIATED WITH THE VARIABLE */ /* NAME OF THE COLUMN. */ /* SO IT IS LIKE B=INDIRECT(ZK.K) */ /* BUILDS VAR1 = 'VAR1.DATA.VALUE'; */ /*-------------------------------------------------------------*/ IF NUMROWS.IMBR > 0 THEN DO ; DO J = 1 TO NUMROWS.IMBR; "ISPEXEC TBSKIP "MBR.IMBR; IF NUMKEYS.IMBR > 0 THEN DO K = 1 TO NUMKEYS.IMBR; IF J = 1 THEN LENK.IMBR.K=0; INTERPRET "B="ZK.K; II=II+1; SAS.II = ZK.K||"= '"||TRANSLATE(B,' ','00'X)||"';"; C= "'"||B||"'"; LENK.IMBR.K=MAX(LENK.IMBR.K,LENGTH(C)); END; LEN.ZN.IMBR=0; /*-------------------------------------------------------------*/ /* GET THE NAME VARIABLES AND THEIR VALUE */ /* ALSO SAVE THE MAX LENGTH OF EACH VARIABLE IN LENN.IMBR.K */ /*-------------------------------------------------------------*/ IF NUMNAMES.IMBR > 0 THEN DO K = 1 TO NUMNAMES.IMBR; IF J = 1 THEN LENN.IMBR.K=0; INTERPRET "B="ZN.K; II=II+1; SAS.II = ZN.K||"= '"||TRANSLATE(B,' ','00'X)||"';"; C= "'"||B||"'"; LENN.IMBR.K=MAX(LENN.IMBR.K,LENGTH(C)); END; II=II+1;SAS.II="OUTPUT;"; END; /*-------------------------------------------------------------*/ /* NOW THAT WE HAVE FINISHED GENERATING ALL OF THE ROWS FOR */ /* THIS TABLE, LETS BUILD THE FORMAT STATEMENTS FOR EACH OF */ /* THE VARIABLES THAT WAS GENERATED BY THE STEP ABOVE */ /*-------------------------------------------------------------*/ IF NUMKEYS.IMBR > 0 THEN DO K = 1 TO NUMKEYS.IMBR; JJ=JJ+1;FMT.JJ="INFORMAT "||ZK.K||" $"||LENK.IMBR.K||".;"; END; IF NUMNAMES.IMBR > 0 THEN DO K = 1 TO NUMNAMES.IMBR; JJ=JJ+1;FMT.JJ="INFORMAT "||ZN.K||" $"||LENN.IMBR.K||".;"; END; IF NUMKEYS.IMBR > 0 THEN DO K = 1 TO NUMKEYS.IMBR; JJ=JJ+1;FMT.JJ=ZK.K||"="||"'';"; END; IF NUMNAMES.IMBR > 0 THEN DO K = 1 TO NUMNAMES.IMBR; JJ=JJ+1;FMT.JJ=ZN.K||"="||"'';"; END; II=II+1;SAS.II="RUN;"; /*-------------------------------------------------------------*/ /* GENERATE THE PROC SORT IF THERE ARE ANY KEYS */ /*-------------------------------------------------------------*/ IF NUMKEYS.IMBR > 0 THEN DO; II=II+1; SAS.II = "PROC SORT DATA="||MBR.IMBR||";" II=II+1; SAS.II = " BY "||XXKEYS||";"; END; SAS.0=II; /* SET THE NUMBER OF ROWS */ FMT.0=JJ; /* SET THE NUMBER OF ROWS */ END; END; "ALLOC F(SASOUT) DA("SASOUT") SHR REUSE"; "EXECIO * DISKW SASOUT (STEM FMT. )"; "EXECIO * DISKW SASOUT (STEM SAS. FINIS)"; "FREE F(SASOUT)"; RETURN; /*-------------------------------------------------------------*/ /* CLEANUP */ /*-------------------------------------------------------------*/ CLEANUP: RETURN;