高分求解:dw_1.Describe("DataWindow.Objects")奇怪问题,高手帮忙看看

hch9230 2004-05-11 11:30:23
dw_1.Describe(("DataWindow.Objects")
我在做一个通用查询,动态提取数据窗口的对象.
大部分数据窗口都没有问题.有几个就出现"取出的对象名称重复",数据窗口重新生成,导出去删除再导入也不能解决问题.不知道问题出在哪里?
各位大侠帮帮忙
...全文
327 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxichen 2004-08-01
  • 打赏
  • 举报
回复
还没解决吗?
帮你顶!
qq_net 2004-07-29
  • 打赏
  • 举报
回复
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
cxwsoftware 2004-05-12
  • 打赏
  • 举报
回复
帮你顶
解决了吗?
liujw0211 2004-05-12
  • 打赏
  • 举报
回复
jacksu19(梦幻影像),谢谢你
你说的办法很好,但是我做的处理较复杂,不单是显示这些信息,我要将数据窗口中每一列的名称都要取出来,另外写入刀一个表中,用于动态生成SQL做查询方案。你所说的办法中能否也取出列名?
谢谢你
klbt 2004-05-12
  • 打赏
  • 举报
回复
对dw_1.Describe(("DataWindow.Objects")分解是可以的,注意object的band属性和type属性
txchen 2004-05-12
  • 打赏
  • 举报
回复
贴出你的代码好吗?
hch9230 2004-05-12
  • 打赏
  • 举报
回复
jacksu19(梦幻影像),你所说的办法一样的有重复列
hch9230 2004-05-12
  • 打赏
  • 举报
回复
没有解决呀,各位大脑救救我呀
jacksu19 2004-05-11
  • 打赏
  • 举报
回复
你倒不如直接要一个通用查询的例子?

//
idw_ToActOn = Message.PowerObjectParm

ids_dddwLBrother = Create DataStore
DataWindowChild ldwc_Columns

Integer li_ColCount, li_ColIndex , li_opers
String ls_Column
Long ll_cRow

ias_Operators = {"像...~tLIKE" , "不像...~tNOT LIKE" , "等于~t=" , "大于~t>" , "小于~t<" , "大于等于~t>=" , "小于等于~t<=" , "不等于~t<>" }
ii_Opers = 8

il_Row = 0

g_env.function of_centerWin(this)

li_ColCount = Integer(idw_ToActOn.Object.DataWindow.Column.Count)

dw_criteria.GetChild("colname", ldwc_Columns)

ias_ColDataTypes[li_ColCount] = ""

For li_ColIndex = 1 To li_ColCount
ls_Column = wf_strip(idw_ToActOn.Describe(idw_ToActOn.Describe("#" + String(li_ColIndex) + ".Name") + "_t.Text"))
If ls_Column <> "!" Then
ll_cRow = ldwc_Columns.InsertRow(0)
ldwc_Columns.SetItem(ll_cRow, "display_column", ls_Column)
ldwc_Columns.SetItem(ll_cRow, "column_number", li_ColIndex)
ias_ColDataTypes[li_ColIndex] = idw_ToActOn.Describe("#" + String(li_ColIndex) + ".ColType")
End If
Next

/***/
dw_criteria.ClearValues("oper")
For li_opers = 3 to ii_Opers
dw_criteria.SetValue("oper", li_opers, ias_Operators[li_opers])
Next
/***/
dw_criteria.InsertRow(0)
hch9230 2004-05-11
  • 打赏
  • 举报
回复
谢谢你们.
sun1976(关羽观雨),你所说的办法我不是太明白,能不能够再详细一点.
sun1976 2004-05-11
  • 打赏
  • 举报
回复
自己写个函数去空
参数data return ls_data
==================
ls_data=trim(data)
ll_pos=pos(ls_data,' ')
do while ll_pos>0
ls_data=left(ls_data,ll_pos -1)+mid(ls_data,ll_pos+1)
loop

在itemchanged里调用的到没空格的再setitem()
第一章 基础篇1. 第1节 - Mid journey register Discord和Midjourney 并将Midjourney BOT添加至自己的服务器 Midjourney入门到精通2. 第2节 - Midjourney教程 用Mid journey画一条狗 知识点:Midjourney基本用法、U和V是什么、查询账号信息和Midjourney付费套餐说明3. 第3节 - Midjourney 教程 Mid journey imagine指令详解 知识点:Midjourney prompt结构、AR指令4. 第4节 - Midjourney教学 Mid journey imagine指令详解 知识点:用Midjourney V4和Niji模型 画出卡通风格的绘图5. 第5节 - Midjourney教程 CHAOS参数详解 知识点:用Chaos指令激发Mid journey的创造力 第二章 进阶篇6. 第6节 - Midjourney 教学 Seed参数 以图作图 知识点:用Seed指令在Mid journey中进行连续创作7. 第7节 - Midjourney进阶教程 光和权重 知识点:如何通过在midjourney中打光提高图片质感 双冒号权重的实战用法8. 第8节 - Midjourney 角色设计 知识点:在midjourney中进行卡通角色概念设计 通过修改种子角色达到对角色的控制9. 第9节 - Midjourney LOGO设计教学 知识点:--no参数 | remix mode | ChatGPT + Midjourney结合使用10. 第10节 - Midjourney + DALL·E 2 角色设计以图作图 知识点:用DALL·E 2将Midjourney的图片进行拓图和改图 实现角色的连续创作11. 第11节 - Midjourney VS DALL·E 2 AI绘图网站哪家强?用Midjourney和DALL·E 2风别进行人物⧸动物⧸风景⧸风格化⧸设计创作 最全测评12. 第12节 - Midjourney + DALL·E 2 手部修复 知识点:用DALL·E 2修复Mid journey图片的一些问题 通过渐进式修复实现对AI的控制13. 第13节 - Midjourney生成风格化图片 知识点:提交Midjourney一张照片 通过Midjourney进行照片的风格化创作14. 第14节 - Midjourney生成风格化图片 知识点:用过渡图的方式,在Midjourney中进行照片的风格化创作15. 第15节 - Midjourney生成风格化照片 知识点:用过渡图的方式在Midjourney中进行照片的风格化的一点补充说明16. 第16节 - ⧸describe 是啥?Midjourney最新命令⧸describe魔鬼测试 知识点:describe命令用法 | describe风格测试17. 第17节 - ⧸describe 是啥?Midjourney最新命令⧸describe魔鬼测试 知识点:用describe命令识别logo 第三章 常见问题18. 第18节 - Midjourney常见问题解答 知识点:seed获取 | 如何写prompt | 试用和付费 | 描述报错等问题19. 第19节 - Midjourney V5来了!全网最全V5模型测试视频 包括手部⧸面部修复、图片分辨率提升、--iw参数在以图作图中的应用

609

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧