前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PowerBuilder的搜索

PowerBuilder数据窗口技巧(二)_ksbyc_新浪博客 加载中… BYC小屋 http://blog.sina.com.cn/yjsbyc [订阅][手机订阅] 首页 博文目录 图片 关于我 个人资料 ksbyc Qing 微博 加好友 发纸条 写留言 加关注 博客等级: 博客积分:129 博客访问:5,602 关注人气:0 天天美食 精彩图文 相关博文 更多>> 推荐博文 风青杨:中国官场为何频发自杀案 风青杨V 第1051篇&bull;籽儿玉 马未都 朝鲜重臣为何爱玩“失踪”? 丁咚2010 “不能吃肉”的凉山州谁在吃肉? 纸上建筑_ 普通话与普通人 赵普 被“富人”所累的穷人 鄢烈山 “雪龙”号脱困技术分析 航海衣羊 当下中国面临哪些安全威胁 公方彬 13岁“小土豪”他爹是谁 乔志峰 喜闻习总对新疆战略作出重大调整 蔡慎坤 查看更多>> 谁看过这篇博文 加载中… 正文 字体大小:大 中 小 PowerBuilder数据窗口技巧(二) (2008-07-11 19:53:00) 标签: 杂谈 21 数据窗口检查重复行 dw_1.SetSort ("user_id A") dw_1.Sort() dw_1.SetFilter ("user_id = user_id[-1]") dw_1.Filter() if dw_1.RowCount() > 0 then Messagebox("注意", "用户编码重复.") end if dw_1.SetFilter ("") dw_1.Filter() 22 如何在分组形式的DataWindow中分别显示各组的行号 ---- 当我们为Datawindow的每一行显示行号时&#65292;可以简单的放一个表达式为GetRow() ---- 计算列。但是对于分组的Datawindow&#65292;要分别显示各组的行号&#65292;则应使用表达式为 GetRow() - First(GetRow() for Group 1) + 1的计算列。 23 如何能让数据窗口的某几列在其他列横拉时固定不动 //////////////////////////////////////////////////////////////// // 功能说明&#65306;用于冻结左边的滚动栏 // 变更记录: 变更或版本更新的时候 // //////////////////////////////////////////////////////////////// int i if pane = 1 then i = integer(this.o b j e c t.datawindow.horizontalscrollposition2) if i < 1 or isnull(i) then return if scrollpos > 0 then this.o b j e c t.datawindow.horizontalScrollPosition = 0 end if else i = integer(this.Object.DataWindow.HorizontalScrollSplit) if i < 1 or isnull(i) then return if i > scrollpos then this.o b j e c t.datawindow.horizontalScrollPosition2 = i end if end if 24 在数据窗口中如果要使其中一列的属性为只读&#65292;也就是不允许用户修改&#65292;那么只需简单地将这一列的Table Order 设置成0就可。然而&#65292;在有些情况下 需要对这一列的某些行修改&#65292;而某些行不能修改&#65292;这就要用到这一列的protect属性了。打开列的属性中的Expressions&#65292;在protect中输入条件判别 式。例如&#65306;允许用户修改新增加的记录&#65292;而检索出来的记录则不允许修改。条件判别式可以写成如下&#65306; if(isRowNew(),0,1) 在 PowerScript 中可以动态修改 Protect 属性&#65306; dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'") 这样&#65292;DataWindow 中只有新追加的记录可修改&#65292;而其他记录是只读的。 25 控制DATAWINDOW里每页显示的行数 1、在Datawindow中增加一个计算域&#65292;起名为&#65306;ceil_page,此计算域必须放在Detail段中&#65292; Expression中输入 ceiling(getrow()/25) 25表示每页打印25行&#65292;也可以是一个参数。 2、分组,选择菜单RowsCreate Group,选择ceil_page 按ceil_page分组&#65292;并选中New Page On Group Break(意思是新组开始时换页)。 3、将此计算域设为隐藏(在属性页中的expression页中在visible属性中写0)。 4、补空行&#65306; 在窗口的open事件中写如下代码&#65306; long li_count,li_i li_count=dw_1.retrieve() if mod(li_count,25)<>0 then for li_i=1 to 25 - mod(li_count,25) dw_1.insertrow(0) next end if 26 数据窗口的closeQuery事件:提示保存数据 dw_1.AcceptText() IF dw_1.ModifiedCount() + dw_1.DeletedCount() > 0 THEN CHOOSE CASE MessageBox("操作提示","数据已经发生变化,是否保存?",Question!,YesNoCancel!,1) CASE 1 cb_save.TriggerEvent(clicked!) CASE 2 Return 0//不做任何操作直接关闭窗口 CASE 3 Return 1//不会运行Close Event,维持原来的情况 END CHOOSE END IF 27 Getchild函数主要被用来得到一个数据窗口的子数据窗口 该函数在两种情况下可以使用&#65292;1、取出数据窗口对象的下拉式数据窗口&#65307; 2、取出复合风格&#65288;composite&#65289;数据窗口对象里所嵌入的子数据窗口对象。 语法&#65306;integer dwcontrol.GetChild (string name, REF DataWindowChild dwchildvariable ) 例子1 这段程序取出一个composite数据窗口对象的两个子数据窗口&#65292;并对他们进行过滤&#65292;和排序的操作。 String ls_filter DataWindowChild dwc_czrw,dwc_czx//定义子数据窗口变量 dw_dy.Settranso b j e c t(sqlca) dw_dy.Retrieve() dw_dy.GetChild("dw_2",dwc_czrw) dw_dy.Getchild("dw_1",dwc_czx) ls_filter = "czrw_bh = '"+dw_3.GetItemString(dw_3.GetRow(),"czrw_bh")+"'"//过滤条件 dwc_czrw.SetFilter(ls_filter) dwc_czrw.Filter() ls_filter = "czx_rwbh = '"+dw_3.GetItemString(dw_3.GetRow(),"czrw_bh")+"'" dwc_czx.SetSort("czx_sx A") dwc_czx.Sort() dwc_czx.SetFilter(ls_filter) dwc_czx.filter() 当然也可以通过数据共享(ShareData)等方式操作子数据窗口中的数据。 访问复合数据窗口对象.方法 &#65306;dw_dy.o b j e c t.dw_1.o b j e c t.对象 例子2 下拉数据窗口动态过滤 在数据窗口dw_1的ItemFocusChanged事件中写入如下脚本&#65306; Integer rtncode String ls_nowFld,ls_deptid,ls_sql DataWindowChild fld_child rtncode = dw_1.GetChild("Unit_id",fld_child) //获得Unit_id字段名下拉数据窗口的句柄 If rtncode = -1 Then MessageBox("错误!", "不是下拉数据窗口!") fld_child.SetTransObject(SQLCA) //设置事务对象 ls_sql = Lower(fld_child.GetSQLSelect())// 获得DDDW的SQL语句 // 去除Sql 语句中的Where条件子句&#65292; 如原Sql 语句中须有Where条件子句&#65292;此处则需进行较 //复杂的处理&#65292;应视具体情况而定。 if Pos(ls_sql, " where ")>0 then ls_sql = Left(ls_sql,Pos(ls_sql, " where ")) //重新设置Sql 语句中的Where条件子句 ls_deptid=dw_1.Object.dept_id[GetRow()] //取得当前dept_id选定值 ls_sql = ls_sql + " Where dept_id = '" +Trim(ls_deptid)+"'" //重新设置Sql 语句 fld_child.SetSQLSelect(ls_sql) fld_child.Retrieve()//取得满足条件的数据 28 从数据窗口中获取数据 单条&#65306;假设我们要读取dept_id字段的第一笔数据&#65292;可以用下列方式表示∶li_id = dw_1.o b j e c t.dept_id[1] 假设我们要读取第一行中第二个字段的数据&#65292;可以用下列方式表示∶ls_name = dw_1.o b j e c t.DATA[1,2] 假设我们要读取dept_id字段的所有数据&#65292;可以用下列方式表示∶li_array = dw_1.o b j e c t.dept_id.CURRENT 假设我们要读取过滤缓冲区 (filter buffer) 内dept_id字段的第一笔数据&#65292;可以用下列方式表示∶li_id = dw_1.o b j e c t.dept_id.Filter [1] 假设我们要读取从第二笔数据的第一个字段到第三笔数据的二个字段之间的数据&#65292;表示∶lstr_array = dw_1.o b j e c t.DATA[2,1,3,2] 假设我们要读取整个第二笔的数据&#65292;可以用下列方式表示∶lstr_dept = dw_1.o b j e c t.DATA[2] 使用GetItemX ( )函数 x为string number等 lstr_name = dw_1.getitemstring (li_count , "emp_name") li_count为哪一条 多条&#65306;string ls_name[ ] ls_name = dw_ 1.o b j e c t.emp_name.current 数据的读取 一般格式∶数据窗口控件.Retrieve ( ) 返回个数 &#65292;-1为错误 增加数据 数据窗口控件.InsertRow (行数) 参数为0加到最后 数据的删除 数据窗口控件.Deleterow (行数) 数据的过滤l 数据窗口控件.SetFilter (条件字符串). 数据窗口控件.Filter ( ) 用法∶将主要缓冲区 (Primary Buffer) 内不符合过滤条件的数据移到过滤缓冲区 (Filter Buffer) 内。 例子&#65306;string ls_exp ls_exp = "dept_id = 100" dw_1.SetFilter (ls_exp) dw_1.Filter ( ) 排序 dw_1.SetSort ("dept_id") dw_1.Sort ( ) 将数据从所有的缓冲区 (Buffer) 中清除 dw_1.ReSet ( ) 计算数据数目。例如∶dw_1.Rowcount ( ) 类似&#65306; .DeletedCount ( ) .ModifiedCount ( ) .FilteredCount ( ) 数据窗口的滚动 数据窗口控件.ScrollToRow (行数) 29 数据窗口属性改变&#65306; 描述数据窗口对象本身颜色&#65292;可以表示如下∶long ll_color ll_color = dw_emplist.Describe ("DataWindow.Color") 描述数据窗口对象内标题 dept_id_t 的颜色&#65292;可以表示如下∶long ll_color ll_color = dw_emplist.Describe ("dept_id_t.Color") 修改数据窗口对象本身颜色&#65292;可以表示如下:dw_emplist.Modify ("DataWindow.Color = 255") 修改数据窗口对象内标题 dept_id 的颜色&#65292;可以表示如下∶dw_emplist.Modify ("dept_id_t.Color = 255") 假设当我们希望在程序运行阶段才给予下行条件∶薪水超过 50000 时显示红色&#65292;低于 50000 时显示黑色。程序的写法如下∶ ls_modstring = "Salary.Color = '0~tIf (Salary > 50000&#65292;255&#65292;0) '" dw_1.modify (ls_modstring) 30 得到当前鼠标所指对象所在的带区 string str_band str_band=GetBandAtPointer() //得到当前鼠标所指对象所在的带区 str_band=left(str_band,(pos(str_band,'~t') - 1))//得到"header"、"detail"等 if str_band<>'header' then return //单击非头区&#65292;退出 31 得到鼠标指向的列对象名 str_o b j e c t=GetObjectAtPointer() //得到当前鼠标所指对象名 str_o b j e c t=left(str_o b j e c t,(pos(str_o b j e c t,'~t') - 1)) //得到列对象名(默认为列名_t为列标题) str_column=left(str_o b j e c t,(len(str_title) - 2)) //判断该名称是否为列名字 if this.describe(str_column+".band")='!' then return //非是列名&#65292;即列标题不是按正常规律起名的。 32 得到当前行、列&#65292;总行、列 //this 针对数据窗口而言 li_col = this.GetColumn() li_ColCount = long(describe(this,"datawindow.column.count")) ll_row = this.GetRow() ll_RowCount = this.RowCount() //设置当前行、列 scrolltorow(this,ll_Row) setrow(this,ll_Row) setcolumn(this,li_col) this.SetFocus() 33得到所有列标题 ll_colnum = Long(dw_1.o b j e c t.datawindow.column.count) for i = 1 to ll_colnum //得到标题头的名字 ls_colname = dw_1.describe('#' + string(i) + ".name") + "_t" ls_value = dw_1.describe(ls_colname + ".text") next 34 如何用代码取得数据窗口汇总带计算列的值? String ls_value ls_value = dw_1.Describe("Evaluate("'compute_1',1)") 如果是数值型&#65292;要转换。 35 取得单击的列标题、列名、数据库字段名 string ls_dwo long ll_pos string ls_type string ls_title string ls_column string ls_dbname if Not KeyDown(KeyControl!) then return ls_dwo = dwo.Name if trim(ls_dwo) = '' or isnull(ls_dwo) then return ls_type = This.describe(ls_dwo + '.type') if ls_type = 'column' then ls_title = This.describe(ls_dwo + '_t.text')//标题 ls_column = This.describe(ls_dwo + '.Name') //数据窗口列名 ls_dbname = This.describe(ls_dwo + '.dbname') //数据库中字段名 messagebox('信息', '标 题 文 本 &#65306;' + ls_title + & '~r~n数据窗口列名 &#65306;' + ls_column + & '~r~n数据库中字段名&#65306;' + ls_dbname ) end if 36 窗口为w_gcde内&#65292;放入一个DW_1&#65292;如何得到dw_1内的某列值yuonghu_id列的内容 方法&#65306; long lng_column_count integer i string str_column[] //列名 string str_column_text[] //text的名字 //得到数据窗口的总列数 lng_column_count = long(dw_1.Describe("DataWindow.Column.Count")) //循环依次读取 for i = 1 to lng_column_count str_column = dw_1.Describe("#"&#65291;string(i)&#65291;".name") str_column_text = dw_1.Describe(str_column &#65291; "_t.text") next 37 在DDDW中实现当前高亮行随鼠标移动 DataWindowChild ldwc_Child String ls_Pointer Long ll_Row GetChild( "dept_id", ldwc_Child ) // Replace the column name "dept_id" as you needed IF hwndchild = Handle( ldwc_child ) THEN if notificationcode = 2311 then //DDDW的mousemove事件 //得到鼠标所在行 ls_Pointer = ldwc_Child.GetObjectAtPointer() ll_Row=Long( Mid( ls_Pointer, Pos( ls_Pointer, "~t" ) + 1 )) //移到鼠标所在行 IF ldwc_Child.GetRow() <> ll_Row AND ll_Row > 0 THEN ldwc_Child.ScrollToRow( ll_Row ) END IF end if END IF 38 实现打印完一个DataWindow后不换页 首先将datawindow的print输出到一个打印文件中&#65292;把其他的print也输入这个prn&#65292;然后,打印这个打印文件就行了。 如&#65306; datawindow_control1.object.datawindow.print.filename="c:printfilepathexam_1.prn" datawindow_control2.object.datawindow.print.filename="c:printfilepathexam_1.prn" dw_1.print() dw_2.print() run("print //d:\printservenamesharename "c:printfilepathexam_1.prn") //d:\printservenamesharename打印机名 分享: 喜欢 阅读┊ 评论 ┊ 收藏 ┊禁止转载 ┊ 喜欢▼ ┊打印┊举报 加载中,请稍候...... 前一篇:PowerBuilder数据窗口技巧(一) 后一篇:国内公文流转系统开发状况研究(备忘) 评论 重要提示:警惕虚假中奖信息 | [发评论] 评论加载中,请稍候... 发评论 | 登录名: 密码: 找回密码 注册 记住登录状态昵 称: 分享到微博 验证码: 请点击后输入验证码 收听验证码 发评论 以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 < 前一篇PowerBuilder数据窗口技巧(一) 后一篇 >国内公文流转系统开发状况研究(备忘) 新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正 新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑 Copyright &copy; 1996 - 2014 SINA Corporation, All Rights Reserved 新浪公司 版权所有