UpdateBatch为啥总是更新最后一条数据

liaowenwei2009 2019-03-24 02:47:59
我界面是这样设计的,panel1是一些文本编辑框(比如:门牌号、姓名),还有一个cxgrid,cxgrid用来编辑一些有收费编码、收费名称,现在我再cxgrid里多编辑几行,用UpdateBatch保存时,为啥门牌号、姓名这些基本信息保存时库表只是最后一行才有,其它几行门牌号、姓名都为null,但是cxgrid里的收费编码、收费名称保存是库表里都有。以下是代码。

with WYData.Ado_FYMX do
begin
for i := 0 to cxGrid1DBTableView1.Controller.FocusedRowIndex do
begin
Edit;
if cxLabel26.Caption = '' then
FieldByName('IID').Value := null
else
FieldByName('IID').Value := cxLabel26.Caption;
FieldByName('CMPH').Value := cxTextEdit5.Text; //门牌号
FieldByName('CSFDH').Value := cxLabel25.Caption; //收费单号
FieldByName('CZHXM').Value := cxTextEdit4.Text; //住户姓名
FieldByName('CXQMC').Value := cxTextEdit6.Text; //小区名称
FieldByName('BTF').Value := 0; //退费标记
FieldByName('CJSJMC').Value := GetComputerName;
FieldByName('CIP').Value := GetHostIP;
FieldByName('DJSSJ').Value := DateTimeToStr(Now);
UpdateBatch; //保存
end;

保存到库表是这样的:

...全文
564 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
luj_1768 2019-03-25
  • 打赏
  • 举报
回复
这是系统为了加快显示速度与效果,弄出的一个优化bug。只要在最后加上一个刷新cxgrid 控件显示的代码,就行了。
liaowenwei2009 2019-03-25
  • 打赏
  • 举报
回复
引用 8 楼 秋天之落叶 的回复:
另外,增加应该是append,编辑才是edit,你确定没用错?

用append保存到库表里是这样的
liaowenwei2009 2019-03-25
  • 打赏
  • 举报
回复
引用 8 楼 秋天之落叶 的回复:
另外,增加应该是append,编辑才是edit,你确定没用错?


用append增加,会造成赋值语句与cxgrid的值不在一行 ,跟踪的语句是有2个insert语句,用edit编辑一行数据书正常的,但是多于一行,赋值语句就在最后一行保存。
我数据源是用的ado的,只是在locktype里设置了ItBatchOptimistic,用post压根就不保存,是不是cxgrid的值保存到内存去了,要用edit。
秋天之落叶 2019-03-25
  • 打赏
  • 举报
回复
另外,增加应该是append,编辑才是edit,你确定没用错?
秋天之落叶 2019-03-25
  • 打赏
  • 举报
回复
没用过cxGrid,你确认cxGrid1DBTableView1.Controller.FocusedRowIndex是有效的循环数据?
liaowenwei2009 2019-03-25
  • 打赏
  • 举报
回复
引用 5 楼 秋天之落叶 的回复:
是不是应该以下结构
for i:=0 to ado.count-1 do
begin
edit;
...; //赋值语句
post;
ado.next;
end;
UpdateBatch;

还是一样的
秋天之落叶 2019-03-25
  • 打赏
  • 举报
回复
楼上的好像没什么差别。
楼主你改成ItOptimistic,加上post试一试效果。
不过我确实没能完全理解楼主的意思。
天行归来 2019-03-25
  • 打赏
  • 举报
回复
针对明细数据,逐条补齐设定的公用信息?
可以这么做。

with WYData.Ado_FYMX do
begin
First;
DisableControls;
while not Eof do
begin
Edit;
if cxLabel26.Caption = '' then
FieldByName('IID').Value := null
else
FieldByName('IID').Value := cxLabel26.Caption;
FieldByName('CMPH').Value := cxTextEdit5.Text; //门牌号
FieldByName('CSFDH').Value := cxLabel25.Caption; //收费单号
FieldByName('CZHXM').Value := cxTextEdit4.Text; //住户姓名
FieldByName('CXQMC').Value := cxTextEdit6.Text; //小区名称
FieldByName('BTF').Value := 0; //退费标记
FieldByName('CJSJMC').Value := GetComputerName;
FieldByName('CIP').Value := GetHostIP;
FieldByName('DJSSJ').Value := DateTimeToStr(Now);
Next;
end;
UpdateBatch; //保存
EnableControls;
end;

如果不想Grid光标因为记录集遍历引起的闪烁,可以用游标记录位置,最后再回到游标初始位置。
秋天之落叶 2019-03-24
  • 打赏
  • 举报
回复
是不是应该以下结构
for i:=0 to ado.count-1 do
begin
edit;
...; //赋值语句
post;
ado.next;
end;
UpdateBatch;
秋天之落叶 2019-03-24
  • 打赏
  • 举报
回复
是不是应该以下结构
for to do
begin
edit;
...;
post;
end;
UpdateBatch;
看那山瞧那水 2019-03-24
  • 打赏
  • 举报
回复
那就不是这个问题了。。。找找其它的问题,好久没用ADO了
liaowenwei2009 2019-03-24
  • 打赏
  • 举报
回复
引用 1 楼 看那山瞧那水 的回复:
是不是数据源没有设置缓存跟新?

怎么设置?我数据源是用的ado的,只是在locktype里设置了ItBatchOptimistic
看那山瞧那水 2019-03-24
  • 打赏
  • 举报
回复
是不是数据源没有设置缓存跟新?

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧