2.5.6 DBRResultSet仮想関数の利用

DBRResultSetクラスでは,オーバライド可能な仮想関数を提供しています。この仮想関数を利用するためには,派生クラスを作成する必要があります。

ここでは,この関数仕様とその利用方法について説明します。

<この項の構成>
(1) OnBeforeRefreshメソッドの仕様
(2) OnMoveRecordメソッドの仕様
(3) OnEndRecordメソッド
(4) 仮想関数の利用例

(1) OnBeforeRefreshメソッドの仕様

■機能
Open,RefreshメソッドでResultSetに検索結果を読込む前に呼び出される。
■形式

virtual void OnBeforeRefresh(BOOLEAN bRefesh);

■引数
bRefesh … 呼び出し元がRefreshメソッドの場合はTRUE,OpenはFALSE

(2) OnMoveRecordメソッドの仕様

■機能
Absolute,Bottom,Next,PageNext,Previous,Refresh,Relative,Topメソッドでカーソルの移動時に呼び出される。また,Updateメソッドで更新直前に呼び出される。
■形式

virtual void OnMoveRecord(BOOLEAN bSaveAndValidate);

■引数
bSaveAndValidate … 呼び出し元がUpdateメソッドの場合はTRUE,他はFALSE

(3) OnEndRecordメソッド

■機能
カレントレコードを移動した結果,IsEOFがTRUEになった時に呼び出される。
■形式

virtual void OnEndRecord(BOOLEAN bEndRecord);

■引数
bEndRecord … TRUE固定

(4) 仮想関数の利用例

DBRResultSetクラスで提供する仮想関数を利用する例を説明します。この仮想関数を利用するためには,派生クラスを作成する必要があります。

(a) 派生クラスの外部仕様

図2-3に示すテーブルをアクセスするCustomクラスとし,OnMoveRecordのカーソル移動では,フィールド値をメンバ変数に格納し,Updateの時には,フィールド値をチェックするものとします。

図2-3 業務で使用するテーブルの例

[図データ]

(b) 派生クラスの作成
■派生クラスの仕様
  • Customコンストラクタ
    機能
    DBRResultSetクラスの機能を継承したCustomオブジェクトを生成します。テーブルcustomに対応した変数 tokuisakiCD,TELNO,ZIPCDを持ちます。
    形式
    Custom(DBRDatabase *pDatabase)
    引数
    pDatabase:DBRDatabaseオブジェクトのポインタを指定します。
  • Nextなどのカーソル操作メソッド
    機能
    カーソルを移動すると,テーブルCustomに対応した変数 tokuisakiCD,TELNO,ZIPCDにフィールド値を格納します。
  • Updateメソッド
    機能
    変数 tokuisakiCD,TELNO,ZIPCDにフィールド値を設定後に呼び出すとデータのチェックを行った後,Update処理を行う。
■派生クラスの定義
データの型をLPTSTRとしてメンバ変数tokuisakiCD,TELNO,ZIPCDを定義します。これらのメンバ変数はアプリケーションに参照させるためpublic属性にします。
OnMoveRecordメソッドのプロトタイプだけを定義します。

////////////////////////////////////////////////////////////
class Custom : public DBRResultSet
{
Public:
// Customのコンストラクタ
 Custom(DBRDatabase* pDatabase) ;
 // OnMoveRecord関数の定義
 virtual void OnMoveRecord(BOOLEAN bSaveAndValidate);
 // メンバ変数の定義
 LPTSTR tokuisakiCD;
 LPTSTR TELNO;
 LPTSTR ZIPCD;
};

■コンストラクタの定義
コンストラクタでは,フィールド値を格納するメンバ変数を初期化します。

////////////////////////////////////////////////////////////
Custom::Custom(DBRDatabase* pDatabase) :
                                    DBRResultSet(pDatabase)
{
 tokuisakiCD = NULL;
 TELNO = NULL;
 ZIPCD = NULL;
}

■OnMoveRecord仮想関数の再定義
Updateメソッドの場合,メンバ変数ZIPCDのデータの妥当性をチェックし,不当なデータの場合は000を設定します。
他のカーソル移動メソッドの場合,カレントレコードの各フィールド値をそれぞれtokuisakiCD,TELNO,ZIPCDメンバ変数に設定します。

////////////////////////////////////////////////////////////
void Custom::OnMoveRecord(BOOLEAN bSaveAndValidate)
{
  if (bSaveAndValidate){        // レコードの更新要求か
    // 更新データのチェック
    if(ZIPCD[0]!='0') {         // 先頭文字は0か
       ZIPCD="000";             // 000を設定
    }
    SetField(1, tokuisakiCD);
    SetField(2, TELNO);
    SetField(3, ZIPCD);
  } else {                      // いいえ
    GetField(1, &tokuisakiCD);
                       // USERIDフィールドをtokuisakiCD変数に設定
    GetField(2, &TELNO);        // TELフィールドをTELNO変数に設定
    GetField(3, &ZIPCD);        // ZIPフィールドをZIPCD変数に設定
  }    
};