需要用户自定义条件,自定义计算公式.每个条件对应一个公式.当符合对应条件时执行相应公式.
把用户定义的条件和公式保存在一个表里.程序运行时从表中读取条件和公式我想把if后面的表达式设成变量.然后程序运行时我可以随时改变它的值.
现在问题是怎样能让用户自定义if后面的东西呢?ls_tj = 'a>b and (c>d or d>e)'
if ls_tj then
...
end if
这肯定不行.
有没有其它的解决方法?分数可加至500
把用户定义的条件和公式保存在一个表里.程序运行时从表中读取条件和公式我想把if后面的表达式设成变量.然后程序运行时我可以随时改变它的值.
现在问题是怎样能让用户自定义if后面的东西呢?ls_tj = 'a>b and (c>d or d>e)'
if ls_tj then
...
end if
这肯定不行.
有没有其它的解决方法?分数可加至500
解决方案 »
- deplhi 如何通过treeNode的data属性来查找treeview对应的treeNode
- 在DES加密算法里,在对串进行加密的时候,第一句就是验证要加密的串最后一位是否为空,这是为为什么呢?
- 求简易方法
- 一个关于WideString和PByteArray的问题,请教大家.
- 如何获取Foxmail新建邮件的主题内容
- 数据库构架编辑器 发布, 现场发送.
- 请问为什么我的编译时会提示说不能输入到原来已经存在的可执行程序中去?
- DBGrid如何将向下的光标键封闭。急急急,在线等待!!!
- 请问到哪能下载到MSCOMM控件。
- 关于数据库的问题
- 如何改变一个panel内所有组件的某一属性?
- 有哪种共享软件能解开pdf文档的密码?
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
第一种方法:如果能用函数问题就简单了,比如setfilter(),describe等
第二种方法:用我自己创造的方法,做个函数,把字符串作为参数传入,返回一个布尔型的值,就是你的表达式的结果。不给分不能告诉你。想知道的话先给我一半得分,再给我发信:[email protected]不过个人的想法不是很高明,可以说是很麻烦的,需要你建立一个函数用到递归调用。如果你觉着满意再给另外一半分数
制定一个函数: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
//够麻烦的吧?再现来没事的时候可以当作消遣,可别真拿这个做工作。:)
这确实是个特别笨的方法,但是可以练习逻辑思维。
强烈建议你的程序里不要用到。如果是数据窗口的问题,用对象自带的函数把表达式作为参数,大部分问题是能够解决的。把你的项目、客户的需求具体说明一下,比如用户定义什么表达式,根据表达式你打算做哪些数据的处理等。应该有别的方法解决问题。一般程序用不到这么笨的法子。
定义一个计算字段在数据窗口中,然后改变计算字段的表达式为
if ('a>b and (c>d or d>e',1,0)
取的该值为aa
if aa > 0 then
.....
else
....
end if
很简单吧?
让客户定义查询条件!
如有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()
这样就可以了这些东西只是一个思路,许多东西还是靠自己,
这样才能做出自己特色的东西来
抄来不一定是最好的!
我要的不是自定义组合查询啊,这个我做过.我要的是自定义表达式啊.不用dw.因为我打算在delphi中用.
这样行吗?
你的代码我看不大懂,不过有收藏价值
to sun1976(关羽):
你可真是小心谨慎啊:)谢谢你的大作.能不能把其余的详细代码和注释发到:[email protected]啊?to blazingfire(烈焰):
你的方法可行.需依变量建表,把值插到表中.再select.
1.在pb中用dw计算列
2.依变量建表,把值插到表中.再select
3.关羽兄的方法.写一个分析表达式的函数.但还需要关羽兄支持一下啊.
http://expert.csdn.net/Expert/topic/1116/1116495.xml?temp=8.036441E-02
这个关键是拆分字符串的问题.
先找括号,再找and or,再找> , < 什么的,把最里面的计算出来,可以写成递归的.
别忘了校验字符串.以前我写过,算式表达式,逻辑表达式,如果是数据库相关,还可以生成sql语句,或者是where条件.
但是逻辑要求比较严格,如果程序代码超过300行,肯定会有问题.