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


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

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

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
有谁能做个字段间的计算关系由用户自定义公式的例子?  发帖心情 Post By:2009/3/31 11:20:00 [显示全部帖子]

    在此之前,我们用狐表做的所有项目中,各字段间的运算关系都是固定写在列的DataChanged事件中,或者写在项目的变量事件中。但在实际应用中,有时候这种计算关系并不是固定的,需要在运行程序的时候动态生成,并可能变化。    
   例如,在通用的工资软件中,各字段之间的计算关系是由最终用户自定义的。放到Foxtable中,也就是各字段之间的计算关系不能由软件的开发者在DataChanged中写死。而是允许最终用户在窗口中编辑一个公式,编辑之后保存在某个表里面,然后,系统根据表中保存的自定义公式动态生成DataChanged事件中的代码,即生成了各列之间的计算关系。一般情况下,自定义公式中使用的元素包括:各数字(0-9),+,—,*,/,(),负号,if(如果) 函数。
    狐表作为一个开发工具,相信一定能解决好这个问题。所以,希望哪位老师(或者贺老师若有时间能亲自动手最好),能做个例子,供大家学习!如果这个问题能妥善解决好,狐表的应用会更广泛!用途更广!
[此贴子已经被作者于2009-3-31 11:33:21编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/3/31 11:25:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-3-31 11:22:00的发言:
呵呵,我昨天看到老程做过了,你可以咨询一下。
是通过Eval函数做的。

   呵呵,如果程老师已经做好了,就请他上传上来大家共同学习一下吧!看与其他同类软件的功能是否一致。
其他人如果做得比较成功,也希望尽快传上来,期盼学习!
   另外,我很想知道是否支持 括号()和if函数。如果只有加减乘除,没有括号和 if 函数,功能至少会折扣一多半!

   补充:刚刚贺老师说程老师用Eval做的,我查了一下帮助,说EVAL函数采用VBScript语法,好像VBScript中没有if函数,如果是这样,它的功能会大打折扣的,或者说根本无法正常使用.

[此贴子已经被作者于2009-3-31 11:31:29编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/3/31 11:37:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-3-31 11:32:00的发言:
if then end if do loop while等等,都可以的。
你可以先看看帮助中的Eval函数说明。
[此贴子已经被作者于2009-3-31 11:32:33编辑过]

    帮助中的说明很简单,根本就没有提到if,更没有提到怎么用.若是可以用,建议您把帮助中的VBScript语法部分认真完善一下.另外,Eval中的if函数,使用方法应该和易表中的差不多吧.即if(表达式,数值1,数值2)的开式,若表达式为真,等于数值1,若为假,等于数量2.对不对?
    补充:我说的不是Eval函数用在if语句中,而是指Eval的参数(表达式)中是否支持if函数.

[此贴子已经被作者于2009-3-31 11:45:16编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/3/31 12:46:00 [显示全部帖子]

以下是引用czy在2009-3-31 12:26:00的发言:
eval中应该用iif更合适。
如:eval(iif(表达式,值1,值2),……)
[此贴子已经被作者于2009-3-31 12:26:16编辑过]

我的意思就是Eval中支持不支持IIF函数,只要支持就好了.我在帮助中没有看到相关的说明.


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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/3/31 12:47:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-3-31 12:35:00的发言:
我刚刚改了一下Eval函数,以后可以执行简单的代码:

i = 1
If i = 1 Then
   Eval = "壹佰"
Else
   Eval = "贰佰"
End If

Eval就是要返回的值。

你可以补补VbScript的知识:
http://www.microsoft.com/china/vbscript/vbstutor/vbstutor.htm

这些内容,我不会在帮助提供的了。
[此贴子已经被作者于2009-3-31 12:36:25编辑过]

没有看明白这个例子是什么意思.


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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/3/31 12:53:00 [显示全部帖子]

   还是希望谁做个自定义公式的例子.

   总感觉在目前的狐表系统中做这个太复杂,一个表中,可能有几十个列都有自定义公式,虽然每个公式的结果都是影响一列,但可能有另外的很多列的变化都会导致这个结果列重算。
   例如,在工资软件中,若用户自定义:应发工资=基本工资+提成+补助+奖金+加班费,则基本工资、提成、补助、奖金、加班费中任一列发生变化,都要重算应发工资。如果是固定的公式用表事件很方便,右是自定义的公式,则需要判断每一个公式中都是由哪些列的变化影响的,感觉比较复杂。希望谁能提供一个好的思路。

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/3/31 13:46:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-3-31 12:59:00的发言:
你想得多了,你在往更复杂的路上走。
首先,你这样的计算,用表达式就行了,应发工资的表达式设为:

[基本工资]+[提成]+[补助]+[奖金]+[加班费]

还能比这更简单吗?

即使用代码,也没有多复杂,将应发工资改为数据列,DatacolChanged的代码为:

    可能是我没有把意思表达清楚,让贺老师误解了。
     在上面的例子中,如果已知应发工资等于什么,就不叫自定义公式了。经过这么多天的学习和大家的帮助,这个代码我可以不费劲的写出来。
    在实际中,这个公式是最终用户自定义的,在设计项目的时候并不是已知的。它的复杂性在于:
1、不知道应发工资等于什么,即不知道影响应发工资的有哪几列,可能是4个列,也可能是8列。也就是在DatacolChanged的代码中,不知道让e.Datacol.Name 等于什么。究竟有哪些列,需要系统根所用户自定义的这个公式地行解析、判断。
2、应发工资的公式并不一定只有加减乘除,如果只有加减乘除,要简单得多。可能有括号,甚至还有IIF函数或者其他函数。不是用表达式列就可以解决的。
3、在一个工资表中,并不是只有应发工资列的公式是自定义的。而是,可能有许多列的公式都是自定义的,需要对每个列的公式进行解析、判断。这里面可能还涉及到一个列顺序的问题,在实际的系统中,列顺序也允许最终用户进行调整,这可能会对公式的计算产生一定的影响。

不知我说明白了没有,还是希望贺老师或者其他老师提供一个好的事例,或者思路。

[此贴子已经被作者于2009-3-31 13:48:07编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/3/31 14:18:00 [显示全部帖子]

以下是引用czy在2009-3-31 14:09:00的发言:
看楼上说的有些复杂。

建议还是楼主建个示例文件,让大家一起来想想办法。

   因为我只知道最终的结果是什么样子,如何实现没有很好的思路,所以不好建示例文件。如果一定要建一个示例文件,那我只能建一个没有任何公式、没有任何事件的表了。因为列之间所有的公式都是最终用户自定义的,现在不知道最终用户要为哪一列定义公式,定义什么样的公式,所以DatacloChanged事件我不太清楚该怎样写。
   如果版主想要研究这个事,可以随便找一个主流的工资软件(例如用友),一看就知道是怎么回事了。


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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/3/31 15:17:00 [显示全部帖子]

看了程老师的事例,基本上明白了大概的思路。好像这段代码是应用在输入数据的时候。

我认为在工资软件中,最大的难度在于如何把自定义公式应用在DatacolChanged事件中,希望哪位老师再提供一下事例或者思路。
[此贴子已经被作者于2009-3-31 15:18:24编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/3/31 15:26:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-3-31 15:22:00的发言:


其实也不难,在DataColChaned设置代码,判断某列的自定义公式是否包括e.Datacol.Name,如果包括,则重算该列的自定义公式即可。

    对了,顺便请教一个问题,在这种情况下,Datacolchanged事件中的代码顺序可能会有点乱,可能会造成先计算第3列,然后再计算第6列,再计算第1列(第6列的公式可能引用第1列和第3列,第3列的公式可能引用第1列),……,这样对表中计算的正确性有无影响?

[此贴子已经被作者于2009-3-31 15:28:05编辑过]

 回到顶部
总数 29 1 2 3 下一页