换句话说,您想创建一个带有非数据感知控件的对话框。为此,您需要三个 TSQLQueries:一个用于在进入对话框时检索数据(在编辑数据的情况下),一个用于插入,一个用于更新。
这是我前几天写的这样一个对话框中的一些(编辑过的)代码。参数'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 是一个查询,定义为 select curdate, amount, details from cashbox where id = :p1
qInsertCashbox 被插入到钱箱(id,curdate,amount,details)值(:p0,:p1,:p2,:p3)
qUpdateCashbox 是更新钱箱设置 curdate = :p1, amount = :p2, details = :p3 where 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;