pb优化

啥地方11 2017-11-23 03:13:54
pb新手,入坑不久后接手了一个离职兄弟的pb程序,发现有两个窗口打开的时候需要很长的时间,可能是初始化的东西太多?也不至于1分钟吧?所以想做一些优化,不知如何下手,还望诸位能人指点
open 事件
win_center(this)
This.TriggerEvent('ue_position')

datetime dt
string s_1,s_2,s_3,s_4,kh1,kh2
DECLARE ls_cur CURSOR FOR
SELECT "KHXXDB"."KHMC"
FROM "KHXXDB" where sjhm is not null and wxsbs='1' and wxshzbs='1' and inval is null;
open ls_cur;
fetch ls_cur into:s_1;
do while sqlca.sqlcode=0
ddlb_1.additem(s_1)
ddlb_14.additem(s_1)
fetch ls_cur into:s_1;
loop
close ls_cur;
em_1.text=string(today())

DECLARE l CURSOR FOR
SELECT "BM_WXCPLB"."SORT_NA"
FROM "BM_WXCPLB"
where id not in('7');
open l;
fetch l into:s_2;
do while sqlca.sqlcode=0
ddlb_4.additem(s_2);
fetch l into:s_2;
loop
close l;

DECLARE ls_2 CURSOR FOR
SELECT DISTINCT JZM FROM JZB WHERE BS<>'7' ;
open ls_2;
fetch ls_2 into:s_3;
do while sqlca.sqlcode=0
ddlb_2.additem(s_3);
fetch ls_2 into:s_3;
loop
close ls_2;


dw_1.settransobject(sqlca)
dw_2.settransobject(sqlca);
dw_3.settransobject(sqlca);
dw_4.settransobject(sqlca);
dw_5.settransobject(sqlca);
dw_6.settransobject(sqlca)
dw_3.retrieve()
//dw_4.retrieve()
int i,j
string khmc

for j=1 to dw_3.rowcount()
khmc=dw_3.getitemstring(j,"khmc")
ddlb_9.additem(khmc)
next

select sysdate into:dt from dual;
em_2.text=string(dt)



ddlb_5.reset()
DECLARE ls_cur4 CURSOR FOR
SELECT "CALL_KH_LEVEL1"."KH_NAME"
FROM "CALL_KH_LEVEL1" where kh_name not in ('哈根达斯','好利来','德克士','肯德基KFC','必胜客PH') and inval='0' ;
open ls_cur4;
fetch ls_cur4 into:s_1;
do while sqlca.sqlcode=0
ddlb_5.additem(s_1)
fetch ls_cur4 into:s_1;
loop
close ls_cur4;

DECLARE ls_gzxz CURSOR FOR
SELECT code,"BM_WX_GDXZ"."MC"
FROM "BM_WX_GDXZ" order by code;
open ls_gzxz;
fetch ls_gzxz into:s_1,:s_2;
do while sqlca.sqlcode=0
ddlb_10.additem(s_1+s_2)
fetch ls_gzxz into:s_1,:s_2;
loop
close ls_gzxz;
ddlb_8.text='48'

/////省份//////////
String ls_sf
declare cursor_sf cursor for

SELECT "BM_PROVINCE"."NAME"
FROM "BM_PROVINCE"
WHERE "BM_PROVINCE"."LEVELTYPE" = '1' and "BM_PROVINCE"."BS" is null and "BM_PROVINCE"."NAME"<>'海外'
order by "BM_PROVINCE"."NAME" asc;

open cursor_sf ;
fetch cursor_sf into:ls_sf;
do while sqlca.sqlcode=0
ddlb_13.additem(ls_sf)
fetch cursor_sf into:ls_sf;
loop
close cursor_sf;

//电话排障备注
String ls_dhpzbz
declare cursor_bz cursor for

SELECT "BM_WX_DHPZGZ"."NAME"
FROM "BM_WX_DHPZGZ"
WHERE "BM_WX_DHPZGZ"."INVAL" = '0'
order by "BM_WX_DHPZGZ"."NAME" asc;

open cursor_bz ;
fetch cursor_bz into:ls_dhpzbz;
do while sqlca.sqlcode=0
ddlb_dhpzgz.additem(ls_dhpzbz)
fetch cursor_bz into:ls_dhpzbz;
loop
close cursor_bz;

//特殊维修类别
String ls_tswxlb
declare cursor_tswxlb cursor for

SELECT "BM_WXTSWXLX"."NAME"
FROM "BM_WXTSWXLX"
WHERE "BM_WXTSWXLX"."INVAL" = '0'
order by "BM_WXTSWXLX"."NAME" asc;

open cursor_tswxlb ;
fetch cursor_tswxlb into:ls_tswxlb;
do while sqlca.sqlcode=0
ddlb_tswxlb.additem(ls_tswxlb)
fetch cursor_tswxlb into:ls_tswxlb;
loop
close cursor_tswxlb;
...全文
1562 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zh1303300 2018-12-29
  • 打赏
  • 举报
回复
早期的pb代码很多都是游标的,现在最后能改成DataStore,还有业务的处理逻辑最好能变动一下,将全局变量根据业务的需求做好分类,当需要什么类的全局变量的时候就处理,不要在open里面一次性处理。
  • 打赏
  • 举报
回复
不要用游标,直接用datawindow,否则游标需要多次访问数据库
ntchance 2018-05-20
  • 打赏
  • 举报
回复
是啊,游标不是随便用的。 要优化思路应该很清晰 ,设断点高度一下就知道,时间花在哪里了,然后再分析那段代码。
DYFDWX 2018-05-10
  • 打赏
  • 举报
回复
尽量用datastore
囡程序猿 2018-05-09
  • 打赏
  • 举报
回复
老板看到你到处用游标,求老板的心理阴影面积
qq_33259475 2018-05-09
  • 打赏
  • 举报
回复
我觉得还是设计上的优化吧,大量的和数据库交互的数据都在初始化时就要retrieve出来, 可以把一部份放到由用户操作后再retrieve出来。
秋天之落叶 2018-05-09
  • 打赏
  • 举报
回复
不知道数量级,尽量少使用游标吧
qq_39247055 2018-02-11
  • 打赏
  • 举报
回复
从事物逻辑,sql语句优化两方面入手,缓存机制的使用我也不会,有大神会的话,介绍一下谢谢
qq_39247055 2018-02-11
  • 打赏
  • 举报
回复
SELECT "BM_WXCPLB"."SORT_NA" FROM "BM_WXCPLB" where id not in('7'); 改成 where id<>'7'
qq_39247055 2018-02-11
  • 打赏
  • 举报
回复
do while sqlca.sqlcode=0 ddlb_1.additem(s_1) ddlb_14.additem(s_1) fetch ls_cur into:s_1; loop 用if语句替换掉
fuxiaoyang13 2018-02-11
  • 打赏
  • 举报
回复
将游标 用datastore替换 试试
wzh2021 2018-01-04
  • 打赏
  • 举报
回复
1、"数据窗口控件"dw_xx绑定的"数据窗口对象"的sql,并没有看到,没法判断。 2、单从看到的sql看起来,应该问题不大,虽然使用了游标。 估计还是得从数据库方面的下手。
WMERP 2018-01-04
  • 打赏
  • 举报
回复
我觉得更多的是数据库的表索引问题,当然这是建立在数据量够多的情况下,我开发的时候碰到过,保存或者运算很慢要5分钟,后来根据select或者DW的where部分进行索引后不到30秒就完成。和程序的执行一般没多大关系,主要是电脑硬件不同速度不同。
MrWhite8023 2018-01-03
  • 打赏
  • 举报
回复
首先打断点,debug下看看哪个位置卡顿的时间比较长,我猜测这几个dw中必有卡顿的,然后就是sql上的优化,以及数据的优化,包括建立必要的索引,等等。以上,望采纳
jyglint 2017-11-24
  • 打赏
  • 举报
回复
在这个窗体里新建一个ue_open事件 然后把open事件中datetime dt开始的代码都移动到这个自定义事件内 在datetime dt那一行处写上PostEvent( ue_open ) 。 酱紫应该能感觉快一点,要做优化的话,再继续优化ue_open里面大堆的代码,这么多看着也累
xiaozhe_song 2017-11-23
  • 打赏
  • 举报
回复
打开调试,设置几个断点,看看那个区间内的代码执行时间长,然后考虑去优化或者窗口open以后在调用~
啥地方11 2017-11-23
  • 打赏
  • 举报
回复
另一个窗口的open事件 string pg,s_1,s_2 String ls_kh1 String ls_pgr win_center(this) dw_1.settransobject(sqlca) dw_2.settransobject(sqlca) dw_3.settransobject(sqlca) dw_4.settransobject(sqlca) dw_5.settransobject(sqlca) dw_6.settransobject(sqlca) dw_7.settransobject(sqlca) dw_8.settransobject(sqlca) dw_9.settransobject(sqlca) ls_pgr=user.user_id if ls_pgr="苏珊" or ls_pgr="林强" then ls_pgr="%" else ls_pgr=ls_pgr+"%" end if pg='0' dw_1.retrieve(pg,ls_pgr) //dw_3.retrieve(pg) //dw_7.retrieve() dw_2.retrieve('%','%') //timer(60) ddlb_2.text='48' st_25.text=user.user_id DECLARE ls_gzxz CURSOR FOR SELECT code,"BM_WX_GDXZ"."MC" FROM "BM_WX_GDXZ" order by code; open ls_gzxz; fetch ls_gzxz into:s_1,:s_2; do while sqlca.sqlcode=0 ddlb_3.additem(s_1+s_2) fetch ls_gzxz into:s_1,:s_2; loop close ls_gzxz; //电话排障备注 String ls_dhpzbz declare cursor_bz cursor for SELECT "BM_WX_DHPZGZ"."NAME" FROM "BM_WX_DHPZGZ" WHERE "BM_WX_DHPZGZ"."INVAL" = '0' order by "BM_WX_DHPZGZ"."NAME" asc; open cursor_bz ; fetch cursor_bz into:ls_dhpzbz; do while sqlca.sqlcode=0 ddlb_dhpzgz.additem(ls_dhpzbz) fetch cursor_bz into:ls_dhpzbz; loop close cursor_bz; /////省份////////// String ls_sf declare cursor_sf cursor for SELECT "BM_PROVINCE"."NAME" FROM "BM_PROVINCE" WHERE "BM_PROVINCE"."LEVELTYPE" = '1' and "BM_PROVINCE"."BS" is null and "BM_PROVINCE"."NAME"<>'海外' order by "BM_PROVINCE"."NAME" asc; open cursor_sf ; fetch cursor_sf into:ls_sf; do while sqlca.sqlcode=0 ddlb_10.additem(ls_sf) fetch cursor_sf into:ls_sf; loop close cursor_sf; // String ls_wxs DECLARE ls_cur CURSOR FOR SELECT "KHXXDB"."KHMC" FROM "KHXXDB" where sjhm is not null and wxsbs='1' and wxshzbs='1' and inval is null; open ls_cur; fetch ls_cur into:ls_wxs; do while sqlca.sqlcode=0 ddlb_14.additem(ls_wxs) fetch ls_cur into:ls_wxs; loop close ls_cur; //特殊维修类别 String ls_tswxlb declare cursor_tswxlb cursor for SELECT "BM_WXTSWXLX"."NAME" FROM "BM_WXTSWXLX" WHERE "BM_WXTSWXLX"."INVAL" = '0' order by "BM_WXTSWXLX"."NAME" asc; open cursor_tswxlb ; fetch cursor_tswxlb into:ls_tswxlb; do while sqlca.sqlcode=0 ddlb_tswxlb.additem(ls_tswxlb) fetch cursor_tswxlb into:ls_tswxlb; loop close cursor_tswxlb;

1,072

社区成员

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

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