在PB中巧用下拉数据窗口
PowerPB提供了下拉数据窗口(DropDown DataWindow),使数据窗口更灵活、更方便。在用数据窗口进行数据录入时,经常要用到代码录入,即对经常输入的某些值设置代码,录入时直接录入代码即可。例如,有两个表,主表main_table和代码表code_table,录入时主表中需要代码表中的数据,但不允许录入不在代码表中的数据。下面介绍如何使用下拉数据窗口实现上述功能。静态设计下拉数据窗口
首先对主表和代码表设计两个数据窗口dw_main和dw_code,其中dw_main包括字段id、name、本人、city和unit;dw_code包括字段code和data。假设unit字段有几个常用值可使用代码录入,则在设计dw_main时,用鼠标右键点击字段unit,在下拉菜单中选择Properties...(属性),则系统会弹出unit列的属性对话框;在其中选择Edit(编辑)项,并在Style(风格)下拉列表框中选择DropDownDW项;然后在下面的Options(选项)框中作具体的选项配置:在DataWindow下拉框中选择已设计好的代码数据窗口dw_code作为下拉数据窗口;在DisplayColumn(显示列)下拉框中选择code字段;在Data Column(数据列)下拉框中选择data字段 ,这表示显示的是code字段的内容,而实际存于表main_table中的是data字段的内容。至此,数据窗口设计完毕。
设计完数据窗口后,需要建立一个数据录入的窗口(window),名字为w_input;在窗口w_input上建立一个数据窗口的控件dw_1,其属性DataWindow Object Name设为dw_main,并在w_input的open事件中写入下列语句:
dw_1.SetTransObject(SQLCA)
dw_1.Retrieve()
这样,在执行此窗口时,在unit字段上就会出现一个下拉列表框,列出了表code_table中所有的内容,用户可以用鼠标选择录入。
动态改变SQL语句
在上面的例子中,如果表main_table中的字段city也需要代码录入,则还需为city字段新建一个表,这样很麻烦,因为有几个字段需要代码,就需有几个表与之对应。我们可利用下拉数据窗口的一些特点来解决这一问题。可以相应地修改表code_table的结构,加一
个字段field(char(30)),以存储需要代码的字段名,这样,就可利用SQL语句对之进行检索,以得到某字段的所有代码。具体实现如下:
重新设计数据窗口dw_code,把field字段加上并使它不可见(因为用户不需要见到该字段的内容),数据窗口dw_main和窗口w_input的设置同上,只是在数据窗口dw_1中需要进行一些编程。在ItemFocusChanged事件中,加入如下代码:
String ls_sql
Integer rtncode
DataWindowChild field_child
//dwo为该事件的参数,其name属性的值表示获得焦点的字段名
Choose Case lower(dwo.name)
Case ‘city'
//city字段获得焦点
//获得city字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("city",field_child)
If rtncode = -1 Then MessageBox( "Error", "Not a DataWindowChild")
//设置事务对象
field_child.SetTransObject(SQLCA)
//获得下拉数据窗口的SQL语句
ls_sql=field_child.GetSQLSelect()
//重新设置SQL语句,加上Where条件
ls_sql=ls_sql+"Wherefield=‘"+dwo.name+"'"
field_child.SetSQLSelect(ls_sql)
//取得满足条件的数据
field_child.Retrieve()
Case ‘unit'
unit字段获得焦点
//获得unit字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("unit",field_child)
……(此处编程同上)
End Choose
动态设置取值参数
上例中采用动态改变SQL语句,其实,下拉数据窗口有一种更简单的方法就是设置取值参数(Retrieval Arguments),但这种方法适合从固定表中取数据,如果是从动态表(即表名不固定)中取数据,则只能通过改变SQL语句来实现。
修改数据窗口dw_code,在图形方式下,选择Design菜单下的Retrieval Arguments…,设置取值参数的类型为String,名字可任取,假设为field_data。然后在窗口下面的Where标签中选择Column为"code_table.field",Operator为"=",Value为取值参数的值:field_data(变量名前加冒号表示该变量的值),至此,取值参数设置完毕。同上例,也需要在窗口w_input中的数据窗口控件dw_1中的ItemFocusChanged事件中进行如下编程:
Integer rtncode
DataWindowChild field_child
//dwo为该事件的参数,其name属性的值表示获得焦点的字段名
Choose Case lower(dwo.name)
Case ‘city'//city字段获得焦点
//获得city字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("city",field_child)
If rtncode = -1 Then MessageBox( "Error", "Not a DataWindowChild")
//设置事务对象
field_child.SetTransObject(SQLCA)
//利用取值参数取得满足条件的数据,如果没有数据,则插入一空记录,否则系统会提示一个英文对话框,要求输入取值参数的值
If field_child.Retrieve(dwo.name)<1 Then
field_child.InsertRow(0)
Case ‘unit'
//unit字段获得焦点
//获得unit字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("unit",field_child)
……(此处编程同上)
End Choose 这办法不错,我也常用 非常感谢楼主分享,初学中。。。 学习学习!!!!!!!!!
页:
[1]