PB中實(shí)現(xiàn)數(shù)據(jù)窗口動態(tài)排序的三種方法
2024-07-21 02:10:12
供稿:網(wǎng)友
在powerbuilder中使用數(shù)據(jù)窗口檢索到的數(shù)據(jù)往往是無序的,雖然可以通過設(shè)置select語句實(shí)現(xiàn)排序的功能,但是數(shù)據(jù)窗口一旦生成都無法進(jìn)行動態(tài)調(diào)整。筆者總結(jié)了在已經(jīng)生成的數(shù)據(jù)窗口中實(shí)現(xiàn)動態(tài)排序的三種方法,現(xiàn)介紹給大家。
一、 準(zhǔn)備工作
設(shè)計(jì)如圖1所示的示例窗口。為了更好地比較三種不同的方法,dw—1中的數(shù)據(jù)來自兩個表student和class。student表中包含四個字段sid(學(xué)號)、sname(姓名)、saddr(住址)和cid(班號),class表中包含兩個字段cid(班號)和cname(班級名稱)。
圖1
二、三種方法的源程序
三種方法中的“執(zhí)行”按鈕的代碼分別為:
方法1:用setsqlselect()
string ls—oldsql,ls—newsql,ls—order ls—column
ls—oldsql=dw—1.getsqlselect()
choose case ddlb—1.text
case ″學(xué)號″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(″警告″,″數(shù)據(jù)設(shè)置失敗″,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 ″學(xué)號″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 ″學(xué)號″ 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.第一種和第二種方法要求數(shù)據(jù)窗口在生成時是無序的,第三種方法無此要求。
2.對于來自不同表單的相同的列名(如student.cid、class.cid)用第二種方法排序?qū)崿F(xiàn)起來較麻煩,因?yàn)樵谟胢odify()函數(shù)時要特別注意引號的使用。但是第二種方法比第一種方法的執(zhí)行速度要快。
3.第三種方法使用起來最方便,既可以引用列名也可引用列號(如#4表示第四列)來指定序列。