VC中使用ADO+SQLSERVER2000做数据库应用。因为客户的需求偶尔要改变,所以客户要求有一项功能就是允许客户自定义多个计算公式或修改已经设置的公式,并且要求在DataGrid中修改的记录时候根据公式立即更新。
举个简单的例子如工资核算:
    假设计算公式为:
        实发工资 = 应发工资 - 扣除费用
    ADO的RecordSet的fields(0)表示实发工资、fields(1)表示应发工资、fields(2)表示扣除费用。
    用户设置的计算公式保存在字符串中,如下:
    CString cFormula("fields(0)=fields(1)-fields(2)");问题是:在VC++中怎样让cFormular中保存的"fields(0)=fields(1)-fields(2)"表达式执行?说白了,就是怎样执行一个字符串中的语句,例如"int a = 1+2;"。
以前用VFP的时候做这个非常简单,使用VFP的宏代换(&)功能就行,例如:
Local cExpr as string
cExpr = "fields(0)=fields(1)-fields(2)"
&cExpr.
用VFP就这么简单,VC++怎么实现类似的功能?不要告诉我编译型的语言没有这个功能,解释型的语言才有,C++可是史上最牛的语言啊,连这个都实现不了?

解决方案 »

  1.   

    VFP只是内部帮你解析好了表达式而已,C++没有这个。你需要自己写个解析表达式的函数,应该需要用到堆栈,你不妨自己试试看
      

  2.   

    c++没有,可以自己做
    很多东西在VFP是现成的,如果系统不提供,直接编程很难实现。
      

  3.   

    可以参考下面的文章
    http://www.vckbase.com/document/viewdoc/?id=1462
      

  4.   

    select 字段2-字段1 form table不行 吗????
      

  5.   

    c++的boost库中有个关于四则运算的模板Spirit。
    纯c有个执行类似c语言脚本的开源项目,名字记不住了,这个需要你自己写一些简单的解析方法。
      

  6.   

    SQLSERVER2000 自带,比这个需求复杂N倍的都有
      

  7.   

    谢谢大家的关心和回复!
    对于7楼所提的“select 字段2-字段1 form table”这个方法肯定是不行的,因为公式的本质是要根据表达式确定的关系同步更新,例如在表格中修改了“扣除费用”,那么“实发工资”必须立即根据该公式进行更新。更新的本质是UPDATE,而不是SELECT,所以在我的这个问题中不行,7楼的方法只能用于查询时求值,而不能用于更新。
    顺便再提一下,有朋友可能会提议将公式写成SQLSERVER的触发器,这个方法虽然能让SQLSERVER去解析公式并执行,但是与我们的应用原则有悖,原因很多也很复杂,所以请朋友们不要跑题了,我要求的不是怎样通过其它办法的实现来绕过这个问题,而是怎样正视它,既然C++语言本身没有这个功能,那么是否有哪位牛人写好的表达式解析器呢?
    感谢5楼marrco2005提供的链接,可是要我来实现这个解析器太不现实了,我希望能有朋友帮忙提供一个。
      

  8.   

    想简单就用现有的脚本引擎,比如JS或者VBS
    不想用解释型语言就用LEX和YACC来生成运算代码(本质就是做编译器)
      

  9.   

        不就是数据公式解释吗?网上这样库肯定有,看看这个:MTParser
      

  10.   

    非常感谢大家的热情回复,其实客户可以设置的公式不止是数值计算,还可能有字符串的连接、替换等等,甚至有?:这个三元操作符,总之客户设置的公式可能很简单,也可能很复杂,解析这个公式不太容易。to: clever101,感谢您提供的链接,可惜我没有积分,下不了。这个帖子周末再结,看看哪位朋友能把这个问题深入地展开一下。
      

  11.   

    参考一下这个
    http://www.vckbase.com/document/viewdoc/?id=1563