COBOL Concepts - Columbus State University

COBOL Concepts - Columbus State University

Enterprise COBOL Concepts Dr. David Woolbright [email protected] 2013 Why Cobol? Billions of lines of existing code with more added each year Designed for business Great compilers Runs fast Relatively simple to learn The language keeps evolving

Enterprise Cobol for z\OS IBM COBOL: http://www-01.ibm.com/software/awdtools/cobol/zos/ IBM COBOL Documentation: http://www-01.ibm.com/software/awdtools/cobol/zos/library/ Languagage Reference http://publibfp.boulder.ibm.com/epubs/pdf/igy3lr50.pdf Programming Guide http://publibfp.boulder.ibm.com/epubs/pdf/igy3pg50.pdf

Program Organization Program Organized like a book Division Identification, Environment, Data, Procedure

Section Paragraph Sentence Clause Phrase Word Grammatical Hierarchy The grammatical hierarchy follows this form: Identification division

Paragraphs Entries Environment division

Sections Paragraphs Entries Clauses Phrases Data division

Sections Entries Clauses Clauses

Phrases Procedure division Sections Paragraphs Sentences Statements

Phrases Coding Rules Cols 1-6 left blank. Compiler fills in with sequence numbers Col 7 Usually blank,* means comment line, - is continuation, D for debugging lines Cols 8-11 A margin or Area A

Cols 12-72 B margin or Area B Cols 73-80 unused 1 2 3 4 5 6|7| 8 9 10 11|12 13 71 71 | Seq Nos | | Area A | Area B | Continuation of Statements Statements can be continued on the next line in Area B Continuation of Literals

Continue the constant through column 71 Put a - in column 7 Continue constant with a OR Continue constant in area B Things That Go in Area A Area A items:

Division headers Section headers Paragraph headers or paragraph names Level indicators or level-numbers (01 and 77) DECLARATIVES and END DECLARATIVES End program, end class, and end method markers Things That Go in Area B

Area B items: Entries, sentences, statements, and clauses Continuation lines Things That Go in A or B Area A or B

Level-numbers Comment lines Compiler-directing statements Debugging lines Pseudo-text Structure of a Program IDENTIFICATION DIVISION IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. AUTHOR. JOE SMITH. INSTALLATION. TSYS.

DATE-WRITTEN. 12/03/2011. DATE-COMPILED. 12/03/2011. Only PROGRAM-ID is required Some interesting parms can be coded on the PROGRAM-ID ENVIRONMENT DIVISION This division connects external DD file names with internal file names. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT MSTRFILE ASSIGN TO MSTRFILE

SELECT CUSTOMER-FILE ASSIGN TO CUSTMAST ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS COSTOMER-KEY FILE STATUS IS CUSTOMER-FILE-STATUS. Internal File Name External DD File Name DATA DIVISION

Used to create variables and constant fields Only three data types numeric PIC 99999. alphanumeric (text/string) PIC XXX. alphabetic PIC AAA. Level numbers indicate subordination of fields. Use levels 01-49 Alphabetic is seldom used Level Numbers

Group item a subdivided field Elementary item a non-subdivided field 01 Group or independent item Higher numbers indicate subordinate fields Level Numbers

66, 77, 88 have special significance 66 Used to rename (no longer used) 77 An independent item (choose 01) 88 Condition name Level Numbers 01 77 XXX.

05 YYY. 10 10 05 ZZZ AAA AAA PIC X. BBB PIC X. PIC X(20). PIC 999V99. Condition Names 01

TRAN-CODE PIC X. 88 GOOD 88 BAD 88 INDIFFERENT SET GOOD TO TRUE

Equivalent to IF (GOOD) VALUE G. VALUE B. VALUE I. MOVE G TO TRAN-CODE Equivalent to IF TRAN-CODE = G Level 88

Condition Names Picture Clauses Picture clause values usually use 9, X, V, S, A 9 a decimal digit X any alphanumeric character V an implied decimal point S a sign A A-Z, and blank Picture Clauses

PIC 9(6) PIC 9(6)V99 PIC 999999V99 PICTURE X(10) PIC XXXXXXXXXX

PIC S9(4)V9(4) PIC S9999V9999 PIC 9(18) Numeric Edited Fields

XXXBXXBXXXX 99/99/99 ZZ,ZZZ.99DB ***,***.99 ----.99 $$$9.99 99999.99 USAGE Clause Specifies the format in which data is stored in memory Normally, the phrase USAGE IS is omitted 01 COST

01 COST USAGE IS PACKED-DECIMAL PIC S9(5). PACKED-DECIMAL PIC S9(5). 01 FIRST-NAME 01 FIRST-NAME USAGE IS DISPLAY PIC X(20). PIC X(20). DATA DIVISION We define data used in input-output operations.

FILE SECTION. FD CUSTOMER-FILE. 01 CUSTOMER-MASTER. 05 CUST-NUM 05 CUST-FNAME 05 CUST-LNAME FD SALES-REPORT. 01 REPORT-AREA PIC PIC 9(2). PIC X(20).

PIC X(20). X(132). Data Formats Older terms: Modern terms:

BINARY BINARY FLOATING POINT FLOATING POINT PACKED-DECIMAL BINARY BINARY (NATIVE) PACKED-DECIMAL. BINARY.

COMPUTATIONAL COMP COMP-1 COMP-2 COMP-3 COMP-4 COMP-5 05 XDATA PIC S9(5) 05 YDATA PIC S9(4) EBCDIC EBCDIC is an IBM format for storing alphanumeric characters

A - XC1 J - XD1 B - XC2 K - XD2 S XE2 C - XC3 L - XD3 T XE3 D - XC4 M - XD4 U XE4 E - XC5 N - XD5

V XE5 F - XC6 O - XD6 W XE6 G - XC7 P - XD7 X XE7 H - XC8 Q - XD8 Y XE8 I - XC9 R - XD9 Z XE9

EBCDIC EBCDIC is an IBM format for storing alphanumeric characters 0 - XF0 SPACE X40 1 XF1 . - X4B 2 - XF2 , - X6B 3 XF3

* - X5C 4 - XF4 - X60 5 XF5 6 - XF6 7 XF7 8 XF8 9 XF9 BINARY DATA Stored in 2s Complement format Leftmost bit is a sign ( 0 +, 1 - )

If the number is positive, interpret it as plain binary 01011 = 8 + 2 + 1 = + 11 If the number is negative, compute the complement Invert. (Change all 1s to 0s and 0s to 1s.) Add 1. The result is the additive complement BINARY DATA 10011 is a negative number. Inverting we have 01100. Adding 1 we have 01100 + 1 = 01101. This is a positive number. 01101 8 + 4 + 1 = 13, so the original number is -13.

BINARY DATA Declaring a data field as BINARY causes the data to be stored in 2s complement format. 01 X-FIELD PIC S9(4) BINARY VALUE -1. X-FIELD will contain 1111111111111111 = XFFFF. Binary data is processed in a register

PACKED-DECIMAL DATA Defining a field to be PACKED-DECIMAL or Computational-3 causes the data to be stored internally in a packed decimal format. There are 2 decimal digits stored in each byte. A sign is stored in the rightmost nibble. (C +, D -) Y-FIELD PIC S999 VALUE -23 PACKED-DECIMAL. produces a 2 byte field containing X023D

Most business arithmetic occurs in packed decimal. Packed No-Sign Data Packed no-sign data is a non-native data type that was created to save space on a disk when storing dates If the digits in a date like 10/23/89 were stored in a packed field, the field would require 4 bytes: 01|02|38|9C By removing the sign, the date fits in 3 bytes: 10|23|89

Packed No-Sign Data These type fields require special handling in Cobol Program PKNOSIGN illustrates how a displayable date can be recovered from a packed no-sign field. ZONED-DECIMAL DATA A numeric field which is described as DISPLAY, or in which the usage clause is omitted, is stored in a zoned decimal format. In zoned decimal, each digit takes up one byte, and a

sign is stored in the zone portion of the rightmost byte of the field. Z-FIELD PIC S999 VALUE -32 produces a 3 byte field containing XF0F3D2. ZONED-DECIMAL DATA Z-FIELD PIC S999 VALUE -32. produces a 3 byte field containing XF0F3D2. Z-FIELD PIC S999 VALUE 32. produces a 3 byte field containing XF0F3C2. W-FIELD PIC 999 VALUE 0. MOVE -32 TO W-FIELD produces a 3 byte field containing XF0F3C2.

DATA DIVISION Define the data needed for internal processing in the WORKING-STORAGE SECTION. Storage is statically allocated and exists for the life of the run unit. WORKING-STORAGE SECTION. 01 TOTAL-FIELDS. 05 CUST-TOTAL 05 COST-TOTAL 01 DATE-AND-TIME. 05 CD-YEAR 05 CD-MONTH

PIC S9(7)V99 VALUE 0. PIC S9(7)V99 VALUE 0. PIC 9999. PIC 99. DATA RELATIONSHIPS BINARY PACKEDDECIMAL CHARACTER or ALPHANUMERIC

ZONEDDECIMAL DATA DIVISION Describe data that exists in another program, or storage you want to associate with a symbolic name in the LINKAGE SECTION. LINKAGE SECTION. 01 LK-DATA-AREA 05 NAME

05 AGE PIC X(40). PIC 999. DATA DIVISION The LOCAL-STORAGE SECTION is used to have storage allocated each time a program is entered, and deallocated on return from the program. Used for compatibility with C or Java. LOCAL-STORAGE SECTION. 01 CUST-NO

PIC X(3). 01 COST PIC 9(5)V99. Initialization of Storage WORKING-STORAGE for programs is allocated at the start of the run unit. Any data items with VALUE clauses are initialized to the appropriate value at that time. Initialization of Storage For the duration of the run unit, WORKING-STORAGE items persist in their last-used state. Exceptions are:

1) A program with INITIAL specified in the PROGRAMID paragraph In this case, WORKING-STORAGE data items are reinitialized each time the program is entered. IDENTIFICATION DIVISION. PROGRAM-ID. MAIN IS INITIAL. ... Initialization of Storage For the duration of the run unit, WORKING-STORAGE items persist in their last-used state. Exceptions are: 2) A subprogram that is dynamically called and then canceled In this case, WORKING-STORAGE data items are reinitialized on the first reentry into the program following the CANCEL.

MOVE PROG23 TO PROGID CALL PROGID CANCEL PROGID CALL PROGID Group and Data Items 01 Customer-Record. 05 Customer-Name. 10 Last-Name Pic x(17). 10 Filler Pic x. 10 Initials Pic xx. 05 Part-Order. 10 Part-Name Pic x(15).

10 Part-Color Pic x(10). REDEFINES 01 MONTH-NAMES. 05 STRING-1 PIC X(15) VALUE JANFEBMARAPRMAY. 05 MONTH REDEFINES STRING-1 OCCURS 5 TIMES PIC XXX. MOVE MONTH(3) TO MONTH-OUT REDEFINES 05 05

10 10 AMOUNT AMOUNTX XFIELD YFIELD 20 A 20 B PIC ZZ9.9-.

REDEFINES AMOUNT PIC X(6). PIC 9(5). REDEFINES XFIELD. PIC X(3). PIC X(2). Literals String Literals enclosed in quotes (single or double) MOVE "INVALID" To CUST-NAME Numeric literals without quotes

MOVE 19 TO CUST-AGE Literals Hexadecimal literals with X MOVE XAF3B TO CUST-CODE Constants A constant is a data item that has only one value and it can never change Unfortunately, COBOL does not define a construct specifically for constants Moral: All values are subject to change Data Division.

01 Report-Header pic x(50) value "Company Report". 01 Interest pic 9v9999 value 1.0265. Figurative Constants There are some figurative constants supplied by the language:

ZERO - an appropriate form of 0 SPACE - x40 HIGH-VALUES - binary 1s LOW-VALUES - binary 0s QUOTE - a single quote NULL

- binary 0s used for pointers ALL - Technically not a figurative constant: X PIC X(5) VALUE ALL 3. Tables (Arrays) A table is a set of logically consecutive data items that you define in the DATA DIVISION by using the OCCURS clause. 01 TABLE. 05 TABLE-ENTRY OCCURS 10 TIMES. 10 NUM PIC 99.

10 NAME PIC X(30). 10 ITEM PIC X(5) OCCURS 3 TIMES. Referencing a Table 01 TABLE. 05 TABLE-ENTRY 10 NUM 10

NAME 10 ITEM OCCURS 10 TIMES. PIC 99. PIC X(30). PIC X(5) OCCURS 3 TIMES. COBOL tables are 1-indexed Some valid References with subscripts: TABLE-ENTRY(SUB) TABLE

NUM(SUB) NAME(SUB) ITEM(SUB1,SUB2) Subscripts vs Indexes Subscripts are defined separately from the table definitions. 01 MYTABLE. 05 ITEM PIC X(3) OCCURS 10 TIMES. 01 I PIC 9(4) BINARY. ... MOVE 1 TO I

MOVE ABC TO ITEM(I) Subscripts are numeric fields choose BINARY fields for efficiency, although packed and zoned fields also work Subscripts vs Indexes Subscripts can be easily printed 01 01 MYTABLE. 05 ITEM PIC X(3) OCCURS 10 TIMES. I PIC 9(4) BINARY.

... MOVE 1 TO I MOVE ABC TO ITEM(I) DISPLAY I Subscripts vs Indexes Subscripts represent an occurrence number, 1 is the first occurrence, 2 is the second, 01 01 MYTABLE. 05 ITEM PIC X(3) OCCURS 10 TIMES.

I PIC 9(4) BINARY. ... PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10 DISPLAY ITEM(I) END-PERFORM Subscript Program Subscripts vs Indexes Indexes are created when a table is defined 01 MYTABLE. 10

10 LETTERVALS PIC X(10) VALUE 'ABCDEFGHIJ'. LETTER REDEFINES LETTERVALS PIC X(1) OCCURS 10 TIMES INDEXED BY I. Indexes are manipulated with SET statements and automatically altered by PERFORM statements SET I TO 1 MOVE LETTER(I) TO CHAROUT

Subscripts vs Indexes Indexes are generally more efficient than subscripts Indexes represent offsets from the beginning of the table SET I TO 1 Causes I to have the binary value 0 internally. It takes a bit of work to print them Index Program Tables with Two Dimensions 01 TABLE. 05 TABLE-ENTRY OCCURS 10 TIMES INDEXED BY SUB1.

10 NUM PIC 99. 10 NAME PIC X(30). 10 ITEM PIC X(5) OCCURS 3 TIMES INDEXED BY SUB2. Valid References with subscripts: TABLE-ENTRY(SUB1) TABLE

NUM(SUB1) NAME(SUB1) ITEM(SUB1,SUB2) Subscripts and Indexes In a two-dimensional table, the two subscripts correspond to the row and column numbers. In a three-dimensional table, the three subscripts correspond to the depth, row, and column numbers. Indexes use address computation to efficiently reference items in a table.

A Testy Program This program displays You Chose Paper. Why? PROCEDURE DIVISION The PROCEDURE DIVISION is where you code the executable statements in your COBOL program Divided into Paragraphs (terminated with periods): 100-MAIN. DISPLAY HELLO PERFORM 200-SUB GOBACK

. 200-SUB. DISPLAY WORLD! . The Evils of Coding Periods Periods have proven troublesome in the procedure division, and a new style of coding has evolved to deal with them The period is a statement terminator but we want to think of it as a paragraph terminator only We will code in a period-less style Only use periods to end a paragraph name

PROCEDURE DIVISION To resolve ambiguity caused by not using periods, we will use statement delimiters: END-IF END-PERFORM END-COMPUTE ... DISPLAY DISPLAY Handy for debugging and simple report

creation DISPLAY X Y Z DISPLAY "A = " A Data is written to SYSOUT MOVE MOVE STATEMENT Used to copy data from one field to another Example MOVE X-FIELD TO Y-FIELD Z-FIELD Data is copied from the sending field to the

receiving field MOVE STATEMENT To move data from one field to another field, the two fields should be compatible but dont have to be identically pictured Alphanumeric - PIC X(10) Numeric - PIC 999v99 Numeric-Edited - PIC 999.99Compatible moves: -Alphanumeric to Alphanumeric -Numeric to Numeric -Numeric to Numeric edited

MOVE STATEMENT Compatible moves: -Alphanumeric to Numeric if the sending field is an unsigned integer -Alphanumeric to Numeric edited if the sending field is an unsigned integer -Numeric to Alphanumeric if the sending field is an unsigned integer MOVE STATEMENT Compatible moves: -Numeric edited fields can be sent to Numeric and

Numeric edited fields this causes a de-edit process to occur -Numeric edited fields can be sent to Alphanumeric and Alphanumeric edited fields this causes a de-edit process to occur MOVE STATEMENT Moving data can cause data conversions to occur. 01 01 X

Y PIC S9(4) BINARY. PIC S9(5) PACKED-DECIMAL. MOVE X TO Y MOVE STATEMENT If the receiving field is larger than the sending field, the receiving field is filled with leading 0s in a numeric move: 01

01 X Y PIC S9(3) VALUE 123. PIC S9(5) VALUE 0. MOVE X TO Y RESULT: Y = XF0F0F1F2C3 MOVE STATEMENT If the receiving field is larger than the sending

field, the receiving field is filled with trailing spaces in a alphanumeric move. 01 01 X Y PIC X(3) VALUE ABC. PIC X(5) VALUE SPACES. MOVE X TO Y RESULT: Y = XC1C2C34040

MOVE STATEMENT If the receiving field is smaller than the sending field, data will be truncated on the left for numeric moves and on the right for alphanumeric moves 01 01 01 01 X Y

A B PIC S9(5) VALUE 12345. PIC S9(3) VALUE 0. PIC X(5) VALUE ABCDE PIC X(3) VALUE SPACES. MOVE X TO Y MOVE A TO B RESULT: Y = XF3F4F5 B = XC1C2C3

Use Move for Assignment 01 WORK. 05 A-FIELD 05 B-FIELD PIC X(3). PIC S999V99. MOVE ABC TO A-FIELD

MOVE 123.45 TO B-FIELD MOVE LOW-VALUE TO WORK Assignment Can Cause Conversions Consider the following move: 01 01 01 A B C

PIC PIC PIC MOVE A TO B MOVE A TO C S999V99. ZZ9.99-. S9(5)V9999 PACKED-DECIMAL. Zoned to Numeric-edited Zoned to Packed-decimal

MOVE CORRESPONDING MOVE CORRESPONDING identifier-1 TO identifier-2 CORR Usually a bad idea Both identifiers must name group items. Elementary items with the same name are moved. 01 A-GROUP.

01 B-GROUP. 05 W PIC X(3). 05 05 X PIC X(2). 05 05 Y PIC 999. 05 MOVE CORRESPONDING A-GROUP TO B-GROUP W to W, X to X, Y to Y

W X Y PIC X(3). PIC X(2). PIC 999. MOVE CORRESPONDING Subordinate items must not be identified by the keyword FILLER No reference modification for either identifier

Subordinate items must not include a REDEFINES, RENAMES, OCCURS, INDEX or POINTER description 01 A-GROUP. 01 B-GROUP. 05 W PIC X(3). 05 05 X PIC X(2). 05 05 Y

PIC 999. 05 MOVE CORRESPONDING A-GROUP TO B-GROUP W to W, X to X P X W PIC X(3). PIC X(2). PIC 999.

INITIALIZE INITIALIZE SPACE is the implied sending item for receiving items of category alphabetic, alphanumeric, alphanumeric-edited, DBCS, national, or national-edited. ZERO is the implied sending item for receiving items of category numeric or numeric-edited. INITIALIZE

01 PRICE-FIELDS. 05 UNIT-PRICE PIC 9(5)V9(2) PACKED-DECIMAL. 05 DISCOUNT PIC V9(2). 05 UNIT-CODE PIC XX. 05 SALES-PRICE PIC S9(4) BINARY. . . . INITIALIZE PRICE-FIELDS ADD

ADD Semantics All identifiers or literals that precede the keyword TO are added together, and this sum is added to and stored in identifier-2. This process is repeated for each successive occurrence of identifier-2 in the left-to-right order in which identifier-2 is specified. ADD X Y Z TO P Q Before X=1, Y=2, Z=3, P=4, Q=6 After X=1, Y=2, Z=3, P=10, Q=12 ADD EXAMPLES

ADD ADD ADD ADD ADD ADD

X X X 1 X X TO Y Y Z TO P Y TO P Q TO Z TO Y ROUNDED

TO Y ON SIZE ERROR DISPLAY ADD ERROR END-ADD ADD GIVING ADDGIVING Semantics All identifiers or literals that precede the keyword TO are added together, and this sum is added to identifier-2 to obtain a temporary sum. (Identifier-2 is unchanged) The the temporary sum is moved to identifier-3.

ADD X Y Z TO V GIVING P Before X=1, Y=2, Z=3, V=4, P=6 After X=1, Y=2, Z=3, V=4, P=10 SUBTRACT SUBTRACT All identifiers or literals preceding the keyword FROM are added together and their sum is subtracted from and stored immediately in identifier-2. This process is repeated for each successive occurrence of identifier-2, in the left-to-right order in which identifier-2 is specified.

SUBTRACT X Y FROM P Q Before: X=1,Y=2, P=3,Q=4 After: X=1,Y=2, P=0,Q=1 SUBTRACT SUBTRACT Semantics All identifiers or literals preceding the keyword FROM are added together and their sum is subtracted from identifier-2 to obtain a temporary value which is moved to identifier-3. SUBTRACT X Y FROM P GIVING Q

Before: X=1,Y=2,P=5,Q=6 After: X=1,Y=2,P=5,Q=2 MULTIPLY MULTIPLY Semantics In format 1, the value of identifier-1 or literal-1 is multiplied by the value of identifier-2; the product is then placed in identifier-2. For each successive occurrence of identifier-2, the multiplication takes place in the left-toright order in which identifier-2 is specified. MULTIPLY X BY P Q Before: X=2,P=4,Q=5

After: X=2,P=8,Q=10 MULTIPLY MULTIPLY In format 2, the value of identifier-1 or literal-1 is multiplied by the value of identifier-2 or literal-2. The product is then stored in the data items referenced by identifier-3. Identifier-2 is unchanged. MULTIPLY X BY Y GIVING Z Before: X=2, Y=3, Z=4 After: X=2, Y=3, Z=6

DIVIDE DIVIDE In format 1, the value of identifier-1 or literal-1 is divided into the value of identifier-2, and the quotient is then stored in identifier-2. For each successive occurrence of identifier-2, the division takes place in the left-to-right order in which identifier-2 is specified. DIVIDE X INTO Y Z Before: X=3, Y=7, Z=12 After: X=3, Y=2, Z=4

DIVIDE DIVIDE In format 2, the value of identifier-1 or literal-1 is divided into the value of identifier-2 or literal-2. The value of the quotient is stored in each data item referenced by identifier-3. DIVIDE X INTO Y GIVING Z Before: X = 2, Y = 13, Z = 1 After: X = 2, Y = 13, Z = 6 DIVIDE

DIVIDE In format 3, the value of identifier-1 or literal-1 is divided by the value of identifier-2 or literal-2. The value of the quotient is stored in each data item referenced by identifier-3. DIVIDE X BY Y GIVING Z Before: X = 10, Y = 3, Z = 1 After: X = 10, Y = 3, Z = 3 DIVIDE DIVIDE

In format 4, the value of identifier-1 or literal-1 is divided into identifier-2 or literal-2. The value of the quotient is stored in identifier-3, and the value of the remainder is stored in identifier-4. DIVIDE X INTO Y GIVING Z REMAINDER R Before: X = 2, Y = 9, Z = 8, R = 7 After: X = 2, Y = 9, Z = 4, R = 1 COMPUTE

COMPUTE 05 COMPUTE can be used to initialize a numeric field Usually reserved for nontrivial computations. For simple computations choose ADD, SUBTRACT, MULTIPLY or DIVIDE X PIC

S9(4)V9 PACKED DECIMAL. COMPUTE X ROUNDED = (A + B) / 2.3 ON SIZE ERROR DISPLAY X WAS TRUNCATED END-COMPUTE Arithmetic Operators Operation Operator

+ Addition - Subtraction * Multiplication /

Division ** Exponentiation Parentheses provide precedence. Always parenthesize! ((X + Y) * ( Z ** 3)) Locate Mode I/O Your Program

Input Buffers Output Buffers Region Move Mode I/O READ MYFILE INTO MYREC WRITE RECOUT FROM MYREC 01 MYREC PIC X(80).

Input Buffers Output Buffers Region QSAM FILE OPERATIONS ENVIRONMENT DIVISION. INPUT-OUTPUT-SECTION. FILE-CONTROL. SELECT MY-INPUT-FILE ASSIGN TO MASTER FILE STATUS IS MAST-STAT.

MY-INPUT-FILE Internal file name MASTER External DD name MAST-STAT A two byte PIC XX field in which the operating system returns a status code. Consult IBM Language Reference page 315 for status code details. QSAM FILE OPERATIONS ENVIRONMENT DIVISION. INPUT-OUTPUT-SECTION. FILE-CONTROL. SELECT MY-INPUT-FILE ASSIGN TO MASTER FILE STATUS IS MAST-STAT.

DATA DIVISION. FILE SECTION. FD MY-INPUT-FILE 01 RECORD-AREA PIC X(80). QSAM Queued Sequential Access Method For input files, records are buffered when the file is OPENed For output, records are buffered before being written

Records are processed from the beginning record sequentially to the end of the file Very efficient access method for sequential files Sometimes referred to as flat files QSAM FILE OPERATIONS Every file must be OPENed before it can be processed. Opening a QSAM Input file queues records for subsequent read operations OPEN INPUT MY-INPUT-FILE OPEN OUTPUT MY-OUTPUT-FILE

Files should be closed when you have finished processing the records CLOSE MY-FILE OPEN CLOSE READ QSAM Input File Operations Remember: READ a file, WRITE a record. READ MY-INPUT-FILE

AT END MOVE NO TO MORE-RECS END-READ This is a locate-mode read and the most efficient way to read records File Reading READ MY-INPUT-FILE INTO MY-REC AT END MOVE NO TO MORE-RECS END-READ WRITE This is a move-mode read and the least efficient way to deliver records

QSAM Output File Operations Write a record! WRITE MY-RECORD (locate mode) WRITE MY-RECORD FROM REC-BUFF END-WRITE (move mode) CLOSE MY-OUTPUT-FILE CLOSE MY-INPUT-FILE Sequential File Reading Pattern READ MYFILE AT END MOVE N TO MORE-RECS

END-READ PRIMING READ PERFORM UNTIL MORE-RECS = N (process a record code) READ MYFILE AT END MOVE N TO MORE-RECS END-READ END-PERFORM CONTINUATION READ File Status Codes 00

10 2x 3x 4x 9x

normal end of file invalid key permanent i/o error logic error unsuccessful operation Exercise #1 Create a file of 80 byte records Each record has 3 fields AFIELD ZONED DECIMAL with 4 DIGITS & 2 DECIMALS BFIELD PACKED DECIMAL

with 7 DIGITS & 3 DECIMALS CFIELD - PACKED DECIMAL with 7 DIGITS & 1 DECIMAL Print a report with a column for each field and a column for the computed value : (AFIELD + BFIELD)/ CFIELD Print the result with 2 decimals rounded. Total each column. FLOW OF CONTROL There is a theoretical result in Computer Science by two Italian mathematicians, Boehm and Jacopini, that states that only 3 control structures are required to write any

program: Sequence - Do this, now do this, now do this, Selection - If something is true do this, else do that Repetition While something is true, do this Practice has shown that being able to create procedures is helpful in overcoming complexity, but they arent strictly necessary One implication of this result is that GO TO statements arent needed FLOW OF CONTROL F ?

T T F IF IF The condition is tested and either the true or false blocks are selected for execution Dont use NEXT SENTENCE if you are using END-IF as the delimiter (and you should). Use of NEXT SENTENCE causes

execution to continue with the next closest period, which is probably the end of the paragraph. IF Examples IF X < Y ADD 1 TO X DISPLAY AAA ELSE DISPLAY BBB END-IF

IF X > Y DISPLAY X WAS BIGGER END-IF NESTED IFs Each ELSE is matched with the nearest preceding IF IF X < Y DISPLAY XXX IF Y < Z DISPLAY ZZZ ELSE

DISPLAY AAA END-IF MORAL: Indent properly and terminate all if statements with END-IF EVALUATE EVALUATE EVALUATE PLANET-NUMBER WHEN 1 MOVE "Mercury" TO PLANET-NAME WHEN 2 MOVE "Venus " TO PLANET-NAME WHEN 3 MOVE "Earth " TO PLANET-NAME WHEN 4 MOVE "Mars " TO PLANET-NAME

WHEN 5 MOVE "Jupiter" TO PLANET-NAME WHEN 6 MOVE "Saturn " TO PLANET-NAME WHEN 7 MOVE "Uranus " TO PLANET-NAME WHEN 8 MOVE "Neptune" TO PLANET-NAME WHEN 9 MOVE "Pluto " TO PLANET-NAME WHEN OTHER MOVE " " TO PLANET-NAME END-EVALUATE. EVALUATE EVALUATE PLANET-NAME WHEN "Mercury" WHEN "Venus " WHEN "Earth "

WHEN "Mars " WHEN "Jupiter" WHEN "Saturn " WHEN "Uranus " WHEN "Neptune" WHEN "Pluto " WHEN OTHER END-EVALUATE. MOVE MOVE MOVE

MOVE MOVE MOVE MOVE MOVE MOVE MOVE 1 2 3 4 5

6 7 8 9 0 TO TO TO TO TO TO TO

TO TO TO PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER PLANET-NUMBER

PLANET-NUMBER EVALUATE EVALUATE TRUE WHEN PLANET-NAME = "Mercury" MOVE 1 TO PLANET-NUMBER WHEN PLANET-NAME = "Venus " MOVE 2 TO PLANET-NUMBER WHEN PLANET-NAME = "Earth " MOVE 3 TO PLANET-NUMBER WHEN PLANET-NAME = "Mars " MOVE 4 TO PLANET-NUMBER WHEN PLANET-NAME = "Jupiter" MOVE 5 TO PLANET-NUMBER WHEN PLANET-NAME = "Saturn " MOVE 6 TO PLANET-NUMBER WHEN PLANET-NAME = "Uranus " MOVE 7 TO PLANET-NUMBER WHEN PLANET-NAME = "Neptune" MOVE 8 TO PLANET-NUMBER WHEN PLANET-NAME = "Pluto " MOVE 9 TO PLANET-NUMBER

WHEN OTHER MOVE 0 TO PLANET-NUMBER END-EVALUATE. EVALUATE EVALUATE Qty ALSO TRUE ALSO Member WHEN 1 THRU 5 ALSO VOP < 501 ALSO "Y" MOVE 2 TO Discount WHEN 6 THRU 16 ALSO VOP < 501 ALSO "Y" MOVE 3 TO Discount WHEN 17 THRU 99 ALSO VOP < 501 ALSO "Y" MOVE 5 TO Discount WHEN 1 THRU 5 ALSO VOP < 2001 ALSO "Y" MOVE 7 TO Discount

WHEN 6 THRU 16 ALSO VOP < 2001 ALSO "Y" MOVE 12 TO Discount WHEN 17 THRU 99 ALSO VOP < 2001 ALSO "Y" MOVE 18 TO Discount WHEN 1 THRU 5 ALSO VOP > 2000 ALSO "Y" MOVE 10 TO Discount WHEN 6 THRU 16 ALSO VOP > 2000 ALSO "Y" MOVE 23 TO Discount END-EVALUATE EVALUATE EVALUATE TRUE ALSO Position WHEN L-Arrow ALSO 2 THRU 10

SUBTRACT 1 FROM Position WHEN R-Arrow ALSO 1 THRU 9 ADD 1 TO Position WHEN L-Arrow ALSO 1 MOVE 10 TO Position WHEN R-Arrow ALSO 10 MOVE 1 TO Position WHEN DelKey ALSO ANY PERFORM DeleteChar WHEN Char ALSO 1 THRU 9 PERFORM InsertChar ADD 1 TO Position WHEN Char ALSO 10

PERFORM InsertChar WHEN OTHER PERFORM DisplayErrorMessage END-EVALUATE PERFORM PERFORM Paragraph PERFORM paragraph name Execute all instructions in the paragraph Return control to the next instruction after the PERFORM PERFORM 100-ROUTINE

PERFORM 200-ROUTINE PERFORM 100-ROUTINE 100-ROUTINE. 200-ROUTINE. 300-ROUTINE. PERFORM THRU PERFORM paragraph name THRU paragraph name

PERFORM 100-XXX THUR 100-XXX-EXIT 100-XXX. DISPLAY IN 100-XXX. 100-XXX-EXIT. EXIT. There is an implicit EXIT in every paragraph so why do I need to code it explicitly? Perform Thru (Let it Die) I view use of PERFORMTHRU as an older, unnecessary style, caused by a compiler problem that

existed many years ago. Using PERFORM THRU was a way to address this ancient problem. The problem has been fixed for many years now, yet old habits die hard. PERFORM WITH TIMES PERFORM x TIMES MOVE 5 TO COUNT PERFORM COUNT TIMES DISPLAY XXX END-PERFORM PERFORM 100-DISPLAY COUNT TIMES

PERFORM UNTIL PERFORM UNTIL MOVE 0 TO X PERFORM UNTIL X > 10 MOVE X TO X-EDITED DISPLAY X-EDITED ADD 1 TO X END-PERFORM PERFORM X-PARA UNTIL X > 10 PERFORM X-PARA WITH TEST AFTER UNTIL X > 10

PERFORM VARYING Inline Perform PERFORM VARYING X FROM 1 BY 1 UNTIL X > 100 DISPLAY X END-PERFORM PRINTS: 1 2 3 100

Inline PERFORM PERFORM VARYING X FROM 5 BY -1 UNTIL X =0 DISPLAY X END-PERFORM PRINTS: 5 4 3 2 1 0

Inline PERFORM MOVE 10 TO X PERFORM WITH TEST AFTER UNTIL DISPLAY X SUBTRACT 1 FROM X END-PERFORM X = 0 PERFORM PARAGRAPH PERFORM 100-RTN

WITH TEST AFTER VARYING X FROM 1 BY 1 UNTIL X = 100 100-RTN. . Inline PERFORM MOVE ZERO TO Y PERFORM UNTIL X = 0 READ AT END MOVE 0 TO X ADD X TO Y DISPLAY Y

END-PERFORM Alternate PERFORM PERFORM 100-PARA VARYING I FROM 1 BY 1 UNTIL I > 5 AFTER J FROM 1 BY 1 UNTIL J > 3 END-PERFORM 100-PARA. DISPLAY I J . 1 1 1 2 1 3 2 1

2 2 2 3 3 1 3 2 3 3 4 1 Table Processing with Subscripts 01 TOT PIC S9(8) PACKED DECIMAL. 01 SUB1 PIC 99. 01 TEMP-REC.

05 TEMP OCCURS 12 TIMES PIC S9(4). MOVE 0 TO TOT PERFORM VARYING SUB1 FROM 1 BY 1 UNTIL SUB1 > 12 ADD TEMP(SUB1) TO TOT ENDPERFORM Table Processing with Indexes 01 TOT 01 TEMP-REC. 05 TEMP

PIC S9(8) PACKED DECIMAL. OCCURS 12 TIMES INDEXED BY K PIC S9(4). MOVE 0 TO TOT PERFORM VARYING K FROM 1 BY 1 UNTIL K > 12 ADD TEMP(K) TO TOT END-PERFORM

Manipulating Indexes Indexes cant be manipulated with ordinary arithmetic commands. Instead use SET. SET SET SET SET

K K K K TO 3 UP BY 1 UP BY 2 DOWN BY 3 CONTINUE Used to indicate that no operation is present.

EXIT Sometimes used to provide an explicit exit from a paragraph or a program. There is an implicit exit at the end of each paragraph 100-PARA. DISPLAY X EXIT . STOP

Usually used to permanently halt execution of a program Can be used to temporarily halt execution and require operator intervention GOBACK Functions like an EXIT PROGRAM when coded at the end of a called program Functions like STOP RUN when coded in a main program I prefer coding this in place of STOP RUN

GO TO Causes an unconditional jump in program execution to the procedure that is named. This statement should be used only in very special situations, for instance, to branch to an error routine that terminates the program from a deeply nested area of your program. Overuse (any?) of this statement is unnecessary and leads to

spaghetti code Dont even think of using the alternate forms of GO TO ! Exercise #2

Create a file of 80 byte records Each record has 3 fields CUSTLNAME CHARACTER 15 CUSTFNAME - CHARACTER 15 BALANCE - PACKED DECIMAL 5 BYTES 2 DECS Create a table of the file data using subscripts. Sort the table with a bubble sort on customer name. Print the sorted table: Last Name First Name Balance Exercise #3 Repeat Exercise #2 using indexes

SEQUENTIAL SEARCH SEARCH Search performs a sequential search with an index Rule of thumb: Use SEARCH for tables with 20 items or less DEPENDING ON field must contain the number of table entries 01 01 RECCOUNT PIC 9(2). SALES-TAX. 05 TAB-ENTRIES OCCURS 20 TIMES

DEPENDING ON RECCOUNT INDEXED BY K. 10 ZIPCODE PIC 9(5). 10 RATE PIC V999. SET K TO 1 SEARCH TAB-ENTRIES AT END MOVE 0 TO TAX WHEN ZIPIN = ZIPCODE(K) COMPUTE TAX = RATE(K) * AMOUNT END-SEARCH

Exercise #4 Read the file from exercise #3 Store the data in a table Read the file BCST.SICCC01.PDSLIB(DAT4EXER). Each record has a LAST NAME, FIRST NAME field: Last name columns 1 15 First name columns 16 30 Code a Sequential Search statement to find each name in the file. Print each name, Found or Not Found, and the customer balance if found. SEARCH ALL

SEARCH ALL 01 01 SEARCH ALL performs a binary search with an index ENTRIES MUST BE IN ORDER BY KEY! No SET necessary (the whole table is searched) RECCOUNT must contain the number of table entries.

RECCOUNT PIC 999 PACKED-DECIMAL. SALES-TAX. 05 TAB-ENTRIES OCCURS 100 TIMES DEPENDING ON RECCOUNT 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 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 SEARCH ALL Constraints Table must indicate ASCENDING or DESCENDING KEY 01 TABLE. 05 CUST-REC OCCURS 40 TIMES DEPENDING ON RECCOUNT

ASCENDING KEY CUST INDEXED BY K. 10 CUST PIC 9(4). 10 RATE PIC V999. Exercise #5 Read the file from exercise #3 Store the data in a table Read the file BCST.SICCC01.PDSLIB(DAT4EXER). Each record has a LAST NAME , FIRST NAME fields Last name columns 1 15

First name columns 16 30 Code a binary search statement to find each name in the file. Print each name, Found or Not Found, and the customer balance if found. STRING STRING Used to build string expressions by concatenation (blanks not stored) STRING FNAME DELIMITED BY MNAME DELIMITED BY LNAME DELIMITED BY

INTO NAME-OUT STRING Blanks stored DELIMITED BY SIZE means include the entire literal or variable contents STRING FNAME DELIMITED BY DELIMITED BY SIZE MNAME DELIMITED BY DELIMITED BY SIZE LNAME DELIMITED BY DELIMITED BY SIZE INTO NAME-OUT

STRING UNSTRING UNSTRING Separates a string into several component strings Sending field must be alphanumeric UNSTRING NAME DELIMITED BY , INTO LNAME FNAME

MI END-UNSTRING UNSTRING UNSTRING JCL-DATA DELIMITED BY ALL SPACES OR ALL ',' INTO WS-DATE-REQUESTED WS-DATE1 WS-DATE2 END-UNSTRING Exercise #6

Read the file BCST.SICCC01.PDSLIB(STRINGS) Print the first name, middle initial, and last names in columns Exercise #7 Read the file BCST.SICCC01.PDSLIB(STRINGS1) Print the digits followed by the letters. Use / as the delimiter of the two fields. CALL

Static and Dynamic Call Programs A and B that are linked together prior to being loaded are statically linked. If A calls B, the call is static If programs A and B are separately compiled and linked, A can call B dynamically: 01 PGMNAME PIC X(8) VALUE B. CALL PGMNAME Calling Other Programs Statically

CALL literal program name USING identifier-1, Examples CALL CUST1030 USING X,Y CALL PROG1000 CALLING ANOTHER PROGRAM CALL PROGXXXX USING A,B IDENTIFICATION DIVISION. PROGRAM-ID. PROGXXXX. LINKAGE SECTION. 01 X

PIC X(5). 01 Y PIC 999V99. PROCEDURE DIVISION USING X,Y. GOBACK . Static and Dynamic CALLS

Two methods for generating dynamic calls 1. CALL MYPROG USING X,Y,Z (Using an identifier insures a dynamic call.) 2. DYNAM/NODYNAM compiler option determines whether a static or dynamic call occurs 3. At TSYS all calls are dynamic. Exercise #8 Write a main program that, 1) Prints I am in the main program,

2) Calls your subprogram, 3) Prints I am back in the main program Write a subprogram that prints I am in the subprogram. Compile and link the programs, execute the main program Exercise #9 Write a main program that passes 3 packed decimal numbers to a subprogram and a fourth variable in which to receive a result. Write a subprogram that accepts the 3

integers, computes their sum and returns the answer to the main Have the main print the result Exercise #10 Write a main program that passes a variable X by reference and Y by content Have the subprogram add one to both numbers Have the main program print X and Y after returning from the subprogram NUMERIC Class Test

Before using a suspect field that has a PIC of 9s, use the NUMERIC class test to verify the field before doing arithmetic IF AMOUNT-IN IS NUMERIC ADD 1 TO AMOUNT-IN ELSE DISPLAY AMOUNT IS NOT NUMERIC END-IF Sign Test Numeric data can be tested for positive, negative, and zero values IF AMOUNT-IN IS POSITIVE

ADD 1 TO AMOUNT-IN END-IF IF AMOUNT-IN IS NEGATIVE DISPLAY AMOUNT-IN END-IF IF AMOUNT-IN IS ZERO DISPLAY THE FIELD IS ZERO END-IF INSPECT (TALLYING) INSPECT (TALLYING) INSPECT MYLINE

TALLYING ECOUNT FOR ALL E AFTER INITIAL START" BEFORE INITIAL END END-INSPECT INSPECT WORK TALLYING COUNT1 FOR LEADING * COUNT2 FOR CHARACTERS END-INSPECT INSPECT WORK TALLYING COUNT1 FOR ALL * BEFORE . COUNT2 FOR ALL CHARACTERS AFTER . END-INSPECT

INSPECT (REPLACING) INSPECT (REPLACING) INSPECT MYDATA REPLACING ALL X" BY Y AFTER INITIAL A" BEFORE INITIAL Z INSPECT MYDATA REPLACING LEADING " BY + INSPECT MYDATA REPLACING ALL A" BY + AFTER INITIAL X" INSPECT MYDATA REPLACING FIRST A" BY +" AFTER INITIAL A" BEFORE INITIAL Z INSPECT MYDATA REPLACING ALL AAAA" BY ZZZZ"

INSPECT (CONVERTING) INSPECT (CONVERTING) INSPECT TEXTLINE CONVERTING "abcdefghijklmnopqrstuvwxyz" TO "ABCDEFGHIJKLMNOPQRSTUVWXYZ" INSPECT FIELDA CONVERTING 1234567890 TO ABCDEFGHIJ REFERENCE MODIFICATION

05 Allows you to process PIC 9 and PIC X fields as if they were an array of characters. FIELDNAME(start pos : [ length]) FIELDA PIC X(7) VALUE ABCDEFG. FIELDA(1:3) ABC FIELDA(2:2) BC FIELDA(4: ) DEFG

Qualification of Names COBOL allows the same variable name to be used to define fields in different records or group items. Duplicate names must be qualified when they are referenced 01 XFIELD. 05 YFIELD. 10 ZFIELD PIC X(3). If ZFIELD is a duplicate name it can be qualified in two ways: ZFIELD OF YFIELD

ZFIELD OF XFIELD Intrinsic Functions COBOL does not permit user-defined functions or procedures Intrinsic (built-in) Functions can be used in your programs Three broad categories of intrinsic functions: date functions, numeric functions and string functions. Intrinsic Functions Intrinsic Function values are replaced in the position

where they occur by the function result. In COBOL, an Intrinsic Function is a temporary data item whose value is determined at the time the function is executed. Functions that return a number value (numeric & integer) are always considered to be signed. A function that returns a number value can be used only in an arithmetic expression or as the source of a MOVE statement. Intrinsic Functions Intrinsic function pattern: FUNCTION FunctionName(Parameters)

FunctionName is the name of the function and Parameters is one or more parameters supplied to the function. COMPUTE NUM = FUNCTION RANDOM(99) MOVE FUNCTION REVERSE(ABCD) TO NAME Sample Intrinsic Functions CHAR(PosInt) AlphanumericReturns the character at ordinal position PosInt of the collating sequence. ORD(Alph) IntegerReturns the ordinal position of character Alph. ORD-MAX({Any}...) IntegerReturns the ordinal position of whichever of the

parameters has the highest value. All parameters must be of the same type. The parameter list may be replaced by an array. ORD-MIN({Any}...) IntegerReturns the ordinal position of whichever of the parameters has the lowest value. All parameters must be of the same type. Intrinsic Functions REVERSE(Alph) Alphanumeric Returns a character string with the characters in Alph reversed. LOWER-CASE(Alph) Alphanumeric Returns a character string with the characters in Alph

changed to their lower case equivalents. UPPER-CASE(Alph) Alphanumeric Returns a character string with the characters in Alph changed to their upper case equivalents Date Intrinsic Functions CURRENT-DATE - Returns a 21 character string representing the current date and time DATE-OF-INTEGER(PosInt) - Returns the yyyymmdd (standard date) equivalent of the integer date - PosInt. The integer date is the number of days that have

passed since Dec 31st 1600 in the Gregorian Calendar. Math Intrinsic Functions MAX({Any}...)Return type on type of Any. Takes a parameter list and returns the content of whichever parameter contains the maximum value. The returned type depends upon the parameter types as follows; Alphanumeric if parameters are Alphabetic or Alphnumeric. Integer if all are integer.

Numeric if all are Numeric. An array may be used instead of the parameter list. Math Intrinsic Functions SQRT(Num) Returns an approximation of the square root of Num. STANDARD-DEVIATION({Num}...) Returns an approximation of the standard deviation of its parameters. And many others Condition Names

01 NO-OF-NEIGHBORS PIC 9. 88 JUST-RIGHT VALUE 2 THRU 3. 88 TOO-FEW VALUE 0 THRU 1. 88 TOO-MANY VALUE 4 THRU 8. 01 MARITAL-STATUS PIC X. 88 VALID-STATUS VALUE S M D W. Variable Length Tables 01 TCOUNT

PIC S9(3) PACKED-DECIMAL. 01 STATE-TABLE. 05 ST-GROUP OCCURS 1 TO 100 TIMES DEPENDING ON TCOUNT ASCENDING KEY IS ZIP INDEXED BY NDX. 10 ZIP PIC X(5). 10 RATE PIC V9999. Loading a Variable Length Table

PERFORM WITH TEST AFTER VARYING NDX FROM 1 BY 1 UNTIL PTABLE-EOF OR NDX = 100 PERFORM FILE-READ IF NOT PTABLE-EOF MOVE ZIP-IN TO ZIP(NDX) MOVE RATE-IN TO RATE(NDX) ELSE SET NDX DOWN BY 1 SET TCOUNT TO NDX END-IF END-PERFORM

Exercise #11 Read the file BCST.SICCC01.PDSLIB(STATES) Store the data in a variable length table Read the file BCST.SICCC01.PDSLIB(COBDATA4). Each record has a 2 digit

state code and a 5 byte zip code. For each record in this file print a record on a report. The report will have the following format: GA CA ZD 31907 90003 30002 GEORGIA - VALID ZIP AND STATE CALIFORNIA - INVALID ZIP INVALID STATE

Capitalize the state name found in the table. Print message next to each state name separated by a dash. Use the SEARCH command perform a sequential search of the table for each look up. After the program is working, modify it to perform a binary search with SEARCH ALL Files with Multiple Record

Types FD TransFile. 01 InsertRec. 02 RECI 02 STUDENTIDI 02 STUDENTNAME. 03 SURNAME 03 INITIALS 02 DOB. 03 YOBIRTH 03 MOBIRTH 03 DOBIRTH 02 COURSECODE

02 GENDER 01 DELETEREC. 02 RECD 02 STUDENTIDD 01 UpdateRec. 02 STUDENTIDU 02 NEWCOURSECODE PIC X. PIC 9(7). PIC X(8). PIC XX. PIC

PIC PIC PIC PIC 9(4). 99. 99. X(4). X. PIC X. PIC 9(7).

PIC 9(7). PIC X(4). Multiple O1 File Descriptions Any number of 01 record descriptions can be coded with the FD Only one buffer is used no matter how many record descriptions have been coded Record fields cant be referenced before the file is opened or after it is closed With multiple record formats, there needs to be a fixed field to indicate the record type Value clauses are only used for 88 level items

Writing With Carriage Control Variable Length Records The RECORD IS VARYING IN SIZE clause specifies a file containing variable length records. Variable Length Records The RECSIZE number in the DEPENDING ON phase must be an elementary unsigned integer data-item declared in the WORKING-STORAGE SECTION.

FD TRANFILE RECORD IS VARYING IN SIZE FROM 1 TO 80 CHARACTERS DEPENDING ON RECSIZE. Variable Length Record Processing When writing a variable length record, the size of the record must be placed in the RECSIZE variable before the WRITE is issued. When reading a variable length record, the length of the record is delivered into the RECSIZE variable. The 01 Record description must be long enough

to accommodate the largest record Variable length Record Processing FD TRANFILE RECORD IS VARYING IN SIZE FROM 1 TO 80 CHARACTERS DEPENDING ON RECSIZE. 01 TRANREC PIC X(80). 88 END-OF-RECS VALUE HIGH-VALUES. WORKING-STORAGE SECTION. 01 RECSIZE PIC 99. READ TRANFILE AT END DISPLAY TRANREC(1:RECSIZE)

Writing Variable Length Records Many variable length records have a fixed front end, and varying numbers of segments FD CUST RECORD IS VARYING IN SIZE FROM 28 TO 408 CHARACTERS DEPENDING ON RECORD-LEN. 01 CUST-REC. 05 ROOT-SEG. 10 CUST-NO

PIC X(6). 10 INVOICE-COUNT PIC S99. 05 INVOICE-SEGMENT OCCURS 20 TIMES INDEXED BY NDX 10 INVOICE-DATE PIC X(8). 10 INVOICE-NO PIC X(5). 10 INVOICE-AMT pIC S9(5)V99. You must set the RECORD-LEN before writing the record! Alternative FD CUSTFILE

RECORD CONTAINS 20 TO 80 CHARACTERS 01 REC. 05 FIXED-PART PIC X(20). 10 05 VARY-PART OCCURS 1 TO 6 TIMES DEPENDING ON COUNT INDEXED BY NDX COUNT has to be initialized at the time of writing the record Reading Variable Length Records FD CUST

RECORD IS VARYING IN SIZE FROM 28 TO 408 CHARACTERS. 01 CUST-REC. 05 ROOT-SEG. 10 CUST-NO PIC X(6). 10 INVOICE-COUNT PIC S99. 05 INVOICE-SEGMENT OCCURS 20 TIMES INDEXED BY NDX 10 INVOICE-DATE PIC X(8). 10 INVOICE-NO PIC X(5). 10 INVOICE-AMT PIC S9(5)V99.

PERFORM VARYING NDX FROM 1 BY 1 UNTIL NDX > INVOICE-COUNT ADD INVOICE-AMT(NDX) TO AMT-OWED END-PERFORM EXERCISE #12 Each A record for a given customer is followed by one to five B records for that customer. For each A record, write out one variable length record that contains the A record as

the fixed part and the associated B records as the variable parts EXERCISE #13 BCST.SICCC01.PDSLIB(COBDATA5) CONTAINS TWO TYPES OF 80 BYTE RECORDS : RECORD TYPE A 1 BYTE TYPE CODE PIC X CONTAINING A 5 BYTE CUSTOMER ID PIC X(5) RECORD TYPE B 1 BYTE TYPE CODE PIC X CONTAINING B 5 BYTE PART NUMBER PIC X(5)

6 BYTE COST PIC 9(4)V99 EXERCISE #14 Read the variable length records you created in exercise #5. Produce a report similar to the one below: CUSTOMER ID PART # 10030 22322 23444 50043 TOTAL 20030 22322

23444 50043 TOTAL COST 1,333.34 3.44 98.77 1435.55 1,333.34 3.44 98.77

1435.55 VSAM File Processing Virtual Storage Access Method 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 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 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 CIs can be constructed with free space to accommodate additions to the file Control Areas (CA) can be constructed with free space to accommodate additions

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 CIs When a CA becomes too full the data it contains is split into two CAs VSAM tries to keep records that are logically close together, physically close as well VSAM Indexes

VSAM Components Access Method Services (AMS) AMS is a VSAM utility that provides numerous options

DEFINE CLUSTER PRINT REPRO LISTCAT DELETE DEFINE ALTERNATEINDEX DEFINE PATH BLDINDEX VSAM JCL Unlike QSAM files, VSAM files are usually allocated in a separate job step before

data can be written to the file A VSAM cluster is usually created by deleting and then defining the cluster After the cluster is defined, a job can run which writes data to the file 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 MAKEKSDS

000100 000200

000300 000400 000500 000600 000700 000800 000900 001000 001100 001200 001210 001220 001230

001240 001250 001260 001270 001280 //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)) /* IDCAMS PRINT 000100 //TSYSAD2P JOB 'A.STUDENT',USER=TSYSAD2,REGION=2048K,MSGCLASS=V 000200 //*MAIN CLASS=TSYSC,USER=TSYSAD2 000210 //* THIS IS AN IDCAMS PRINT 000220 //PRINT EXEC PGM=IDCAMS 000230 //SYSPRINT DD SYSOUT=* 000240 //SYSIN

DD * 000250 PRINT INFILE(IFILE) 000251 DUMP 000252 /* 000253 //IFILE DD DSN=TSYSAD2.PAYROLL.MASTER,DISP=SHR 000254 // IDCAMS REPRO

000100 000200 000210 000220 000230 000240 000250 000251 000252 000253 000254 000255 000256

000257 000258 //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=* // Creating a VSAM File

000100 000200 000300 000400

000500 000600 000610 000620 000630 000640 000700 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. Creating a VSAM File

004410 01 PM-STATUS. 004430 05 PM-STAT1 PIC X. 004440 05 PM-STAT2 PIC X. 004441 PROCEDURE DIVISION. 004450 OPEN INPUT PAYROLL-MASTER-IN

004460 OPEN OUTPUT PAYROLL-MASTER-OUT 004461 IF PM-STATUS NOT = '00' 004462 PERFORM 300-PRINT-STATUS 004463 END-IF 004470 PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO ' 004480 READ PAYROLL-MASTER-IN 004490

AT END 004500 MOVE 'NO ' TO ARE-THERE-MORE-RECORDS 004600 NOT AT END 004700 PERFORM 200-READ-MODULE 004800 END-READ 004900 END-PERFORM 005000 CLOSE PAYROLL-MASTER-IN

005100 PAYROLL-MASTER-OUT 005110 GOBACK Creating a VSAM File

005130 005410 005420 005430 005440

005500 005510 005520 005530 005600 005700 005800 005900 006000 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 WRITE MASTER-REC-OUT IF PM-STATUS NOT = '00' PERFORM 300-PRINT-STATUS END-IF . 300-PRINT-STATUS. DISPLAY 'FILE STATUS CODE:' PM-STATUS GOBACK . 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 OPEN OPEN OPEN OPEN OPEN

INPUT file-name OUTPUT file-name I-O file-name EXTEND file-name For EXTEND, access mode must be sequential 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 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 Writing WRITE record-name [FROM dataname] [INVALID KEY imperative stmt] [NOT INVALID KEY imperative stmt] [END-WRITE] KSDS FILE CREATION SELECT INVMAST ASSIGN TO INVMAST

ORGANIZATION IS INDEXED ACCESS IS SEQUENTIAL RECORD KEY IS ITEM-NO FILE STATUS IS FILE-STAT. FD INVMAST 01 RECORD-AREA. 05 ITEM-NO PIC X(5) 05 PIC X(75). WORKING-STORAGE SECTION 01 FILE-STAT PIC X(2).

KSDS File Commands OPEN INPUT file-name OPEN OUTPUT file-name READ file-name [NEXT] RECORD [INTO data-area] [AT END imperative] [NOT AT END imperative] [END-READ] KSDS File Commands WRITE record [FROM]] data-name] [INVALID KEY imperative] [NOT INVALID KEY imperative]

[END-WRITE] REWRITE record [FROM]] data-name] [INVALID KEY imperative] [NOT INVALID KEY imperative] [END-REWRITE] CLOSE file-name KSDS File Statements START file-name KEY IS = data-name > >= [INVALID KEY imperative]

[NOT INVALID KEY imperative] [END-START] KSDS File Statements DELETE file-name RECORD [INVALID KEY imperative] [NOT INVALID KEY imperative] [END-DELETE] Exercise #15

Read BCST.SICCC01.PDSLIB(COBDATA6) COL 1-5 KEY COL 6-25 NAME Allocate a KSDS with record size 25 and a key field in cols 1-5 Write out a KSDS record for each record in the file. Write out the records sequentially. Exercise #16 Read BCST.SICCC01.PDSLIB(COBDATA7)

COL 1-5 KEY Read a KSDS record (randomly) for each record in the file. Write out the names you find sequentially. If the record doesnt exist, print a message Not Found Nested Programs 1) 2) 3) 4)

COBOL programs can be nested. There are many advantages for doing this: The monolithic working storage of most COBOL programs leads to difficulty in debugging because all data is global Nested programs break the working storage into smaller areas that can only be accessed by programs that need access. Nested programs provide for parameter passing by techniques found in all modern languages (by value, by reference) There is no execution degradation because of nested programs. In fact, calling a nested program is more

efficient than calling a separately compiled program. Nested Programs Calling a nested program is as efficient as performing a paragraph Nested programs provide design flexibility and encourage good program design A nested program would be called a function or subroutine in any other language Nested programs unleash the power of COBOL pointers and allow COBOL programmers to design data structures that encourage efficient programming techniques

Nested Programs PROGRAM-ID. MAIN. PROGRAM-ID. SUB1. END PROGRAM PROGRAM-ID. END PROGRAM END PROGRAM SUB1. SUB2 SUB2. MAIN.

COBOL Pointers 05 PTR1 USAGE IS POINTER. 05 PTR2-P USAGE IS POINTER VALUE NULL. SET PTR1 TO ADDRESS OF LINKAGE-THING SET PTR2 TO PTR1 LINKAGE SECTION. 01 NAME-STRUCTURE. 05 FIRST-NAME PIC X(18). 05 LAST-NAME PIC X(26). SET ADDRESS OF NAME-STRUCTURE TO EXAMPLE-P.

COBOL Pointers IF PTR1 NOT = NULL AND PTR1 NOT = PTR2 PERFORM 2730-SOMETHING END-IF SYNCHRONIZED The SYNCHRONIZED clause is sometimes used with USAGE IS COMP or USAGE IS INDEX items. It is used to optimize speed of processing but it does so at the expense of increased storage requirements.

The word SYNC can be used instead of SYNCHRONIZED SYNCHRONIZED causes slack bytes to be generated when needed.

Recently Viewed Presentations

  • &#x27;Who&#x27;s Afraid Of Virginia Wolf - Yola

    'Who's Afraid Of Virginia Wolf - Yola

    Who's Afraid of Virginia Woolf ? is a play by Edward Albee that opened on Broadway at the Billy Rose Theater on October 13, 1962. Who's Afraid of Virginia Woolf ? won both the 1963 Tony Award for Best Play...
  • Chapter 9 The Greek World Common Core Standard:

    Chapter 9 The Greek World Common Core Standard:

    G. reat and Darius I. to change the situation. Persia Becomes an Empire. Cyrus the Great. Cyrus II won independence for Persia and conquered the Medes (MEEDZ) who ruled them for more than 150 years. His victory marked the beginning...
  • The Bridge to Work: Supplemental Security Income (SSI)

    The Bridge to Work: Supplemental Security Income (SSI)

    SLIDE 21: Work Incentives, a Bridge to Work, and Independent Living. Parents, with the best intentions, often prevent their adult child from exploring work options and setting work goals. The fear of losing benefits and eliminating their adult child's safety...
  • Chapter 4: Reskin - Southern Illinois University Edwardsville

    Chapter 4: Reskin - Southern Illinois University Edwardsville

    Chapter 4: Reskin Job Sex Segregation Activity Pretend that we are putting on a performance of Snow White and the Seven Dwarfs. I want you to cast the main characters: Snow White Evil Witch Prince Seven Dwarfs (Dopey, Doc, Sleepy,...
  • Chapter 52 Assessment of the Musculoskeletal System Skeletal

    Chapter 52 Assessment of the Musculoskeletal System Skeletal

    Chapter 52 Assessment of the Musculoskeletal System Bone Cancer: Surgical Management Preoperative care Operative procedure Postoperative care Bone Cancer: Community-Based Care Home care management Health teaching Health care resources Disorders of the Hand Dupuytren's contracture—slowly progressive contracture of the palmar...
  • Man, manu - Jefferson School

    Man, manu - Jefferson School

    Root word: man, manu = hand Prefix: post = after. To set free; to lend a hand in freeing someone. Emancipate (v) handcuffs. Manacles (n) A person who has the upper hand; the person in charge . Manager (n) An...
  • The Royal Parks 2004 Research Report: 1) In-park

    The Royal Parks 2004 Research Report: 1) In-park

    All parks (including Hyde Park) are visited significantly more frequently than the other places of interest in London asked about in the research. ... There is universal agreement that the nine Royal Parks improve life in London Extent 9 Royal...
  • What Well Cover Today  2016 Annual Open Enrollment

    What Well Cover Today 2016 Annual Open Enrollment

    Welcome to Cablevision's Annual Open Enrollment for your 2016 [two thousand sixteen] Health and Welfare Benefits!. This presentation is designed to help you make the most of your benefit elections for 2016 and includes an overview of our offerings, with...