需要用户自定义条件,自定义计算公式.每个条件对应一个公式.当符合对应条件时执行相应公式.
把用户定义的条件和公式保存在一个表里.程序运行时从表中读取条件和公式我想把if后面的表达式设成变量.然后程序运行时我可以随时改变它的值.
现在问题是怎样能让用户自定义if后面的东西呢?ls_tj = 'a>b and (c>d or d>e)'
if ls_tj then
  ...
end if
这肯定不行.
有没有其它的解决方法?分数可加至500

解决方案 »

  1.   

    我的一个根据数据库表中的值动态调节税率计算的datawindow计算域中公式的问题,你的问题也可以这样处理的。string ls_taxFormula,ls_accuFormula,ls_modString
    string ls_rtnString,ls_today
    long ll_rowCount,ll_currentRow
    dec ld_taxRate,ld_fastDec,ld_moneyShouldTaxdataStore lds_taxRate
    lds_taxRate = Create dataStoredataStore lds_transfer
    lds_transfer = Create dataStorelds_transfer.dataObject = 'd_transfer'//得到当前时间
    ls_today = em_year.text + '-' + ddlb_month.text//首先利用存储过程将数据导入到其中一个表中
    declare sp_transfer procedure for usp_transferData
    @transferDate = :ls_today;

    execute sp_transfer;//得到两个计算公式
    ls_accuFormula = profileString("salary.ini","formula","accu",'')
    ls_taxFormula = profileString("salary.ini","formula","tax",'') + ' - ' + &
     profileString('salary.ini','taxDec','decOfLaw','0') + ' - ' + &
     profileString('salary.ini','taxDec','decOfRule','0')//根据税率得到调节税的计算公式
    lds_taxRate.dataObject = 'd_taxRate'
    lds_taxRate.setTransObject(sqlca)
    ll_rowCount = lds_taxRate.retrieve()if ll_rowCount = 0 then
    ls_modString = "compute_tax.expression = '" + ls_taxFormula + "'"
    else

    ls_modString = "compute_tax.expression = '"

    for ll_currentRow = 1 to ll_rowCount

    ld_taxRate = lds_taxRate.getItemNumber(ll_currentRow,'taxRate')
    ld_moneyShouldTax = lds_taxRate.getItemNumber(ll_currentRow,'moneyShouldTax')
    ld_fastDec = lds_taxRate.getItemNumber(ll_currentRow,'fastDec')

    if ll_currentRow <> ll_rowCount then
    ls_modString = ls_modString + "if((" + ls_taxFormula + ") < " + &
    string(ld_moneyShouldTax) + ",(" + ls_taxFormula + &
    ") * " + string(ld_taxRate) + " / 100 - " + &
    string(ld_fastDec) + ","
    else
    ls_modString = ls_modString + "(" + ls_taxFormula + &
    ") * " + string(ld_taxRate) + " / 100 - " + &
    string(ld_fastDec)
    end if
    next

    for ll_currentrow = 1 to ll_rowCount - 1 
    ls_modString = ls_modString + ')'
    next
    ls_modString = ls_modString + "'"
    end if
    destroy lds_taxRate//设置公式
    ls_rtnString = lds_transfer.modify(ls_modString)

    if ls_rtnString <> '' then
    messageBox('错误','计算公式不正确,无法继续.请重新设置计算公式'+ ls_rtnString)
    return 0
    end if
      

  2.   

    我有办法,但是怕你不给分。我以我验证可行的办法回答过不少问题,可是结贴的不多。
    第一种方法:如果能用函数问题就简单了,比如setfilter(),describe等
    第二种方法:用我自己创造的方法,做个函数,把字符串作为参数传入,返回一个布尔型的值,就是你的表达式的结果。不给分不能告诉你。想知道的话先给我一半得分,再给我发信:[email protected]不过个人的想法不是很高明,可以说是很麻烦的,需要你建立一个函数用到递归调用。如果你觉着满意再给另外一半分数
      

  3.   

    用户子定义条件所涉及到的变量应该是有限的个数。这没有问题吧?
    制定一个函数:uf_myf()返回值:整形().....-1,失败;0,false;1,true
    参数:a1,a2,......an..........表达式中所有可能涉及到的变量。
          再加一个字符串型参数as_expresion......传入用户定义的表达式
    函数脚本:
    boolean lb_result[],lb_resultleft,lb_resultright,lb_resultmid
    int li_rtn
    string ls_leftexp,ls_rightexp,ls_leftjion,ls_rightjion,ls_jion[]
    if pos(')',as_expression)>0 then //表达式含有()比较复杂先去除()   具体脚本没得分暂不给出,思路:
       取得自左向右第一个反括号“)”,找出与之对应的“(”,找不到就返回-1
    并用messagebox报错。判断“()”的两边是否有表达式,如果有,先判断连接关系是and 还是 or ,分别纪录到ls_leftjion,ls_rightjion,再把两边的表达式分别纪录到ls_leftexp,ls_rightexp
    if 两边都有表达式 then
       if uf_myf(a1,a2,...,an,ls_leftexp)=1 then
          lb_resultleft=true
       elseif uf_myf(a1,a2,...,an,ls_leftexp)=0 then 
          lb_resultleft=false
       else
          return -1
       end if
       //同理取得右边表达式的返回值纪录lb_resultright,()的表达式纪录到 
       ls_resultmid再根据原来纪录的连接关系判断本级函数返回值
       choose case 连接情况
             case 左边表达式
                   if ls_leftjion='and' then
                      if lb_resultleft and lb_resultmid then
                         return 1
                      else
                         return 0
                      end if
                  elseif ls_leftjion='or' then
                      if lb_resultleft or lb_resultmid then
                         return 1
                      else
                         return 0
                      end if
                  else
                      messagebox('error','xxxxxxxxxxx')
                  end if
                   
             case 右边表达式
                   //略
             case  两边表达式
                   //略
             case else
                  return uf_myf(a1,a2,....,an,()中的表达式)
       end choose
    else  //如果没有()
        从左向右查找表达式分别纪录到lb_result[],关系连接纪录到ls_jion[],根据lb_result[i]值用对应的参数ax代替lb_result[i]的位置,根据ls_jion[]组成表达式,
        if 表达式 then
           return 1
        else 
           return 0
        end if    
    end if
    //够麻烦的吧?再现来没事的时候可以当作消遣,可别真拿这个做工作。:)
    这确实是个特别笨的方法,但是可以练习逻辑思维。
    强烈建议你的程序里不要用到。如果是数据窗口的问题,用对象自带的函数把表达式作为参数,大部分问题是能够解决的。把你的项目、客户的需求具体说明一下,比如用户定义什么表达式,根据表达式你打算做哪些数据的处理等。应该有别的方法解决问题。一般程序用不到这么笨的法子。
      

  4.   

    这个太麻烦了
    定义一个计算字段在数据窗口中,然后改变计算字段的表达式为
    if ('a>b and (c>d or d>e',1,0)
    取的该值为aa
    if aa > 0 then
    .....
    else
    ....
    end if
    很简单吧?
      

  5.   

    在pb中dw的describe实现我也想过.但我需要在delphi中实现.所以...
      

  6.   

    如果能把pb的东东做成dll供delphi调用就好了.谁做过?讲讲
      

  7.   

    自定实现例子我给一个建议,
    让客户定义查询条件!
    如有15项查询条件,客户可能只选择其中任意几项,
    界面效果要达一数据窗口建立外部数据源的效果
      name   string
        id     integer
        year   integer
    增加一行后自动增加一条记录
    实际效果可以是
      id    = 16    and  name =  张三  and
        year  > 18    and
    为样,再将查询语句保存至数据库中
    'id = 16 and name = '张三' and year >18'
     保存时还可能保存一个助记码
    如 李四查询5鎴
    调用时读出数据库内容至变量ls_filter
    再调用过滤
    dw_1.setfilter(ls_filter)
    dw_1.filter()
    这样就可以了这些东西只是一个思路,许多东西还是靠自己,
    这样才能做出自己特色的东西来
    抄来不一定是最好的!
      

  8.   

    to: joss(季节...秋至) 
    我要的不是自定义组合查询啊,这个我做过.我要的是自定义表达式啊.不用dw.因为我打算在delphi中用.
      

  9.   

    把公式写到SQL中,查出来就可以了
      

  10.   

    用计算列实现.在GridDrawDataCell中实现计算.
    这样行吗?
      

  11.   

    我要结贴给分啦!to pbworm(pb菜鸟) 兄:
    你的代码我看不大懂,不过有收藏价值
    to sun1976(关羽):
    你可真是小心谨慎啊:)谢谢你的大作.能不能把其余的详细代码和注释发到:[email protected]啊?to  blazingfire(烈焰):
    你的方法可行.需依变量建表,把值插到表中.再select.
      

  12.   

    我准备试三种方法,这几种方法都可行:
    1.在pb中用dw计算列
    2.依变量建表,把值插到表中.再select
    3.关羽兄的方法.写一个分析表达式的函数.但还需要关羽兄支持一下啊.
      

  13.   

    其余的分到这儿领啊:
    http://expert.csdn.net/Expert/topic/1116/1116495.xml?temp=8.036441E-02
      

  14.   

    sun1976(关羽)你的思路没错,可程序也太复杂了。
    这个关键是拆分字符串的问题.
    先找括号,再找and or,再找> , < 什么的,把最里面的计算出来,可以写成递归的.
    别忘了校验字符串.以前我写过,算式表达式,逻辑表达式,如果是数据库相关,还可以生成sql语句,或者是where条件.
    但是逻辑要求比较严格,如果程序代码超过300行,肯定会有问题.