我想在财务凭证转换的时候,让财务人员可以自行设定某个科目数值的计算公式,例如
应缴税款的计算方法就是:金额*17%
当然,可能还会涉及其他的运算,我就希望能让用户自行设定公式,然后程序在生成科目的时候,根据预设的公式自动计算该科目对应的金额,
现在就不知道该如何把用户定义的公式字符串转换为deiphi的计算公式?

解决方案 »

  1.   

    我想用一系列的判断就能实现!如A(1值)*(符号1)B(数值2)+(符号2)C(数值3)(当然也可以是其他形式,你可以设计时候预设最多可能的数值字段 和 最多可能符号字段,包括括号),用户在填写时候后边没用的则默认为空 然后在程序里用case判断,遇到部位空的数值或符号就判读,然后转为delphi的相应代码。这只是我的个人思路,期待他人有更好的方法。
      

  2.   

    用sql语句放到数据库中执行一下,能成功就行了
      

  3.   

    先转换为标准的脚本表达式,再用下面的方法计算。复杂的转换建议用正则。uses ComObj;
    function Evaluate(Expression: String): String;
    var
      Calc: Variant;
    begin
      Calc := CreateOleObject('ScriptControl');
      try
        Calc.Language := 'JavaScript';//or VBScript
        Result := Calc.Eval(Expression);
      except
        Result := '';
      end;
    end;
      

  4.   

    还是在数据库操作好,动态写SQL语句
      

  5.   

    写了个简单的例子procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      Expres: string;
    const
      Params: array [0..2] of string = ('金额', '数量', '回扣');
    begin
      Expres := '(金额*数量)*17%*(1-回扣)';
      for I := 0 to High(Params) do
        Expres := StringReplace(Expres, Params[I], VarToStrDef(ADODataSet1[Params[I]], '0'), [rfReplaceAll]);
      Expres := StringReplace(Expres, '%', '/100', [rfReplaceAll]);
      ShowMessage(Evaluate(Expres));
    end;
      

  6.   

    直接给个edit,然后取出来放到数据库去执行好了
    PS:看到17%好熟悉啊