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++可是史上最牛的语言啊,连这个都实现不了?
举个简单的例子如工资核算:
假设计算公式为:
实发工资 = 应发工资 - 扣除费用
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++可是史上最牛的语言啊,连这个都实现不了?
很多东西在VFP是现成的,如果系统不提供,直接编程很难实现。
http://www.vckbase.com/document/viewdoc/?id=1462
纯c有个执行类似c语言脚本的开源项目,名字记不住了,这个需要你自己写一些简单的解析方法。
对于7楼所提的“select 字段2-字段1 form table”这个方法肯定是不行的,因为公式的本质是要根据表达式确定的关系同步更新,例如在表格中修改了“扣除费用”,那么“实发工资”必须立即根据该公式进行更新。更新的本质是UPDATE,而不是SELECT,所以在我的这个问题中不行,7楼的方法只能用于查询时求值,而不能用于更新。
顺便再提一下,有朋友可能会提议将公式写成SQLSERVER的触发器,这个方法虽然能让SQLSERVER去解析公式并执行,但是与我们的应用原则有悖,原因很多也很复杂,所以请朋友们不要跑题了,我要求的不是怎样通过其它办法的实现来绕过这个问题,而是怎样正视它,既然C++语言本身没有这个功能,那么是否有哪位牛人写好的表达式解析器呢?
感谢5楼marrco2005提供的链接,可是要我来实现这个解析器太不现实了,我希望能有朋友帮忙提供一个。
不想用解释型语言就用LEX和YACC来生成运算代码(本质就是做编译器)
http://www.vckbase.com/document/viewdoc/?id=1563