コミットメント制御を使用する例

図 102 に、銀行の環境でコミットメント制御を使用する例を示します。 プログラムは、トランザクションを処理して、ある口座から別の口座に送金します。 トランザクション中に問題が起きなければ、変更内容がデータベース・ファイルにコミットされます。 口座番号が不適切だったり金額が足りなかったりして送金が行われないと、ROLLBACK が出されて変更内容が取り消されます。

図 100. コミットメント制御の使用例 - アカウント・マスター・ファイル DDS
....+....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
図 101. コミットメント制御の使用例 - プロンプト画面 DDS
....+....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'
図 102. コミットメント制御の使用例
 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
                           * * * * *   ソ ー ス 仕 様 の 終 わ り   * * * * *
 1 
プログラム用に別個の標識域を用意します。
 2 
COMMITMENT CONTROL 文節で、コミットメント制御のもとに置かれるファイルを指定します。 この文節で指定されているファイルは、COMMIT verb と ROLLBACK verb の影響を受けます。
 3 
形式 2 の COPY ステートメント中に標識属性 INDIC を指定することにより、 プログラムの中で標識を使用するためのデータ記述項目を WORKING-STORAGE の中に定義します。
 4 
無効なファイル状況の場合に IN96 が設定されます。
 5 
REWRITE 操作で INVALID KEY 条件の場合に IN95 が設定されます。
 6 
入力された口座番号が送金元の口座として無効な場合には、IN99 が設定されます。
 7 
入力された口座番号が送金先の口座として無効な場合には、IN97 が設定されます。
 8 
READ において INVALID KEY 条件が発生すると、ROLLBACK が使用され、 最初の READ の後のレコードに対するレコード・ロックが解除されます。
 9 
送金できない (標識が設定されている) 場合には、ROLLBACK ステートメントが処理されます。 コミットメント制御下のデータベース・ファイルに加えられた変更は、すべて取り消されます。
 10 
送金が有効だった (標識が設定されていない) 場合には、COMMIT ステートメントが処理され、 コミットメント制御下のデータベース・ファイルに加えられた変更は、すべて永続的な変更になります。
 11 
標識で制御されるワークステーションのディスプレイ装置に関するオプションに、INDICATORS 句が必要です。