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;
uj5u.com熱心網友回復:
另一個視窗的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;
uj5u.com熱心網友回復:
打開除錯,設定幾個斷點,看看那個區間內的代碼執行時間長,然后考慮去優化或者視窗open以后在呼叫~uj5u.com熱心網友回復:
在這個表單里新建一個ue_open事件然后把open事件中datetime dt開始的代碼都移動到這個自定義事件內
在datetime dt那一行處寫上PostEvent( ue_open ) 。
醬紫應該能感覺快一點,要做優化的話,再繼續優化ue_open里面大堆的代碼,這么多看著也累
uj5u.com熱心網友回復:
首先打斷點,debug下看看哪個位置卡頓的時間比較長,我猜測這幾個dw中必有卡頓的,然后就是sql上的優化,以及資料的優化,包括建立必要的索引,等等。以上,望采納uj5u.com熱心網友回復:
我覺得更多的是資料庫的表索引問題,當然這是建立在資料量夠多的情況下,我開發的時候碰到過,保存或者運算很慢要5分鐘,后來根據select或者DW的where部分進行索引后不到30秒就完成。和程式的執行一般沒多大關系,主要是電腦硬體不同速度不同。uj5u.com熱心網友回復:
1、"資料視窗控制元件"dw_xx系結的"資料視窗物件"的sql,并沒有看到,沒法判斷。2、單從看到的sql看起來,應該問題不大,雖然使用了游標。
估計還是得從資料庫方面的下手。
uj5u.com熱心網友回復:
將游標 用datastore替換 試試uj5u.com熱心網友回復:
do while sqlca.sqlcode=0ddlb_1.additem(s_1)
ddlb_14.additem(s_1)
fetch ls_cur into:s_1;
loop
用if陳述句替換掉
uj5u.com熱心網友回復:
SELECT "BM_WXCPLB"."SORT_NA"FROM "BM_WXCPLB"
where id not in('7'); 改成 where id<>'7'
uj5u.com熱心網友回復:
從事物邏輯,sql陳述句優化兩方面入手,快取機制的使用我也不會,有大神會的話,介紹一下謝謝uj5u.com熱心網友回復:
我覺得還是設計上的優化吧,大量的和資料庫互動的資料都在初始化時就要retrieve出來, 可以把一部份放到由用戶操作后再retrieve出來。uj5u.com熱心網友回復:
老板看到你到處用游標,求老板的心理陰影面積uj5u.com熱心網友回復:
不知道數量級,盡量少使用游標吧uj5u.com熱心網友回復:
盡量用datastoreuj5u.com熱心網友回復:
是啊,游標不是隨便用的。要優化思路應該很清晰 ,設斷點高度一下就知道,時間花在哪里了,然后再分析那段代碼。
uj5u.com熱心網友回復:
不要用游標,直接用datawindow,否則游標需要多次訪問資料庫uj5u.com熱心網友回復:
早期的pb代碼很多都是游標的,現在最后能改成DataStore,還有業務的處理邏輯最好能變動一下,將全域變數根據業務的需求做好分類,當需要什么類的全域變數的時候就處理,不要在open里面一次性處理。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/13141.html
標籤:基礎類
