Foxtable(狐表)用户栏目专家坐堂 → [讨论]关于空值的判定


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

主题:[讨论]关于空值的判定

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


加好友 发短信
等级:童狐 帖子:255 积分:2353 威望:0 精华:0 注册:2011/4/25 9:23:00
[讨论]关于空值的判定  发帖心情 Post By:2012/2/7 15:20:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:出库.jpg
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:库存.jpg
图片点击可在新窗口打开查看

 

有如上图两个表,要从库存表中找出与出库表中 编码和批次号相同 的行,然后 实时库存(新)=实时库存(旧)-出库数量,代码该怎么写?

 

其中两表中编码和数量列肯定不为空,批次号可能为空。

 

较为简短的代码如何编写?


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


加好友 发短信
等级:管理员 帖子:47449 积分:251065 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/2/7 15:26:00 [只看该作者]

我也没有什么简短的代码,你贴出你的代码看看。


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


加好友 发短信
等级:童狐 帖子:255 积分:2353 威望:0 精华:0 注册:2011/4/25 9:23:00
  发帖心情 Post By:2012/2/7 15:41:00 [只看该作者]

Dim n As Integer
n = 0
Dim drs As List(of DataRow)
Drs = DataTables("成品仓退料单_Table1").Select("材料编码 Is not null")
For Each dr As DataRow In drs
    Dim gr As DataRow
    If dr.IsNull("订单号") Then '判定操作的合法性,库存表必须有与之相对应的物料
        Gr = DataTables("成品仓实时库存").find("订单号 is null and 材料编码 = '" & dr("材料编码") & "' And 单位 = '" & dr("单位") & "'")
    Else
        Gr = DataTables("成品仓实时库存").find("材料编码 = '" & dr("材料编码") & "' And 单位 = '" & dr("单位") & "' And 订单号 = '" & dr("订单号") & "'")
    End If
    If gr Is Nothing Then
        MessageBox.Show("反审核后物料库存将小于零,禁止操作","警告", MessageBoxButtons.OK ,MessageBoxIcon.Warning)
        n = n+1
        Exit For
    Else
        Dim Ys As Double   '判定操作的合法性,若有与之相对应的物料,运算后库存不能为负
        Ys = gr("实时库存") - dr("数量")
        If YS < 0 Then
            MessageBox.Show("反审核后物料库存将小于,禁止操作","警告", MessageBoxButtons.OK ,MessageBoxIcon.Warning)
            n = n + 1
            Exit For
        End If
    End If
Next
If n <= 0 Then           '判定操作的合法,进行真正运算
    For Each dr2 As DataRow In drs
        Dim gr2 As DataRow
        If dr2.IsNull("订单号") Then
            Gr2 = DataTables("成品仓实时库存").find("订单号 is null and 材料编码 = '" & dr2("材料编码") & "' And 单位 = '" & dr2("单位") & "'")
        Else
            Gr2 = DataTables("成品仓实时库存").find("材料编码 = '" & dr2("材料编码") & "' And 单位 = '" & dr2("单位") & "' And 订单号 = '" & dr2("订单号") & "'")
        End If
        gr2("实时库存")  = gr2("实时库存") - dr2("数量")
    Next
[此贴子已经被作者于2012-2-7 15:46:42编辑过]

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


加好友 发短信
等级:管理员 帖子:47449 积分:251065 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/2/7 15:49:00 [只看该作者]

我也没有更好的办法。


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


加好友 发短信
等级:童狐 帖子:255 积分:2353 威望:0 精华:0 注册:2011/4/25 9:23:00
  发帖心情 Post By:2012/2/7 15:55:00 [只看该作者]

一楼的案例其实是我设计进销存系统时的一个简化模型,他模拟的一个单据审核的操作,单据审核后,单据有效,系统即自动对库存进行相应的运算。

 

上面的代码其实才是我真正的案例,包含了操作合法性的判定,其实真正的关于运算的只有红色的那一部分。

 

不过时至今日,我还是经常搞不清什么时候用NOTHING,什么时候用IS NULL,都是试出来的。

 

还有查找条件有朝一日能不能这样写呢? FIND( A AND ( B OR C) )


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


加好友 发短信
等级:管理员 帖子:47449 积分:251065 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/2/7 15:57:00 [只看该作者]

表达式中都是用Is Null:

http://www.foxtable.com/help/topics/0102.htm

 

代码中,看看:

http://www.foxtable.com/help/topics/1470.htm

 


 回到顶部