図 102 に、銀行の環境でコミットメント制御を使用する例を示します。 プログラムは、トランザクションを処理して、ある口座から別の口座に送金します。 トランザクション中に問題が起きなければ、変更内容がデータベース・ファイルにコミットされます。 口座番号が不適切だったり金額が足りなかったりして送金が行われないと、ROLLBACK が出されて変更内容が取り消されます。
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 A* ACCOUNT MASTER PHYSICAL FILE -- ACCTMST A A UNIQUE A R ACCNTREC A ACCNTKEY 5S A NAME 20 A ADDR 20 A CITY 20 A STATE 2 A ZIP 5S A BALANCE 10S 2 A K ACCNTKEY
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* PROMPT SCREEN FILE NAME 'ACCTFMTS'
A*
A 1 INDARA
A R ACCTPMT
A TEXT('CUSTOMER ACCOUNT PROMPT')
A
A CA01(15 'END OF PROGRAM')
A PUTRETAIN OVERLAY
A 1 3'ACCOUNT MASTER UPDATE'
A 3 3'FROM ACCOUTN NUMBER'
A ACCTFROM 5Y 0I 3 23CHECK(ME)
A 99 ERRMSG('INVALID FROM ACCOUNT +
A NUMBER' 99)
A 98 ERRMSG('INSUFFICIENT FUNDS IN FROM +
A ACCOUNT' 98)
A 4 3'TO ACCOUNT NUMBER'
A ACCTTO 5Y 0I 4 23CHECK(ME)
A 97 ERRMSG('INVALID TO ACCOUNT +
A NUMBER' 97)
A 5 3'AMOUNT TRANSFERRED'
A TRANSAMT 10Y02I 5 23
A R ERRFMT
A 96 6 5'INVALID FILE STATUS'
A 95 7 5'INVALID KEY IN REWRITE'
A 94 8 5'EOF CONDITION IN READ'
5722WDS V5R4M0 060210 LN IBM ILE COBOL CBLGUIDE/ACCOUNT ISERIES1 06/02/15 13:53:23 ページ 2 ソ ー ス STMT PL SEQNO -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN S コピー名 変更日付 1 000100 IDENTIFICATION DIVISION. 2 000200 PROGRAM-ID. ACCOUNT. 3 000300 ENVIRONMENT DIVISION. 4 000400 CONFIGURATION SECTION. 5 000500 SOURCE-COMPUTER. IBM-ISERIES. 6 000600 OBJECT-COMPUTER. IBM-ISERIES. 7 000700 INPUT-OUTPUT SECTION. 8 000800 FILE-CONTROL. 9 000900 SELECT ACCOUNT-FILE ASSIGN TO DATABASE-ACCTMST 11 001000 ORGANIZATION IS INDEXED 12 001100 ACCESS IS DYNAMIC 13 001200 RECORD IS EXTERNALLY-DESCRIBED-KEY 14 001300 FILE STATUS IS ACCOUNT-FILE-STATUS. 15 001400 SELECT DISPLAY-FILE ASSIGN TO WORKSTATION-ACCTFMTS-SI 1 17 001500 ORGANIZATION IS TRANSACTION. 001600********************************************************************* 18 001700 I-O-CONTROL. 19 001800 COMMITMENT CONTROL FOR ACCOUNT-FILE. 2 001900********************************************************************* 20 002000 DATA DIVISION. 21 002100 FILE SECTION. 22 002200 FD ACCOUNT-FILE. 23 002300 01 ACCOUNT-RECORD. 002400 COPY DDS-ALL-FORMATS OF ACCTMST. 24 +000001 05 ACCTMST-RECORD PIC X(82). <-ALL-FMTS +000002* I-O FORMAT:ACCNTREC FROM FILE ACCTMST OF LIBRARY CBLGUIDE <-ALL-FMTS +000003* <-ALL-FMTS +000004*THE KEY DEFINITIONS FOR RECORD FORMAT ACCNTREC <-ALL-FMTS +000005* NUMBER NAME RETRIEVAL ALTSEQ <-ALL-FMTS +000006* 0001 ACCNTKEY ASCENDING NO <-ALL-FMTS 25 +000007 05 ACCNTREC REDEFINES ACCTMST-RECORD. <-ALL-FMTS 26 +000008 06 ACCNTKEY PIC S9(5). <-ALL-FMTS 27 +000009 06 NAME PIC X(20). <-ALL-FMTS 28 +000010 06 ADDR PIC X(20). <-ALL-FMTS 29 +000011 06 CITY PIC X(20). <-ALL-FMTS 30 +000012 06 STATE PIC X(2). <-ALL-FMTS 31 +000013 06 ZIP PIC S9(5). <-ALL-FMTS 32 +000014 06 BALANCE PIC S9(8)V9(2). <-ALL-FMTS 002500 33 002600 FD DISPLAY-FILE. 34 002700 01 DISPLAY-REC. 002800 COPY DDS-ALL-FORMATS OF ACCTFMTS. 35 +000001 05 ACCTFMTS-RECORD PIC X(20). <-ALL-FMTS +000002* INPUT FORMAT:ACCTPMT FROM FILE ACCTFMTS OF LIBRARY CBLGUIDE <-ALL-FMTS +000003* CUSTOMER ACCOUNT PROMPT <-ALL-FMTS 36 +000004 05 ACCTPMT-I REDEFINES ACCTFMTS-RECORD. <-ALL-FMTS 37 +000005 06 ACCTFROM PIC S9(5). <-ALL-FMTS 38 +000006 06 ACCTTO PIC S9(5). <-ALL-FMTS 39 +000007 06 TRANSAMT PIC S9(8)V9(2). <-ALL-FMTS +000008* OUTPUT FORMAT:ACCTPMT FROM FILE ACCTFMTS OF LIBRARY CBLGUIDE <-ALL-FMTS +000009* CUSTOMER ACCOUNT PROMPT <-ALL-FMTS +000010* 05 ACCTPMT-O REDEFINES ACCTFMTS-RECORD. <-ALL-FMTS +000011* INPUT FORMAT:ERRFMT FROM FILE ACCTFMTS OF LIBRARY CBLGUIDE <-ALL-FMTS
5722WDS V5R4M0 060210 LN IBM ILE COBOL CBLGUIDE/ACCOUNT ISERIES1 06/02/15 13:53:23 ページ 3 STMT PL SEQNO -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN S コピー名 変更日付 +000012* <-ALL-FMTS +000013* 05 ERRFMT-I REDEFINES ACCTFMTS-RECORD. <-ALL-FMTS +000014* OUTPUT FORMAT:ERRFMT FROM FILE ACCTFMTS OF LIBRARY CBLGUIDE <-ALL-FMTS +000015* <-ALL-FMTS +000016* 05 ERRFMT-O REDEFINES ACCTFMTS-RECORD. <-ALL-FMTS 002900 40 003000 WORKING-STORAGE SECTION. 41 003100 77 ACCOUNT-FILE-STATUS PIC X(2). 42 003200 77 IND-ON PIC 1 VALUE B"1". 43 003300 77 IND-OFF PIC 1 VALUE B"0". 44 003400 01 DISPFILE-INDICS. 003500 COPY DDS-ALL-FORMATS-INDIC OF ACCTFMTS. 3 45 +000001 05 ACCTFMTS-RECORD. <-ALL-FMTS +000002* INPUT FORMAT:ACCTPMT FROM FILE ACCTFMTS OF LIBRARY CBLGUIDE <-ALL-FMTS +000003* CUSTOMER ACCOUNT PROMPT <-ALL-FMTS 46 +000004 06 ACCTPMT-I-INDIC. <-ALL-FMTS 47 +000005 07 IN15 PIC 1 INDIC 15. <-ALL-FMTS +000006* END OF PROGRAM <-ALL-FMTS 48 +000007 07 IN97 PIC 1 INDIC 97. <-ALL-FMTS +000008* INVALID TO ACCOUNT NUMBER <-ALL-FMTS 49 +000009 07 IN98 PIC 1 INDIC 98. <-ALL-FMTS +000010* INSUFFICIENT FUNDS IN FROM ACCOUNT <-ALL-FMTS 50 +000011 07 IN99 PIC 1 INDIC 99. <-ALL-FMTS +000012* INVALID FROM ACCOUNT NUMBER <-ALL-FMTS +000013* OUTPUT FORMAT:ACCTPMT FROM FILE ACCTFMTS OF LIBRARY CBLGUIDE <-ALL-FMTS +000014* CUSTOMER ACCOUNT PROMPT <-ALL-FMTS 51 +000015 06 ACCTPMT-O-INDIC. <-ALL-FMTS 52 +000016 07 IN97 PIC 1 INDIC 97. <-ALL-FMTS +000017* INVALID TO ACCOUNT NUMBER <-ALL-FMTS 53 +000018 07 IN98 PIC 1 INDIC 98. <-ALL-FMTS +000019* INSUFFICIENT FUNDS IN FROM ACCOUNT <-ALL-FMTS 54 +000020 07 IN99 PIC 1 INDIC 99. <-ALL-FMTS +000021* INVALID FROM ACCOUNT NUMBER <-ALL-FMTS +000022* INPUT FORMAT:ERRFMT FROM FILE ACCTFMTS OF LIBRARY CBLGUIDE <-ALL-FMTS +000023* <-ALL-FMTS +000024* 06 ERRFMT-I-INDIC. <-ALL-FMTS +000025* OUTPUT FORMAT:ERRFMT FROM FILE ACCTFMTS OF LIBRARY CBLGUIDE <-ALL-FMTS +000026* <-ALL-FMTS 55 +000027 06 ERRFMT-O-INDIC. <-ALL-FMTS 56 +000028 07 IN94 PIC 1 INDIC 94. <-ALL-FMTS 57 +000029 07 IN95 PIC 1 INDIC 95. <-ALL-FMTS 58 +000030 07 IN96 PIC 1 INDIC 96. <-ALL-FMTS 003600 59 003700 PROCEDURE DIVISION. 60 003800 DECLARATIVES. 003900 ACCOUNT-ERR-SECTION SECTION. 004000 USE AFTER STANDARD EXCEPTION PROCEDURE ON ACCOUNT-FILE. 004100 ACCOUNT-ERR-PARAGRAPH. 61 004200 IF ACCOUNT-FILE-STATUS IS NOT EQUAL "23" THEN 62 004300 MOVE IND-ON TO IN96 OF ERRFMT-O-INDIC 4 004400 ELSE 63 004500 MOVE IND-ON TO IN95 OF ERRFMT-O-INDIC 5 004600 END-IF 64 004700 WRITE DISPLAY-REC FORMAT IS "ERRFMT" 004800 INDICATORS ARE ERRFMT-O-INDIC
5722WDS V5R4M0 060210 LN IBM ILE COBOL CBLGUIDE/ACCOUNT ISERIES1 06/02/15 13:53:23 ページ 4 STMT PL SEQNO -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN S コピー名 変更日付 004900 END-WRITE 65 005000 CLOSE DISPLAY-FILE 005100 ACCOUNT-FILE. 66 005200 STOP RUN. 005300 005400 DISPLAY-ERR-SECTION SECTION. 005500 USE AFTER STANDARD EXCEPTION PROCEDURE ON DISPLAY-FILE. 005600 DISPLAY-ERR-PARAGRAPH. 67 005700 MOVE IND-ON TO IN94 OF ERRFMT-O-INDIC 68 005800 WRITE DISPLAY-REC FORMAT IS "ERRFMT" 005900 INDICATORS ARE ERRFMT-O-INDIC 006000 END-WRITE 69 006100 CLOSE DISPLAY-FILE 006200 ACCOUNT-FILE. 70 006300 STOP RUN. 006400 END DECLARATIVES. 006500 006600 MAIN-PROGRAM SECTION. 006700 MAINLINE. 71 006800 OPEN I-O DISPLAY-FILE 006900 I-O ACCOUNT-FILE. 72 007000 MOVE ZEROS TO ACCTPMT-I-INDIC 007100 ACCTPMT-O-INDIC. 73 007200 PERFORM WRITE-READ-DISPLAY. 74 007300 PERFORM VERIFY-ACCOUNT-NO UNTIL IN15 EQUAL IND-ON. 75 007400 CLOSE DISPLAY-FILE 007500 ACCOUNT-FILE. 76 007600 STOP RUN. 007700 007800 VERIFY-ACCOUNT-NO. 77 007900 PERFORM VERIFY-TO-ACCOUNT. 78 008000 IF IN97 OF ACCTPMT-O-INDIC EQUAL IND-OFF THEN 79 008100 PERFORM VERIFY-FROM-ACCOUNT. 80 008200 PERFORM WRITE-READ-DISPLAY. 008300 008400 VERIFY-FROM-ACCOUNT. 81 008500 MOVE ACCTFROM TO ACCNTKEY. 82 008600 READ ACCOUNT-FILE 83 008700 INVALID KEY MOVE IND-ON TO IN99 OF ACCTPMT-O-INDIC 008800 END-READ 84 008900 IF IN99 OF ACCTPMT-O-INDIC EQUAL IND-ON THEN 6 009000* 85 009100 ROLLBACK 009200* 009300 ELSE 86 009400 PERFORM UPDATE-FROM-ACCOUNT 009500 END-IF. 009600 009700 VERIFY-TO-ACCOUNT. 87 009800 MOVE ACCTTO TO ACCNTKEY. 88 009900 READ ACCOUNT-FILE 89 010000 INVALID KEY MOVE IND-ON TO IN97 OF ACCTPMT-O-INDIC 7 010100 END-READ 90 010200 IF IN97 OF ACCTPMT-O-INDIC EQUAL IND-ON THEN 010300*
5722WDS V5R4M0 060210 LN IBM ILE COBOL CBLGUIDE/ACCOUNT ISERIES1 06/02/15 13:53:23 ページ 5 STMT PL SEQNO -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN S コピー名 変更日付 91 010400 ROLLBACK 8 010500* 010600 ELSE 92 010700 PERFORM UPDATE-TO-ACCOUNT 010800 END-IF. 010900 011000 UPDATE-TO-ACCOUNT. 93 011100 ADD TRANSAMT TO BALANCE. 94 011200 REWRITE ACCOUNT-RECORD. 011300 011400 UPDATE-FROM-ACCOUNT. 95 011500 SUBTRACT TRANSAMT FROM BALANCE. 96 011600 REWRITE ACCOUNT-RECORD. 97 011700 IF BALANCE IS LESS THAN 0 THEN 98 011800 MOVE IND-ON TO IN98 OF ACCTPMT-O-INDIC 011900* 99 012000 ROLLBACK 9 012100* 012200 ELSE 012300* 100 012400 COMMIT 10 012500* 012600 END-IF. 012700 012800 WRITE-READ-DISPLAY. 101 012900 WRITE DISPLAY-REC FORMAT IS "ACCTPMT" 013000 INDICATORS ARE ACCTPMT-O-INDIC 11 013100 END-WRITE 102 013200 MOVE ZEROS TO ACCTPMT-I-INDIC 013300 ACCTPMT-O-INDIC. 103 013400 READ DISPLAY-FILE RECORD 013500 INDICATORS ARE ACCTPMT-I-INDIC 013600 END-READ. 013700 013800 * * * * * ソ ー ス 仕 様 の 終 わ り * * * * *
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.