PB⽇志-数据窗⼝控件的函数19.Describe() Describe()
功能:返回数据窗⼝控件结构⽅⾯的指定信息包括DataWindow 对象以及数据窗⼝
对象中其他对象的属性取值数据窗⼝中的每个列每个标题等等都是对象各⾃都有⼀
组描述其特征的属性参看第6 章数据窗⼝对象的属性在Describe()函数的参数
中可以通过字符串指定要得到其值的⼀组属性该函数将会把它们的值作为⼀个字符串返
回
使⽤Describe()函数也可以计算表达式的值表达式中可以使⽤指定⾏/列的值
语法:dwcontrol.Describe ( propertylist )
参数:dwcontrol 数据窗⼝控件名
propertylist 属性列表是个字符串由要查看其取值的⼀个或多个属性或表
达式组成属性以及表达式之间使⽤空格分隔这⾥的属性指数据窗⼝对象的属性
返回值String 该函数返回⼀个字符串这个字符串由对应于propertylist 中各属性
的具体取值构成各属性值之间使⽤换⾏字符~n 分隔
如果属性列表中包含了⽆效的项⽐如拼错了属性名或写错了表达式那么Describe()
函数在相应项的位置返回⼀个惊叹号! 并忽略随后的所有项当某个属性没有值时
Describe()函数在相应位置返回⼀个问号?
如果某个属性的值是个问号? 那么Describe()函数将在该项位置返回问号并把
拿走英语问号放置到引号中通常为单引号 '
如果任何参数的值为NULL 则Describe()函数返回NULL
⽤法使⽤Describe()函数可以深⼊理解数据窗⼝的结构例如我们可以查到数据
窗⼝都具备哪些区域也有称做带Band 的叫法各列的数据类型是什么等使⽤
Describe()函数也能够得到数据窗⼝当前的属性取值之后可以使⽤数据窗⼝控件Modify()
函数进⾏所需的修改
understand是什么意思应⽤程序中经常使⽤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
的带名
nudes girl
BandsName=dw_1.Describe( "DataWindow.Bands ")
带名之间使⽤Tab 字符~t 分隔具有下述的形式数据窗⼝不同使⽤的带也略
有区别
header~tdetail~tsummary~tfooter
当应⽤程序要查看某个列的属性时可以使⽤列名也可以使⽤列号使⽤列号时
在列号前放上#号例如Name 是某个数据窗⼝的第2 列那么语句
sirrahName=dw_1.Describe( "ltype ")
与
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 " &sleep walker
+ "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 ") //得到第⼀个可见⾏的⾏号si ulement
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
an parker
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
aon
END IF
. . . // 您可以⾃⾏增加对其他数据类型的处理
END CHOOSE