第4章 アプリケーションを作成しよう
4.4 手続きを編集する
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 SECTION)
・ 作業場所節(WORKING-STORAGE SECTION) 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.
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