简单的设计一下界面,大致如下:
要求:审核或者反审核用户选择的数据
1.正常点审核时,审核=true,审核人=当前用户名
2.反审核时,审核=false,审核人=null
实现代码:
procedure TForm1.UpdateData(flg: Boolean);
var
i, n, Errors: Integer;
PN, ID: string;
begin
if flg then
PN := 'TEST' //用户名,按业务自己处理
else
PN := 'NULL'; //反审核,按业务自己处理
with FDQuery1 do
begin
FetchOptions.AutoClose := False; //取消自动关闭
CachedUpdates := True; //开户快储功能
n := TV.datacontroller.GetSelectedCount; //当前选择记录的长度
{*
我不知道你们有没有出现过这种问题,当我ctrl+a全选数据时,就会弹错,原因是此时recno指到了最后一条记录
导致下面的 TV.Controller.SelectedRows[i].Focuesd:=true; 语句出错,所以我下面做了个判断,当选择了所有的记录时,手动把游标移动到了第一条
*}
if n=RecordCount then
frist;
try
for i := 0 to n - 1 do
begin
TV.Controller.SelectedRows[i].Focuesd:=true;
Edit;
FieldByName('审核').Value := BoolToStr(flg);//按业务自己处理
FieldByName('审核人').Value := PN;//按业务自己处理
Next;
end;
FDConnection1.StartTransaction; //开始事务
Errors := ApplyUpdates(0); //尝试批量更新,并返回错误值
finally
if Errors > 0 then
FDConnection1.Rollback //出错回滚
else
begin
FDConnection1.Commit;
CommitUpdates; // 清除所有异动记录
Refresh; //更新数据
end;
CachedUpdates := False; //关闭快储
end;
end;
end;
Errors := ApplyUpdates(0);
参数为0时,表示不容忍任何错误,直接回滚
参数为-1时,表示尽量保存修改,更新完后再报错误.
比如你要更新十条数据,其中有五条会成功,五条会失败,此时如果你参数为0的话,程序就会直接放弃所有变更,也就是不更新了.如果参数为-1,则会更新五条,然后再告诉你有五条出错了
我用SQL语句一句句的更新,同样53条数据的时间对比如下,也不知道是不是我的数据量太少,没有体现出ApplyUpdates的性能,还是什么原因.服务器的负荷是减少了,但花费的时间变多了
说一下多选数据时的问题:
然后ACXTV.Controller.SelectedRows[i].index这个属性,在使用时也要注意一下,这个值不一定会等于RecNo的值,所以我们不能用它来设置游标位置.
2023-02-18
以下是ChatGPT的回复
---
Q: 请用delphi写出用tfdquery组件实现批量更新的代码,要带注释
A:
//定义变量
var
FDQuery1: TFDQuery;
i: Integer;
//初始化
FDQuery1 := TFDQuery.Create(nil);
//设置SQL语句
FDQuery1.SQL.Text := 'update table set field1=:field1,field2=:field2 where id=:id';
//循环更新
for i := 0 to 10 do
begin
FDQuery1.ParamByName('field1').AsString := 'value1';
FDQuery1.ParamByName('field2').AsString := 'value2';
FDQuery1.ParamByName('id').AsInteger := i;
FDQuery1.ExecSQL;
end;
//释放资源
FDQuery1.Free;---