DBアクセスコントロールを使ってデータベースへアクセスするために、以下の手続きを記述します。
WORKING-STORAGE | 現在の状態を管理するための変数を宣言します。 |
CmCommand1-Click | データベースと接続します。 |
CmCommand2-Click | データベースとの接続を解除します。 |
CmCommand3-Click | カーソルをオープンします。 |
CmCommand4-Click | 現直前のレコードを読み込みます。 |
CmCommand5-Click | 次のレコード読み込みます。 |
CmCommand6-Click | カレントのレコードを更新します。 |
CmCommand7-Click | コミット処理を実行します。 |
CmCommand8-Click | ロールバック処理を実行します。 |
* OpenFlagの値でステータスを管理します。 * 0: データベースに接続していません。 * 1: データベースに接続中です。 * 2: 結果セット(カーソル)が作成されています。 * 3: 現在のレコード(カレントレコード)が存在します。 01 OpenFlag PIC S9(4) COMP-5 VALUE 0 GLOBAL.
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 ReturnValue PIC S9(9) COMP-5. PROCEDURE DIVISION. * すでに接続中なら何もしないで復帰します。 IF OpenFlag > 0 THEN EXIT PROGRAM END-IF * データベースに接続します。 INVOKE CmDb1 "OpenDB" RETURNING ReturnValue. IF ReturnValue >= 0 THEN MOVE 1 TO OpenFlag END-IF
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. * 現在接続されていなければ、何もしないで復帰します。 IF OpenFlag = 0 THEN EXIT PROGRAM END-IF * 接続を解除します。 INVOKE CmDb1 "CloseDB". MOVE 0 TO OpenFlag.
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 ReturnValue PIC S9(9) COMP-5. PROCEDURE DIVISION. * 現在接続されていなければ、何もしないで復帰します。 IF OpenFlag = 0 THEN EXIT PROGRAM END-IF * カーソルをオープン(レコード群の選択を)します。 INVOKE CmDb1 "SelectRecords" RETURNING ReturnValue IF ReturnValue >= 0 THEN MOVE 2 TO OpenFlag END-IF
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 ReturnValue PIC S9(9) COMP-5. PROCEDURE DIVISION. * カーソルがオープンされていなければ、 * テキストボックスの値を空白に設定します。 IF OpenFlag < 2 THEN MOVE SPACE TO "Text" OF CmText1 MOVE SPACE TO "Text" OF CmText2 MOVE SPACE TO "Text" OF CmText3 MOVE SPACE TO "Text" OF CmText4 EXIT PROGRAM END-IF * 直前のレコードを読み込みます。 INVOKE CmDb1 "ReadPreviousRecord" RETURNING ReturnValue * 読み込んだレコードをテキストボックスに表示します。 IF ReturnValue = 1 THEN MOVE "CNO" OF CmDb1 TO "Text" OF CmText1 MOVE "NAME" OF CmDb1 TO "Text" OF CmText2 MOVE "PHONE" OF CmDb1 TO "Text" OF CmText3 MOVE "ADDRESS" OF CmDb1 TO "Text" OF CmText4 MOVE 3 TO OpenFlag * カレントレコードが存在しなければ、 * テキストボックスの値を空白に設定します。 ELSE MOVE SPACE TO "Text" OF CmText1 MOVE SPACE TO "Text" OF CmText2 MOVE SPACE TO "Text" OF CmText3 MOVE SPACE TO "Text" OF CmText4 MOVE 2 TO OpenFlag END-IF
ポイント
フィールドの設定や参照は、「"CNO" OF CmDb1」のように記述します。このとき、フィールド名の大文字と小文字は区別されます。
注意
実行時にフィールドの設定や参照ができるのは、データベースを接続しているあいだだけです。
フィールドにNULL値を設定することはできません。レコードを更新または追加する場合は、すべての抽出フィールドに値を設定してください。
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 ReturnValue PIC S9(9) COMP-5. PROCEDURE DIVISION. * カーソルがオープンされていなければ、 * テキストボックスの値を空白に設定します。 IF OpenFlag < 2 THEN MOVE SPACE TO "Text" OF CmText1 MOVE SPACE TO "Text" OF CmText2 MOVE SPACE TO "Text" OF CmText3 MOVE SPACE TO "Text" OF CmText4 EXIT PROGRAM END-IF * 次のレコードを読み込みます。 INVOKE CmDb1 "ReadNextRecord" RETURNING ReturnValue * 読み込んだレコードをテキストボックスに表示します。 IF ReturnValue = 1 THEN MOVE "CNO" OF CmDb1 TO "Text" OF CmText1 MOVE "NAME" OF CmDb1 TO "Text" OF CmText2 MOVE "PHONE" OF CmDb1 TO "Text" OF CmText3 MOVE "ADDRESS" OF CmDb1 TO "Text" OF CmText4 MOVE 3 TO OpenFlag * カレントレコードが存在しなければ、 * テキストボックスの値を空白に設定します。 ELSE MOVE SPACE TO "Text" OF CmText1 MOVE SPACE TO "Text" OF CmText2 MOVE SPACE TO "Text" OF CmText3 MOVE SPACE TO "Text" OF CmText4 MOVE 2 TO OpenFlag END-IF
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. * カレントレコードが存在しなければ、 * 何もしないで復帰します。 IF OpenFlag < 3 THEN EXIT PROGRAM END-IF * 書き換える値を各フィールドに設定します。 * CNOはキーフィールドに設定されているため、 * 書き換えの対象にはなりません。 MOVE "Text" OF CmText2 TO "NAME" OF CmDb1 MOVE "Text" OF CmText3 TO "PHONE" OF CmDb1 MOVE "Text" OF CmText4 TO "ADDRESS" OF CmDb1 * カレントレコードを書き換えます。 INVOKE CmDb1 "RewriteCurRecord"
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. * 現在接続されていなければ、何もしないで復帰します。 IF OpenFlag = 0 THEN EXIT PROGRAM END-IF * コミット処理を実行します。 INVOKE CmDb1 "CommitDB". * カーソルがクローズされるので、OpenFlagを変更します。 MOVE 1 TO OpenFlag.
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. * 現在接続されていなければ、何もしないで復帰します。 IF OpenFlag = 0 THEN EXIT PROGRAM END-IF * ロールバック処理を実行します。 INVOKE CmDb1 "RollbackDB". * カーソルがクローズされるので、OpenFlagを変更します。