TDataSetProvider.OnUpdateData イベントの説明に関する Delphi ヘルプ ファイルを読んだ後:
- データを調べて (たとえば、許可されるべきではない値やデータの変更について)、更新が発生する前に適用をキャンセルする例外を発生させます。
- ソース データセットまたはデータベース サーバーに送信される前に、データを変更します (たとえば、値の暗号化または復号化)。
OnUpdateData のデータを変更する方法のサンプル コードを探しています。私は解決策を探すために最善を尽くしました。これは私が達成できるものです:
例 1 :
procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
DataSet.First;
while not DataSet.EOF do begin
if DataSet.UpdateStatus = usUnmodified then begin
TPacketDataSet(Dataset).InitAltRecBuffers(True);
if DataSet.UpdateStatus in [usInserted, usModified] then begin
Dataset.Edit;
DataSet.FindField('MyField').AsString := 'zzz';
Dataset.Post;
end;
end;
end;
DataSet.Next;
end;
例 1 の問題: 残念ながら、一部のフィールド値が欠落しているというエラーが表示され続けます。いくつかのデバッグを実行した後、値が空の必須フィールドがあることがわかりました。
例 2:
procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
DataSet.First;
while not DataSet.EOF do begin
if DataSet.UpdateStatus = usUnmodified then begin
TPacketDataSet(Dataset).InitAltRecBuffers(True);
if DataSet.UpdateStatus in [usInserted, usModified] then
DataSet.FindField('MyField').NewValue:= 'zzz';
end;
DataSet.Next;
end;
end;
例 2 の問題: このように記述すると、DataSet.Edit と DataSet.Post を呼び出す必要がなくなります。しかし、TField.NewValue に設定された値「zzz」はデータベースに保存されていません。
この更新は、BeforeUpdateRecord/AfterUpdateRecord ではなく OnUpdateData で実行する必要がある特別な理由があります。
ご意見をお聞かせください。どうもありがとうございました。