我想用Java+数据库完成如下功能:用户自定义一个指标S,保存在数据库里,该指标有一些数据项A1...An通过用户设定的计算公式S=exp(A1:Am)计算所得,这些数据A1...An保存在数据库中,计算公式也由用户自己设定并保存到数据库,计算符号有(,),+,-,*,/  数据项个数n,m未知
大致过程是:
1:用户自定义指标S,有指标的名称,编码....
2:用户自定义若干个数据项Ax,有名称,编码等,0<x<=n
3:用户指定一个指标S,选择数据项,并用计算符组合成计算公式,计算公式也保存到数据库
同时,关联指标和数据项
4:系统从数据库中提取计算公式和数据项数据,先检验数据是否合法,例如计算的除数不能为0,然后根据计算公式计算结果保存到S中
(最好能有简便的方法,如果能不用分析计算式得出逆波兰式的方法最好)
我这里可能描述得不是很正确,若有需要请问一下,我会在这里等候。
可能有点麻烦,想请社区的高手帮帮忙,谢谢!

解决方案 »

  1.   

    存储倒没有什么难度,
    主要是根据存储的公式,计算指标的值,需要好好考虑。可以将公式以字符串的形式存储到数据库中 ,读取的时候,解析字符串,得到公式。将变量A1...An带入公式中就可以得到值了。
    解析公式的时候需要对变量和运算符进行检验,比如用户输入的变量中没有A12,但是公式中出现了A12,程序就应该会报错。
    解析的时候主要是“(”和“)”的成对出现需要设计一个简单的算法来检查。之后运算符和变量就使用equals来判断就可以了,哦,对了,公式中的变量是不是都是A1....An啊?如果是,那么就比较简单了,比如
    String gongshi=getFromDB();
    String para1=gongshi.subString(0,2);
    if(para1.equals("A1")){
       para1="A1";
    }else if(para1.equals("A2")){
       para1="A2";
    }else....如果不是这样,可以在数据库中另外存储一个hash表,把变量和A1...An对应起来。之后采取同样的办法。一般来说,一个公式有十几个变量就已经很多了。然后运算符只有那六个。这样逐一比对也不是很麻烦。以上的方法,你可以参考一下。
      

  2.   

    1.对变量和运算符进行检验的话可以保证,计算公式中出现的任一数据项Ax,都有对应的变量和数据值,因为用户公式设定不是任意,而是对现有数据项的组合。
    2.公式中的变量都是A1....An,一般n<100,而计算符只有上而说的六种
    3.整个过程,我觉得关键在于如何解析计算公式,并从数据库中取得对应的数据,然后套用公式计算结果
    比如:从数据表jsgs中取得一个计算公式为((A12+A23)*A31-A1)/(A4+A78)
    而在sjx的表中,存放在着数据,A1,A2,.....,A99
    这时该如何解析和实现计算呢?先可以不考虑数据检验,当作理想情况来计算
      

  3.   

    简单的说就是根据一个由字符串组成的计算公式,解析该公式,提到各个变量,再从数据库中取得变量的数值,再利用公式计算结果
    在解析该计算公式,分离变量和运行符时还好,关键是我不知道该如何将取得变量数据再代入到公式计算举个例说,设定一个计算公式为:String S="((A12+A21)*A45-A4)/(A4+A9-A4)"
    分离出变量A12,A21,A45,A4,A9,其数值保存在数据库,从数据库取得数据后由于S是一个字符串,该如何再将变量的数据代入到S公式中进行计算?
      

  4.   

    分离变量的方法我记得在数据结构(严蔚名)书上讲过算法,你去查查。
    重新计算的话,就是动态拼装SQL语句(select 计算公式 AS resualt),执行一下,取resualt值就可以了。