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;

保存到库表是这样的:

...全文
546 13 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
是不是数据源没有设置缓存跟新?
SQL语法大全 SQL语法大全 1. ASP与Access数据库连接: 2. ASP与SQL数据库连接: 建立记录集对象: set rs=server.createobject("adodb.recordset") rs.open SQL语句,conn,3,2 3. SQL常用命令使用方法: (1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 like \'%字段值%\' order by 字段名 [desc]" sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 in (\'值1\',\'值2\',\'值3\')" sql="select * from 数据表 where 字段名 between 值1 and 值2" (2) 更新数据记录: sql="update 数据表 set 字段名=字段值 where 条件表达式" sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式" (3) 删除数据记录: sql="delete from 数据表 where 条件表达式" sql="delete from 数据表" (将数据表所有记录删除) (4) 添加数据记录: sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)" sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) (5) 数据记录统计函数: AVG(字段名) 得出一个表格栏平均值 COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名) 取得一个表格栏最大的值 MIN(字段名) 取得一个表格栏最小的值 SUM(字段名) 把数据栏的值相加 引用以上函数的方法: sql="select sum(字段名) as 别名 from 数据表 where 条件表达式" set rs=conn.excute(sql) 用 rs("别名") 获取统的计值,其它函数运用同上。 (5) 数据表的建立和删除: CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… ) 例:CREATE TABLE tab01(name varchar(50),datetime default now()) DROP TABLE 数据表名称 (永久性删除一个数据表) 4. 记录集对象的方法: rs.movenext 将记录指针从当前的位置向下移一行 rs.moveprevious 将记录指针从当前的位置向上移一行 rs.movefirst 将记录指针移到数据表第一行 rs.movelast 将记录指针移到数据最后一行 rs.absoluteposition=N 将记录指针移到数据表第N行 rs.absolutepage=N 将记录指针移到第N页的第一行 rs.pagesize=N 设置每页为N条记录 rs.pagecount 根据 pagesize 的设置返回总页数 rs.recordcount 返回记录总数 rs.bof

2,496

社区成员

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

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