在PowerBuilder中使用資料視窗檢索到的資料往往是無序的,雖然可以通過設定Select語句實現排序的功能,但是資料視窗一旦產生都無法進行動態調整。筆者總結了在已經產生的資料視窗中實現動態排序的三種方法,現介紹給大家。
一、 準備工作
設計1所示的樣本視窗。為了更好地比較三種不同的方法,dw—1中的資料來自兩個表student和class。student表中包含四個欄位sid(學號)、sname(姓名)、saddr(住址)和cid(班號),class表中包含兩個欄位cid(班號)和cname(班級名稱)。
圖1
二、三種方法的來源程式
三種方法中的“執行”按鈕的代碼分別為:
方法1:用SetSQLselect()
string ls—oldsql,ls—newsql,ls—order ls—column ls—oldsql=dw—1.getsqlselect() choose case ddlb—1.text case ″學號″ls—column=″sid″ case ″姓名″ls—column=″sname″ case ″住址″ls—column=″saddr″ case ″班號″ls—column=″class.cid″ case ″班級名稱″ ls—column=″cname″ end choose if rb—1.checked then ls—order=″ASC″ else ls—order=″DESC″ end if ls—newsql=ls—oldsql+″ ORDER BY ″+ & ls—column+″ ″+ls—order if dw—1.setsqlselect(ls—newsql)=-1 then messagebox(″警告″,″資料設定失敗″,stopsign!) else dw—1.settransobject(sqlca) dw—1.reset() dw—1.retrieve() dw—1.setsqlselect(ls—oldsql) end if |
方法2:用describe()和modify()
string ls—mod, ls—order,ls—old,ls—column ls—old=dw—1.describe(′datawindow.table.select′) dw—1.settransobject(sqlca) choose case ddlb—1.text case ″學號″ls—column=″sid″ case ″姓名″ls—column=″sname″ case ″住址″ls—column=″saddr″ case ″班號″ls—column=″class.cid″ case ″班級名稱″ ls—column=″cname″ end choose if rb—1.checked then ls—order=″ASC″ else ls—order=″DESC″ end if ls—mod=″datawindow.table.select=′ ″+ls—old+& ′ORDER BY ″ ′+ls—column+′ ″ ′+ls—order+″ ′ ″ dw—1.modify(ls—mod) dw—1.retrieve() dw—1.modify(″datawindow.table.select= & ′ ″+ls—old+″ ′ ″) |
方法3:用setsort()和sort()
string ls—sort,ls—order,ls—column choose case ddlb—1.text case ″學號″ ls—column=″#1″ case ″姓名″ ls—column=″#2″ case ″住址″ ls—column=″#3″ case ″班號″ ls—column=″#4″ case ″班級名稱″ ls—column=″#5″ end choose if rb—1.checked then ls—order=″A″ else ls—order=″D″ end if ls—sort=ls—column+′′+ls—order dw—1.setsort(ls—sort) dw—1.sort() |
三、三種方法的比較
1.第一種和第二種方法要求資料視窗在產生時是無序的,第三種方法無此要求。
2.對於來自不同表單的相同的列名(如student.cid、class.cid)用第二種方法排序實現起來較麻煩,因為在用modify()函數時要特別注意引號的使用。但是第二種方法比第一種方法的執行速度要快。
3.第三種方法使用起來最方便,既可以引用列名也可引用列號(如#4表示第四列)來指定序列。