ページの先頭行へ戻る
NetCOBOL V11.0 PowerCOBOL ユーザーズガイド
FUJITSU Software

4.4.3 手続きを記述する

手続きの記述方法について説明します。

フォームの環境部

フォームの環境部を記述します。このサンプルプログラムでは、ファイルを利用するために、入出力節(INPUT-OUTPUT SECTION)のファイル管理段落(FILE-CONTROL)を記述します。

FILE-CONTROL
   *    入力したデータを扱います。
        SELECT 売上ファイル ASSIGN TO FILE-NAME.
   *    商品コードをキーとして、商品名および単価をもちます。
        SELECT 商品ファイル ASSIGN TO "..\PRODUCTS.TBL"
          ORGANIZATION IS RELATIVE
          RELATIVE KEY IS 商品-キー
          ACCESS MODE  IS RANDOM
          FILE STATUS  IS FS.

注意

"PRODUCTS.TBL"は、サンプルプログラムと同じ"Table"フォルダに格納されています。サンプルプログラムを別のフォルダに作成した場合は、コピーしてお使いください。

フォームのデータ部

フォームのデータ部を記述します。サンプルプログラムでは、以下の節を記述します。これらの節で定義するデータは、フォーム内で共通に利用できるよう、GLOBAL句を付けてください。

FILE
    FD  売上ファイル GLOBAL.
    01  売上レコード.
      02  売上-商品コード PIC X(8).
      02  売上-商品名     PIC N(10).
      02  売上-単価       PIC 9(5).
      02  売上-個数       PIC 9(4).
      02  売上-小計       PIC 9(8).
      02  売上-備考       PIC N(20).
    01  顧客レコード GLOBAL.
      02  顧客-顧客名     PIC X(50).
    FD  商品ファイル GLOBAL.
    01  商品レコード.
      02  商品-名         PIC N(10).
      02  商品-単価       PIC 9(5).
WORKING-STORAGE

   * 編集中のファイルの名前
   * ファイルを開いた場合や名前を付けて保存した場合に設定されます。
    01 FILE-NAME PIC X(256) VALUE SPACE GLOBAL.
   * 商品コードに対応した商品名と単価を求めるために使用します。
    01 商品-キー PIC 9(5) BINARY GLOBAL.
    01 FS PIC XX GLOBAL.

共通内部プログラム

イベント手続きを記述する前に、各イベント手続きから共通に利用できる内部プログラムを作成しておきます。サンプルプログラムでは、以下の共通内部プログラムを作成します。

GET-FILE-NAME

ファイル名を取得するプログラムです。

LOAD-DATA

ファイルに保存されたデータを表コントロール上にロードするプログラムです。

SAVE-DATA

表コントロール上に入力されたデータをファイルに保存するプログラムです。

GET-TOTAL

表コントロール上の小計から合計金額を計算するプログラムです。

GET-FILE-NAME

ファイル名を取得する場合は、フォームの"GetFileName"メソッドを利用します。このメソッドは、ダイアログボックスを表示してファイル名を取得するためのメソッドです。"POW-SELF"は、この手続きをもつフォームを表しています。メソッドの詳細については、『リファレンス』を参照してください。

    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    01 WK-TITLE     PIC X(22).
    LINKAGE         SECTION.
    01 GET-STYLE    PIC S9(4) COMP-5.
    01 BUTTON-STATE PIC S9(4) COMP-5.
    PROCEDURE       DIVISION USING GET-STYLE BUTTON-STATE.
   *    ファイルを開くのか保存するのかを判別します。
        IF GET-STYLE = POW-CDOPEN THEN
          MOVE "ファイルを開く"         TO WK-TITLE
        ELSE
          MOVE "ファイル名を付けて保存" TO WK-TITLE
        END-IF
   *    ファイル名を取得します。
   *    BUTTON-STATEには、クリックされたボタンがOKボタンか
   *    キャンセルボタンかの情報が設定されます。
        ADD POW-CDNOCHANGEDIR TO GET-STYLE
        INVOKE POW-SELF "GetFileName" USING
          FILE-NAME
          WK-TITLE
          "データファイル(*.DAT)|*.DAT|ALL(*.*)|*.*"
          GET-STYLE
          RETURNING BUTTON-STATE
LOAD-DATA

表コントロールの行数を設定または参照する場合は、"RowCount"プロパティを、テキストボックスコントロールの文字列を設定または参照する場合は、"Text"プロパティを利用します。また、表中のセルの内容は、表コントロールがもつ"TableCells"オブジェクトの"Text"プロパティを利用して参照することができます。オブジェクトへのアクセス方法については、「8.2 オブジェクトを使ったアプリケーションを作成する」を、また、オブジェクトおよびプロパティの詳細については、『リファレンス』を参照してください。

    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    01  ROW-COUNT  PIC S9(4) COMP-5.
    PROCEDURE   DIVISION.
   *    フォームを無効にしマウスポインタ(マウスカーソル)を砂時計にします。
        MOVE 11 TO "MousePointer" OF POW-SELF
        MOVE POW-FALSE TO "Enabled" OF POW-SELF
   *    表の内容をクリアします。
        INVOKE TBL-PURCHASE "ClearTable"
   *    ファイルをオープンし、顧客名を読み込みます。
        OPEN INPUT 売上ファイル
        READ 売上ファイル
        END-READ
        MOVE 顧客-顧客名 TO "Text" OF TX-CUSTOMER
        MOVE 1 TO ROW-COUNT
        .
    LOOP.
   *    商品の一覧を読み込みます。
        READ 売上ファイル
          AT END GO TO END-LOOP
        END-READ
        MOVE 売上-商品コード TO
          "Text" OF "TableCells"(ROW-COUNT 1) OF TBL-PURCHASE
        MOVE 売上-商品名     TO
          "Text" OF "TableCells"(ROW-COUNT 2) OF TBL-PURCHASE
        MOVE 売上-単価       TO
          "Text" OF "TableCells"(ROW-COUNT 3) OF TBL-PURCHASE
        MOVE 売上-個数       TO
          "Text" OF "TableCells"(ROW-COUNT 4) OF TBL-PURCHASE
        MOVE 売上-小計       TO
          "Text" OF "TableCells"(ROW-COUNT 5) OF TBL-PURCHASE
        MOVE 売上-備考       TO
          "Text" OF "TableCells"(ROW-COUNT 6) OF TBL-PURCHASE
        ADD 1 TO ROW-COUNT
        GO TO LOOP
        .
    END-LOOP.
        CLOSE 売上ファイル
   *    フォームを有効にし、マウスカーソルを元に戻します。
        MOVE POW-TRUE TO "Enabled" OF POW-SELF
        MOVE 0 TO "MousePointer" OF POW-SELF
        .

ポイント

ファイルからデータを読み込んだりデータを書き込んだりするなど、処理に時間がかかる場合は、手続きの先頭でフォームへの入力を禁止し、マウスポインタ(マウスカーソル)の形を変更しておいて、手続きの最後で元に戻すことをお勧めします。

フォームへの入力を禁止する(無効な状態にする)には、"Enabled"プロパティを利用します。フォーム上のマウスポインタを変更するには、"MousePointer"プロパティを利用します。

SAVE-DATA
    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    01  ROW-COUNT   PIC S9(4) COMP-5.
    01  TABLE-ROW   PIC S9(4) COMP-5.
    PROCEDURE       DIVISION.
   *    フォームを無効にしマウスポインタ(マウスカーソル)を砂時計にします。
        MOVE 11 TO "MousePointer" OF POW-SELF
        MOVE POW-FALSE TO "Enabled" OF POW-SELF
   *    最終行を求めます。
        MOVE 0 TO TABLE-ROW.
        MOVE "RowCount" OF TBL-PURCHASE TO ROW-COUNT
        PERFORM ROW-COUNT TIMES
          ADD 1 TO TABLE-ROW
          IF "Text" OF "TableCells"(TABLE-ROW 2) OF TBL-PURCHASE = SPACE
          THEN
            SUBTRACT 1 FROM TABLE-ROW
            EXIT PERFORM
          END-IF
        END-PERFORM
   *    表からデータを取り出し、順に書き出していきます。
        OPEN OUTPUT 売上ファイル
   *    レコードを書き出します。
        MOVE "Text" OF TX-CUSTOMER TO 顧客-顧客名
        WRITE 売上レコード
        MOVE 1 TO ROW-COUNT
        PERFORM WITH TEST BEFORE UNTIL ROW-COUNT > TABLE-ROW
          MOVE "Text" OF "TableCells"(ROW-COUNT 1) OF TBL-PURCHASE
            TO 売上-商品コード
          MOVE "Text" OF "TableCells"(ROW-COUNT 2) OF TBL-PURCHASE
            TO 売上-商品名
          MOVE "Text" OF "TableCells"(ROW-COUNT 3) OF TBL-PURCHASE
            TO 売上-単価
          MOVE "Text" OF "TableCells"(ROW-COUNT 4) OF TBL-PURCHASE
            TO 売上-個数
          MOVE "Text" OF "TableCells"(ROW-COUNT 5) OF TBL-PURCHASE
            TO 売上-小計
          MOVE "Text" OF "TableCells"(ROW-COUNT 6) OF TBL-PURCHASE
            TO 売上-備考
          WRITE 売上レコード
          ADD 1 TO ROW-COUNT
        END-PERFORM
        CLOSE 売上ファイル
   *    フォームを有効にし、マウスカーソルを元に戻します。
        MOVE POW-TRUE TO "Enabled" OF POW-SELF
        MOVE 0 TO "MousePointer" OF POW-SELF
GET-TOTAL
    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    01  合計金額    PIC S9(8) COMP-5.
    01  ROW-COUNT   PIC S9(4) COMP-5.
    01  TABLE-ROW  PIC S9(4) COMP-5.
    PROCEDURE   DIVISION.
   *    小計の合計を計算し、表示します.
        MOVE ZERO TO 合計金額
        MOVE 1 TO TABLE-ROW.
        MOVE "RowCount" OF TBL-PURCHASE TO ROW-COUNT
        PERFORM ROW-COUNT TIMES
          IF "Text" OF "TableCells"(TABLE-ROW 2) OF TBL-PURCHASE = SPACE
          THEN
            EXIT PERFORM
          END-IF
          ADD "Text" OF "TableCells"(TABLE-ROW 5) OF TBL-PURCHASE
            TO 合計金額
          ADD 1 TO TABLE-ROW
        END-PERFORM
        MOVE 合計金額 TO "Caption" OF ST-TOTAL

イベント手続き

サンプルプログラムでは、以下のイベント手続きを記述します。

MN-OPEN-Click

[開く(O)...]を選択した場合に実行する手続きを記述します。

MN-SAVE-Click

[上書き保存(S)]を選択した場合に実行する手続きを記述します。

MN-SAVEAS-Click

[名前を付けて保存(A)...]を選択した場合に実行する手続きを記述します。

MN-PAGESETUP-Click

[ページ設定(T)...]を選択した場合に実行する手続きを記述します。

MN-PRINT-Click

[印刷(P)]を選択した場合に実行する手続きを記述します。

MN-EXIT-Click

[終了(X)]を選択した場合に実行する手続きを記述します。

MN-TOTAL-Click

[合計(T)]を選択した場合に実行する手続きを記述します。

TBL-PURCHASE-Return

表中の、1つのセルの入力が完了した場合に実行する手続きを記述します。

BT-TOTAL-Click

合計ボタンをクリックした場合に実行する手続きを記述します。

MN-OPEN-Click
    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    01 GET-STYLE    PIC S9(4) COMP-5 VALUE POW-CDOPEN.
    01 BUTTON-STATE PIC S9(4) COMP-5.
    PROCEDURE       DIVISION.
   *    開くファイル名を取得します。
        CALL "GET-FILE-NAME" USING GET-STYLE BUTTON-STATE
   *    キャンセルボタンがクリックされた場合は、
   *    ファイルを開かないで処理を終了します。
        IF BUTTON-STATE = POW-FALSE THEN
          EXIT PROGRAM
        END-IF
   *    ファイル中のデータを表に表示します。
        CALL "LOAD-DATA"
MN-SAVE-Click
    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    01 GET-STYLE    PIC S9(4) COMP-5 VALUE POW-CDSAVE.
    01 BUTTON-STATE PIC S9(4) COMP-5.
    PROCEDURE       DIVISION.
   *    ファイル名が決まっていない場合、ファイル名を取得します。
        IF FILE-NAME = SPACE THEN
          CALL "GET-FILE-NAME" USING GET-STYLE BUTTON-STATE
   *      キャンセルボタンがクリックされた場合は、
   *      ファイルに保存しないで処理を終了します。
          IF BUTTON-STATE = POW-FALSE THEN
            EXIT PROGRAM
          END-IF
        END-IF
   *    表のデータをファイルに保存します。
        CALL "SAVE-DATA"
MN-SAVEAS-Click
    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    01 GET-STYLE    PIC S9(4) COMP-5 VALUE POW-CDSAVE.
    01 BUTTON-STATE PIC S9(4) COMP-5.
    PROCEDURE       DIVISION.
   *    保存するファイル名を取得します。
        CALL "GET-FILE-NAME" USING GET-STYLE BUTTON-STATE
   *    キャンセルボタンがクリックされた場合は、
   *    ファイルに保存しないで処理を終了します。
        IF BUTTON-STATE = POW-FALSE THEN
          EXIT PROGRAM
        END-IF
   *    表のデータをファイルに保存します。
        CALL "SAVE-DATA"
MN-PAGESETUP-Click

ページを設定する場合は、印刷コントロールの"SetPage"メソッドを利用します。メソッドの詳細については、『リファレンス』を参照してください。

    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    PROCEDURE       DIVISION.
        INVOKE CmPrint1 "SetPage"
MN-PRINT-Click

フォームを印刷する場合は、印刷コントロールの"PrintForm"メソッドを利用します。

    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    PROCEDURE       DIVISION.
        INVOKE CmPrint1 "PrintForm"
MN-EXIT-Click

フォームを閉じてアプリケーションを終了する場合は、フォームの"CloseForm"メソッドを利用します。

    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    PROCEDURE       DIVISION.
        INVOKE POW-SELF "CloseForm"
MN-TOTAL-Click

合計を計算する共通内部プログラムを呼び出します。

    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    PROCEDURE       DIVISION.
        CALL "GET-TOTAL"
TBL-PURCHASE-Return

このイベント手続きは、表の1つのセルに対して入力が完了した場合に呼び出されます。ただし、1列め、4列めおよび6列めのそれぞれの入力内容により処理が異なるので、どの列のセルの入力が完了したかは、"Column"プロパティを利用して判定し、それぞれ以下のような処理をします。

  • 1列めが入力されたら、内容をチェックし、商品名と単価を表示し、個数の欄に選択位置を移動します。

  • 4列めが入力されたら、単価と個数から小計を計算し、備考の欄に選択位置を移動します。

  • 6列めが入力されたら、次行の商品コードの欄に選択位置を移動します。

        ENVIRONMENT     DIVISION.
        DATA            DIVISION.
        WORKING-STORAGE SECTION.
        01  W-CODE      PIC S9(8) COMP-5.
        01  W-PRICE     PIC S9(8) COMP-5.
        01  W-NUMBER    PIC S9(8) COMP-5.
        01  ROW-POS     PIC S9(4) COMP-5.
        PROCEDURE       DIVISION.
       *    表の1つのセルの入力が完了した場合に呼び出されます。
            MOVE "Row" OF TBL-PURCHASE TO ROW-POS
            EVALUATE "Column" OF TBL-PURCHASE
       *    1列めの場合、商品コードの入力完了です。
            WHEN 1
       *      入力された品番が無効なら、エラーを表示して、処理を中止します。
              MOVE "Text" OF "TableCells"(ROW-POS 1) OF TBL-PURCHASE
                TO W-CODE
              IF W-CODE = ZERO THEN
                PERFORM コード入力エラー
              END-IF
       *      入力された品番から、 製品名と単価を求めます。
              MOVE W-CODE TO 商品-キー
              OPEN INPUT 商品ファイル
              READ 商品ファイル
                INVALID KEY
                CLOSE 商品ファイル
                PERFORM コード入力エラー
              END-READ
              CLOSE 商品ファイル
       *      製品名と単価を表示します。
              MOVE 商品-名   TO
                "Text" OF "TableCells"(ROW-POS 2) OF TBL-PURCHASE
              MOVE 商品-単価 TO
                "Text" OF "TableCells"(ROW-POS 3) OF TBL-PURCHASE
       *      表の選択位置を個数の欄に移動します。
              INVOKE TBL-PURCHASE "SelectCell" USING ROW-POS 4
       *    4列めの場合、個数の入力完了です。
            WHEN 4
       *      入力された個数が無効なら、エラー表示して処理を中止します。
              IF "Text" OF "TableCells"(ROW-POS 4) OF TBL-PURCHASE = 0
              THEN
                PERFORM 個数入力エラー
              END-IF
       *      単価と個数から小計を計算します。
              MOVE "Text" OF "TableCells"(ROW-POS 3) OF TBL-PURCHASE
                TO W-PRICE
              MOVE "Text" OF "TableCells"(ROW-POS 4) OF TBL-PURCHASE
                TO W-NUMBER
              COMPUTE "Text" OF "TableCells"(ROW-POS 5) OF TBL-PURCHASE = 
              W-PRICE * W-NUMBER
       *      表の選択位置を備考の欄に移動します。
              INVOKE TBL-PURCHASE "SelectCell" USING ROW-POS 6
       *    6列めの場合、備考の入力完了です。
            WHEN 6
       *      表コントロールの入力域がすべて埋まっていないことを確認して、
       *      表の選択位置を次行の商品コードの欄に移動します。
              IF ROW-POS > "RowCount" OF TBL-PURCHASE THEN
                ADD 1 TO ROW-POS
                INVOKE TBL-PURCHASE "SelectCell" USING ROW-POS 1
              END-IF
            END-EVALUATE
            EXIT PROGRAM
            .
        コード入力エラー.
       *    メッセージを表示します。
            INVOKE POW-SELF "DisplayMessage" USING 
              "品番が正しくありません。"
       *    製品名と単価をクリアします。
            MOVE SPACE TO "Text" OF "TableCells"(ROW-POS 2) OF TBL-PURCHASE
            MOVE SPACE TO "Text" OF "TableCells"(ROW-POS 3) OF TBL-PURCHASE
       *    再入力箇所にフォーカスを設定します。
            INVOKE TBL-PURCHASE "SetFocus"
            INVOKE TBL-PURCHASE "SelectCell" USING ROW-POS 1
            EXIT PROGRAM
            .
        個数入力エラー.
       *    メッセージを表示します。
            INVOKE POW-SELF "DisplayMessage" USING
              "個数を入力してください。"
       *    小計をクリアします。
            MOVE SPACE TO "Text" OF "TableCells"(ROW-POS 5) OF TBL-PURCHASE
       *    再入力セルにフォーカスを設定します。
            INVOKE TBL-PURCHASE "SetFocus"
            INVOKE TBL-PURCHASE "SelectCell" USING ROW-POS 4
            EXIT PROGRAM
            .
BT-TOTAL-Click

"MN-TOTAL-Click"と同じ処理です。

    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    PROCEDURE       DIVISION.
        CALL "GET-TOTAL"