如何获取pbl中的所有DataWindow名称

guest78978 2008-09-20 04:20:24
能不能在程序中动态获取到一个pbl中的所有数据窗口的名称
...全文
333 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
guest78978 2008-09-21
  • 打赏
  • 举报
回复
谢谢jlwei888 和dawugui 。
jlwei888 的回答简单明了符合我的要求。
dawugui 讲的这5个系统表我也经常使用,这些表的内容是数据窗口连接过的数据库表,或者是在Database Connect后对字段注释等进行修改后,才会有记录出现在这些系统表中,也是PB很有用的资源。

揭贴了
jlwei888 2008-09-20
  • 打赏
  • 举报
回复

string s
s = LibraryDirectory ( GetLibraryList ( ), DirDataWindow! )


messagebox('',s)
dawugui 2008-09-20
  • 打赏
  • 举报
回复
这个应该可以通过系统表来做,我贴个东西,你自己看看吧.




PB扩展属性系统表及其应用













(独孤求败二零零四年一月二十四日整理于深圳市南山区)



在PB第一连接数据库时,会自动在用户数据库中建立扩展属性数据字典,一共有5个以”pbcat”为前缀的表,分别是:pbcatcol、pbcatedt、pbcatfmt、pbcattbl和pbcatvld,这就是所谓的PB扩展属性系统表(Extended Attribute System Table),有叫PB Catalog Table。各表说明如下:
pbcattbl:数据库中的表
pbcatcol:数据库中的列
pbcatedt:编辑风格
pbcatfmt:显示格式
pbcatvld:有效性规则
PB扩展属性系统表保存了数据库中的表、列、显示格式、有效性规则和编辑风格等信息。当在数据库画板中增加或者删除字段时,相应地在pbcatcol和pbcattbl表中有一条相关记录自动插入或删除;同样,如果增加扩展属性,那么在pbcatfmt、pbcatvld和pbcatedt表中,也会建立相应的记录。

一、系统表说明
1、pbcattbl:数据库中的表,各字段说明如下:
字 段 名 说 明
pbt_tnam 表名
pbt_tid 表的Sql Server Object ID(仅用于Sql Server)
pbt_ownr 表的属主
pbd_fhgt 数据字体高度,以PB中的单位表示
pbd_fwgt 数据字体笔划粗细(400=Normal,700=Bold)
pbd_fitl 数据字体是否斜体(Y=Yes,N=No)
pbd_funl 数据字体是否为加下划线(Y=Yes,N=No)
pbd_fchr 数据字体字符(0=ANSI,1=Symbol,255=OEM)
pbd_fptc 数据字体的字符间距和系列,由2个常数相加得到Pitch(0=Default,1=Fixed,2=Varible)
Family(0=无所谓,16=Roman,32=Swiss,48=Modern,64=Scrit,80=Decorative)
pbd_ffce 数据字体的字形
pbh_fhgt 标题字体高度,以PB中的单位表示
pbh_fwgt 标题字体笔划粗细(400=Normal,700=Bold)
pbh_fitl 标题字体是否斜体(Y=Yes,N=No)
pbh_funl 标题字体是否为加下划线(Y=Yes,N=No)
pbh_fchr 标题字体字符(0=ANSI,1=Symbol,255=OEM)
pbh_fptc 标题字体的字符间距和系列,由2个常数相加得到Pitch(0=Default,1=Fixed,2=Varible)
Family(0=无所谓,16=Roman,32=Swiss,48=Modern,64=Scrit,80=Decorative)
pbh_ffce 标题字体的字形
pbl_fhgt 标签字体高度,以PB中的单位表示
pbl_fwgt 标签字体笔划粗细(400=Normal,700=Bold)
pbl_fitl 标签字体是否斜体(Y=Yes,N=No)
pbl_funl 标签字体是否为加下划线(Y=Yes,N=No)
pbl_fchr 标签字体字符(0=ANSI,1=Symbol,255=OEM)
pbl_fptc 标签字体的字符间距和系列,由2个常数相加得到Pitch(0=Default,1=Fixed,2=Varible)
Family(0=无所谓,16=Roman,32=Swiss,48=Modern,64=Scrit,80=Decorative)
pbl_ffce 标签字体的字形
pbl_cmnt 表的注释

2、pbcatcol:数据库中的列,各字段说明如下:
字 段 名 说 明
pbc_tnam 表名
pbc_tid 表的Sql Server Object ID
pbc_ownr 表的属主
pbc_cnam 列名
pbc_cid Sql ServerColumn ID
pbc_labl 标签
pbc_lpos 标签位置(23=左边,24=右边)
pbc_hdr 标题
pbc_hpos 标题位置(23=左边,24=右边,25=中间)
pbc_jtfy 对齐方式(23=左边,24=右边)
pbc_mask 显示格式的名称
pbc_case 大小写(26=Actual,27=Upper,28=Lower)
pbc_hght 列高度
pbc_wdth 列宽度
pbc_ptrn 有效规则的名称
pbc_bmap 位图/图片(Y=Yes,N=No)
pbc_init 初始值
pbc_cmnt 列的注释
pbc_edit 编辑风格
pbc_tag (保留)

3、pbcatfmt:显示风格,各字段说明如下:
字 段 名 说 明
pbf_name 显示风格的名称
pbf_frmt 显示风格
pbf_type 格式应用于何种数据类型
pbf_cntr 并发用法标志

4、pbcatvld:有效性规则,各字段说明如下:
字 段 名 说 明
pbv_name 有效性规则的名称
pbv_vald 有效性规则
pbv_type 有效性规则作用的数据类型
pbv_cntr 并发用法标志
pbv_msg 有效性规则出错信息

5、pbcatedt:编辑风格,各字段说明如下:
字 段 名 说 明
pbe_name 编辑风格的名称
pbe_edit 编辑风格
pbe_type 编辑风格类型:85=CheckBox,86=RadioButton,87=DropDownListBox,
88=DropDownDataWindow,89=Edit,90=Edit Mask
pbe_cntr 修改次数计数器
pbe_segn 对于PNCatEdt标志中需要多行的编辑类型,指定行循序
pbe_flag 编辑风格标志
pbe_work 附加域

二、相关知识
1、PB扩展属性系统表在PB第一连接数据库时会建立,不过此时连接数据库的用户应该具有建表等相应权限。
2、PB扩展属性系统表是PB自动维护的,但如果对数据库表的结构的修改等操作是在其他数据库工具完成,而没有通过PB,例如在ISQL中建立表、增加表字段或者删除表,系统表不会自动修改。只有在PB中修改表定义,系统表才相应改动。上面的这些信息要删除的话,可以通过PB的Sync Extended Attributes同步功能来完成。

三、应用实例
1、数据库设置,见附件(pbbook.db)
2、建立一个工作空间(workspace),取名为:systemtable。
3、建立一个应用(application),取名为:systemtable。
4、建立一个窗口,取名为:w_test,内置如下控件:
控件名 类型 说明
ddlb_table DropDownListBox 显示数据库中的表
lb_column ListBox 显示当前表的所有列
st_1 Static Text 选择表
st_2 Static Text 选择字段
cb_create Command Button 创建数据窗口
cb_close Command Button 关闭窗口
dw_1 DataWindow 创建数据窗口的结果,Datawindow Object name为空。

5、设置窗口中相关控件的属性
1)、ddlb_table:Sorted设置为false
2)、lb_column:Sorted设置为false,MultiSelect属性设置为True,VscrollBar设置为True。

6、定义窗口实例变量
string is_table[] //所有表
string is_column[] //当前表的所有列
string is_colmnt[] //当前表所有列注释
string is_cur_table //当前表

7、窗口的open事件:
string ls_tnam
string ls_cmnt
integer li_i
//定义游标(取表名及注释)
DECLARE get_table CURSOR FOR
SELECT "pbcattbl"."pbt_tnam",
"pbcattbl"."pbt_cmnt"
FROM "pbcattbl" ;
//打开游标
Open get_table;
li_i = 1
Fetch get_table into :ls_tnam, :ls_cmnt;
Do while sqlca.sqlcode = 0
If Not IsNull(ls_cmnt) and ls_cmnt <> '' then
is_table[li_i] = ls_tnam //记录表名
ddlb_table.additem( ls_cmnt)//加载到列表框
li_i ++
End if
Fetch get_table into :ls_tnam, :ls_cmnt;
Loop
//关闭游标
Close get_table;

8、ddlb_table的SelectionChanged事件:
string ls_tnam //表名
string ls_cnam //列名
string ls_cmnt //列注释
integer li_i
is_cur_table = is_table[Index] // 当前表名
//定义游标,取列名及列注释
DECLARE get_column CURSOR FOR
SELECT "pbcatcol"."pbc_cnam",
"pbcatcol"."pbc_cmnt"
FROM "pbcatcol"
where "pbcatcol"."pbc_tnam" = :is_cur_table;
//重置数据窗口
lb_column.reset( )
li_i = 1
Open get_column;
Fetch get_column into :ls_cnam, :ls_cmnt;
Do while sqlca.sqlcode = 0
If not isnull(ls_cmnt) and ls_cmnt <> '' then
is_column[li_i] = ls_cnam //保存列名,创建数据窗口时用
is_colmnt[li_i] = ls_cmnt //保存列注释,创建数据窗口汉化标题
lb_column.additem(ls_cmnt ) //加载到列表框
li_i ++
End if
Fetch get_column into :ls_cnam, :ls_cmnt;
Loop
Close get_column;

9、cb_create的clicked事件:
integer li_itemcount
integer li_i
integer li_Index
string ls_syntax, ls_sqlselect
string ls_Errors, ls_errmsg

//重置数据窗口
dw_1.Reset()
//如果没有列或没有列选中,则返回
li_itemcount = lb_column.TotalItems ( )
If li_itemcount <= 0 then return
IF lb_column.totalselected( ) <= 0 then return
For li_Index = 1 to li_itemcount
li_i = lb_column.State ( li_Index )
If li_i = 1 then //选中
ls_sqlselect = ls_sqlselect + "," + is_column[li_Index]//列
End if
Next
//去除最前一个“,”号
ls_sqlselect = Right(ls_sqlselect, len(ls_sqlselect) - 1)
//动态创建数据窗口对象DataWindow
ls_sqlselect = "select " + ls_sqlselect + " from " + is_cur_table
ls_syntax = sqlca.syntaxfromsql(ls_sqlselect, "style(type=grid)", ls_errmsg)
IF Len (ls_errmsg) > 0 THEN
MessageBox("创建失败", "错误: " + ls_errmsg)
RETURN
END IF
dw_1.create (ls_syntax, ls_Errors)
IF Len(ls_Errors) > 0 THEN
MessageBox("创建失败", "错误: " + ls_Errors)
RETURN
END IF
//汉化标题区(Header Band)文本
For li_Index = 1 to li_itemcount
dw_1.modify(is_column[li_Index] + "_t.text = '" + is_colmnt[li_Index] + "'")
Next
//检索数据
dw_1.settransobject(sqlca);
dw_1.retrieve()

10、cb_close的clicked事件:
Close(parent)

11、效果图:



1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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