Foxtable(狐表)用户栏目专家坐堂 → 有谁能做个字段间的计算关系由用户自定义公式的例子?


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

主题:有谁能做个字段间的计算关系由用户自定义公式的例子?

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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40550 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2009/3/31 14:37:00 [显示全部帖子]

贴上这段代码,只希望大家对狐表多一份了解和爱戴,尽量避免过早定论,多一分努力和实践,灵活运用,狐表能做的东西,绝大部分功能都已经能够实现了,其实我也很菜,希望大家多指教,并对我的代码给予精简为盼:

Tables("明细数据").Current("钢筋代码") = Vars("钢筋代码")
Dim dr As DataRow = DataTables("计算规则").Find("[钢筋代码]= '" &  Vars("钢筋代码") & "'")
Tables("明细数据").Current("下料长度计算规则") = dr("下料长度计算规则")
dim r as row = Tables("明细数据").Current
Dim Multi As String = "A|B|C|D|E|F|G|H|JD1|JD2"
Dim Values() as String
Values = Multi.split("|")
For Index As Integer = 0 To Values.Length - 1
   if e.Form.ExistControl(Values(Index))  = true
         if e.Form.Controls(Values(Index)).Value = nothing
            MessageBox.Show("对不起,您输入的参数不全,请为本钢筋录入" & Values(Index) & "参数后再提料!", "提示")
            Return
         else
            Tables("明细数据").Current(Values(Index)) = e.Form.Controls(Values(Index)).Value
         end if
   else
       Tables("明细数据").Current(Values(Index)) = nothing
   end if
Next
Multi = "施工部位|构件名称|钢筋编号|钢号|直径|间距|构件根数|构件数"
Values = Multi.split("|")
For Index As Integer = 0 To Values.Length - 1
    if e.Form.Controls(Values(Index)).Value = nothing
       MessageBox.Show("您还没有输入" & Values(Index) & ",请您先输入" & Values(Index) & "再提料!", "提示")
       Return
    else
       Tables("明细数据").Current(Values(Index)) = e.Form.Controls(Values(Index)).Value
    end if
Next
r("下料长度计算式") = r("下料长度计算规则").Replace("直径",r("直径")).Replace("A",r("A")).Replace("B",r("B")).Replace("C",r("C")).Replace("D",r("D")).Replace("E",r("E")).Replace("F",r("F")).Replace("G",r("G")).Replace("H",r("H")).Replace("JD1",r("JD1")).Replace("JD2",r("JD2"))
r("总根数") = Eval(r("构件根数") & "*" & r("构件数"),r)
r("下料长度") = Eval(r("下料长度计算式"),r)
r("总长度") = Eval("(" & r("下料长度计算式") & ")*" & r("总根数") & "/1000",r)
r("总重量") = Eval(Math.Round(0.617*r("直径")*r("直径")/100,3) & "*(" & r("下料长度计算式") & ")*" & r("总根数") & "/1000",r)


     下料长度计算规则来自于计算规则表,A|B|C|D|E|F|G|H|JD1|JD2均为列名称,下料长度计算式根据下料长度计算规则列,替换对应的A|B|C|D|E|F|G|H|JD1|JD2列,再利用eval并参与与其他列的计算。
      可以只用定义任意复杂公式,比如:
        简单点的:A+B+C+D+2*6.25*直径+3.14*(E*2)/4-7*直径
        复杂一点的:A+Math.Sqrt((B-2*直径)* (B-2*直径)+ (C/2-50)*(C/2-50)) * 4 + 2*C      平方值的表达式暂时还没改过来,这里显得有点笨。

      
   优点,可由管理员用户灵活定制各列直接的计算关系(我这里叫计算规则,可以制定1~N个任意规则,支持函数),用户在操作中,根据不同的条件任意调用,得出计算结果,
         本系统是我以前的易表设计的商业版行业系统改版,程序我就不贴上来了,下面贴上改系统的主表界面,对照代码即可看出规律:

        
图片点击可在新窗口打开查看此主题相关图片如下:系统界面.jpg
图片点击可在新窗口打开查看


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40550 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2009/3/31 15:29:00 [显示全部帖子]

呵呵,我这是针对当前行的按钮公式,几乎就是挪挪位置,调整一下顺序,删除部分仅需要在按钮实现的功能即可,其实很简单的,事件中的代码还不需要这么集中,我的系统中就需要这样的功能,抽空会改,不过到表事件,代码可能需要打散了!


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40550 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2009/4/1 12:14:00 [显示全部帖子]


1、不仅是eval,就是VB,也不支持iff
2、目前eval()真正执行的应该是符合四则混合运算规则的字符串,里面不应该有等号。

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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40550 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2009/4/1 12:37:00 [显示全部帖子]

1、我是说根本没有iff,而是iif您这样测试就是支持也检测不出来。
2、还是认为您下定义太早,这样不比您要求的iif强N倍?开下面的代码:


dim r as Integer Tables("表名").Current
dim a as Integer
if r.("数量") < 1000
   a = 1
else
   if r.("数量") < 2000
      a = 0.9
   else
      if r.("数量") < 3000
         a = 0.8
      else
       ..............
      end if
    end if
end if
r("折扣") = a
r("金额") = Eval(Math.Round(r("数量") & "*" & r("单价") & "*" & r("折扣"),3),r)


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40550 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2009/4/1 12:41:00 [显示全部帖子]

狐表的代码加以灵活运用要靠我们自己,不能单单给贺老师加码呀,要把他逼疯了,我还想继续使用狐表呢!图片点击可在新窗口打开查看

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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40550 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2009/4/1 12:48:00 [显示全部帖子]

以下是引用cpayinyuan在2009-4-1 12:18:00的发言:

   如果这样,公式解析时就只能包括加减乘除,不能包含关系运算和IFF函数了?在很多时候,这样的公式解析是没有办法使用的!根本解决不了实际问题。还是希望贺老师能想一个解决的办法。




 我不明白,为什么要能执行等号才能解决根本问题,我向您也不应该执行这样的比如:Eval("(1+2)*8/2 =5",..........)

逻辑表达式应该直接是 if Eval("(1+2)*8/2 ",..........) = 12 '
                                    true
                              else
                                    false
                              end if

       我想不明白!

[此贴子已经被作者于2009-4-1 12:52:46编辑过]

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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40550 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2009/4/1 13:06:00 [显示全部帖子]

以下是引用cpayinyuan在2009-4-1 12:59:00的发言:

我说的支持等号与支持 iif函数实质上是一回事,带等号的表达式就是用在iif函数中作为参数的。


 哦,那就直接是iif问题,贺老师好像说了,更新后也是可以支持的,甚至eval能扩展到支持流程语句,具体要的贺老师或者更新后就知道了。


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40550 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2009/4/1 13:28:00 [显示全部帖子]

建议您学学自定义函数那一章,我还没有过多地研究,通过自定义函数,加上我说的判断方法,将来用户只需要输入参数即可,最灵活还是我那个定义计算规则的方法,用户只需要改规则即可实现任意运算方式。


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40550 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2009/4/2 8:11:00 [显示全部帖子]

图片点击可在新窗口打开查看

 回到顶部