Foxtable(狐表)用户栏目专家坐堂 → [求助]让所有数值列不显示零值的通用代码


  共有22839人关注过本帖树形打印复制链接

主题:[求助]让所有数值列不显示零值的通用代码

帅哥哟,离线,有人找我吗?
t_fs
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:431 积分:2808 威望:0 精华:0 注册:2008/9/1 8:46:00
[求助]让所有数值列不显示零值的通用代码  发帖心情 Post By:2008/12/9 16:18:00 [只看该作者]

    由于表中的数据列太多,我设计了一个通用的让所有数值列不显示零值的代码。代码如下:

Dim dr As dataRow = e.dataRow
For Each dc As Col In Tables("汇总表").Cols
    If dc.IsNumeric Then   '是否数据列
If dr.IsNull(dc.Name) then   '是否为零
   dr(dc.Name)= Nothing     '清零
end if
    End If
Next

   我将上述代码放在DataColChanged事件中,点击确认后,没有错误显示。可是当数据更新后,表中仍然存在0.00.

不知道错在那里,请高手再给看看。谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
关于示例文件的问题  发帖心情 Post By:2008/12/9 16:25:00 [只看该作者]

零值的处理

假定某个表的金额列,由单价、数量、折扣三列计算得出,可以将该表的DataColChanged事件代码设置为:

Dim dr As DataRow = e.DataRow
Select
Case e.DataCol.Name
   
Case "数量","单价","折扣"
        dr(
"金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))
End Select

显然如果我们只输入数量、单价中的一个,金额列的计算结果等于0。
即使我们没有输入数量、单价、折扣中的任何一个值,如果重置其中某一列,金额列的内容同样也会等于0。

如果你希望只有同时输入了单价和数量的情况下,才计算金额,避免金额出现0值,可以将DataColChanged事件代码改为:

Dim dr As DataRow = e.DataRow
Select
Case e.DataCol.Name
   
Case "数量","单价","折扣"
       
If dr.IsNull("数量") OrElse dr.IsNull("单价") Then
            dr(
"金额") = Nothing
        Else

            dr(
"金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))
       
End If
End
Select

这样如果数量或者单价中任何一个为空,金额也会自动清空,而不会出现0值。

如果你希望在任何情况下,某一列都不能出现0值,那么代码会更简单,同样用金额列为例,只需将DataColChanging事件代码设为:

If e.DataCol.Name = "金额" Then
    If
e.NewValue = 0 Then
        e.NewValue =
Nothing
    End
if
End
If

注意上面的代码设置在DataColChanging事件中,而不是DataColChanged事件中。这样可以在金额列的值发生变化之前进行拦截干预,判断新的值是否为0,如果为0,则将新值设为Nothing,这样金额列的值就永远不可能为0了。


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2008/12/9 16:26:00 [只看该作者]

根据帮助,可以写出针对所有列的代码:

If e.DataCol.IsNumeric Then
    If
e.NewValue = 0 Then
        e.NewValue =
Nothing
    End
if
End
If

放在DataColChanging事件中

 回到顶部
帅哥哟,离线,有人找我吗?
t_fs
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:431 积分:2808 威望:0 精华:0 注册:2008/9/1 8:46:00
  发帖心情 Post By:2008/12/9 16:40:00 [只看该作者]

以下是引用狐狸爸爸在2008-12-9 16:26:00的发言:
根据帮助,可以写出针对所有列的代码:

If e.DataCol.IsNumeric Then
    If
e.NewValue = 0 Then
        e.NewValue =
Nothing
    End
if
End
If

放在DataColChanging事件中

       非常好用,也非常实用。谢谢了!!


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2008/12/9 17:03:00 [只看该作者]

以下是引用t_fs在2008-12-9 16:40:00的发言:

       非常好用,也非常实用。谢谢了!!


正式版本出来了,建议你重新看一次帮助。
从你一楼写的代码,我可以看出老兄还得补补基本功。

If dr.IsNull(dc.Name) then  
   dr(dc.Name)= Nothing 
end if

要知道,上面的代码没有任何意义的,只是将已经为空的单元格再次设为空值,意义何在呢?

[此贴子已经被作者于2008-12-9 17:03:18编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
t_fs
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:431 积分:2808 威望:0 精华:0 注册:2008/9/1 8:46:00
  发帖心情 Post By:2008/12/9 17:54:00 [只看该作者]


     以下应该是正确的吧?关键是代码的存放位置应放在DataColChanging事件中

if dr(dc.Name)= 0  then
  dr(dc.Name)= Nothing 
end if

    另外,e.NewValue  这个代码好象以前未出现过,是个暂新的代码。

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2008/12/9 17:55:00 [只看该作者]

以下是引用t_fs在2008-12-9 17:54:00的发言:

    另外,e.NewValue  这个代码好象以前未出现过,是个暂新的代码。


这个一直有的,就在帮助中。


 回到顶部