起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: hdwt

【搞定】使用表格文档时出现的问题**

[复制链接]
发表于 2007-10-24 15:21:47 | 显示全部楼层
看这些代码真是折磨阿...
给您几点建议。
对于长过7行的代码不用用with.
不要嵌套的使用with.
这样大大的降低了代码的可读性。也别把编译器想的太聪明。
finally一般用于释放对象,不是用来提交数据的。
post和applyupdates可以拿出循环之外,最后调用一次即可。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-24 15:25:17 | 显示全部楼层
请看 这就是每次退出文档时的提示信息 如图

我去设断点调试下 谢谢您的提示

1.jpg

13.11 KB, 下载次数: 81

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-24 15:32:15 | 显示全部楼层
呵呵 非常感谢您给的建议
我是个X3平台下的新手 刚开始只考虑到程序能不能完成功能 而没有多留意代码的可读性一些规范 麻烦您看我这么乱的代码了 ~~~^_^@
回复 支持 反对

使用道具 举报

发表于 2007-10-24 16:29:04 | 显示全部楼层
调试结果如何?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-24 16:32:20 | 显示全部楼层
我修改了一下程序 按您的建议把post和ApplyUpdates都放到循环之外,同样也没有在with关键字中再嵌套使用with 可是运行中总给我报DataSet not in edit or insert mode的错误 我是在循环外显式的声明了DataSetBroker1.DataSet.Edit和DataSetBroker1.DataSet.Post 这样不在一个范围内吗?我试着将Edit放到循环里,然后再循环外部Post,还是出现这样的错误。请问Edit和Post怎么样成对出现才算一个Eidt Or Insert Mode
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-24 16:37:11 | 显示全部楼层
我用断点调试 程序的逻辑是没有错的 执行了正常的循环流程也得到了正确的值 我在怀疑表格每一次只修改第一行是不是数据集那里出了问题 原来的程序中我是每循环一次在循环内部Post一次 导致数据集的Next没有起到作用 所以我想显式声明Edit和Post在循环外部 等循环结束后一起Post 可是却出现了No.15的错误 麻烦您给指点一下
回复 支持 反对

使用道具 举报

发表于 2007-10-24 17:18:39 | 显示全部楼层
一个Edit对应一个Post即可。你把Post放在循环外了的话,那也把Edit放在循环外面(循环前Edit,循环中修改,循环后Post)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-24 17:37:03 | 显示全部楼层
我的代码就是这样写的 Edit和Post都在循环外
代码如下 您请看看有什么不妥
  with QueryPole do
  begin
    close;
    commandText := 'select count(*) DGZSL,sStuff from pd_d_hvolpole where sFeederName1='''+sLineSid+''' group by sStuff';
    try
      open;
      //first;
      if DataSetBroker1.DataSet.Active then DataSetBroker1.DataSet.Close;
      DataSetBroker1.DataSet.Open;
      DataSetBroker1.DataSet.Edit;
      while not eof do
      begin
        //根据电杆材质编码得到电杆的材质
        tempSQLStr := 'select sPoleTextrue from PD_P_POLETEXTURE where sId='''+FieldByName('sStuff').AsString+'''';
        if ReturnSQLValue(Query1,tempSQLStr,'sPoleTextrue') <> '' then
        begin
          DGCZ := ReturnSQLValue(Query1,tempSQLStr,'sPoleTextrue');
        end
        else
        begin
        //如果查找电杆材质为空,则该电杆的材质显示为'未知'
          DGCZ := '未知';
        end;
        DGCZSL := StoI(FieldByName('DGZSL').AsString);
        DGZSL := DGZSL+StoI(FieldByName('DGZSL').AsString);
        //DataSetBroker1.DataSet.Edit;
        DataSetBroker1.DataSet.FieldByName('DGCZ').Value := DGCZ;
        DataSetBroker1.DataSet.FieldByName('DGCZSL').Value := DGCZSL;
        DataSetBroker1.DataSet.FieldByName('DGZSL').Value := DGZSL;
        DataSetBroker1.DataSet.Next;
        next;
      end
    finally
      close;
    end;
    DataSetBroker1.DataSet.Post;
    DataSetBroker1.DataSet.ApplyUpdates;
    DataSetBroker1.DataSet.Close;
  end;
回复 支持 反对

使用道具 举报

发表于 2007-10-25 08:49:01 | 显示全部楼层
16楼用  checkmode保存,替代post。如果要真正写回数据库,直接用appleupdates
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-25 09:20:14 | 显示全部楼层
没有checkmode,是DataSetBroker1.DataSet.CheckBrowseMode; 。。。?
我试了 还是那个错误DataSet not in edit or insert mode
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-6-29 11:02 , Processed in 0.040990 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表