起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 186|回复: 8

【结贴】临时字段赋值问题**

[复制链接]
发表于 2008-6-16 17:48:19 | 显示全部楼层 |阅读模式
我在业务信息的代码里面单独写了一个方法,通过对数据集循环为临时字段赋值。
然后在业务功能的代码里,在数据集代理的afteropen事件里调用这个方法,报下图所示的错误,这个要怎么改啊??
还有个问题是,我在数据集代理的OnCalcFields事件里对临时字段赋值,但是这个事件的代码会重复执行两边,为什么呢??有什么方法可以只执行一遍么?

ab.jpg

296.84 KB, 下载次数: 129

回复

使用道具 举报

发表于 2008-6-16 17:52:32 | 显示全部楼层
楼主的报错是没有对数据集Edit就进行赋值了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-16 18:43:01 | 显示全部楼层
我在赋值之前调用 DataSetCheciAnalySingle.Edit; 还是报错,楼上说的Edit是什么意思?
数据集代理的OnCalcFields事件里对临时字段赋值,但是这个事件的代码会重复执行两边,为什么呢??有什么方法可以只执行一遍么?

这个问题能解决么?
回复 支持 反对

使用道具 举报

发表于 2008-6-17 08:29:41 | 显示全部楼层
楼主,把完整的代码贴出来看一下吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-17 09:28:18 | 显示全部楼层
这个是写在业务信息里的方法。
procedure TCheciAnaly.setTempData();
var
  ordernum:integer;
  custnum:integer;
  glsnumouble;
  qyid:string;
  tempqyid:string;
begin
//直接为数据集的临时字段赋值
  ordernum :=0;
  custnum :=0;
  glsnum :=0.00;
  qyid:='';
  DataSetCheciAnalySingle.Edit;
  DataSetCheciAnalySingle.First;
     while(DataSetCheciAnalySingle.Eof=False) do
     begin
       ordernum := ordernum + DataSetCheciAnalySingle.FieldByName('orderSum').AsInteger;
       custnum := custnum+1;
       tempqyid := DataSetCheciAnalySingle.FieldByName('QYLJID').AsString;
       if(qyid.Equals(tempqyid)=False)then
       begin
         glsnum := glsnum+ DataSetCheciAnalySingle.FieldByName('ZD').AsFloat;
         qyid := tempqyid;
       end;
       DataSetCheciAnalySingle.FieldByName('ordercustsum').AsInteger := ordernum;
       DataSetCheciAnalySingle.FieldByName('custsum').AsInteger := custnum;
       DataSetCheciAnalySingle.FieldByName('LCLJ').AsFloat := glsnum;
       DataSetCheciAnalySingle.Next;
     end;
end;

我在业务功能的窗体代码里,数据集代理的 afteropen 事件里调用
procedure TCCFX.dsbCheciSingleAfterOpen(DataSet: TDataSet);
begin

//jsDialogs.ConfirmBox('f','f',1);
CheciAnaly.TCheciAnaly(InfoBrokerCHECIANALY.Info).setTempData;
end;
回复 支持 反对

使用道具 举报

发表于 2008-6-17 09:32:52 | 显示全部楼层
DataSetCheciAnalySingle.First;
     while(DataSetCheciAnalySingle.Eof=False) do
     begin
       ordernum := ordernum + DataSetCheciAnalySingle.FieldByName('orderSum').AsInteger;
       custnum := custnum+1;
       tempqyid := DataSetCheciAnalySingle.FieldByName('QYLJID').AsString;
       if(qyid.Equals(tempqyid)=False)then
       begin
         glsnum := glsnum+ DataSetCheciAnalySingle.FieldByName('ZD').AsFloat;
         qyid := tempqyid;
       end;
       DataSetCheciAnalySingle.Edit;      
      DataSetCheciAnalySingle.FieldByName('ordercustsum').AsInteger := ordernum;
       DataSetCheciAnalySingle.FieldByName('custsum').AsInteger := custnum;
       DataSetCheciAnalySingle.FieldByName('LCLJ').AsFloat := glsnum;
       DataSetCheciAnalySingle.Next;
     end;
回复 支持 反对

使用道具 举报

发表于 2008-6-17 09:39:30 | 显示全部楼层
触发多次OnCalcFields事件是因为你代码中对数据集进行了修改
如果不想在执行setTempData时,触发OnCalcFields事件
可以在进入setTempData时:DataSetLXSJJ.OnCalcFields := nil;  //对事件赋空值,即无事件可以触发
在跳出setTempData时:DataSetLXSJJ.OnCalcFields := DataSetLXSJJCalcFields;  //恢复要触发的事件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-17 09:40:39 | 显示全部楼层
这次好了,太感谢了!结贴吧
回复 支持 反对

使用道具 举报

发表于 2008-6-17 09:43:31 | 显示全部楼层
客气,结贴了!
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-17 20:42 , Processed in 0.047580 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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