PB按公式自动计算问题

金大哈 2008-11-27 11:27:01
公式自动计算问题:
1.有个公式表:公式代码、公式名称、定义的公式【可维护】
2.在另外一个界面用到公式计算【不是简单的计算列】利用定义的公式计算(公式除了系数外其它字段全部来自数据库表,提供选择)
这个公式可能会用到若干个表的数据【其中表字段及汉字名称可用另一个表维护】

麻烦各位高手给予指点怎么计算效率好点
我曾用过动态sql语句+游标 不过速度很慢,计算1000条数据要3000秒左右

公式表及界面【a、b、d、c、k取自3-5不同的表,有相应的关联关系对应】
公式代码 公式名称 公式
A1 公式1 (a+b)/c*1.2-d+k
A2 公式2 (a*c/d)/2
用公式的表及界面
ABC5046982 物料1 公式计算 A1
ABM5046983 物料2 公式计算 A1
ABD5046984 物料3 公式计算 A2
ABK5046985 物料4 公式计算 A2


...全文
804 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
金大哈 2008-12-01
  • 打赏
  • 举报
回复
用sql 写出来了
@item_data 为table50,table51 需要计算字段的任意组合
@formula_no 为计算公式代码

exec ('select table50.item_no, table51.dept_id,table51.wkct_id,table51.process_id,'+@item_data+' as '''+@formula_no+'''' +
' from table51,table50 '+
' where (table50.wkct_id = table51.wkct_id ) and (table51.dept_id = table50.dept_id)and '+
'(table50.item_no = table51.item_no)and(table50.meter_type_wsp = table51.meter_type_wsp) and '+
' table51.meter_type_wsp = '''+@meter_type_wsp+''' and table51.formula_no = '''+@formula_no+''' '+
' order by table50.meter_type_wsp, table51.dept_id,table51.wkct_id, table51.process_id,table50.item_no ')


liubocy 2008-11-28
  • 打赏
  • 举报
回复
不说什么了,看效果吧

Methodor 2008-11-28
  • 打赏
  • 举报
回复
借助dw可实现简单的公式计算,楼主的问题借助dw应该是难实现的-估计公式里面的变量来源比较复杂,不可能放到一个dw中去...

解决这个问题需要楼主把问题分析清楚,描述清楚复杂度先,比如变量的来源与类型\处理方式等等,这样归类好之后实现就容易了,否则是无法获得满意的结果的...

如果楼主公式中的a\b\d\c\k\等所有变量均为可通过简单连接获得的表字段值,那用dw应该很容易实现了...

假如这些变量中有比较复杂的情况,比如a是通过表X的多个字段的多行数据+输入参数经过复杂计算得到,B又是由某几个表加参数经过一定计算获得....这样的话通过dw是无法实现的...

先归类分析清楚公式中的变量的来源和类型...
leef_zh 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jjl_sky 的回复:]
leef_zh 你说的问题是对的

如果动态创建的话有点不好,若事先要用创建的那个列问题就暴露了


我还是想知道14楼后面提出的问题怎么解决
[/Quote]

如果你找到怎么解决这个问题,麻烦发一份给我,谢谢了!
zyf8167@163.com
liubocy 2008-11-28
  • 打赏
  • 举报
回复
dw_1.describe("Evaluate('" + exp + "'," + string(row) + ")")

=============

你试试是返回一行还是所有!
金大哈 2008-11-28
  • 打赏
  • 举报
回复
leef_zh 你说的问题是对的

如果动态创建的话有点不好,若事先要用创建的那个列问题就暴露了


我还是想知道14楼后面提出的问题怎么解决
leef_zh 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jjl_sky 的回复:]
动态创建计算列应该有一定的局限性 只能计算同一种公式

liubocy 的
dw_1.describe("Evaluate('" + exp + "'," + string(row) + ")")
也有一定的局限性一次只能返回一个结果 ,多次计算就的循环


二者结合起来还行

Chenghj 的判断我在自定义公式的时候已经做判断了 ,在运行过程中我也做了检测避免除数为0


我有个想法就是 如果要能把定义的公式作为变量传入存储过程 并且实现计算的功能就好了(放在查询…
[/Quote]
我是新手,见笑了!

不用动态创建计算列了,直接在DW中建好就行了,然后在程序中修改它的expression!
这样可以计算不同公式!
this.object.compute_1.Expression = string(this.object.compute_1.Expression) + "+ 1"
金大哈 2008-11-28
  • 打赏
  • 举报
回复
动态创建计算列应该有一定的局限性 只能计算同一种公式

liubocy 的
dw_1.describe("Evaluate('" + exp + "'," + string(row) + ")")
也有一定的局限性一次只能返回一个结果 ,多次计算就的循环


二者结合起来还行

Chenghj 的判断我在自定义公式的时候已经做判断了 ,在运行过程中我也做了检测避免除数为0


我有个想法就是 如果要能把定义的公式作为变量传入存储过程 并且实现计算的功能就好了(放在查询列中 实现计算)

望高手指点



liubocy 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 jjl_sky 的回复:]
给 leef_zh 好的,有就发出来共享

LIUBOCY 理解你的意思了 呵呵 不好意思,我的错
不过你的方法也不太合适,用起来也比较麻烦
因为有许多计算公式
[/Quote]

加分给你用sql做出来
金大哈 2008-11-28
  • 打赏
  • 举报
回复
给 leef_zh 好的,有就发出来共享

LIUBOCY 理解你的意思了 呵呵 不好意思,我的错
不过你的方法也不太合适,用起来也比较麻烦
因为有许多计算公式

liubocy 2008-11-28
  • 打赏
  • 举报
回复
画板
liubocy 2008-11-28
  • 打赏
  • 举报
回复
数字的:
金大哈 2008-11-27
  • 打赏
  • 举报
回复
liubocy 你的方法应该是要把计算的字段全部放在当前数据窗口上吧


还有用过程的话,
我想了想应该有多少个公式就写多少个
或者不同公式传不同参数进入按不同方式计算

用过程有个问题
就是我现在计算8000个物料的话每个物料代码长度为21
这样就8000*21个字符了
这个参数怎么传入存储过程

有什么好的方法没有
liubocy 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liubocy 的回复:]
做个全局函数,f_getexp( string exp, int row ) returns string
函数代码:
string ls_ret

if isvalid(w_1) then w_1.dw_1.describe("Evaluate('" + exp + "'," + string(row) + ")")
=========================================================================================

做个dw,里面的列:a,b,c,d,k,exp(公式列),再加个计算域,计算域公式为:f_getexp( exp, getrow() )

应该可行吧,就是不知道速…
[/Quote]

函数代码:
string ls_ret

if isvalid(w_1) then ls_ret = w_1.dw_1.describe("Evaluate('" + exp + "'," + string(row) + ")")

return ls_ret
eviler 2008-11-27
  • 打赏
  • 举报
回复
游标少用 ,效率出了名的低,就一个用着简单
sjq521521 2008-11-27
  • 打赏
  • 举报
回复
写在后台数据库里,用个存储过程不就可以提高速度了吗
liubocy 2008-11-27
  • 打赏
  • 举报
回复
做个全局函数,f_getexp( string exp, int row ) returns string
函数代码:
string ls_ret

if isvalid(w_1) then w_1.dw_1.describe("Evaluate('" + exp + "'," + string(row) + ")")
=========================================================================================

做个dw,里面的列:a,b,c,d,k,exp(公式列),再加个计算域,计算域公式为:f_getexp( exp, getrow() )

应该可行吧,就是不知道速度怎么样。

其实这个也可以直接在数据库中构造sql来计算结果的
eviler 2008-11-27
  • 打赏
  • 举报
回复
先存上在数据库中想招吧,使用过程
金大哈 2008-11-27
  • 打赏
  • 举报
回复
我一点击计算按钮个物料需要的信息就根据不同的计算公式分别取值并计算
讲计算结果存表
Chenghj 2008-11-27
  • 打赏
  • 举报
回复
lz是这个意思吗?
string str_a1 = 公式
nPosition = 0
Char_n()
a1 = Expression()
//
//Char_n() 为函数
//Expression()为函数

//Char_n() 函数:
DO
nPosition = nPosition + 1
if nPosition <= len(m_strFunction) then
strCharacter = mid(m_strFunction,nPosition, 1)
else
strCharacter = ''
end if
LOOP WHILE strCharacter = " "
return nPosition


//Expression()函数:
String strOperator
double erg

erg = SimpleExpression()
do while (strCharacter = "+" or strCharacter = "-")
strOperator = strCharacter
Char_n()
if (strOperator = "+") then
erg = erg + SimpleExpression()
elseif (strOperator = "-") then
erg = erg - SimpleExpression()
end if
loop
return erg

//SimpleExpression() 函数:
double s,dum
String strOperator

s = Term()
do while (strCharacter = "*" or strCharacter = "/")
strOperator = strCharacter
Char_n()
if (strOperator = "*") then
s = s * Term()
elseif (strOperator = "/") then
dum = Term()
if (dum <> 0) then
s = s / dum
else
messagebox('错误','被零除!')
end if
end if
loop
return s


//Term()
double t,vz
t = SignFactor()
do while (strCharacter = "^")
Char_n()
vz = SignFactor()

if ((t <= 0 and abs(vz) <= 1) or (t <= 0 and vz <> int(vz))) then
messagebox('错误','Pow()参数无效!')
else
t = pow(t,vz)
end if
loop
return t

//SignFactor()
if (strCharacter = "-") then
Char_n()
return (-1.0) * Factor()
else
return Factor()
end if
加载更多回复(5)

743

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧