つまり、データを認識しないコントロールを使用してダイアログを作成する必要があります。これを行うには、3つのTSQLQueriesが必要です。1つはダイアログに入るときにデータを取得するため(データを編集する場合)、1つは挿入するため、もう1つは更新するためです。
これは私が先日書いたそのようなダイアログからのいくつかの(編集された)コードです。パラメーター'n'は、編集するタプルのIDです。新しいレコードを挿入する場合、その値は-1になります。
Function TEditCashbox.Execute (n: longint): boolean;
var
q: TSqlQuery;
begin
if n = -1 then
begin
edDate.Text:= datetostr (date);
edAmount.text:= '0';
end
else with qGetCashbox do
begin
params[0].asinteger:= n;
open;
edDate.text:= fieldbyname ('curdate').asstring;
edAmount.text:= fieldbyname ('amount').asstring;
edDetails.text:= fieldbyname ('details').asstring;
close
end;
if showmodal = mrOK then
begin
if n = -1 then
begin
q:= qInsertCashbox;
q.ParamByName ('p0').asinteger:= dm.GenerateID ('cashbox')
end
else
begin
q:= qUpdateCashbox;
q.ParamByName ('p0').asinteger:= n
end;
with q do
begin
parambyname ('p1').asdate:= strtodate (edDate.text);
parambyname ('p2').asinteger:= strtoint (edAmount.Text);
parambyname ('p3').asstring:= edDetails.text;
execsql
end;
end
end.
qGetCashboxは、キャッシュボックスからcurdate、amount、detailsを選択するように定義されたクエリです。id=:p1
qInsertCashboxは、キャッシュボックス(id、curdate、amount、details)の値(:p0、:p1、:p2、:p3)に挿入されます
qUpdateCashboxは、キャッシュボックスセットの更新ですcurdate =:p1、amount =:p2、details =:p3ここで、id =:p0
もちろん、「三位一体」を必要とするデータ対応コンポーネント(TSQLDataSet、TDataSetProvider、TClientDataSet)を使用することもできます。データ対応コンポーネントの使用は簡単ですが、このアプローチが適切でない場合があります。データ対応コンポーネントを使用する場合、私のテンプレートコードは次のとおりです
sdsEditDeposit.params[0].AsInteger:= n; // this is the TSQLDataSet
with qEditDeposit do // this is the clientdataset
begin
open;
if n = -1 then // new tuple
begin
insert;
fieldbyname ('amount').asinteger:= 0;
fieldbyname ('curdate').asdatetime:= date;
end;
edit;
if showmodal = mrOK then
begin
if n = -1 then
begin
n:= dm.GenerateID;
fieldbyname ('id').asinteger:= n;
end;
result:= n;
post;
applyupdates (0)
end
else
begin
cancel;
result:= 0
end;
end;