手続きの記述方法について説明します。
フォームの環境部を記述します。このサンプルプログラムでは、ファイルを利用するために、入出力節(INPUT-OUTPUT SECTION)のファイル管理段落(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 SECTION)
作業場所節(WORKING-STORAGE SECTION)
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).
* 編集中のファイルの名前
* ファイルを開いた場合や名前を付けて保存した場合に設定されます。
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 | 表コントロール上の小計から合計金額を計算するプログラムです。 |
ファイル名を取得する場合は、フォームの"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
表コントロールの行数を設定または参照する場合は、"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"プロパティを利用します。
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
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 | 合計ボタンをクリックした場合に実行する手続きを記述します。 |
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"
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"
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"
ページを設定する場合は、印刷コントロールの"SetPage"メソッドを利用します。メソッドの詳細については、『リファレンス』を参照してください。
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. INVOKE CmPrint1 "SetPage"
フォームを印刷する場合は、印刷コントロールの"PrintForm"メソッドを利用します。
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. INVOKE CmPrint1 "PrintForm"
フォームを閉じてアプリケーションを終了する場合は、フォームの"CloseForm"メソッドを利用します。
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. INVOKE POW-SELF "CloseForm"
合計を計算する共通内部プログラムを呼び出します。
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. CALL "GET-TOTAL"
このイベント手続きは、表の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 .
"MN-TOTAL-Click"と同じ処理です。
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. CALL "GET-TOTAL"