PB可以通过在DW控件的字典中定义数据窗口的排序规则来实现动态排序。具体步骤如下:
-
在DW控件的字典中找到需要排序的列,右键点击该列,选择“列属性”。
-
在弹出的列属性对话框中,选择“数据”选项卡,在“排序”下拉框中选择“动态”,并在“排序表达式”中输入排序规则。
-
排序规则可以是单个列,也可以是多个列的组合,例如:
- 单个列排序:按照某个列升序排序,可以输入该列的名称(如“emp_no”);
- 多列排序:按照多个列的组合排序,例如先按照“dept_no”升序排序,再按照“emp_no”降序排序,可以输入“dept_no ASC, emp_no DESC”。
- 在代码中,可以通过DW控件的“sort()”方法来动态排序,例如:
dw_1.Sort("dept_no ASC, emp_no DESC")
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()
以上就是PB实现数据窗口动态排序的方法,也是目前来说最常见的方法,使用起来最方便,既可以引用列名也可引用列号(如#4表示第四列)来指定序列
下面在介绍两种不同的思路
方法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+” ‘ “)
1.第一种和第二种方法要求数据窗口在生成时是无序的。
2.对于来自不同表单的相同的列名(如student.cid、class.cid)用第二种方法排序实现起来较麻烦,因为在用modify()函数时要特别注意引号的使用。但是第二种方法比第一种方法的执行速度要快