ユーザー定義データ・タイプの作成

ILE COBOL では、TYPEDEF 文節を使用して、ユーザー定義データ・タイプを作成できます。 ユーザー定義データ・タイプは、英数字、数字、ブールなど、ILE COBOL データ・タイプですでに使用可能なものへの追加ではありません。 ユーザー定義データ・タイプ (型定義または型名とも呼ばれる) は、実際は TYPEDEF 文節を使用して、 プログラムの WORKING-STORAGE、LOCAL-STORAGE、LINKAGE、または FILE セクションで定義された、 項目全体またはグループ項目です。 これらの型定義はテンプレートと同様に行動するため、TYPE 文節を使用して新しいデータ項目を定義するのに使用できます。 新しいデータ項目は、ユーザー定義データ・タイプのすべての特性を獲得します。 ユーザー定義データ・タイプがグループ項目であるならば、 その新しいデータ項目は、ユーザー定義データ・タイプに属しているものと同じ名前、記述、および階層の従属エレメントをもちます。

ユーザー定義データ・タイプでは、時間が節約でき、ソース・コードを最小化できます。 それは、プログラム内の 2 つまたはそれ以上のデータ項目の定義の一部として発生する複雑なデータ構造を再定義する必要がないためです。 必要なことは、定義を 1 つ作成し、それを、TYPE 文節を使用して、 必要とするものと同じタイプの後続の定義のどれかに適用するだけです。

たとえば、次の 2 つのタイプの品目を配送する小規模流通業者用の在庫プログラムを開発するとします。

在庫プログラムで、個々の衣類品目や書籍について手元にある数量をカウントし、 別個のデータ項目にそれらを格納してから、衣類および書籍の在庫の累計も別個のデータ項目に入れることにします。

図 50 は、TYPEDEF 文節と TYPE 文節を使用して、時間を節約し、 これと同様のプログラムの WORKING-STORAGE セクションのソース・コードを最小化する方法の例です。

この例では、衣類と書籍用のユーザー定義データ・タイプを作成します。 次に、ユーザー定義データ・タイプに基づいて、3 つの異なる衣類品目と 2 つの異なる書籍品目に別個のデータ項目を作成します。 これは、在庫のタイプごとに定義をコーディングし直すよりも、簡単で効率が高い方法です。 間違いをする確率も、少なくなります。

図 50. プログラムにおける TYPEDEF 文節と TYPE 文節の使用法を示す例
5722WDS V5R4M0  060210 LN  IBM ILE COBOL                 CBLGUIDE/SAMPTYPE         AISERIES  06/02/15 13:31:06        ページ    2

                                     ソ ー ス
  STMT PL SEQNO  -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN  S コピー名   変更日付
     1     000100 IDENTIFICATION DIVISION.
     2     000200 PROGRAM-ID.    SAMPTYPE.
           000300
           000400**************************************************************
           000500* The following program demonstrates some of the funcitons
           000600* available with the TYPE and TYPEDEF clauses.
           000700**************************************************************
           000800
     3     000900 ENVIRONMENT DIVISION.
     4     001000 CONFIGURATION SECTION.
     5     001100 SOURCE-COMPUTER.  IBM-ISERIES.
     6     001200 OBJECT-COMPUTER.  IBM-ISERIES.
     7     001300 INPUT-OUTPUT SECTION.
     8     001400 FILE-CONTROL.
     9     001500     SELECT DATA-IN
    10     001600         ASSIGN TO Database-INVDATA
    11     001700         ORGANIZATION IS INDEXED
    12     001800         record key is inv-type
           001900            with duplicates
    13     002000         ACCESS MODE IS SEQUENTIAL.
           002100
    14     002200     SELECT PRINTER-FILE
    15     002300         ASSIGN TO PRINTER-QPRINT
    16     002400         ORGANIZATION IS SEQUENTIAL
    17     002500         ACCESS MODE IS SEQUENTIAL.
           002600
    18     002700 DATA DIVISION.
    19     002800 FILE SECTION.
    20     002900 FD PRINTER-FILE.
    21     003000 01 PRINTER-REC.
    22     003100    05 PRINTER-RECORD    PIC X(132).
           003200
           003300**************************************************************
           003400* define inventory type
           003500**************************************************************
    23     003600 01 INV-TYPE-T IS TYPEDEF PIC S9(3) VALUE 0.
    24     003700    88 INV-TYPE-BOOK             VALUE 4, 5.
    25     003800    88 INV-TYPE-BOOK-001         VALUE 4.
    26     003900    88 INV-TYPE-BOOK-002         VALUE 5.
    27     004000    88 INV-TYPE-CLOTHES          VALUE 1, 2, 3.
    28     004100    88 INV-TYPE-CLOTHES-SWEATERS VALUE 1.
    29     004200    88 INV-TYPE-CLOTHES-SOCKS    VALUE 2.
    30     004300    88 INV-TYPE-CLOTHES-PANTS    VALUE 3.
           004400
    31     004500 FD DATA-IN.
    32     004600 01 DATA-IN-REC.
    33     004700    05 INV-TYPE          TYPE INV-TYPE-T.
    34     004800    05 FILLER            PIC X(80).
           004900
    35     005000 WORKING-STORAGE SECTION.
           005100**************************************************************
           005200* Initialize END-OF-FILE flag to FALSE
           005300**************************************************************
 5722WDS V5R4M0  060210 LN  IBM ILE COBOL                 CBLGUIDE/SAMPTYPE        AISERIES   06/02/15 13:31:06        ページ    3
  STMT PL SEQNO  -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN  S コピー名   変更日付
           005400
    36     005500 01 END-OF-FILE PIC 1 VALUE B"0".
    37     005600    88 AT-END-OF-FILE VALUE B"1".
    38     005700 01 ITEM-PRICE-T TYPEDEF PIC S9(4)V9(2) value 0.
    39     005800 01 ITEM-COLOR-T TYPEDEF PIC S9(2) VALUE 1.
    40     005900    88 ITEM-COLOR-BLUE  VALUE 1.
    41     006000    88 ITEM-COLOR-RED   VALUE 2.
    42     006100    88 ITEM-COLOR-GREEN VALUE 3.
    43     006200 01 ITEM-SIZE-T    TYPEDEF PIC S9(2) VALUE 10.
    44     006300 01 ITEM-COUNTER-T TYPEDEF PIC S9(6) VALUE 0.
           006400
    45     006500 01 ITEM-B-T TYPEDEF.
    46     006600    05  ITEM-B-VALUE PIC s9(2).
    47     006700    88 ITEM-B-BLUE  VALUE 1.
    48     006800    88 ITEM-B-RED   VALUE 2.
    49     006900    88 ITEM-B-GREEN VALUE 3.
    50     007000 01 TEST-ITEM TYPE ITEM-B-T.
           007100
    51     007200 01 WORK-INV-TYPE  TYPE INV-TYPE-T.
           007300**************************************************************
           007400* User-defined data type for items of clothing.
           007500* Items of clothing are INVENTORY-TYPE 1 through 3.
           007600**************************************************************
           007700
    52     007800 01 CLOTHING-ITEM IS TYPEDEF.
    53     007900    05 CLOTHING-TYPE   TYPE INV-TYPE-T.
    54     008000    05 PRICE           TYPE ITEM-PRICE-T.
    55     008100    05 COLOR           TYPE ITEM-COLOR-T.
    56     008200    05 CLOTHING-SIZE   TYPE ITEM-SIZE-T.
    57     008300    05 FILLER PIC X(70).
           008400
    58     008500 01 SWEATERS TYPE CLOTHING-ITEM.
    59     008600 01 SOCKS TYPE CLOTHING-ITEM.
    60     008700 01 PANTS TYPE CLOTHING-ITEM.
           008800
           008900**************************************************************
           009000* User-defined data type for books.
           009100* Books are INVENTORY-TYPE 4 through 5.
           009200**************************************************************
           009300
    61     009400 01 BOOK-ITEM IS TYPEDEF.
    62     009500    05 BOOK-TYPE    TYPE INV-TYPE-T.
    63     009600    05 PRICE        TYPE ITEM-PRICE-T.
    64     009700    05 FILLER       PIC X(20).
    65     009800    05 BOOK-TITLE   PIC X(40).
    66     009900    05 FILLER       PIC X(14).
           010000
    67     010100 01 BOOK-001 TYPE BOOK-ITEM.
    68     010200 01 BOOK-002 TYPE BOOK-ITEM.
           010300
           010400**************************************************************
           010500* Initialize all of the inventory counters.
           010600**************************************************************
           010700
    69     010800 01 sweaters-count TYPE item-counter-t.
 5722WDS V5R4M0  060210 LN  IBM ILE COBOL                 CBLGUIDE/SAMPTYPE         AISERIES  06/02/15 13:31:06        ページ    4
  STMT PL SEQNO  -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN  S コピー名   変更日付
    70     010900 01 socks-count TYPE item-counter-t.
    71     011000 01 pants-count TYPE item-counter-t.
           011100
    72     011200 01 book-001-count TYPE item-counter-t.
    73     011300 01 book-002-count TYPE item-counter-t.
           011400
    74     011500 01 clothes-count TYPE item-counter-t.
    75     011600 01 book-count TYPE item-counter-t.
           011700
           011800**************************************************************
           011900* Declare report variables.
           012000**************************************************************
           012100
    76     012200 01 header-line.
    77     012300    05 FILLER   pic x(40) value spaces.
    78     012400    05 FILLER   pic x(52) value "Detailed Inventory Report".
    79     012500    05 FILLER   pic x(40) value spaces.
           012600
    80     012700 01 DETAIL-LINE.
    81     012800    05 FILLER             pic x(10) value spaces.
    82     012900    05 ITEM-DESCRIPTION   pic x(25) value spaces.
    83     013000    05 ITEM-QUANTITY      pic 9(6) blank when zero.
    84     013100    05 FILLER             pic x(92) value spaces.
           013200
           013300
    85     013400 PROCEDURE DIVISION.
           013500 MAIN-PAR.
    86     013600     OPEN INPUT DATA-IN
           013700          OUTPUT PRINTER-FILE.
           013800
           013900
           014000**************************************************************
           014100* Read the first record.
           014200**************************************************************
           014300
    87     014400     READ DATA-IN
           014500         AT END
    88     014600            SET AT-END-OF-FILE TO TRUE
           014700         NOT AT END
    89     014800            MOVE INV-TYPE TO WORK-INV-TYPE
           014900     END-READ.
           015000
           015100**************************************************************
           015200* Tally each of the inventory types and move the amounts into
           015300* separate totals.
           015400**************************************************************
           015500
    90     015600     PERFORM UNTIL AT-END-OF-FILE
    91     015700         EVALUATE TRUE
           015800         WHEN INV-TYPE-CLOTHES-SWEATERS OF WORK-INV-TYPE
    92     015900            ADD 1 TO sweaters-count
    93     016000            ADD 1 TO clothES-count
           016100         WHEN INV-TYPE-CLOTHES-SOCKS OF WORK-INV-TYPE
    94     016200            ADD 1 TO socks-count
    95     016300            ADD 1 TO clothES-count
 5722WDS V5R4M0  060210 LN  IBM ILE COBOL                 CBLGUIDE/SAMPTYPE        AISERIES   06/02/15 13:31:06        ページ    5
  STMT PL SEQNO  -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN  S コピー名   変更日付
           016400         WHEN INV-TYPE-CLOTHES-PANTS OF WORK-INV-TYPE
    96     016500            ADD 1 TO pants-count
    97     016600            ADD 1 TO clothES-COUNT
           016700         WHEN INV-TYPE-BOOK-001 OF WORK-INV-TYPE
    98     016800            ADD 1 TO book-001-count
    99     016900            ADD 1 TO book-count
           017000         WHEN INV-TYPE-BOOK-002 OF WORK-INV-TYPE
   100     017100            ADD 1 TO book-002-count
   101     017200            ADD 1 TO book-count
           017300         END-EVALUATE
           017400
   102     017500         READ DATA-IN
           017600            AT END
   103     017700               SET AT-END-OF-FILE TO TRUE
           017800            NOT AT END
   104     017900               MOVE INV-TYPE TO WORK-INV-TYPE
           018000         END-READ
           018100     END-PERFORM.
           018200
           018300**************************************************************
           018400* Write report.
           018500**************************************************************
           018600
   105     018700     PERFORM REPORT-WRITE.
   106     018800     CLOSE DATA-IN
           018900           PRINTER-FILE.
   107     019000     STOP RUN.
           019100
           019200**************************************************************
           019300* Procedure to write report.
           019400**************************************************************
           019500
           019600 REPORT-WRITE.
   108     019700     WRITE PRINTER-REC FROM HEADER-LINE AFTER ADVANCING PAGE.
           019800
   109     019900     MOVE "BOOKS:"                TO ITEM-DESCRIPTION.
   110     020000     MOVE ZEROS                   TO ITEM-QUANTITY.
   111     020100     WRITE PRINTER-REC FROM DETAIL-LINE AFTER ADVANCING 2 LINES.
           020200
   112     020300     MOVE "Best-seller Number 1:" TO ITEM-DESCRIPTION.
   113     020400     MOVE BOOK-001-COUNT          TO ITEM-QUANTITY.
   114     020500     WRITE PRINTER-REC FROM DETAIL-LINE AFTER ADVANCING 2 LINES.
           020600
   115     020700     MOVE "Best-seller Number 2:" TO ITEM-DESCRIPTION.
   116     020800     MOVE BOOK-002-COUNT          TO ITEM-QUANTITY.
   117     020900     WRITE PRINTER-REC FROM DETAIL-LINE AFTER ADVANCING 2 LINES.
           021000
   118     021100     MOVE "Total Books:"          TO ITEM-DESCRIPTION.
   119     021200     MOVE BOOK-COUNT              TO ITEM-QUANTITY.
   120     021300     WRITE PRINTER-REC FROM DETAIL-LINE AFTER ADVANCING 2 LINES.
           021400
   121     021500     WRITE PRINTER-REC FROM HEADER-LINE AFTER ADVANCING PAGE.
           021600
   122     021700     MOVE "CLOTHES:"              TO ITEM-DESCRIPTION.
   123     021800     MOVE ZEROS                   TO ITEM-QUANTITY.
   124     021900     WRITE PRINTER-REC FROM DETAIL-LINE AFTER ADVANCING 2 LINES.
           022000
   125     022100     MOVE "Sweaters:"             TO ITEM-DESCRIPTION.
   126     022200     MOVE SWEATERS-COUNT          TO ITEM-QUANTITY.
   127     022300     WRITE PRINTER-REC FROM DETAIL-LINE AFTER ADVANCING 2 LINES.
           022400
   128     022500     MOVE "Socks:"                TO ITEM-DESCRIPTION.
   129     022600     MOVE SOCKS-COUNT             TO ITEM-QUANTITY.
   130     022700     WRITE PRINTER-REC FROM DETAIL-LINE AFTER ADVANCING 2 LINES.
           022800
   131     022900     MOVE "Pants:"                TO ITEM-DESCRIPTION.
   132     023000     MOVE PANTS-COUNT             TO ITEM-QUANTITY.
   133     023100     WRITE PRINTER-REC FROM DETAIL-LINE AFTER ADVANCING 2 LINES.
           023200
   134     023300     MOVE "Total Clothes:"        TO ITEM-DESCRIPTION.
   135     023400     MOVE CLOTHES-COUNT           TO ITEM-QUANTITY.
   136     023500     WRITE PRINTER-REC FROM DETAIL-LINE AFTER ADVANCING 2 LINES.
           023600
                           * * * * *   ソ ー ス 仕 様 の 終 わ り   * * * * *