Download presentation
Presentation is loading. Please wait.
1
Advanced COBOL Dr. David E. Woolbright 2011
2
Documentation IBM Enterprise COBOL for z/OS
Especially helpful for programmers: Language Reference Manual Programming Guide
3
Course Outline QSAM File Processing Subprograms Tables Defining files
Dynamic File processing in COBOL Subprograms CALL Parameter passing techniques CANCEL Nested programs Recursion Tables Single Dimension Multi-Dimension Subscripts and Indexes Searching
4
Course Outline Debugging XML and COBOL Basics Dumps
Introduction to XML Parsers Cobol Features Parsing Events
5
Course Outline Files with Variable Length Records Strings Pointers
UNSTRING INSPECT Reference modification Pointers VSAM File Processing
6
Course Outline Files with Variable Length Records Strings Pointers
UNSTRING INSPECT Reference modification Pointers VSAM File Processing
7
Queued Sequential Access Method
QSAM File Processing Queued Sequential Access Method
8
QSAM Files Unkeyed, Sequentially created and processed
Records cannot change length or position QSAM files on direct access storage can be modified with REWRITE ENVIRONMENT DIVISION. FILE-CONTROL paragraph SELECT I-O-CONTOL paragraph APPLY WRITE-ONLY DATA DIVISION FILE SECTION FD
10
Environment Division - File Control
SELECT file-name1 OPTIONAL ASSIGN assignment-name TO
11
Environment Division File-CONTROL
Optional – used for files opened in I-O, INPUT, or EXTEND. File doesn’t have to be present when the program is executed. File-name1 – identifies an FD entry (internal file name) Assignment-name – identifies the external file. If name component of the SELECT clause is found in the JCL it is treated as a DD name. If not found in the JCL, then “name” is treated an an environment variable
12
QSAM File Name name label- S-
Label – documents for the programmer the device and device class to which the file is assigned. No effect on execution. Must end with a dash S – Optional. Indicates sequential organization
13
Environment Variables
14
Exercise A (Dynamic Files)
Statically allocate and read BCST.SICCC01.TESTPDS(DYNAMDAT) This file contains member names of other members in BCST.SICCC01.TESTPDS Dynamically Read each member that is listed and display the records in each member After you can display all the records, try writing out the records to a dynamically allocated file Use BCST.SICCC01.PDSLIB(DYNAM2) to help you read a file dynamically Use BCSC.SICCC01.PDSLIB(DYNAM1) to help you write a file dynamically
15
Environment Variables
Defined as WORKING-STORAGE fields using value clauses 01 FILE-ENV-VAR PIC X(39) VALUE “DYNFILE=DSN(INPUT.FILE) SHR”. Can be used to access QSAM files or existing VSAM clusters.
16
Reserve Clause (optional)
RESERVE integer AREA AREAS
17
RESERVE Clause Specifies the number of I/O buffers allocated the file at run-time If omitted, the number of buffers is taken from the DD statement. If none are specified, the system default is taken
18
QSAM Buffering QSAM buffers can be allocated above the 16 MB line if all of the following are true: - Enterprise COBOL - z/OS Language Environment - the programs are compiled with RENT and DATA(31) or compiled with NORENT and | RMODE(ANY) - the program is executing in AMODE 31 - the program is executing on MVS - the ALL31(ON) run-time option is used (for EXTERNAL files)
19
ORGANIZATION Clause (optional)
ORGANIZATION IS SEQUENTIAL Other non-QSAM options: INDEXED, RELATIVE, LINE SEQUENTIAL Records are read and written in a serial manner
20
PADDING Clause PADDING data name CHARACTER IS literal
Specifies a character for block padding on sequential files Data name – a one character field Literal – a one character alphanumeric literal or national symbol
21
ACCESS MODE Clause ACCESS SEQUENTIAL MODE IS
Default mode is SEQUENTIAL Options for other types of files include RANDOM and DYNAMIC
22
FILE STATUS Clause STATUS dname1 FILE IS dname2
- The operating system moves a value to dname1 and possibly dname2 after each I/O operation. dname1 - a two character alphanumeric or national field dname2 – used for VSAM
23
Environment Division I-O-CONTROL
INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT … I-O-CONTROL. APPLY WRITE-ONLY ON MYFILE. (Used for sequential variable blocked files.)
24
Defining QSAM Files and Records
FILE-CONTROL. SELECT CUSTOMER-MASTER ASSIGN TO CUSTMAST ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS RC.
25
DATA DIVISION FILE SECTION - Sequential
27
DATA DIVISION FILE SECTION - FD
28
EXTERNAL The EXTERNAL clause specifies that a file connector is external, permitting file sharing between two programs in the same run unit
29
GLOBAL GLOBAL clause specifies the file-connector name is available to the declaring program and all programs contained directly or indirectly Used for nested programs
30
BLOCK CONTAINS BLOCK CONTAINS 0 RECORDS
If this clause is omitted, records are unblocked by default! Allows the blocksize to be specified in the JCL or by the operating system Code this Statement! (TSYS Standard)
31
RECORD Clause Specifies the number of bytes in a record (fixed or variable) When omitted, the compiler determines lengths based on record descriptions. RECORD CONTAINS 80 CHARACTERS RECORD CONTAINS 50 TO 80 CHARACTERS RECORD IS VARYING IN SIZE FROM 40 TO 60 CHARACTERS DEPENDING ON REC-COUNT.
32
RECORDING MODE Specifies the format of physical records in a QSAM file (ignored for VSAM) F – fixed size, V – variable size, U – unblocked, fixed or variable, S – spanned, large records that span a block RECORDING MODE IS F RECORDING MODE IS V RECORDING MODE IS U RECORDING MODE IS S
33
DATA RECORD Clause DATA RECORD clause identifies the data areas associated with the file Syntax checked but is only documentation DATA RECORD IS INPUT-AREA. DATA RECORDS ARE INPUT-AREA1 INPUT-AREA2
34
FD Example FD IN-FILE IS GLOBAL RECORDING MODE F
BLOCK CONTAINS 0 RECORDS LABEL RECORDS ARE STANDARD RECORD CONTAINS 80 CHARACTERS DATA RECORD IS IN-AREA. 01 IN-AREA. 05 …
35
LABEL RECORDS Label records are records written at the beginning and end of DASD and Tape files that provide information about file Enterprise COBOL only supports standard labels LABEL RECORDS ARE STANDARD LABEL RECORDS ARE OMITTED
36
Subprograms
37
Calling a Subprogram Syntax for CALL
CALL “subprog name” [ USING [BY REFERENCE | BY CONTENT] ident1 …] END-CALL The subprog name usually refers to an 8 byte field that contains the program name to be called Static call is made when subprogram name is hard-coded and compiler option = NODYNAM Subprogram can be written in any supported language
38
Calling a Subprogram CALL variable-name [ USING [BY REFERENCE | BY CONTENT | BY CONTENT LENGTH OF | BY CONTENT ADDRESS OF ] ident1 …] END-CALL The variable-name usually refers to an 8 byte field that contains the program name to be called Names can be longer with Enterprise COBOL The variable-name can be modified as the program is running to call different programs
39
Calling a Subprogram Linking to the called program is dynamic
At TSYS, all calls are dynamic ( DYNAM compiler option) BY REFERENCE is the default BY REFERENCE provides the subprogram with access to a main program variable. The receiving variable is an alias for the passed variable BY CONTENT provides the subprogram with access to a copy of a main program variable
40
Calling a Subprogram BY CONTENT ADDRESS OF provides a copy of the address of the passed variable (must be a linkage area name) BY CONTENT LENGTH provides a copy of the length of a variable
41
Example Parameters
42
The Called Program Specifies the names of the receiving variables with a USING statement in the PROCEDURE DIVISION statement or in an ENTRY statement PROCEDURE DIVISION USING A. Or ENTRY “COMPUTE” USING COST RESULT. PROCEDURE DIVISION USING A COST RESULT. The variables in the using statement are 01 group items defined in the LINKAGE SECTION or 77 items LINKAGE SECTION. 01 A PIC X(8). O1 COST PIC S9(5) PACKED-DECIMAL. 01 RESULT PIC S9(5) BINARY.
43
The Called Program The called program can return values to the calling program by modifying variables that are passed by reference PROCEDURE DIVISION USING COST. … MOVE ITEM-COST TO COST
44
Exercise #1 Create a main program that calls a subprogram
Print “I am in the main program” in the main program Call the subprogram Print “I am in the subprogram” in the subprogram Print “I am back in the main program” in the main.
45
Exercise #2 Create a two variables X and Y in the main program (you pick the type and value). Print the values of X and Y in the main program Pass X BY REFERENCE and Y BY CONTENT to the subprogram Print the variables in the subprogram Change the values of each variable in the subprogram Print the length of x by passing the length using BY CONTENT LENGTH (Receiving variable PIC S9(8) BINARY) Print the values of the variables again in the main program
46
Canceling a Subprogram
CANCEL syntax CANCEL literal CANCEL identifier Canceling a program means the program will be in its initial state if the program is called again Canceling a program closes all files associated with an internal file connector of the canceled program No action is taken when canceling a previously canceled program or one that has not been dynamically called
47
Exercise #3 Have the main program call a subprogram four times.
Create a local numeric variable Z in the subprogram with initial value 1. Each time the program is called, print Z and then add 1 to it. Repeat the experiment after adding “IS INITIAL” to the PROGRAM-ID PROGRAM-ID. MYPROG IS INITIAL.
48
Subprograms Subprograms remain in their last used state when they terminate with EXIT PROGRAM or GOBACK A program that is coded with INITIAL will always be called with its initial state
49
Exercise #4 Repeat Exercise #3, canceling each program after each subprogram call
50
Return Codes Use the RETURN-CODE special register to test and transmit return codes through register 15 After calling a subprogram, test RETURN-CODE to see if the subprogram completed normally At the end of a suprogram, set RETURN-CODE to indicate the results of the call
51
Exercise #5 Write a main program that passes a numeric parameter, say X, to a subprogram. If the parameter is negative have the subprogram set a return code of 4. If the parameter is non-negative, the subprogram should set the return code to 0. Have the main program test the return code after the subprogram has completed. The main program should print a message indicating the type of number the subprogram received. Try running the main program passing negative and non-negative values for X.
52
External Files Files can be shared by multiple programs in the same run unit. Each program declares the file to be “EXTERNAL” FD MYFILE IS EXTERNAL RECORD CONTAINS 80 CHARACTERS RECORDING MODE IS F. 01 MY-RECORD. …
53
External Files Each program has the same SELECT statement:
SELECT MY-FILE ASSIGN TO MYFILE FILE STATUS IS MYSTATUS ORGANIZATION IS SEQUENTIAL.
54
Reading Records READ MYFILE INTO MY-RECORD READ MYFILE
Move mode IO – Data flows from an I/O buffer into working storage. READ MYFILE Locate mode I/O – Data remains in an I/O buffer. Efficient processing technique TSYS standard
55
External Files Make the file status field external so there is only one shared field for all programs. Each program declares: 01 MYSTATUS PIC 99 EXTERNAL. Be sure to work in locate-mode.
56
Exercise #6 Write a main program that opens a sequential file and calls a subprogram each time it needs a record. Write a subprogram that reads a single record and returns to the main program. Have the main program print all the records in the sequential file and then close the file. Share the same file between the two programs by making the file external with a shared file status field.
57
PROCEDURE DIVISION…RETURNING
An alternate form of passing information back to a calling program is provided: PROCEDURE DIVISION RETURNING dataname To call a “Function” the invocation is: CALL program-name RETURNING dataname Avoid this alternative in favor of Pass By Reference.
58
Nested Programs Avoided in production programs at TSYS
Convenient for developing (one file, one compilation) Nested programs can be separated easily into regular programs after debugging Can be used instead of PERFORM CALL to a nested program is as efficient as a PERFORM Each program ends with END PROGRAM
59
Nested Program Structure
ID DIVISION. PROGRAM-ID. X. PROCEDURE DIVISION. CALL “X1” GOBACK . PROGRAM-ID. X1. DISPLAY “I AM IN X1” END PROGRAM X1. END PROGRAM X. PROGRAM X PROGRAM X1
60
Exercise #7 Convert one of your main programs and subprograms to a nested program version Canceling only makes sense for dynamically called programs Cause an abend in your subprogram. Look at the storage dump and error information. Is it any harder to debug than a regular program?
61
COBOL is Recursive Now A COBOL program can call itself
To make a program recursive, add “IS RECURSIVE” to the PROGRAM-ID statement PROGRAM-ID. SUBPROG IS RECURSIVE. Nested programs cannot be recursive
62
Passing a Parm with JCL A parm can be coded on the EXEC statement in order to pass a parameter to the program that is being executed: // EXEC PGM=PROGNAME,PARM=‘HI there!' The COBOL program will receive the parm through the LINKAGE SECTION Code a LINKAGE SECTION description similar to this: 01 PARM-BUFF. 05 PARM-LEN PIC S9(4) BINARY. 05 PARM-DATA PIC X(256). Code a using statement on the PROCEDURE DIVISION PROCEDURE DIVISION USING PARM-BUFF.
63
Passing a Parm with JCL The parm field is variable in length
Use the length field and reference modification to move variable length data MOVE PARM-DATA(1:PARM-LEN)TO PARMO
64
Exercise #8 Try coding a main program that receives a parm and prints it out Run the program with the following EXEC statements: // EXEC PGM=PROGNAME,PARM=‘HI!‘ // EXEC PGM=PROGNAME,PARM=‘HI THERE!‘ // EXEC PGM=PROGNAME,PARM=‘ABCDEFGHIJKLMNOPQRSTUV'
65
Omitted Parameters You can leave out some arguments when coding a CALL statement by coding OMITTED in place of the passed variable CALL “THATPROG” USING P1,OMITTED,P3 Test for the OMITTED parameter by checking to see if the address of the received parm is NULL. PROCEDURE DIVISION USING X Y Z. … IF ADDRESS OF Y = NULL DISPLAY “PARM Y WAS NOT PASSED” END-IF
66
Exercise 8A Write a main program that passes three parameters to a subprogram. The subprogram detects and prints the passed parameters. Try calling the subprogram with each parameter omitted.
67
Tables
68
Creating A Single Dimension Table
Build a storage area with list of data values defined with multiple picture clauses Redefine the storage area as a single dimension table by defining a typical table entry as an “occuring” item.
69
Creating A Single Dimension Table
01 DAY-TABLE-VALUES. PIC X(9) VALUE 'SUNDAY '. PIC X(9) VALUE 'MONDAY '. PIC X(9) VALUE 'TUESDAY '. PIC X(9) VALUE 'WEDNESDAY'. PIC X(9) VALUE 'THURSDAY '. PIC X(9) VALUE 'FRIDAY '. PIC X(9) VALUE 'SATURDAY '. 01 DAY-TABLE REDEFINES DAY-TABLE-VALUES. 05 WEEKDAY PIC X(9) OCCURS 7 TIMES.
70
“Fat” Single-Dimension Tables
01 EMPLOYEE-TABLE. 05 EMPLOYEE-REC OCCURS 100 TIMES. 15 EMP-NO PIC X(5). 15 NAME PIC X(20). 15 LOC-CODE. 25 TERR-NO PIC XX. 25 OFFICE-NO PIC XX.
71
Employee Table 12345 Joe Brown 10 20 12345 Joe Brown 10 20
EMPLOYEE-REC(1) Joe Brown Joe Brown Joe Brown Betty Smith Joy Dokes Jim Doyle LOC-CODE(3) NAME(3) EMP-NO(4)
72
Exercise #9 Implement a single dimension table of days. Print the table from beginning to end Turn the table into a “fat” table by adding a column with the number of letters in each day name. Print each day name and the number of letters it contains.
73
Multi-Dimension Tables
COBOL supports up to 7 dimensions in tables Use OCCURS within OCCURS to add multiple dimensions 01 EMP-TABLE 05 EMPLOYEE OCCURS 100 TIMES. 10 NAME PIC X(30). 10 HOURS PIC S99 OCCURS 7 TIMES.
74
Multi-Dimension Table
01 EMP-TABLE. 05 EMPLOYEE OCCURS 3 TIMES. 10 NAME PIC X(30). 10 HRS PIC S99 OCCURS 3 TIMES. NAME(1) HRS(1,1) HRS(1,2) HRS(1,3) NAME(2) HRS(2,2) HRS(2,3) HRS(2,1) NAME(3) HRS(3,1) HRS(3,2) HRS(3,3) EMPLOYEE(3)
75
Exercise #10 Create a table of integers with 4 rows and 5 columns.
Print the table row by row Print the table column by column Compute and print the sum of each row Compute and print the sum of each column Compute and print the sum of all entries in the table
76
Creating Tables with Indexes
01 EMPLOYEE –TABLE. 05 EMPLOYEE OCCURS 100 TIMES INDEXED BY I,J. 01 SALES-TABLE. 05 MONTH-RECORD OCCURS 12 TIMES INDEXED BY M. 10 NAME PIC X(30). 2O AMOUNT PIC 9(5)V99 PACKED-DECIMAL OCCURS 31 TIMES INDEXED BY D.
77
Subscripts vs Indexes Subscripts Represent an occurrence number
User defined as a numeric field – best to choose USAGE IS BINARY Printable (since they are numeric) Can use relative subscripts J+1 or J-3 Manipulated with PERFORM loops, assignments, and arithmetic commands
78
Subscripts vs Indexes Indexes
Represent a displacement value from the start of a table. More efficient than subscripts Created automatically when a table is defined with indexes Not really designed to be printed Manipulated with PERFORM loops, and SET statements
79
SET Statements Examples SET J TO K SET J TO 1 SET K UP BY 1
SET K DOWN BY 1 SET K TO K + 1
80
Exercise #11 Convert Exercise #10 so that you are using indexes instead of subscripts
81
Sequential Search COBOL provides a SEARCH command that provides a sequential search for tables that have indexes Table entries do not have to be sorted AT END clause provides code in the situation that the search is unsuccessful Searching starts with the current index value
82
SEARCH
83
Sequential Searching 01 EMPLOYEE-TABLE. 05 EMPLOYEE OCCURS 100 TIMES
INDEXED BY I-NDX. 10 EMP-NO PIC 9(5). 10 EMP-RANK PIC X(5). … SET I-NDX TO 1 SEARCH EMPLOYEE AT END DISPLAY ‘NOT FOUND’ WHEN EMP-NO(I-NDX) = 12345 DISPLAY EMP-RANK(I-NDX) END-SEARCH
84
Sequential Searching 01 EMPLOYEE-TABLE. 05 EMPLOYEE OCCURS 100 TIMES
INDEXED BY I-NDX. 10 EMP-NO PIC 9(5). 10 EMP-RANK PIC X(5). … SET I-NDX TO 1 SEARCH EMPLOYEE AT END DISPLAY ‘NOT FOUND’ WHEN EMP-NO(I-NDX) < 10000 DISPLAY EMP-RANK(I-NDX) WHEN EMP-NO(I-NDX) > 2000 END-SEARCH
85
Sequential Search Search can be continued in a loop after setting index value up or down SET I-NDX TO 1 PERFORM UNTIL … SEARCH EMPLOYEE AT END DISPLAY ‘NOT FOUND’ WHEN EMP-NO(I-NDX) = 12345 DISPLAY EMP-RANK(I-NDX) SET I-NDX UP BY 1 END-SEARCH END-PERFORM
86
Exercise #12 Create a fat single dimension table with the data in the file DATA1. Read the file and store the second (Item #) and third fields (Item name) in the table. Assume a fixed size table of 40 items. Sequentially search the table for item #s in the range 400 to Print out the results of the search.
87
Binary Searching Entire table is searched. No need to initialize an index Table must have an ASCENDING or DESCENDING KEY IS clause. Table must be sorted. Only one WHEN clause allowed. The WHEN clause is comprised of one or more “equal” tests joined by AND operators AT END clause is invoked if the WHEN clause is never satisfied
88
Binary Search
89
Binary Searching 01 EMPLOYEE-TABLE. 05 EMPLOYEE OCCURS 100 TIMES
ASCENDING KEY IS EMP-NO INDEXED BY I-NDX. 10 EMP-NO PIC 9(5). 10 EMP-RANK PIC X(5). … SEARCH ALL EMPLOYEE AT END DISPLAY ‘NOT FOUND’ WHEN EMP-NO(I-NDX) = 12345 DISPLAY EMP-RANK(I-NDX) END-SEARCH
90
SEARCH ALL SEARCH ALL performs a binary search with an index
ENTRIES MUST BE IN ORDER No SET necessary (whole table searched) 01 SALES-TAX. 05 TAB-ENTRIES OCCURS 100 TIMES ASCENDING KEY ZIPCODE INDEXED BY K. 10 ZIPCODE PIC 9(5). 10 RATE PIC V999. SEARCH ALL TAB-ENTRIES AT END MOVE 0 TO TAX WHEN ZIPCODE(K) = ZIPIN COMPUTE TAX = RATE(K) * AMOUNT END-SEARCH
91
SEARCH ALL CONSTRAINTS
The condition following WHEN must test for equality Compound conditions with ANDs not Ors Only one WHEN clause VARYING not allowed OCCURS item and its index must appear on the left of the equal sign WHEN TEMP(K) = 80
92
SEARCH ALL Constraints
Table must indicate ASCENDING or DESCENDING KEY 01 TABLE. 05 CUST-REC OCCURS 40 TIMES ASCENDING KEY CUST INDEXED BY K. 10 CUST PIC 9(4). 10 RATE PIC V999.
93
Exercise #13 Convert Exercise #12 to a binary search.
94
Variable Length Tables
Storage for variable length tables is statically created To create a variable length table, use an alternative version of OCCURS Example: OCCURS 1 TO 100 TIMES To create a variable length table add a DEPENDING ON clause to the table definition Example: DEPENDING ON REC-COUNT
95
Variable Length Tables
After loading the table with entries, set the index to point at the last item. Move the index to the DEPENDING ON field 01 CUST-TABLE. 05 CUSTOMER OCCURS 1 TO 50 TIMES DEPENDING ON C-COUNT ASCENDING KEY IS AGE INDEXED BY I. 10 NAME PIC X(20). 10 AGE PIS S999.
96
Exercise #14 Convert Exercise #12 to a variable length table.
Assume you don’t know how many items will be in the table, but the range is 30 to 100 items.
97
Intrinsic Functions MEAN ( ARG1, ARG2,…) MEDIAN (ARG1, ARG2…)
STANDARD-DEVIATION(ARG1,ARG2,…) VARIANCE (ARG1,ARG2, …) RANGE (ARG1, ARG2, …) MAX (ARG1, ARG2, …) MIN (ARG1, ARG2, …) ORD-MIN (ARG1,ARG2,…) ORD-MAX (ARG1,ARG2,…) SUM (ARG1, ARG2, …)
98
Intrinsic Functions CURRENT-DATE UPPER-CASE (ARG) LOWER-CASE(ARG)
ANNUITY(RATE,NO-OF-PAYMENTS)- returns a decimal fraction that when multiplied by loan amount produces the payment. Rate must be consistent with payment period. PRESENT-VALUE(RATE,AMT1,AMT2,…) – returns the present value of future payments
99
Intrinsic Functions SQRT(ARG)
REM(ARG1,ARG2) –returns the remainder of arg1 divided by arg2 MOD(ARG1,ARG2)- similar to REM but with integer arguments INTEGER(ARG) – the greatest integer less than or equal to ARG INTEGER-PART(ARG) – the integer part of ARG NUMVAL(ARG) – the numeric value of an argument that contains leading spaces, sign, or decimal point
100
Intrinsic Function Syntax
FUNCTION function-name [(arg1 …] Arguments can be literals, variables, expressions, other functions Functions can operate on tables by using the word ALL for the subscript COMPUTE X = FUNCTION SUM(SALARY(ALL)) COMPUTE Y = FUNCTION SUM(PRICE(1 ALL)) Usually used with COMPUTE or MOVE
101
Exercise #15 Using Exercise #10 and intrinsic functions, compute the minimum value of each row and the mean of the entire array.
102
Reconsidering Tables With vast amounts of main storage today, you should consider the types of file operations you are using and whether or not an application could benefit by pulling an entire file (or part of a file) into main storage. Working directly with records in memory is very efficient and can speed up an application greatly Most of the time spent in an application is in I/O.
103
Files with Variable Length Records
104
Variable Length Records
FD CUSTFILE RECORD IS VARYING IN SIZE FROM 50 TO 80 CHARACTERS DEPENDING ON RECSIZE. When a record is read from a file defined with the RECORD IS VARYING IN SIZE.. DEPENDING ON identifier phrase, the size of the record read into the buffer is moved into the data-item identifier To write to a file defined with the RECORD IS VARYING IN SIZE.. DEPENDING ON identifier phrase, the size of the record to be written must first be moved to the identifier data-item, and then the WRITE statement must be executed.
105
Exercise #16 Use program WRITEVAR as a model. Run the program to create a variable length record file. Write a program READVAR that reads the file and prints out the total sales for each person
106
Strings
107
String The STRING command is used combine one or more strings into a single concatenated result
108
Joining Strings Use STRING to join multiple parts of strings into an entirely new string STRING ident1 DELIMITED ident2 literal BY literal size INTO ident3 POINTER ident4 WITH OVERFLOW imperative stmt ON
109
Joining Strings NOT OVERFLOW imperative stmt END-STRING
110
Delimited By The characters in ident1 or literal1 are used to build a new string Only the characters up to the delimiter are transferred ”ABCDEF” DELIMITED BY ”D” transfers ”ABC” “JOE BOB SMITH” DELIMITED BY “ “ (two spaces) transfers ”JOE BOB”
111
Delimited By DELIMITED BY SIZE causes the entire identifier or literal to be transferred
112
STRING INTO The INTO clause indicates the target variable where the concatenation occurs Only one target can be indicated If the target is too small to handle the concatenation, the ON OVERFLOW condition is executed
113
With Pointer The WITH POINTER clause indicates a variable that contains the position within the target field where the next character will be placed The pointed is incremented each time a character is transferred At the end, the pointer points to the location following the last transferred character
114
On Overflow The ON OVERFLOW clause is executed if the target is too small to handle the concatenated result The ON OVERFLOW clause is also executed whenever the pointer points to a location outside of the target field
115
Example String Operation
STRING ID-1 DELIMITED BY “*” ID-2 ID-3 DELIMITED BY SIZE INTO ID-4 WITH POINTER PTR END-STRING ID-1 ABC*DE ID-3 XYZ PTR 13 ID-2 1234*5 ID (Assume PIC X(20) ABC1234*5XYZ Assume PTR is Initially 1
116
STRING
117
STRING Operation Unlike MOVE, STRING does not replace rightmost character with spaces The POINTER field is a numeric field that afterwards contains the position of the next byte in the receiving field that would have been processed. (Max = string length + 1)
118
Exercise #17 Read the file DATA1.
Create three fields in the input record: 1) cols 1 – 11 2) cols 15-18 3) cols 40-65 Remove the first part of field 1 up to the *. Remove all of field 2. Remove all of field 3 up to the first space String these three fields together. For example the first record would produce “ PEANUT” Print the results of each record.
119
UNSTRING The UNSTRNG command is used to pull apart a single string into one or more component strings
120
UNSTRING
121
UNSTRING Extracts a field into multiple strings and stores them into one or more fields DELIMITED BY indicates how each subfield ends If ALL is specified for a delimiter, successive occurrences of the delimiter are treated as one UNSTRING ADDRESS DELIMITED BY ALL “ “ INTO STATE ZIP WITH POINTER PTR END-UNSTRING
122
Delimiter In The DELIMITER IN phrase is used when you need to save the delimiter that was used for a given field UNSTRING NAME-FIELD DELIMITED BY ”*” OR ”#” INTO N1 DELIMITER IN D1 N2 DELIMITER IN D2 END-UNSTRING
123
Count In The COUNT IN phrase is used to capture the number of characters sent to a given field UNSTRING NAME-FIELD DELIMITED BY ”*” OR ”#” INTO N1 COUNT IN C1 N2 COUNT IN C2 END-UNSTRING
124
UNSTRING UNSTRING copies Characters from the source string to the destination strings according to the rules for alphanumeric moves. UNSTRING uses space filling. The DELIMITED BY clause causes data movement from the source string to the current destination string to end when 1) a delimiter is encountered in the source string 2) the end of the source string is reached.
125
UNSTRING If DELIMITED BY is not used, data movement terminates when
1) the destination string is full 2) the end of the source string is reached The UNSTRING terminates when 1) All the characters in the source string have been processed 2) All the destination strings have been processed 3) An OVERFLOW condition is encountered when the pointer is pointing outside the source string.
126
UNSTRING EXAMPLE UNSTRING ADDRESS DELIMITED BY ALL “ “
INTO STATE COUNT IN STCNT ZIP COUNT IN ZIPCNT WITH POINTER PTR END-UNSTRING
127
UNSTRING Example UNSTRING ADDRESS DELIMITED BY "," INTO LINE(1) LINE(2) LINE(3) Line(4) TALLYING IN NOLINES END-UNSTRING. Tallying leaves the number of receiving fields that actually receive data in the named variable
128
Exercise #18 Read the file DATA1.
For each record in the file, UNSTRING field 1-11 into two parts (separate at the *). Print each part.
129
INSPECT Statement
130
INSPECT Statement
131
Formats INSPECT has four formats:
1) TALLYING: used to count characters in a string. 2) REPLACING: used to replace a group of characters in a string with another group of characters. 3) TALLYING…REPLACING: combines both operations in one statement. 4) INSPECT …CONVERTING: converts each of a set of characters to its corresponding character in another set of characters.
132
TALLYING INSPECT LINE TALLYING ACOUNT FOR ALL “A”
INSPECT LINE TALLYING XCOUNT FOR ALL “X" AFTER INITIAL “S" BEFORE INITIAL “E".
133
TALLYING INSPECT LINE TALLYING ACOUNT FOR ALL “A”
XCOUNT FOR CHARACTERS BEFORE “,“ YCOUNT FOR CHARACTERS AFTER “E".
134
REPLACING INSPECT MYSTRING REPLACING ALL “X” BY “Y" AFTER INITIAL “A"
BEFORE INITIAL “Z“ REPLACING ALL “XXXX" BY “ABCD“ AFTER INITIAL “A“ BEFORE INITIAL “P"
135
TALLYING … REPLACING INSPECT LINE TALLYING ACOUNT FOR ALL “A”
REPLACING ALL “X” BY “Y" AFTER INITIAL “A" BEFORE INITIAL “Z“
136
CONVERTING INSPECT MYTEXT CONVERTING "abcdefghijklmnopqrstuvwxyz“
TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ“
137
Pointers
138
Creating a Pointer 05 PTR USAGE IS POINTER. 05 A-PTR POINTER.
These definitions create 4 byte fullwords capable of containing addresses of memory locations
139
Setting a Pointer SET PTR TO ADDRESS OF X SET PTR1 TO PTR2
The interesting point is that Cobol now allows pointers to reference storage areas that are inside the program. In older versions, Linkage areas could only reference areas outside the program.
140
“Dropping a Linkage Area”
To position a linkage section item onto a storage area, use SET ADDRESS Linkage Section. 01 X PIC X(8). SET ADDRESS OF X TO PTR
141
Cobol Pointers This fundamentally changes how Cobol can be written
Data structures can now be supported in Cobol (stacks, queues) Segmented records can be supported
142
Exercise #19 Try running programs LINKED and LINKED1 in BCST.SICCC01.PDSLIB
143
Virtual Storage Access Method
VSAM File Processing Virtual Storage Access Method
144
VSAM File Types ESDS – Entry Sequenced Data Set
Allows sequential processing RRDS – Relative Record Data Set Allows sequential or random access by relative record number KSDS – Key-Sequenced Data Set Allows sequential, skip sequential, and random processing by key
145
VSAM VSAM data sets are known as Clusters
For ESDS or RRDS the cluster consists of a data component For KSDS the cluster consists of a data component and an index component VSAM data is stored on DASD in control intervals which are grouped into control areas
146
VSAM The Control Interval (CI) is the unit of data that transfers between the disk and virtual storage CI sizes are multiples of 2K with 4k being common CI’s can be constructed with free space to accommodate additions to the file Control Areas (CA) can be constructed with free space to accommodate additions
147
VSAM VSAM dynamically manages the file by maintaining information in each CI and CA When a CI becomes too “full” the data it contains is split into two CI’s When a CA becomes too “full” the data it contains is split into two CA’s VSAM tries to keep records that are logically close together, physically close as well
148
VSAM Indexes
149
VSAM Components
150
Access Method Services (AMS)
AMS is a VSAM utility that provides numerous options DEFINE CLUSTER PRINT REPRO LISTCAT DELETE DEFINE ALTERNATEINDEX DEFINE PATH BLDINDEX
151
VSAM JCL Unlike QSAM files, VSAM files must be allocated in a separate job step before data can be written to the file VSAM cluster can be created by deleting and then defining the cluster After the cluster is defined, a job can run which writes data to the file
152
VSAM JCL Parameters: INDEXED –KSDS NONINDEXED – ESDS NUMBERED – RRDS
KEYS ( len off) – primary key info CISZ (size) – control interval size FREESPACE (ci ca) – free space %’s
153
MAKEKSDS //TSYSAD2C JOB 'YOUR NAME',USER=TSYSAD2,REGION=2048K,MSGCLASS=V //*MAIN CLASS=TSYSC,USER=TSYSAD2 //DEFINE EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DELETE TSYSAD2.PAYROLL.MASTER DEFINE CLUSTER (NAME(TSYSAD2.PAYROLL.MASTER) INDEXED RECORDSIZE(31 31) KEYS(5 0) MGMTCLAS(STANDARD) FREESPACE(0 0) SHAREOPTIONS (3 3)) DATA (NAME(TSYSAD2.PAYROLL.MASTER.DATA) - TRK(1 1) CONTROLINTERVALSIZE(4096)) INDEX (NAME(TSYSAD2.PAYROLL.MASTER.INDEX) - TRK(1 1)) /*
154
IDCAMS PRINT //TSYSAD2P JOB 'A.STUDENT',USER=TSYSAD2,REGION=2048K,MSGCLASS=V //*MAIN CLASS=TSYSC,USER=TSYSAD2 //* THIS IS AN IDCAMS PRINT //PRINT EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * PRINT INFILE(IFILE) - DUMP /* //IFILE DD DSN=TSYSAD2.PAYROLL.MASTER,DISP=SHR //
155
IDCAMS REPRO //TSYSAD2R JOB 'A.STUDENT',USER=TSYSAD2,REGION=2048K,MSGCLASS=V //*MAIN CLASS=TSYSC,USER=TSYSAD2 //* THIS AN IDCAMS REPRO //REPRO EXEC PGM=IDCAMS //FILEIN DD DSN=TSYSAD2.PGM1.RESULTS,DISP=SHR //FILEOUT DD DSN=TSYSAD2.I10.PGM1.RESULTS,DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,DCB=(RECFM=FB,LRECL=80), // SPACE=(TRK,(1,1),RLSE) //SYSIN DD * REPRO - INFILE(FILEIN) - OUTFILE(FILEOUT) /* //AMSDUMP DD SYSOUT=* //
156
Creating a VSAM File 000100 IDENTIFICATION DIVISION.
PROGRAM-ID. VSAM1. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT PAYROLL-MASTER-OUT ASSIGN TO PAYMASTO ORGANIZATION IS INDEXED ACCESS IS SEQUENTIAL RECORD KEY IS ID-OUT FILE STATUS IS PM-STATUS. SELECT PAYROLL-MASTER-IN ASSIGN TO PAYMASTI.
157
Creating a VSAM File 004410 01 PM-STATUS. 004430 05 PM-STAT1 PIC X.
PROCEDURE DIVISION. OPEN INPUT PAYROLL-MASTER-IN OPEN OUTPUT PAYROLL-MASTER-OUT IF PM-STATUS NOT = '00' PERFORM 300-PRINT-STATUS END-IF PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO ' READ PAYROLL-MASTER-IN AT END MOVE 'NO ' TO ARE-THERE-MORE-RECORDS NOT AT END PERFORM 200-READ-MODULE END-READ END-PERFORM CLOSE PAYROLL-MASTER-IN PAYROLL-MASTER-OUT GOBACK
158
Creating a VSAM File 005130 200-READ-MODULE.
MOVE ID-IN TO ID-OUT MOVE NAME-IN TO NAME-OUT MOVE HOURS-IN TO HOURS-OUT MOVE RATE-IN TO RATE-OUT DISPLAY MASTER-REC-OUT WRITE MASTER-REC-OUT IF PM-STATUS NOT = '00' PERFORM 300-PRINT-STATUS END-IF PRINT-STATUS. DISPLAY 'FILE STATUS CODE:' PM-STATUS GOBACK
159
VSAM Error Strategy VSAM returns a status code after each operation
It is imperative that you check each status code after each operation to insure that the program is proceeding normally The status code is a two byte field
160
OPEN OPEN INPUT file-name … OPEN OUTPUT file-name …
OPEN I-O file-name … OPEN EXTEND file-name … For EXTEND, access mode must be sequential
161
Reading for Sequential Access
READ file-name [NEXT] [RECORD] [INTO data-name] [AT END imperative stmt] [NOT AT END imperative stmt] [END-READ] Specify NEXT if access is DYNAMIC and you want sequential processing Can be omitted when access is SEQUENTIAL INTO provides move mode I/O Omitting INTO provides locate mode I/O
162
Reading for Random Access
READ file-name [RECORD] [INTO data-name] [INVALID KEY imperative stmt] [NOT INVALID KEY imperative stmt] [END-READ] Be sure to set the key of the record you wish to read beforehand
163
Writing WRITE record-name [FROM data-name]
[INVALID KEY imperative stmt] [NOT INVALID KEY imperative stmt] [END-WRITE]
164
REWRITE REWRITE record-name [FROM data-name]
[INVALID KEY imperative stmt] [NOT INVALID KEY imperative stmt] [END-REWRITE] A typical scenario is to read the record, modify it (can’t change the key field), and then rewrite it. For random and dynamic access, you can REWRITE a record without first reading it.
165
DELETE DELETE file-name [RECORD] [INVALID KEY imperative stmt]
[NOT INVALID KEY imperative stmt] [END-DELETE] DELETE can only be used for a file in I-O mode If file is in sequential mode, the DELETE can only be used after executing a READ statement for that record. (Omit INVALID KEY) If file is in random or dynamic mode, a DELETE can be issued without previously reading the record (specify INVALID KEY)
166
START START file-name KEY IS EQUAL TO data-name = GREATER THAN >
NOT LESS THAN NOT < >= [INVALID KEY imperative stmt] [NOT INVALID KEY imperative stmt] [END-START] Used for sequential and skip-sequential processing Does not return a record – positions you in the file
167
File Status Codes 00 Operation completed successfully
02 Duplicate Key was found 04 Invalid fixed length record 05 The file was created when opened - Successful Completion 07 CLOSE with REEL or NO REWIND executed for non tape dataset. 10 End of File encountered 14 Attempted to READ a relative record outside file boundary 21 Invalid Key - Sequence error 22 Invalid Key - Duplicate Key found 23 Invalid key - No record found 24 Invalid Key - key outside boundary of file.
168
File Status Codes 30 Permanent I/O Error34 Permanent I/O Error - Record outside file boundary 35 OPEN, but file not found 37 OPEN with wrong mode 38 Tried to OPEN a LOCKed file 39 OPEN failed, conflicting file attributes 41 Tried to OPEN a file that is already open 42 Tried to CLOSE a file that is not OPEN 43 Tried to REWRITE without READing a record first 44 Tried to REWRITE a record of a different length 46 Tried to READ beyond End-of-file 47 Tried to READ from a file that was not opened I-O or INPUT 48 Tried to WRITE to a file that was not opened I-O or OUTPUT 49 Tried to DELETE or REWRITE to a file that was not opened I-O
169
File Status Codes 91 Password or authorization failed 92 Logic Error
93 Resource was not available (may be allocated to CICS or another user) 94 Sequential record unavailable or concurrent OPEN error 95 File Information invalid or incomplete 96 No DD statement for the file 97 OPEN successful and file integrity verified 98 File is Locked - OPEN failed 99 Record Locked - record access failed.
170
Exercise #20 Create a data file of records which is sorted on a key field (choose a 5 byte key). Creating an 80 byte record in a PDS is easiest. Let some of the keys be in the – range, some in range – 29999, some in range – 39999, and some in range (VSAMDATA) Read the file and output a fixed size record VSAM file.
171
Exercise #21 Read the VSAM file you created in Exercise 20 and print out the records (your choice of format).
172
Exercise #22 Create a small file of keys. Some of the keys should match records in your VSAM file and some should not. (VSAMKEYS) Process the VSAM file randomly. Take each key, print it, and print the record if it is on the file, otherwise print a message indicating the record was not found.
173
Exercise #23 Process the VSAM file dynamically with skip-sequential processing. Issue a Start statement and print the records with keys in the range Issue another START and print the records in the range –
174
Exercise #24 Create a small file of keys. Some of the keys should match records in your VSAM file and some should not. Process the VSAM file randomly. Take each key, read the VSAM file, and delete each record that is found. If the record is not found print a message indicating this.
175
Alternate Indexes An alternate index provides a way to navigate through a VSAM cluster using an alternate key Creating an alternate index is a 3 step process: DEFINE ALTERNATE INDEX DEFINE PATH BLDINDEX
176
Define Alternateindex
//KC02107X JOB 'WOOLBRIGHT',REGION=2M,MSGCLASS=Q,MSGLEVEL=(0,0), // NOTIFY=KC02107 //* * //* VSAM //STEPMAKE EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DELETE KC02107.SICCC01.MYVSAM.AIX DEFINE ALTERNATEINDEX (NAME (KC02107.SICCC01.MYVSAM.AIX) RELATE (KC02107.SICCC01.MYVSAM) KEYS (20 5) NONUNIQUEKEY UPGRADE REUSE ) DATA (NAME (KC02107.SICCC01.MYVSAM.AIX.DATA) - TRACKS(1 1)) INDEX (NAME (KC02107.SICCC01.MYVSAM.AIX.INDEX)) DEFINE PATH (NAME(KC02107.SICCC01.MYVSAM.PATH) - PATHENTRY(KC02107.SICCC01.MYVSAM.AIX) UPDATE ) //
177
BLDINDEX //KC02107X JOB 'WOOLBRIGHT',REGION=2M,MSGCLASS=Q,MSGLEVEL=(0,0), // NOTIFY=KC02107 //* * //* VSAM BLDNDX CLUSTER * //STEPMAKE EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * BLDINDEX INDATASET(KC02107.SICCC01.MYVSAM) - OUTDATASET(KC02107.SICCC01.MYVSAM.AIX) /* //
178
VSAM REPRO //KC02107X JOB 'WOOLBRIGHT',REGION=2M,MSGCLASS=Q,MSGLEVEL=(0,0), // NOTIFY=KC02107 //* * //* VSAM REPRO CLUSTER * //STEPMAKE EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * REPRO INDATASET(KC02107.ASM.DAT(VSAMDATA)) - OUTDATASET(KC02107.SICCC01.MYVSAM) /* //
179
Debugging
180
Learn Hex Basics Decimal: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Hexadecimal A B C D E F
181
Learn Binary Basics Every digit is a power of 2 1 1 1 0 1 0 0 1
= 233
182
Binary to Hex Conversion rule: Remove blocks of 4 binary digits and replace them with a single hex digit D C B Hex dumps are made of hex digits and represent binary values that are stored in memory – a short-hand notation 2 HEX DIGITS = 1 BYTE
183
EBCDIC Characters CHAR HEX CHAR HEX CHAR HEX CHAR HEX
0 = F0 A = C1 J = D1 1 = F1 B = C2 K = D2 S = E2 2 = F2 C = C3 L = D3 T = E3 3 = F3 D = C4 M = D4 U = E4 4 = F4 E = C5 N = D5 V = E5 5 = F5 F = C6 O = D6 W = E6 6 = F6 G = C7 P = D7 X = E7 7 = F7 H = C8 Q = D8 Y = E8 8 = F8 I = C9 R = D9 Z = E9 = F9 SPACE = 40 COMMA = 6B PERIOD = 4B * = 5C MINUS = 60
184
Zoned Decimal Format Byte = 8 bits Leftmost 4 bits = zone part
Rightmost 4 bits = numeric part PIC S9999 PIC 99 PIC 99V99 One digit per byte – sign in zone portion of last byte. Preferred signs – C +, D – Signs: A C E F B D - ZONE NUMERIC
185
Zoned Decimal Format PIC S999 VALUE 123 F1F2C3
PIC 99V99 VALUE F1F2F3C4 PIC S99 VALUE F1D2 PIC S999 VALUE F0F0C0
186
Zoned Decimal Data Zoned decimal data was designed for data entry and is an old data format No arithmetic can occur in zoned decimal! If you perform arithmetic with zoned decimal fields, they must first be converted to packed decimal or binary This conversion is usually unnecessary
187
Data Types PACKED-DECIMAL (COMP-3) – specify 15 or fewer digits in the PIC clause to avoid the use of library routines. Always code an odd number of digits! 01 TOTAL PIC S9(7). Always code a sign unless you have a good reason not to. This is a great choice for most business arithmetic
188
Packed Decimal Format Two decimal digits per byte
Sign stored in numeric portion of the rightmost byte 12|34|5C Decimal points are implied (not stored) Choose packed decimal over zoned decimal if possible
189
Packed Decimal PIC S999 PACKED-DECIMAL VALUE 123 123C
PIC S9(3)V99 PACKED-DECIMAL VALUE -123 00123D PIC S9(4) PACKED-DECIMAL VALUE -98 00098D (5 digits exist here) PIC 9(7) PACKED-DECIMAL VALUE -32 COMPILE ERROR PIC 9(7) PACKED-DECIMAL VALUE 32 C
190
Binary Data 1-4 digits = 2 bytes = halfword
5-9 digits = 4 bytes = fullword 10-18 digits = 8 bytes = doubleword PIC S9(4) BINARY = 2 BYTES PIC S9(5) BINARY = 4 BYTES PIC S9(9) BINARY = 4 BYTES PIC 9(8) BINARY = 4 BYTES
191
Signed Binary Signed binary data is stored in 2’s complement format
High order bit is a sign 1 is negative, 0 is positive = 13 in decimal = -14 Conversion rule: Change the 1s to 0s and 0s to 1s, then add 1. This computes the 2s complement
192
Conversions The machine has specific conversion instructions for changing between types: 1) PACK, UNPK are used to convert between Zoned and Packed. 2) CVB and CVD between Packed and Binary. Try to minimize the conversions by staying in packed
193
Pointers USAGE IS POINTER – A 4 BYTE FULLWORD STORED IN BINARY
194
Signed Binary Example: 111111 Changing: 000000
Add 1: = 1 is the complement so is -1 Example: Changing: Add 1: = = 13 = -13
195
Display The answer to all debugging problems is to gain more information. DISPLAY can provide it.
196
Debugging Lines It is possible to add debugging lines in your code that can be logically removed by commenting one line: Add a “WITH DEBUGGING MODE” Phrase to your program: ENVIRONMENT DIVISION. SOURCE COMPUTER. IBM-XXX WITH DEBUGGING MODE.
197
Debugging Lines Put a D in column 7 on each debugging line:
D IF X NOT = Y D DISPLAY X D END-IF The lines will execute if “WITH DEBUGGING MODE” is included Otherwise, the lines are treated as comments
198
Adding Compiler Options
Compiler options can be included as the first line of a COBOL program: PROCESS options… or CBL options Compiler options can be included from an external file: //SYSOPTF DD DSN= …
199
A Compiler Option for Debugging
Use the SSRANGE compiler option while testing to help detect invalid subscript values Is the effective address of an element within the boundary of a table? For variable length data references,Is the actual length positive and within the max define length of the group item? For reference-modified data references, are the offset and the length positive? Is the length within the max length of the data item?
200
Dump Reading Display Filter View Print Options Help
SDSF OUTPUT DISPLAY SICCC01A JOB DSID LINE COLUMNS COMMAND INPUT ===> SCROLL ===> CSR Data Division Map Data Definition Attribute codes (rightmost column) have the following meanings: D = Object of OCCURS DEPENDING G = GLOBAL S = E = EXTERNAL O = Has OCCURS clause U = F = Fixed-length file OG= Group has own length definition V = FB= Fixed-length blocked file R = REDEFINES VB= Source Hierarchy and Base Hex-Displac LineID Data Name Locator Blk Struc 2 PROGRAM-ID BOMB MYTABLE-VALUES BLW= FILLER BLW= MYPTR BLW= FILLER BLW= FILLER BLW= FILLER BLW= FILLER BLW= FILLER BLW= FILLER BLW= X BLW= Y BLW=
201
Data Division Map 0Source Hierarchy and Base Hex-Displa
LineID Data Name Locator Blk Stru 2 PROGRAM-ID BOMB MYTABLE-VALUES BLW= FILLER BLW= MYPTR BLW= FILLER BLW= FILLER BLW= FILLER BLW= FILLER BLW= FILLER BLW= FILLER BLW= X BLW= Y BLW= Z BLW= PTR BLW= ANIMAL BLL= NAME BLL= NEXT-ANIM BLL=
202
Dump Information <H1> I B M F A U L T A N A L Y Z E R S Y N O P S I S A system abend 0C4 reason code X'4' occurred in module IGZCPAC at offset X'3FEB4'. A program-interruption code 0004 (Protection Exception) is associated with this abend and indicates that: An attempt was made to access a protected storage location using an incorrect storage access key. The cause of the failure was program BOMB1 in module BOMB1. The COBOL source code that immediately preceded the failure was: Source Line # ------ DISPLAY NAME
203
Dump Information ******************************************************************************** *********************** P O I N T O F F A I L U R E ********************** This is the point where control left program BOMB1 prior to the S0C4 abend. COBOL Source Code: Source Line # ------ NEXT-ANIM PIC X. PROCEDURE DIVISION. SET PTR TO ADDRESS OF MYTABLE-VALUES SET ADDRESS OF ANIMAL TO PTR PERFORM 7000 TIMES DISPLAY NAME SET ADDRESS OF ANIMAL TO ADDRESS OF NEXT-ANIM END-PERFORM GOBACK
204
Dump Information Load Module Name : BCST.GP5CS4.DOMESTIC.LOADLIB(BOMB1) At Address : 38B00C38 Load Module Length : X'13C8' Link-Edit Date and Time . : 2005/05/13 12:36:33 Program and Entry Point Name: BOMB1 At Address : 38B00C38 (Module BOMB1 offset X'0') Program Length : X'77A' Program Language : COBOL (Compiled using IBM Enterprise COBOL for z/OS and OS/390 V3 R3 M1 on 2005/05/13 at 12:36:32) Machine Instruction : 05EF BALR R14,R15 At Address : 38B0106E (Program BOMB1 offset X'436') AMODE : 31 General Purpose Registers: R0: (Storage invalid) R1: 38B00E49 (Module BOMB1 program BOMB1 + X'211')
205
Dump Information WORKING-STORAGE SECTION
Off Hex Value EBCDIC Value Source (Starting at <H5> BLW=0000 at address 38D500B8 01 MYTABLE-VALUES. 0 C1C1D9C4 E5C1D9D *AARDVARK * PIC X(1 * * MYPTR1 14 C2C5C1E5 C5D *BEAVER * PIC X(1 24 C3D6D5C4 D6D *CONDOR * PIC X(1 34 C4C5C5D *DEER * PIC X(1 44 C5D3C5D7 C8C1D5E *ELEPHANT * PIC X(1 54 C6D6E *FOX * PIC X(1 64 C7C9D9C1 C6C6C *GIRAFFE * PIC X(1 D X PIC S99 80 F4F5C Y PIC S99 88 FFEC Z PIC S9( 90 38D500B *.N * 01 PTR POINTER
206
Dump Information LINKAGE SECTION
BLL=0000 has not been assigned an address Off Hex Value EBCDIC Value Source (Starting at <H5> BLL=0001 at address 38D57FF8 01 ANIMAL. * * NAME * * NEXT-ANIM See "System-Wide Information" - "Storage Areas" - "Hex-Dumped Storage" for unformatted storage areas related to this event.
207
Dump Information dress 38D500B8 01 MYTABLE-VALUES.
9D *AARDVARK * PIC X(13) VALUE "AARDVARK * * MYPTR1 POINTER SYNC. *BEAVER * PIC X(16) VALUE "BEAVER *CONDOR * PIC X(16) VALUE "CONDOR *DEER * PIC X(16) VALUE "DEER 5E *ELEPHANT * PIC X(16) VALUE "ELEPHANT *FOX * PIC X(16) VALUE "FOX *GIRAFFE * PIC X(16) VALUE "GIRAFFE X PIC S999V99 PACKED-DECIMAL Y PIC S999 VALUE 456. Z PIC S9(4) BINARY VALUE -20 *.N * 01 PTR POINTER.
208
XML and COBOL
209
XML XML = Extensible Markup Language
Used to expose the structure and content of a document Becoming a universal means of exchanging data Tag language <author> <firstname>Charles</firstname> <lastname>Dickens</lastname> </author>
210
XML Tags are user-defined Every start tag has a matching stop tag
<atag> …</atag> Sometimes the tags are combined into one start and stop tag <media type = “CD” /> Tags can’t overlap NO: <a> <b> </a> </b>
211
XML Tags can be nested <a> <b> </b> </a>
Documents are tree-structured <a> <b></b> <c> <d></d> </c> </a> a b c d
212
XML Text based documents Case sensitive Must contain one root element
Start with an XML declaration and comments <?xml version = “1.0”?> <!– comment line - -> <a> </a>
213
XML XML is “Well Formed” if 1) Single root element
2) Start and end tags matching for all elements 3) Proper nesting 4) Attribute values in quotes
214
XML Parsers An XML parser is a program that can read an XML document and provide programmatic access to the document Two types of parsers: 1) DOM based – Document Object Model Constructs a tree that represents the document 2) SAX based – Simple API for XML Generates events when parts of the document are encountered. Can also be classified as “push” or “pull” parsers
215
COBOL Features for Processing XML Input
XML PARSE – begins parsing the document and identifies the processing procedure in your document Processing Procedure – receives and processes the events that are generated by the parser
216
COBOL Features for Processing XML Input
Special Registers XML-CODE - to determine the status of XML parsing XML-EVENT - to receive the name of the event XML-TEXT – to receive XML document fragments
217
Enterprise COBOL Contains an event-based parser that allows you to read XML documents and process them with COBOL XML documents can be retrieved from an MQ message, CICS TD queue, or IMS message processing queue XML documents that are read from a file must be brought into storage as a single item. (Records can be combined using STRING)
218
Parsing XML PARSE document PROCESSING PROCEDURE event-handler-name
ON EXCEPTION … NOT ON EXCEPTION … END-XML Parsing continues until 1) an END-DOCUMENT event occurs 2) the parser signals EXCEPTION and the procedure doesn’t reset the XML-CODE register to 0 3) you terminate processing by moving -1 to XML-CODE
219
Parsing XML Events The XML-EVENT register contains the event name that the parser passing to the handler The XML-CONTENT register contains the content for the event
220
Events Some typical events: START-OF-DOCUMENT START-OF-ELEMENT
ATTRIBUTE-NAME END-OF-ELEMENT CONTENT-CHARACTERS START-OF-CDATA-SECTION END-OF-DOCUMENT
221
Processing Flow
223
Exercise #25 Use the file BCST.SICCC01.PDSLIB(XMLDATA2)
The file structure is similar to the one below: <?xml version=”1.0” encoding=”ibm-1140” standalone=”yes”?> <batch> <trans> <name>Joe Smith</name> <amt>12.32</amt> <amt>5.42</amt> </trans> <trans <name>Tina Louise</name> <amt>8.99</amt> … </batch
224
Exercise #25 Write an XML Cobol program that reads the file and copies it to memory. Print out a report that lists each customer name and a total for each customer. Print a grand total for the entire file Name Amount Joe Smith Tina Louise Grand Total
225
Exercise #26 Read the file BCST.SICCC01.PDSLIB(BOOKLIST)
Copy the data into memory storing the data as a Cobol data structure Write out the entire file as a single XML file Pretty print the XML file
226
Exercise #26 The XML file should have the following structure
<booklist> <book> <author>Melville</author> <title>Moby Dick</title> </book> …. </booklist>
227
Compiler Options Default compiler options are in effect for TSYS
Options can be overridden with a process statement that precedes the IDENTIFICATION DIVISION Example (Start in column 8 or 1) PROCESS LIST, AWO
228
Apply Write Only AWO is faster than NOAWO
Applies to variable length, blocked files With AWO the file buffer is written when there is not enough space for the next record Without AWO the file buffer is written when the largest size record won’t fit in the buffer
229
DATA(24) and DATA(31) DATA(31) + RENT relieves some below the line storage problems. QSAM file buffers can be placed above the line With DATA(24), working storage and FD record areas are below the line
230
DYNAM and NODYNAM DYNAM causes programs that are called by their literal names to be called dynamically NODYNAM allows for static calls for calls made with literal names of programs
231
NUMPROC NUMPROC(PFD) – generates efficient code for numeric comparisons. Doesn’t fix up signs NUMPROC(NOPFD) – causes sign fix up for numeric fields NUMPROC(MIG) – causes arithmetic similar to OS/vs Cobol
232
OPTIMIZE OPTIMIZE(STD) and OPTIMIZE(FULL) –
- eliminate unnecessary brancing - simplifying inefficient branching - simplifying the code for out-of-line PERFORM, moving the code in-line - simplifying calls to nested programs - eliminating duplicate computations - eliminating constant computations - aggregating MOVES - deleting unreachable code - deleting unreferenced data items (FULL only)
233
OPTIMIZE NOOPTIMIZE – suppresses optimizations
Helpful during development to speed compilations Better for testing because code is not removed OPTIMIZE for production
234
RENT and NORENT Causes the compiler to generate code that makes the program reentrant Reentrant programs can be placed in the Link Pack Area and Extended Link Pack Area LPA is for programs that can be shared and are heavily used during production runs. Programs here remain in memory.
235
RMODE RMODE(AUTO) + RENT = RMODE(ANY) RMODE(AUTO) + NORENT = RMODE(24)
RMODE(24) + NORENT => WS below the line RMODE(ANY) + NORENT => WS is above the line
236
SSRANGE and NOSSRANGE SSRANGE – causes subscript and index checking. Reference modifications are also checked Use during program development NOSSRANGE – turns off subscript checking. Use for production code
237
TEST and NOTEST TEST(ALL,SYM) – produces code that enables the Debug Tool to perform batch and interactive debugging NOTEST – produces more efficient object modules. Use this option for production code
238
TRUNC TRUNC(BIN) – Causes base 2 truncation on some intermediate calculations to insure the answer conforms to a halfword, fullword, or doubleword boundary TRUNC(STD) – Causes base 10 truncation on some intermediate calculations TRUNC(OPT) – Assumes the data conforms to the PICTURE and USAGE clauses and manipulates the result based on the size of the field in storage
239
ARITH ARITH – controls the number of digits in decimal numbers (packed, zoned) ARITH(EXTEND) is slower than ARITH(COMPAT) - COMPAT <= 18 digits - EXTEND max 31 digits
240
Performance Issues CALLs – Nested faster than static, call literal faster than dynamic call literal, call literal faster than dynamic all identifier, dynamic call literal faster that dynamic call identifier Nested calls are the fastest – and there are good program design reasons for using them as well
241
Performance Issues IS INITIAL on PROGRAM-ID can be very penalizing in terms of time QSAM files - BLOCK CONTAINS 0 RECORDS ! - Experiment with more buffers by modifying the RESERVE clause of the SELECT statement or specifying more buffers in JCL (BUFNO) - Code APPLY WRITE-ONLY or use AWO compiler option for variable length blocked files
242
VSAM Performance Issues
Increase the number of data buffers (BUFND) for sequential access or (BUFNI) for random access Select an appropriate CI size. Smaller is faster for random processing at the expense of inserts Larger CI size is more efficient for sequential processing Alternate indexes should be built by AMS
243
Performance Issues Specify SYNCH for BINARY items.
Use signed data items with 8 or fewer digits – S9(8) BINARY SYNC S9(4) BINARY SYNC 9 or more digits is slower 18 digits is slowest Avoid USAGE IS DISPLAY for numeric fields PIC S99.
244
Performance Issues Use 15 or fewer digits for PACKED-DECIMAL (COMP-3) fields Always code a sign (S) unless you have a programmatic reason not to. S9(8) instead of 9(8). Indexes are faster than subscripts If you choose subscripts code S9(8) BINARY SYNC or better yet, choose indexes instead
245
Performance Issues Use PIC S9(8) BINARY fields for loop control variables Packed-decimal fields are slower Display fields (PIC 999) are slowest! Initialize constants with a value clause and don’t modify them or pass them by reference. (Compile will optimize the constants.)
246
Performance Issues Don’t use PERFORM THRU
Make appropriate use of in-line PERFORMS Try to use tables so the rightmost subscript varies the most often. (Compiler can optimize some subscript calculations) Use SEARCH ALL for tables with 100 items or more
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.