在PB中巧用下拉数据窗口 PowerBuilder作为目前比较流行的一种开发工具，有其独到之处，那就是数据窗口(DataWindow)。可以说，数据窗口是PowerBuilder的核心，在对数据库的开发过程中，无论是录入、查询、统计还是报表，都离不开数据窗口。但是，除了数据窗口，PB还提供了下拉数据窗口(DropDownDataWindow)，下拉数据窗口的使用，使数据窗口更灵活，更方便，下面举例介绍在数据窗口中使用下拉数据窗口的一些技巧。 在用数据窗口作数据录入时，经常用到代码录入，即对经常输入的某些值设置代码，录入时直接录入代码即可。例如，有两个表，主表main_table和代码表code_table，结构如下：

下面，详细讨论如何使用下拉数据窗口：
静态设计下拉数据窗口
首先对主表和代码表设计两个数据窗口dw_main和dw_code，其中dw_main包括字段id，name，sex，city和unit；dw_code包括字段code和data。假设unit字段有几个常用值可使用代码录入，则在设计dw_main时，用鼠标右键点击字段unit，在下拉菜单中选择Properties...(属性)，则系统会弹出unit列的属性对话框，在其中选择Edit(编辑)项，并在Style(风格)下拉列表框中选择DropDownDW项，然后在下面的Options(选项)框中作具体的选项配置：在DataWindow下拉框中选择已设计好的代码数据窗口dw_code作为下拉数据窗口；在DisplayCol-umn(显示列)下拉框中选择code字段；在DataColumn(数据列)下拉框中选择data字段，这表示显示的是code字段的内容，而实际存于表main_table中的是data字段的内容。至此，数据窗口设计完毕。
设计完数据窗口后，需要建立一个数据录入的窗口(window)，名字为w_input，在窗口w_input上建立一个数据窗口的控件dw_1，其属性DataWindowObjectName为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中需要进行一些编程，具体是在ItemFocus Changed事件中，加入如下的代码：
Stringls_sql
Integerrtncode
DataWindowChildfield_child
//dwo为该事件的参数，其name属性的值表示获得焦点的字段名
ChooseCaselower(dwo.name)
Case'city' //city字段获得焦点
//获得city字段下拉数据窗口的句柄
rtncode=dw_1.GetChild("city",field_child)
Ifrtncode=-1ThenMessageBox("Error","NotaDataWindowChild")
//设置事务对象
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)
......(此处编程同上一样)
EndChoose
动态设置取值参数
上例中，是采用动态改变SQL语句实现的，其实，下拉数据窗口有一种更简单的方法就是设置取值参数(RetrievalArg-uments)但这种方法适合从固定表中取数据，如果是从动态表(即表名不固定)中取数据，则只能通过改变SQL语句来实现。
修改数据窗口dw_code，在图形方式下，选择Design菜单下的RetrievalArguments...，设置取值参数的类型为String，名字可任取，假设为field_data，然后在窗口下面的Where标签中选择Column为“code_table.field”，Operator为“＝”，Value为取值参数的值:field_data(变量名前加冒号表示该变量的值)，至此，取值参数设置完毕。同上例，也需要在窗口w_input中的数据窗口控件dw_1中的ItemFocusChanged事件中进行如下的编程：
Integerrtncode
DataWindowChildfield_child
//dwo为该事件的参数，其name属性的值表示
获得焦点的字段名
ChooseCaselower(dwo.name)
Case'city' //city字段获得焦点
//获得city字段下拉数据窗口的句柄
rtncode=dw_1.GetChild("city",field_child)
Ifrtncode=-1ThenMessageBox("Error","NotaDataWindowChild")
//设置事务对象
field_child.SetTransObject(SQLCA)
//利用取值参数取得满足条件的数据，如果没有数据，
则插入一空记录，//否则系统会提示一个英文对话框，
要求输入取值参数的值。
Iffield_child.Retrieve(dwo.name)<1Then
field_child.InsertRow(0)
Case'unit'
//unit字段获得焦点
//获得unit字段下拉数据窗口的句柄
rtncode="dw_1.GetChild("unit",field_child)"
......(此处编程同上一样)
EndChoose
至此，已介绍了使用下拉数据窗口的一些技巧，希望能给读者提供一些帮助。
(风云)