2008/07/24

REXX,ZOS] DSN CHECK

***************************** Top of Data ******************************
//LGCJDBQC JOB (WVCF3E,BP1A),'LGCJDBQ',
// CLASS=M,SCHENV=DV0A,
// MSGCLASS=Y,NOTIFY=&SYSUID
//* TLCH.MIGUF.KBSLIB(RXCHKDSN)
//REXXRUN EXEC PGM=IKJEFT01,PARM='RXCHKDSN LCE-LOAD'
//SYSEXEC DD DISP=SHR,DSN=TLCH.MIGUF.KBSLIB
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD DUMMY
**************************** Bottom of Data ****************************


***************************** Top of Data ******************************
/* REXX */
/* INPUT ARG PARM = LCB-UNLD */
ARG WORK_GB

DSN_CHK_HEAD = SUBSTR(WORK_GB,1,3)
DSN_CHK_MIDL = SUBSTR(WORK_GB,5,4)

IF SUBSTR(WORK_GB,3,1)="B" THEN S_COND="L.DBNAME LIKE 'LCB%'"
ELSE IF SUBSTR(WORK_GB,3,1)="E" THEN S_COND="L.DBNAME LIKE 'LCE%'"
ELSE IF SUBSTR(WORK_GB,3,1)="F" THEN S_COND="L.DBNAME LIKE 'LCF%'"
ELSE IF SUBSTR(WORK_GB,3,1)="H" THEN S_COND="L.DBNAME LIKE 'LCH%'"
ELSE DO
SAY "INVALID INPUT VALUE !!! CHECK YOUR INPUT PARAMETER~ "
EXIT(8)
END

CALL GET_OBJ_LIST

EXIT
/* ------------------------------------------------------------- */
GET_OBJ_LIST:

IDX = 0
DROP IDBNAME.
DROP ITBNAME.
DROP IPARTCNT.
DROP ILOADTYPE.

"SUBCOM DSNREXX"
IF RC THEN S_RC = RXSUBCOM('ADD','DSNREXX','DSNREXX')
ADDRESS DSNREXX "CONNECT" DV0A

SEL_STMT = "SELECT L.DBNAME,L.TBNAME,TS.PARTITIONS ",
" ,L.LOAD_TYPE ",
" FROM SYSIBM.SYSTABLESPACE TS,CDBD2D20.TD2L0 L ",
" WHERE (L.NUM_CONV=6 AND ",
S_COND || ")",
" AND (TS.DBNAME=L.DBNAME AND TS.NAME=L.TBNAME) ",
" ORDER BY 1,2 ",
" WITH UR "

ADDRESS DSNREXX "EXECSQL DECLARE C1 CURSOR WITH HOLD FOR S1"
IF SQLCODE = 0 THEN
ADDRESS DSNREXX "EXECSQL PREPARE S1 FROM :SEL_STMT"
IF SQLCODE = 0 THEN
ADDRESS DSNREXX "EXECSQL OPEN C1"
IF SQLCODE = 100 THEN DO
ADDRESS DSNREXX "EXECSQL CLOSE C1"
'THERE IS NO TABLES USING ' || S_BP || ' BPOOL. '
EXIT(4)
END
ELSE
DO FOREVER
ADDRESS DSNREXX "EXECSQL FETCH C1 INTO :DB_NAME ",
" ,:TB_NAME ",
" ,:PART_CNT ",
" ,:LOAD_TYPE "
IF SQLCODE = 0 THEN DO
/*
IDX = IDX + 1
IDBNAME.IDX = DB_NAME
ITBNAME.IDX = TB_NAME
IPARTCNT.IDX = PART_CNT
ILOADTYPE.IDX = LOAD_TYPE
*/
CALL DSN_CHECK
END
ELSE IF SQLCODE = 100 THEN DO
/*
IDBNAME.0 = IDX
ITBNAME.0 = IDX
IPARTCNT.0 = IDX
ILOADTYPE.0 = IDX
*/
ADDRESS DSNREXX "EXECSQL CLOSE C1"
LEAVE
END
ELSE DO
SAY " FETCH SQLCODE : " SQLCODE
SAY " FETCH SQLERRMC : " SQLERRMC
EXIT(8)
END
END
RETURN
/* -------------- */
DSN_CHECK:

I = 1

IF DSN_CHK_MIDL = "UNLD" & PART_CNT = 0 THEN DO
CHK_DSN = "'S"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
DSN_CHK_MIDL||".P000'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END

ELSE IF DSN_CHK_MIDL = "UNLD" & PART_CNT > 0 THEN
DO I=1 TO PART_CNT BY 1
PART_NUM = TRANSLATE(FORMAT(I,3),'0',' ')
CHK_DSN = "'S"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
DSN_CHK_MIDL||".P"||PART_NUM||"'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END

ELSE IF DSN_CHK_MIDL = "LOAD" & PART_CNT = 0 THEN DO
SELECT
WHEN LOAD_TYPE = "Y" | LOAD_TYPE = "E" THEN DO
CHK_DSN = "'Q"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
DSN_CHK_MIDL||".P000'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END
WHEN LOAD_TYPE = "S" THEN DO
CHK_DSN = "'S"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
"UNLD.P000'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END
OTHERWISE NOP
END
END

ELSE IF DSN_CHK_MIDL = "LOAD" & PART_CNT > 0 THEN DO
SELECT
WHEN LOAD_TYPE = "Y" | LOAD_TYPE = "E" THEN
DO I=1 TO PART_CNT BY 1
PART_NUM = TRANSLATE(FORMAT(I,3),'0',' ')
CHK_DSN = "'Q"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
DSN_CHK_MIDL||".P"||PART_NUM||"'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END
WHEN LOAD_TYPE = "S" THEN
DO I=1 TO PART_CNT BY 1
PART_NUM = TRANSLATE(FORMAT(I,3),'0',' ')
CHK_DSN = "'S"||DSN_CHK_HEAD||".MIGUF."||TB_NAME||"."||,
"UNLD.P"||PART_NUM||"'"
SAY SUBSTR(CHK_DSN,2,26) LISTDSI(CHK_DSN)
END
OTHERWISE NOP
END
END

ELSE DO
SAY "COULD YOU CHECK YOUR INTPUT >> "DSN_CHK_MIDL" & " PART_CNT
END

RETURN
**************************** Bottom of Data ****************************

2008/07/15

DB2,ZOS] DB2 DCLGEN JCL

//JS020 EXEC PGM=IKJEFT01,REGION=0M,DYNAMNBR=20
//STEPLIB DD DISP=SHR,DSN=DSNA.SDSNLOAD
//SYSTSIN DD *
DSN SYSTEM(DSNA)
DCLGEN TABLE(ABCD23F0.ZABCD) -
LIBRARY('DSNA.DCLLIB(ABCD23F0)') -
ACT(REP) -
NAMES(E3FM-) -
STRUCTURE(ABCD23F0) -
COLSUFFIX(YES)
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSIN DD DUMMY

REXX,ZOS] jcl의 dsn 사용 목록 출력하기

/* REXX */

MEMNM='';

EXITRC = LISTDSI("ISFEXT" "FILE")
IF EXITRC <> 0 THEN
DO
EXTDSN = "'QLCH.MIGJW.DBAWORK.DSN.PARSE'"
IF SYSDSN(EXTDSN) = 'OK' THEN "DELETE" EXTDSN
"ALLOC F(ISFEXT) DA("EXTDSN") NEW CATALOG SPACE(1 10) ",
"CYLINDERS LRECL(53) BLKSIZE(27984) RECFM(F B) UNIT(SYSDA)"
IF RC <> 0 THEN EXIT(83)
END

"ALLOC FI(MEMLIST) DA('TLCH.MIGUF.KBSLIB($MEMLIST)') SHR REU"

ADDRESS TSO "EXECIO * DISKR MEMLIST (STEM INLIST. FINIS)"

IF RC <> 0 THEN SAY "CAN'T READ INPUT MEMBER !!!"
ELSE
DO K=1 TO INLIST.0
PARSE VAR INLIST.K MEMNM .
CALL GET_DSN_LIST
"ALLOC FI(ISFEXT) DA("EXTDSN") MOD REU"
ADDRESS TSO "EXECIO * DISKW ISFEXT (FINIS"
"FREE F(ISFEXT)"
END
EXIT
/* =============================================================== */
GET_DSN_LIST:

PDSNM = "TLCH.MIGUF.JCLPDS("MEMNM")"

"ALLOC FI(GETDSNL) DA('"PDSNM"') SHR REU"

ADDRESS TSO "EXECIO * DISKR GETDSNL (STEM INMEM. FINIS)"

DO I=1 TO INMEM.0
PARSE VAR INMEM.I CONTENTS +72 .
IF INDEX(INMEM.I,"DSN=") > 0 THEN
DO
DSN_PS1 = INDEX(INMEM.I,"DSN=") + 4
DSN_CUT_LEN = 72 - DSN_PS1
DSN_CUT_NAME = SUBSTR(INMEM.I,DSN_PS1,DSN_CUT_LEN)
IF INDEX(DSN_CUT_NAME," ") > 0 THEN
DSN_LEN = INDEX(DSN_CUT_NAME," ")
IF INDEX(DSN_CUT_NAME,",") > 0 THEN
DSN_LEN = INDEX(DSN_CUT_NAME,",") - 1
DSN_NAME = LEFT(DSN_CUT_NAME,DSN_LEN)
QUEUE MEMNM","DSN_NAME
END
END
RETURN


***************************** Top of Data ******************************
//LGCJDBQS JOB (WVCF3E,BP1A),'LGCJDBQ',
// CLASS=M,SCHENV=DV0A,
// MSGCLASS=Y,NOTIFY=&SYSUID
//REXXRUN EXEC PGM=IKJEFT01,PARM='RXDSNLST'
//*EXXRUN EXEC PGM=IKJEFT01,PARM='RXDBREAD DBTM'
//STEPLIB DD DISP=SHR,DSN=DBTM.DSNLOAD
//SYSEXEC DD DISP=SHR,DSN=TLCH.MIGUF.KBSLIB
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD DUMMY
**************************** Bottom of Data ****************************

2008/06/29

ZOS] SUBMIT - 일괄 실행 JCL

//JS010 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=KBS.MAINT.JCL(JCL001),DISP=SHR
//SYSUT2 DD SYSOUT=(*,INTRDR)
//SYSIN DD DUMMY
//*

2008/06/26

IBM,ZOS] H.Q RENAME, FILE manager 예제, 특정 lib.의 모든 memeber 들에 명시된 이름 변경

//JS010 EXEC PGM=FMNMAIN
//SYSPRINT DD SYSOUT=*
//FMNTSPRT DD SYSOUT=*
//SYSTERM DD SYSOUT=*
//SYSIN DD *
$$FILEM FCH,
$$FILEM MEMBER=*,
$$FILEM PACK=ASIS,
$$FILEM JCL=NO,
$$FILEM DSNIN=KBS.TEST.JCLPDS,
$$FILEM PROC=*
OUTREC=SUBSTR(INREC,1,72)
OUTREC=CHANGE(OUTREC,'PLCH.','QLCH.')
RETURN
/+
/*

2008/06/24

ZOS] DSN RENAME

//LGCJXXXX JOB (WVCF3E,BP1A),'LGCJXXX',
// CLASS=X,
// MSGCLASS=Y
//JS010 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
ALTER PLCH.MIGUF.DSNTEST.XXXX.DATA1 -
NEWNAME( PLCH.MIGUF.DSNTEST.XXXX.DATA1.BK )
ALTER PLCH.MIGUF.DSNTEST.XXXX.DATA2 -
NEWNAME( PLCH.MIGUF.DSNTEST.XXXX.DATA2.BK )
/*

2008/06/23

ALP,BMC,ZOS] LOG MASTER 테이블 조회 SAMPLE

SELECT * FROM (
SELECT A.USERID,A.WORKIDNAME,A.RUNSEQNUM,A.HANDLE,HEX(A.URID) AS UI
,TBJ.MINUI
,CASE WHEN HEX(A.URID) < TBJ.MINUI THEN 1
ELSE 2 END AS CHKFLG
FROM BBIALP.ALPURID A,
(SELECT B.USERID,B.WORKIDNAME,B.RUNSEQNUM,B.HANDLE
,MIN(HEX(B.URIDLRSN)) AS MINUI FROM BBIALP.ALPURID B
WHERE B.RECORDTYPE = 2
AND B.USERID = 'LOGMSTRA'
AND B.WORKIDNAME LIKE 'LLOG000%'
GROUP BY B.USERID,B.WORKIDNAME,B.RUNSEQNUM,B.HANDLE) TBJ
WHERE A.RECORDTYPE = 1
AND A.USERID = TBJ.USERID
AND A.WORKIDNAME = TBJ.WORKIDNAME
AND A.RUNSEQNUM = TBJ.RUNSEQNUM
AND A.HANDLE = TBJ.HANDLE
) X
WHERE X.CHKFLG = 2
AND X.RUNSEQNUM >= 2599

2008/06/21

DB2,ZOS] IFNULL, NULL 데이터 처리 쿼리문

설명 : IFNULL 기능을 사용해서 다른 값으로 대체 함.

SELECT I.JOB_NAME ,I.JOB_OWNER, I.START_DATE, I.START_TIME
,I.ELAPSED_TIME, I.CPU_TIME, I.PROC_STEP, I.JCL_STEP
,I.PGM_NAME, J.RESULT_GB
,IFNULL(J.RESULT_CNTI,0),IFNULL(J.RESULT_CNT,0)
FROM CDBD2D20.TD2I0 I LEFT JOIN CDBD2D20.TD2J0 J
ON I.JOB_NAME = J.JOB_NAME
AND I.JOB_OWNER = J.JOB_OWNER
AND I.JOB_DATE = J.JOB_DATE
AND I.JOB_NUMBER = J.JOB_NUMBER
AND I.STEP_SEQ = J.STEP_SEQ
WHERE I.JOB_DATE >= '2008171'
AND I.JOB_DATE <= '2008172'
ORDER BY I.JOB_NAME, I.JOB_OWNER, I.JOB_DATE
,I.STEP_SEQ
WITH UR;

2008/06/17

excel] 문자 탐색 - vlookup #1

=IF(ISNA(VLOOKUP(C2,plch!A:F,6,FALSE)),0,VLOOKUP(C2,plch!A:F,6,FALSE))

ftp로 dsn list 출력 하기 - log 파일 지정

>> dataset-list.bat
ftp -s:dataset-list_plcB.src 10.10.11.11 > DSLIST_PLCB.out


>> dataset-list_plcB.src
bskim
JUN2008
dir 'PLCB.MIGUF.*'
bye

2008/06/01

ICETOOL] record count jcl

//ICETOOL EXEC PGM=ICETOOL,REGION=0M
//DATA1 DD DISP=SHR,DSN=TLCH.MIGUF.KBSLIB.DATA1
//*ORTWK01 DD UNIT=SYSDA,SPACE=(640,3),AVGREC=M
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//TOOLIN DD *
COUNT FROM(DATA1)
/*

2008/05/21

REXX,예제] 일자계산

/* REXX */
START_DATE = '2008-05-19'
START_TIME = '00:05:59'
END_DATE = '2008-05-19'
END_TIME = '20:19:20'

ELAPSE_TIME = GET_ETM(START_DATE,START_TIME,END_DATE,END_TIME)
SAY '********* ' ELAPSE_TIME '*********'
EXIT

/* GETTING ELAPSE TIME */
GET_ETM:
ARG D1,T1,D2,T2
/*SAY D1 T1 D2 T2 */

D1 = SUBSTR(D1,1,4) || SUBSTR(D1,6,2) || SUBSTR(D1,9,2)
D2 = SUBSTR(D2,1,4) || SUBSTR(D2,6,2) || SUBSTR(D2,9,2)

D1_JUL = DATE('B',DATE(,D1,'S'))
D2_JUL = DATE('B',DATE(,D2,'S'))

T1_SEC = SUBSTR(T1,1,2) * 60 * 60 ,
+ SUBSTR(T1,4,2) * 60 ,
+ SUBSTR(T1,7,2)

T2_SEC = SUBSTR(T2,1,2) * 60 * 60 ,
+ SUBSTR(T2,4,2) * 60 ,
+ SUBSTR(T2,7,2) ,
+ ( ( D2_JUL - D1_JUL ) * 60 * 60 * 24 ) /* DAY */

GAP = ( T2_SEC - T1_SEC )

E_HH = TRANSLATE(FORMAT(GAP%(60*60),2),'0',' ')
E_MM = TRANSLATE(FORMAT((GAP-(E_HH*60*60))%60,2),'0',' ')
E_SS = TRANSLATE(FORMAT(GAP//60,2),'0',' ')
E_TM = E_HH':'E_MM':'E_SS

RETURN E_TM