Kevin-moon

学习在于分享
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

动态进行"自定义公式"计算

Posted on 2008-12-11 11:41  Kevin-moon  阅读(8137)  评论(27编辑  收藏  举报

     这几天弄完了一个"自定义公式计算"的方案,觉得比较有意思,在这里就共享下!


     该方案是针对一些需要用户自己去定义"计算公式",然后通过这个公式得出计算的结果这种需求的,特别适用与一些产品的BOM(在制作BOM的时候,需要去设定BOM中每个物料的数量,当这个BOM在比较复杂的时候直接去设定物料的数量,这点就不能去满足,因为有些物料是和其中的一些有关系的,所以这些的数据也想通过公式来建立关联关系并且得到数量)。
     例如,A产品由B和C组成,在这里面B和C有一定的关联,C的数量是B数量的2陪,当出现这种情况的时候,用户就想通过修改B的数量,然后联动修改C的数量,但是这些公式需要允许用户自己去定义。这种类试的问题就是可以通过这个来搞定的。
     大概可以解决的问题,大家应该了解了吧!那么如何使用和基本原理?

让我们先从用户使用的角度开始吧:
1、用户定义了下面结构的产品BOM:

2、现在去需要关联的产品设定数量的公式,从而达到联动改变的效果
相关产品的公式:
产品C: return [产品B]+[产品D];
产品E: return [产品C]*2 + 10;........

这里关于公式有个需要说明的地方:公式中的参数必须要在"[]"里面,必须要有return,除了这两个,其他定义的规范就是和C#一样,因为在内部是把这些转换为代码来执行的。其实在这里,公式的定义对于用户来说,还是需要做些简单培训的,因为要让用户去熟悉C#中简单的算术计算和一些基本的规范。
3、设置产品BOM中每个物料的数量,OK!调用我们的程序去完成工作吧。
那么用户部分的工作就全部结束了。

下面我们进入程序部分:
     先看下程序的流程图:

     程序将产品BOM中公式计算相关的所有物料都当成一个参数(CParamter)对象,对于其中有公式的参数,程序动态的将这些公式进行解析并生成公式类(继承于IFormula接口),然后将不同的公式类对象赋予到参数的Formula属性中,参数的PValue(值)通过这个公式对象的计算方法来得到值,而计算方法就是根据用户定义的公式来解析的。这里的核心部分就是动态的去利用自定义公式生成每个公式类并和参数建立起关系。

下面是所有的类图:

动态生成公式和模板类的代码:
Code

生成后的公式类和模板类
Code

单元测试的代码:
Code

     觉得这个方案对于需要进行自定义公式进行计算的用户,还是不错的!

源代码:DynamicCalculate.rar