deltaの値を取得するには

解決


困ってます  2008-12-24 01:45:55  No: 32972  IP: 192.*.*.*

*************************
環境
delphi2007
oracle8i
*************************

以下をformに貼り付けてDBへの接続を行います
cds:tclientdataset
dsp:tdatasetprovider
selqry:tsqlquery(データ取得用)
updqry:tsqlquery(データ更新用)

*****************
DBへの更新
*****************
元のレコード(selqryにより取得)
 項目1:'001'
 項目2:'2008/12/24'
 項目3:'3'

編集後のレコード(cdsにて編集)
 項目1:'001'
 項目2:Null
 項目3:'5'

上記のcdsの更新(ApplyUpdate)時にdspのBeforeUpdateRecordイベ
ントが発生します。この時点でのDeltaの値が取得したいのですが、

DeltaDS.NewValueは
 項目1:Null (←変更がないためNull)
 項目2:Null (←値がNullに変更のためNull)
 項目3:'5' (←値が'5'に変更ため'5')

このように変更がない場合のNullと本当にNull値に変更したいとき
のNullの判定ができない状態で困っております。
なにか項目の変更の有無を判定できる方法がないものでしょうか。
または変更がなかったときには項目1を'001'のように最終的な更新値
を返してくるプロパティなどないでしょうか。

よろしくお願いします。

編集 削除
DOP  2008-12-24 17:26:13  No: 32973  IP: 192.*.*.*

OldValue使ってもダメですか?

編集 削除
困ってます  2008-12-24 22:28:55  No: 32974  IP: 192.*.*.*

DOPさん返信ありがとうございます。

>OldValue使ってもダメですか?

はい。OldValueを使って最初は

//値が変更されているか判断
if DeltaDS.FieldByName('項目2').OldValue <> DeltaDS.FieldByName('項目2').NewValue then

というやり方で項目の変更の有無を判断できると考えておりました。
しかし、DeltaDS.FieldByName('項目2').OldValueは問題なく取
得できますが、DeltaDS.FieldByName('項目2').NewValue につい
ては値の変更がない場合でもNullとなってしまうため、上記のよ
うな判断もできない状況です。

ちなみにDataTypeですが以下のようになります。
  項目1:ftString(varchar2)
  項目2:ftTimestamp(Date)
  項目3:ftString(varchar2)

編集 削除
たべ  2009-01-05 09:39:55  No: 32975  IP: 192.*.*.*

それぞれ、以下の関数が真になると思います。

// 値が変更されていない状態
VarIsEmpty(DeltaDS.Fields.FieldByName(key).NewValue)

// 値にNullがセットされている状態
VarIsNull(DeltaDS.Fields.FieldByName(key).NewValue)

編集 削除
困ってます  2009-01-07 00:05:40  No: 32976  IP: 192.*.*.*

たべさん返信ありがとうございます。

早速、教わったVarIsEmptyを試してみましたところ
項目の変更の有無を判別できるようになりました。
今回のプロジェクトのコアとなるクラスだったため
大変助かりました。

ありがとうございました。

編集 削除