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

9.7.2 コントロールの手続きを記述する

DBアクセスコントロールを使ってデータベースへアクセスするために、以下の手続きを記述します。

WORKING-STORAGE

現在の状態を管理するための変数を宣言します。

CmCommand1-Click

データベースと接続します。

CmCommand2-Click

データベースとの接続を解除します。

CmCommand3-Click

カーソルをオープンします。

CmCommand4-Click

現直前のレコードを読み込みます。

CmCommand5-Click

次のレコード読み込みます。

CmCommand6-Click

カレントのレコードを更新します。

CmCommand7-Click

コミット処理を実行します。

CmCommand8-Click

ロールバック処理を実行します。

WORKING-STORAGE
   * OpenFlagの値でステータスを管理します。
   *  0: データベースに接続していません。 
   *  1: データベースに接続中です。 
   *  2: 結果セット(カーソル)が作成されています。 
   *  3: 現在のレコード(カレントレコード)が存在します。 
    01 OpenFlag PIC S9(4) COMP-5 VALUE 0 GLOBAL.
CmCommand1-Click
    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
CmCommand2-Click
    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    PROCEDURE       DIVISION.
   *    現在接続されていなければ、何もしないで復帰します。
        IF OpenFlag = 0 THEN
          EXIT PROGRAM
        END-IF
   *    接続を解除します。
        INVOKE CmDb1 "CloseDB".
        MOVE 0 TO OpenFlag.
CmCommand3-Click
    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
CmCommand4-Click
    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値を設定することはできません。レコードを更新または追加する場合は、すべての抽出フィールドに値を設定してください。

CmCommand5-Click
    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
CmCommand6-Click
    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"

ポイント

カレントレコード(直前に読み込んだレコード)の更新は、RewriteCurRecordメソッドを使用してください。ただし、使用中のデータベースに対応するODBCドライバが、カレントレコードの更新をサポートしていない場合は、RewriteRecordメソッドを使用してください。RewriteRecordメソッドは、キーフィールドに設定されている値をレコードの検索条件として、レコードを更新します。

CmCommand7-Click
    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.
CmCommand8-Click
    ENVIRONMENT     DIVISION.
    DATA            DIVISION.
    WORKING-STORAGE SECTION.
    PROCEDURE       DIVISION.
   *    現在接続されていなければ、何もしないで復帰します。
        IF OpenFlag = 0 THEN
          EXIT PROGRAM
        END-IF
   *    ロールバック処理を実行します。
        INVOKE CmDb1 "RollbackDB".
   *    カーソルがクローズされるので、OpenFlagを変更します。