Sunday, June 10, 2007

DB2

TIP # 093
DB2

Use the OS/390 – MVS solution ‘Move current-date to ……’ to obtain a date or
to do a date calculation instead of DB2’s ‘SET CURRENT TIMESTAMP’.

TIP # 094
DB2

Avoid joins that involve more than two TABLES. Break it up into multiple SQL statements.
In a case study, a 5-table join used 4190 CPU hours in a month for a weekly process.
Breaking it up dropped the usage to 9 CPU hours per month!!

TIP # 095
DB2

If using CURSOR SQL for read only, use FOR FETCH ONLY in the SQL.

TIP # 096
DB2

How To Match Contoken Across Loadlib & Dbrmlib
Step 1.
Go to SYSIBM.SYSPACKAGE for that program - look at the latest bind -
you can look at the time stamp column to find the latest. There will be a
column called CONTOKEN. This will have a value.
Ex -
-+---------+---------+---------+---------+---------+---------+---------+----
COLLID NAME CONTOKEN OWNER CREATOR TIMESTAMP
-+---------+---------+---------+---------+---------+---------+---------+----
CBPR39WO PGMNAME .îÒ#.¹". DFDBS ABC
2004-04-21-06.42.00.
Step 2 . Covert the CONTOKEN to zoned decimal format. From the above example it
is X'1756ed7b02da7f32'. You can use HEX on to find the ZD format.
Step 3. Go to the DBRMLIB - Search for this String like - F x'1756ed7b02da7f32'
. If it is the correct DBRM lib using which it is bound then you will find a
match.
Also you can get the DBRMLIB used for binding from the above Query o/p
also if you scroll towards the end. There is a Column for that also.
Now How to match it to load lib .

Step 4. Go to your load lib in browse mode. Search for the First 8 bytes in the
above ZD format of the CONTOKEN
Like =-- F '1756ed7b'. If you find a match then it is your matching
load !!!
The twist here is - on the SYSIBM.SYSPACKAGE and The DBRMLIB the
contoken is stored in the Same format, But in the Loadlib the date & time part of
the CONTOKEN is swapped and stored. This is why you need to search for the
8 bytes separately. Otherwise you need to swap the 16 bytes of the
CONTOKEN and search.

TIP # 097
DB2

To get only the first n rows
select *
from table name
fetch first n rows only
with ur;

TIP # 098
DB2

Performance Tuning
Use JOIN instead of Sub-Queries
SELECT EMPNO, LASTNAME FROM EMP, DEPT
WHERE WORKDEPT =DEPTNO
AND DEPTNAME = ‘PLANNING’
SELECT EMPNO, LASTNAME FROM EMP
WHERE WORKDEPT IN
( SELECT DEPTNO FROM DEPT
WHERE DEPTNAME = ‘PLANNING’ )
TIP # 099
DB2
How to select the duplicate rows from a table?
SELECT columns
FROM table
GROUP BY columns
HAVING COUNT(*) > 1

TIP # 100
DB2

For SQL declaration of DECIMAL(n,m),
the COBOL equivalent generated is PIC S9(n-m)v9(m) COMP-3

CICS

TIP # 086
CICS

Use CALLs instead of LINKs in CICS
EXEC CICS LINK
- establishes a new run unit
- sets up environment
- Does CICS table-search
- For all this activities, it executes 1400 machine code instructions
CALL
- It executes around 12 machine code instructions
Just replacing EXEC CICS LINK with CALL statement on a case study, it was found that
Internal Transaction Response time improved 23 - 78 %
Total CPU Time improved 15 - 23 %
Dynamic storage use improved 11 - 30 %
* CALL used in the study is STATIC CALL . COBOL refered here is VS COBOL II

TIP # 087
CICS

You can use a COBOL CALL statement to call only a VS COBOL II or an Assembler language
program in the same load module as the calling program.
For calls to programs written in languages other than VS COBOL II, including other versions of
COBOL, you need to use the commands EXEC CICS LINK or EXEC CICS XCTL.

TIP # 088
CICS

Do you know how CICS was called initially ??
PUCICS!!!
PUCICS stands for Public Utilities Customer Information Control System.
After couple of years, it took the name CICS.

TIP # 089
CICS

What is the difference between getting the system time with EIBTIME and ASKTIME
command?
ASKTIME = requests the current date and time
EIBTIME = field have the value at the task initiation time

TIP # 090
CICS

To access the system values like date, time, Userid etc and store in a variable, one can use
EXEC CICS ASSIGN

TIP # 091
CICS

While doing a mass delete using a generic key, how can you determine the number of records
deleted?
By using the NUMREC(data-area) option with the generic key. Upon completion of the delete
the data-area will contain the number of records that are deleted.

TIP # 092
CICS

When generating Mapset, specify TIOAPX=YES for COBOL programs. YES generates a 12-
byte FILLER item at the beginning of each symbolic map. It should always be specified for
COBOL programs.

SDSF

TIP # 082
SDSF

If you want to rearrange the columns in SDSF -
1.Go TO SDSF.
2.In command line type "arr ?".
3.This will bring the complete list of SDSF column names.
4.You can move the columns using "/" and "//".
One Column in the SDSF that we can bring to the front position is the MAX-RC (which usual is
the last column in SDSF ) which shows the completion code or the abend code of the job.

TIP # 083
SDSF

How to allow another user to browse my job?
Usually if we want other user to see our job, we supply them with jobname and jobid.
They use, OWNER urid and PRE urid* to browse your job.
One simple way to allow another user to browse is to change the DEST column in either the H /I
or ST panel of the particular job to the another user id(who wants to view it).
The Other user need not issue commands or change panels to view your job. It will be available
in his Hold/Output panel itself.

TIP # 084
SDSF

I have some 50 jobs in my SPOOL. I want to list only the jobs that are ABENDED.
For such a kind of listing, use the primary command FILTER on the command line as given in
the examples below
FIL MAX AB* - shows jobs that has ABENDS
Other Examples are:
FIL MAX ‘JCL ERROR’ - shows jobs that has JCL errors
FIL MAX NE ‘RC 0000’ - shows jobs with “exceptional conditions”
FIL MAX EQ ‘RC 0000’ - shows successfully completed jobs
If you want to switch off the filter, then issue FIL OFF

TIP # 085
SDSF

For selecting jobs in the SDSF queue , I either use "?" or "S".
When I use "?" , I get the break-up output groups for example like
JESMSGLG,JESJCL,JESYSMSG,SYSPRINT,SYSUT2 etc.
When I use "S" , the entire job is selected without this break-up.
Is there any command to navigate to view each output group when I use "S" to select the job?
After opening the job using "S", use "N" (next) or "P"(Previous) to navigate between different
output groups.

SORT

TIP # 079
SORT

Do you know COBOL Internal SORT and MERGE is actually done by DFSORT ?!!
If you SORT or MERGE with COBOL, the compiler automatically generates a SORT or
MERGE control statement for you with the correct DFSORT descriptions for the COBOL fields
you specify.

TIP # 080
SORT

How can I replace all the low-values in a file to spaces??
Use ALTSEQ CODE .
Here's an example of how you could change all low values (X'00') to spaces (X'40'), in an FB
data set with an LRECL of 80:
ALTSEQ CODE=(0040)
OUTREC FIELDS=(1,80,TRAN=ALTSEQ)
(Source: IBM SORT website)

TIP # 081
SORT

SYNCSORT
My Production job is such that, on one of the steps it has to
copy a VSAM dataset to flat file, and then process that flat
file in the subsequent steps. Sometimes the input VSAM may be
empty. When its empty, my job abends. How can I prevent the job
from abending when the VSAM is empty ?
Pass the parameter, VSAMEMT=YES for the SORT utility.
i.e,
//STEP3 EXEC PGM=SORT,PARM=’VSAMEMT=YES’
//*
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=VSAM.DSN
// DISP=SHR
//SORTOUT DD DSN=FLATFILE.DSN
// DISP=SHR
//SYSIN DD *
SORT FIELDS=COPY
/*

FILEAID

TIP # 070
FILEAID

The Easiest and Coolest way to locate bad data is thru File-Aid's FIND command.
1.OPEN the file in FILE-AID (in either browse or edit mode)
2.XREF with COPYBOOK.
3.Use FMT mode
4.Then issue ,
F /field-name INVALID
or
F /field-number INVALID
The control will take you to the first invalid data record for the given field.
e.g.,
The FILE has 3 fields namely NAME,AGE,COUNTRY.
If you want to find the invalid data in the age field, then issue
F /2 INVALID

TIP # 071
FILEAID

We always face a s ituation such that when we have opened a File in FI LEAI
D Brows e mode but later wished it was EDI T Mode and vice ver sa. S o in
this s ituation, what we do is come out of the brows e mode and again open in
edit mode and vice ver sa. But ther e is a cool command available in FI LE-AI D
to help us in this type of s ituation.
I f u r in Brows e Mode and want to change it into EDI T Mode , in the Line
Command is sue
COMMAND = = > GO EDI T
I f u r in EDI T Mode and want to change it into BROWS E Mode , in the Line
Command is sue
COMMAND = = > GO BROWS E

TIP # 072
FILEAID

How to determine compile date of loadlib member ??
Use FILE-AID !!
1. Go to FILE-AID 3.1 option
2. In the Library Utility type in the loadlib dataset name
3. Type 'a' next to the member name
4. TDATE is compile date

TIP # 073
FILEAID

Whats the best way to count the number of records in a VSAM File?
1.Choose FILE-AID Option 3.8
2. At the prompt of ....ENTER NEXT FUNCTION OR END , enter TALLY
3. U will get the record count
4. Type END to exit.

TIP # 074
FILEAID

While working in MS Excel we have the option of “freeze Panes”. By this options we can freeze
some columns and have other columns scrolling. This feature is helpful in analysis when there
are lots of columns(fields) in a file.
In mainframe too, we have similar such facility thru File-Aid.
1.Open the file in File-Aid
2. use VFMT format
3. If you want to freeze columns(fields) 1,2,3, and 6 and have the rest as scrollable
issue command HOLD 1-3,6

TIP # 075
FILEAID

Can I issue FIND command to find values that are less than or greater than ‘certain value’ at
column 25??
We can’t accomplish this task thru ISPF , but File -Aid provides us the facility to issue FIND
command with relational operators like EQ,NE,LT,GT,LE and GE.
e.g.,
FIND LT ‘2004’ 25 ALL
So if one wants to use relational operator along with FIND command, open the same dataset in
FILE-AID.

TIP # 076
FILEAID

Consider this situation. I am doing a verification on an output file. The output file has 200 fields.
I need to verify only 25th and 175th fields only.
I am using FILE-AID’s VFMT mode and for each record I am scrolling between 25 th and 175th
field. Is there any efficient way to handle this situation?
Some people might use HOLD to freeze 25th and 175th field , but still other fields are displayed ,
which is an annoyance.
Here is one better way:
In the VFMT mode, issue DISPLAY 25 175 ONLY
Only 25th and 175th fields will be displayed.

TIP # 077
FILEAID

ABEND SOLVING
At midnight I receive production call.
One job abended due to classic S0C7. Thru analysis I located the particular field which is a
COMP-3 and junk data is sitting in that field for some records.These bad records are not
contiguous but occuring randomly in the input file.
Now to save my head I have to delete all the records with bad data in that particular field and reexecute
the job quickly. Assume that input file has some 10 million records. How can I eliminate
the bad records in an efficient and a fast method?

Here is the approach:
Using the following FILE-AID option in batch mode
$$DD01 DROP IF=(field-position, field-length, NEP)
NEP means Not Equal to PACK
One can generalize and customize the below JCL to deal with similar type of ABENDS.
For Example,
My input layout is:
01 TEST-RECORD.
05 NAME-FIELD PIC X(5).
05 AMOUNT-FIELD PIC 9(3) COMP-3.
My JCL to eliminate the bad records:
//STEP01 EXEC PGM=FILEAID
//*
//SYSUDUMP DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSLIST DD SYSOUT=*
//SYSTOTAL DD SYSOUT=*
//DD01 DD DSN=MYID.CHECK.OUT,DISP=SHR
//DD01O DD DSN=MYID.CHECK.OUT,
// DISP=(NEW,CATLG,CATLG),
// DCB=(MYID.CHECK.OUT)
//SYSIN DD *
$$DD01 DROP IF=(6,2,NEP)
/*
This will drop the bad data records and retain only the good one.

TIP # 078
FILEAID

I want to do Fuzzy Comparison of files!!
My requirement is to compare 2 files of which for one certain field I can have + or - 1 value which should
be acceptable while comparing.
Thru FILE-AID COMPARE (OPTION 10), one can set percentage amount for numeric
fields that determines "close enough" matches. When the "Formatted Criteria" table
appears after the 2 files are specified, use the "T" line command. This brings up a

"Tolerance Value/Percentage Specification" panel where you can set a plus or minus
value for a numeric field.

VSAM

TIP # 059
VSAM

Performance Tuning
One can speed up applications greatly by using memory to cut I/O when dealing with VSAM
datasets.
For this VSAM Buffers can be enlarged.
In the DD statement code AMP parameters = BUFNI(index), BUFND(data), BUFSP ( amount of
virtual storage)
Increase number of Data buffers (BUFND) for sequential access
Increase number of Index buffers (BUFNI) for random access

TIP # 060
VSAM

IDCAMS Utility can't be executed without 2 DD Statements.
They are SYSPRINT and SYSIN.

TIP # 061
VSAM

We know that FREESPACE(100,100) specification causes one record to be written for each
Control interval, and one Control Interval would be written for each control area. But do you
know why?
VSAM will always load the first record before taking FREESPACE option into consideration!!!

TIP # 062
VSAM

DEFINE PATH command creates an alias for the VSAM base cluster
DEFINE ALIAS command creates an alias for non-VSAM datasets

TIP # 063
VSAM

CICS, DB2, IMS can process records in existing VSAM datasets but can't create the dataset.
Even you can process VSAM data sets in COBOL programs only
after you create them with access method services.

TIP # 064
VSAM

How can I specify dummy VSAM dataset in a JCL?
Code AMP=’AMORG’ . This parameter tells the OS to treat the file as VSAM file.
//NOVSAMIO DD DUMMY,AMP=’AMORG’

TIP # 065
VSAM

I want to process a KSDS thru an alternate key. Now what are the 5 IDCAMS commands that must be
executed before the records in a KSDS can be processed thru an alternate key?
1. DEFINE CLUSTER
2. REPRO (the base cluster must be non-empty KSDS)
3. DEFINE ALTERNATEINDEX
4. DEFINE PATH
5. BLDINDEX
The first 3 IDCAMS commands should be executed in the above-mentioned order.
The last 2 IDCAMS can be done in any order.

TIP # 066
VSAM

I want to make my VSAM dataset read-only. How can I do it?
By using INHIBIT along with ALTER command
e.g.,
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
ALTER -
SECRET.KSDS.DATA -
INHIBIT
ALTER -
SECRET.KSDS.INDEX -
INHIBIT
/*
//
Notice that the ALTER command is used with DATA and INDEX and not with the cluster.

TIP # 067
VSAM

VSAM equivalent of temp dataset is to create VSAM file with REUSE option. A dataset created with
REUSE can be treated as a new dataset at any subsequent time.

TIP # 068
VSAM

How should be VSAM file defined in order that it can be accessed both in CICS and in BATCH
environment?
Define as SHAREOPTION (2,3)

TIP # 069
VSAM

While designing VSAM files, what’s the best way to choose Control Interval (CI) size for the data and the
index?
Well, it depends on whether the data will be accessed directly or sequentially.
For Direct access use small CI
For Sequential access use Lager CI

COBOL

TIP # 038
COBOL

If you are accessing ESDS VSAM file, then in COBOL do you know
that SELECT clause has something different about it!!
For ESDS,
SELECT FILE ASSIGN TO AS-DDNAME
Y
es, the DDNAMEs should be prefixed with AS- .
If you are not doing that then an S213 ABEND might occur when
attempting to open data set.

TIP # 039
COBOL

When writing a COBOL program that is to be used as a CICS application program,do not use the
compiler option DYNAM.

TIP # 040
COBOL

MERGE statement can have OUTPUT PROCEDURE but not INPUT PROCEDURE !!

TIP # 041
COBOL

Do you know how COBOL Compiler finds a dataset as VSAM dataset?
When the ORGANIZATION clause is coded for a file, the COBOL compiler interprets it as a
VSAM dataset. Hence, the ORGANIZATION clause should not be coded with a non-VSAM
dataset.

TIP # 042
COBOL

Do you know using an odd number of digits for PACKED DECIMAL (COMP-3) is 5% to 20%
faster than using an even number of digits !!

TIP # 043
COBOL

Performance considerations for indexes vs subscripts:
using COMP to address a table is 30% slower than using indexes!
using COMP-3 to address a table is 300% slower than using indexes !!
using DISPLAY data items to address a table is 450% slower than using indexes !!!
(source: Cobol performance tuning manual)

TIP # 044
COBOL

Rule of the THUMB:
For a table with less than 50 entries ==> go for SEARCH ( Sequential Search)
greater than 50 entries ==> go for SEARCH ALL ( Binary Search)

TIP # 045
COBOL

In CO BO L, why we READ FILE but W RITE RECO RD?
You READ a FI LE becaus e you don’t know in advance:
1.whether ther e actually is a RECORD to read or not
2. For var iable or undefined length files , how long the nex t RECORD will be,
if ther e is one.
You Wr ite a RECORD becaus e you know in advance the answer s to both of
the above ques tions .

TIP # 046
COBOL

Using OPEN OUTPUT to load a VSAM file will significantly improve the performance of your
program. Using OPEN I-O or OPEN EXTEND will have a negative impact on your program's
performance.

TIP # 047
COBOL

Avoid repetitive uses of the INITIALIZE statement.
INITIALIZE once and move it to a second like sized 01 level, then move the second 01 level to
the first to initialize the fields.

TIP # 048
COBOL

Consider using an in-line PERFORM instead of a SEARCH when you have less than 20
elements in a table.

TIP # 049
COBOL

One can generate a complete listing of compiler diagnostic messages, with their explanations, by
compiling a program with the program-id of ERRMSG specified in the PROGRAM-ID
paragraph.
EX:
IDENTIFICATION DIVISION
PROGRAM-ID.ERRMSG.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
STOP RUN.

TIP # 050
COBOL

For KSDS or RRDS , when DELETE statement is used, the file must be
opened in I-O Mode.

TIP # 051
COBOL

Performance Tuning
Taking constant expressions out of a loop speeds up a program with no ill effects.
Example
Move zero to total.
Perform varying I from 1 by 1 until I > 100
Compute total = total + item (i) * discount
End-perform
Remove multiply from loop
Move zero to total
Perform varying I from 1 by 1 until I > 100
Compute total = total + item (i)
End-perform
Compute total = total * discount

TIP # 052
COBOL

Sometimes my initialization doesn’t work when I use INTIALIZE verb? Is there anything that I should take
care of?
When we use INITIALIZE verb to initialize group verbs, group elements which are FILLERs will
not be initialized!

TIP # 053
COBOL

I am using internal sort in my COBOL Program. Is there anyway to test the return code of sort
operation?
The return-code or completion code is stored in a SORT-RETURN special register.
If SORT-RETURN = 0 (successful completion of SORT/MERGE)
If SORT-RETURN = 16 (Unsuccessful completion of SORT/MERGE)

TIP # 054
COBOL

In general, it is advantage to use COMP for numeric data and COMP-3 for decimal data.

TIP # 055
COBOL

Here is one better way of INITIALIZATION of a record or group item.
INTIALIZE WS-RECORD
REPLACING ALPHANUMERIC DATA BY SPACES
NUMERIC DATA BY ZEROES.

TIP # 056
COBOL

SEARCH ALL condition only test an equal condition.

TIP # 057
COBOL

In COBOL SELECT clause, I see sometimes see ASSIGN coded like this…
SELECT INFILE ASSIGN TO UT-S-INFILE
OR
SELECT INFILE ASSIGN TO DA-S-INFILE
What they mean actually…
First part in DDNAME: - Device Class
UT stands for Utility (Tape or Sequential Disk)
DA stands for Direct-Access (disk)
Second part in DDNAME: - Method of Organization
S – Sequential (Printer, terminal, disk or tape)
I, R, D – Disk files to be accessed randomly

TIP # 058
COBOL

When using INPUT /OUTPUT PROCEDURE with SORT
We RELEASE record-name (for INPUT PROCEDURE) and
We RETURN file-name (for OUTPUT PROCEDURE)