Describe()
功能:返回数据窗口控件结构方面的指定信息包括DataWindow 对象以及数据窗口
对象中其他对象的属性取值数据窗口中的每个列每个标题等等都是对象各自都有一
组描述其特征的属性参看第6 章数据窗口对象的属性在Describe()函数的参数
中可以通过字符串指定要得到其值的一组属性该函数将会把它们的值作为一个字符串返
回
使用Describe()函数也可以计算表达式的值表达式中可以使用指定行/列的值
语法:dwcontrol.Describe ( propertylist )
参数:dwcontrol 数据窗口控件名
propertylist 属性列表是个字符串由要查看其取值的一个或多个属性或表
达式组成属性以及表达式之间使用空格分隔这里的属性指数据窗口对象的属性
返回值String 该函数返回一个字符串这个字符串由对应于propertylist 中各属性
的具体取值构成各属性值之间使用换行字符~n 分隔
如果属性列表中包含了无效的项比如拼错了属性名或写错了表达式那么Describe()
函数在相应项的位置返回一个惊叹号! 并忽略随后的所有项当某个属性没有值时
Describe()函数在相应位置返回一个问号?
如果某个属性的值是个问号? 那么Describe()函数将在该项位置返回问号并把
问号放置到引号中通常为单引号 '
如果任何参数的值为NULL 则Describe()函数返回NULL
用法使用Describe()函数可以深入理解数据窗口的结构例如我们可以查到数据
窗口都具备哪些区域也有称做带Band 的叫法各列的数据类型是什么等使用
Describe()函数也能够得到数据窗口当前的属性取值之后可以使用数据窗口控件Modify()
函数进行所需的修改
应用程序中经常使用Describe()函数得到数据窗口当前的SELECT 语句然后根据需
要进行修改比如增加WHERE 子句修改排序方式等
当开发人员使用数据窗口画笔以图形化方式创建数据窗口对象选择了操作数据库的
数据源后实际上就定义了某个SELECT 语句在保存数据窗口对象时PowerBuilder
保存的不是标准的SQL SELECT 语句而是以它自己定义格式的SELECT 语句称做
PBSELECT 语句与数据窗口对象保存在一起当应用程序使用Describe()函数得到
Table.Select 属性的值时如果应用程序已经连接到数据库上那么Describe()函数返回SQL
SELECT 语句如果应用程序尚未连接到数据库上那么Describe()函数返回PBSELECT
语句
在Describe()函数的参数中引用数据窗口对象属性的一般语法为
objectname.property
有关数据窗口属性表达式的详细介绍请参阅第6 章数据窗口对象属性的访问方法
节
对数据窗口的某些属性来说Describe()函数将返回一组值每个值之间使用Tab 字符
~t 分隔例如下面的Describe()语句将返回指定数据窗口当前使用的所有带Band
的带名
BandsName=dw_1.Describe( "DataWindow.Bands ")
带名之间使用Tab 字符~t 分隔具有下述的形式数据窗口不同使用的带也略
有区别
header~tdetail~tsummary~tfooter
当应用程序要查看某个列的属性时可以使用列名也可以使用列号使用列号时
在列号前放上#号例如Name 是某个数据窗口的第2 列那么语句
Name=dw_1.Describe( "Name.coltype ")
与
Name=dw_1.Describe( "#2.coltype ")
等价
当我们使用数据窗口画笔创建数据窗口对象时系统自动为列对象和列的标题对象命
名列对象的名称通常与数据库中相应列的名称相同计算列的名称采用Compute_####
表示其中####是四个数字列标题的名称由列对象名加上_t 构成比如数据库某个表
中有个名称为salary 的列当数据窗口对象中包含该列时这个列对象的名称为salary
相应列标题的名称为salary_t
下面介绍一下使用Describe()函数计算表达式的方法
可以把Evaluate()函数作为Describe()函数的参数来计算数据窗口画笔表达式的值
Evaluate()函数的语法格式为
Evaluate ( 'expression ', rownumber )
这里expression 是希望计算其值的数据窗口画笔表达式rownumber 是数据行的行号
画笔表达式根据该行的数据计算其值在画笔表达式中可以使用数据窗口画笔函数有关
数据窗口画笔函数的详细介绍请参阅第6 章数据窗口画笔函数节例如下面的语句
根据数据窗口第3 行salary 列的值返回255 或0
ls_ret = dw_1.Describe( "Evaluate( 'If(salary > 100000, 255, 0) ', 3) ")
一般来说我们使用数据窗口控件函数来得到数据窗口中数据值但是有些数据窗
口画笔函数例如LookUpDisplay()函数不能在代码中直接调用此时在Describe()函
数中利用Evaluate()函数进行计算就成为唯一的选择
示例1 假设有个名字为dw_emp 的数据窗口控件该控件关联的数据窗口对象中由
两个列名称分别为emp 和empname 相应列标题对象的名称分别为emp_h 和empname_h
另外state 不是该数据窗口中的一个对象使用该选择的目的是为了演示Describe()函数
对不正确属性设置的处理程序执行下述代码后
string ls_request, ls_report
ls_request = "DataWindow.Bands DataWindow.Objects "&
+ "empname_h.Text " &
+ "empname_h.Type emp.Type emp.Coltype " &
+ "state.Type empname.Type empname_h.Visible "
ls_report = dw_1.Describe(ls_request)
变量ls_report 的值为
header~tdetail~tsummary~tfooter~Nemp~tempname~temp_h~tempname_h~N
"Employee~R~NName "cd~N text~N column~Nchar(20)~N!
结果中惊叹号的出现表示Describe()的参数中出现的错误的项即原本没有的state 列
示例2 下面的语句在调用GetItemNumber()函数得到salary 列的值之前首先检查该
列的数据类型
string ls_data_type
integer li_rate
ls_data_type = dw_1.Describe( "salary.ColType ")
IF ls_data_type = "number " THEN
li_rate = dw_1.GetItemNumber(5, "salary ")
ELSE
. . . // 其他处理
END IF
示例3 下面的语句利用列名得到当前列的数据类型这段代码要在数据窗口控件的
事件处理程序中使用在其他地方使用时需要把This 替换为实际的数据窗口控件名
s = This.Describe(This.GetColumnName()+ ".ColType ")
示例4 下面的代码段是数据窗口控件ScrollVertical 事件的事件处理程序的一部分
该代码段的功能是当用户滚动数据窗口不管是按箭头键还是移动滚动条进行滚动时
把数据窗口中第一个可见行设置为当前行
s = This.Describe( "DataWindow.FirstRowOnPage ") //得到第一个可见行的行号
IF IsNumber(s) THEN This.SetRow(Integer(s)) //设置为当前行.
示例5 下面的代码使用了Describe()的Evaluate()函数其功能是得到state_code 列的
显示值该列使用了下拉数据窗口DropDownDataWindow 编辑风格这段代码应该在
发生过ItemChanged 事件后执行这样用户所选值已经被放入了相应的缓冲区为了安全
下面的代码放置在名称为getdisplayvalue 的数据窗口用户自定义事件中
string rownumber, displayvalue
rownumber = String(dw_1.GetRow())
displayvalue = dw_1.Describe( &
"Evaluate( 'LookUpDisplay(state_code) ', " &
+ rownumber + ") ")
在数据窗口的ItemChanged 事件中可以编写下述代码来邮寄用户自定义事件
getdisplayvalue
dw_1.PostEvent( "getdisplayvalue ")
示例6 下面的代码是某个数据窗口控件ItemError 事件处理程序的一部分其功能是
把当前出错的数据项的值置为空除String 类型的列外其他类型的列不能置为空字符串
那样将产生数据类型不匹配的错误代码中Data 和row 是ItemError 事件的参数
string s
s = This.Describe(This.GetColumnName() + ".Coltype ")
CHOOSE CASE s
CASE "number "
IF Trim(data) = " " THEN
integer null_num
SetNull(null_num)
This.SetItem(row, This.GetColumn(), null_num)
RETURN 3
END IF
CASE "date "
IF Trim(data) = " " THEN
date null_date
SetNull(null_date)
This.SetItem(row, This.GetColumn(), null_date)
RETURN 3
END IF
. . . // 您可以自行增加对其他数据类型的处理
END CHOOSE