PB9.0 效率问匙

茫茫前路 2012-09-23 02:45:02
三个表:
1、消费项目表 记录客户所的消费项目
有2千多条记录

2、客人类型表 记录客户的所有客人类型
有40多个记录

3、特殊折扣表 存放每个客人类型对第一个可折(消费项目表有表示是否可折的字段isdiscount)消费项目的折扣
有4万多条记录

现在消费项目表的项目的可折属性改变:增加了可折消费项目,或者将某些可折的消费项目改成不可折。
现在做程序自动调整特殊折扣表的数据,思路是:
1、处理增加了的可折项目
a、找出在特殊折扣表里没有、而在消费项目里有的可折扣项目,那怕是只有一个客人类型都没有的可折项目;
b、将这些可折项目分别对每一个客人类型往客类折扣表里插入,已有了的就不插入。
2、处理原来可折,现在不可折了的项目;
...

第1种情况的a步骤,系统就不响应了。代码如下,各位大大,我应如何调整思路或代码才能避免这种情况啊?

dw_pricespec.visible = false
dw_discitem.visible = false
dw_customertype.visible = false

dw_pricespec.settransobject( sqlca )

dw_discitem.settransobject( sqlca )
dw_discitem.retrieve( )

dw_customertype.settransobject( sqlca )
dw_customertype.retrieve( )

dw_item.settransobject( sqlca )

long ll_loop1, ll_loop2, ll_loop3
long ll_itemrows, ll_custyperows, ll_pricerows
long ll_row

ll_itemrows = dw_discitem.rowcount( )
ll_custyperows = dw_customertype.rowcount( )

string ls_custypeno, ls_itemno

for ll_loop1 = 1 to ll_itemrows
for ll_loop2 = 1 to ll_custyperows
ls_itemno = dw_discitem.getitemstring( ll_loop1, 'v_itemno' )
ls_custypeno = dw_customertype.getitemstring( ll_loop2, 'v_customertypeno' )

ll_pricerows = dw_pricespec.retrieve( ls_custypeno )

if dw_pricespec.find( "v_itemno = '" + ls_itemno + "'", 1, ll_pricerows ) <= 0 then
ll_row = dw_item.insertrow( 0 )
dw_item.setitem( ll_row, 'typeno', dw_discitem.getitemstring( ll_loop1, 'v_itemtypeno' ) )
dw_item.setitem( ll_row, 'subtypeno', dw_discitem.getitemstring( ll_loop1, 'v_subtypeno' ) )
dw_item.setitem( ll_row, 'itemno', dw_discitem.getitemstring( ll_loop1, 'v_itemno' ) )
dw_item.setitem( ll_row, 'name', dw_discitem.getitemstring( ll_loop1, 'v_name1' ) )
dw_item.setitem( ll_row, 'unit', dw_discitem.getitemstring( ll_loop1, 'v_unit' ) )
dw_item.setitem( ll_row, 'price', dw_discitem.getitemdecimal( ll_loop1, 'n_price' ) )
dw_item.setitem( ll_row, 'priceclub', dw_discitem.getitemdecimal( ll_loop1, 'n_priceclub' ) )
dw_item.setitem( ll_row, 'i_type', dw_discitem.getitemnumber( ll_loop1, 'i_type' ) )

exit
end if
next
next


...全文
203 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
herolion2010 2012-09-27
  • 打赏
  • 举报
回复
很死板的方案...........不能灵活点吗?
sjlion 2012-09-26
  • 打赏
  • 举报
回复
1:
取了表1里可折项目的数据(1000多条记录),与表3里一个个客类的折扣项目比较(每个客类1000多条记录),找出表1里的可折项目在表3里没有的项目。 这个写个SQL就出来了,用不着存储过程。
2.又看下你的需求,像楼上几位说的,如果不需要显示,可以全部用存储过程完成。至于你担心的效率问题,好好写SQL,那点数据量根本不算啥
dyf0130 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 5 楼 的回复:
建议写存储过程
或者用datastore代替dw


这个我担心会影响服务器,进而使得所有工作站此时都运行慢。

不过我会试试,谢谢你的建议!
[/Quote]
用datastore代替dw 做成全局变量,
在程序开始时取1次数据,随时用,不要来回retrieve
茫茫前路 2012-09-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
建议写存储过程
或者用datastore代替dw
[/Quote]

这个我担心会影响服务器,进而使得所有工作站此时都运行慢。

不过我会试试,谢谢你的建议!
茫茫前路 2012-09-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
感觉你的逻辑写的可能有点问题,或许可以不用循环,或者说有更简单的方法实现。
[/Quote]

能说细点或给个具体的方案吗?
茫茫前路 2012-09-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
??!!!!你居然在客户端这样循环?2000*40000,死不了才怪。你的A需求肯定是在 表1 和 表3 外连接之后,然后再在客户端操作啊
[/Quote]


我表3是表1与表2连接的结果,A步骤时,取了表1里可折项目的数据(1000多条记录),与表3里一个个客类的折扣项目比较(每个客类1000多条记录),找出表1里的可折项目在表3里没有的项目。
按你这样说,我是不是要将这个查找的工作写成存储过程在服务器里执行,然后返回结果。如果在服务器里执行,会不会影响服务器,进而造成所有工作站都慢啊?
soar_angel 2012-09-24
  • 打赏
  • 举报
回复
感觉你的逻辑写的可能有点问题,或许可以不用循环,或者说有更简单的方法实现。
sjlion 2012-09-24
  • 打赏
  • 举报
回复
??!!!!你居然在客户端这样循环?2000*40000,死不了才怪。你的A需求肯定是在 表1 和 表3 外连接之后,然后再在客户端操作啊
茫茫前路 2012-09-24
  • 打赏
  • 举报
回复
为什么要马上commit啊,不是要修改完数据提交后才commit的吗?
DYFDWX 2012-09-24
  • 打赏
  • 举报
回复
建议写存储过程
或者用datastore代替dw
952 2012-09-23
  • 打赏
  • 举报
回复
retrieve 後馬上commit

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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