PB中关于GetChild的用法

发布于 2015-02-06 14:47:22 分类:技术笔记 阅读(16375)  

比如,在一个数据窗口A中,有一个涉及到姓名的下拉选择列表B(B可能是要展示表中的一列) B的数据要根据A的其中一个部门来动态的过滤数据。

暂且不讨论部门的数据怎么获取的,可能是用户自己输入的某个值C 

那么:

dwcontrol.GetChild ( name, dwchildvariable )

应当定义成:

A.GetChild("B的名字",定义的dwchildvariable 变量)

意思是:将A中的变量或控件B的引用赋给dwchildvariable 

然后dwchildvariable.retrieve("参数C")


功能:得到指定子数据窗口的引用并将其保存到变量中 然后应用程序就可以使用该变量来操作子数据窗口对象

 

  语法:dwcontrol.GetChild ( name, dwchildvariable )

 

  参数:dwcontrol 数据窗口控件名

 

  name string 类型 列名 该列包含了欲得到引用的子数据窗口对象

 

  dwchildvariable DataWindowChild 类型 用于存储该函数得到的子数据窗口对象的引用

 

  返回值:Integer 函数执行成功时返回 1, 出错时返回-1 , 子数据窗口对象引用保存在变量dwchildvariable 中 如果任何参数的值为NULL , 则GetChild()函数返回NULL

 

  用法:这里所说的子数据窗口包括两方面的意义 一是数据窗口对象中的下拉数据窗 口 DropDownDataWindow 是复合风格数据窗口对象中的子报表 , 需要注意的是在创建复合风格的数据窗口对象时,它使用的子报表实际上也是个数据窗口对象 必须要设置其Name 属性,否则就不能使用GetChild()函数来得到该子报表的引用。当应用程序需要以显式方式提取子数据窗口对象的数据时 先使用 GetChild()函数得到该子数据窗口对象的引用 然后像操作普通数据窗口控件那样检索子数据窗口对象的数据。一般来说 在显示主数据窗口时 PowerBuilder 会自动提取出子数据窗口对象的数据,但是 当子数据窗口对象使用了提取参数或检索条件发生变化且需要检索新的数据时 应用程序就需要自己编写代码来实现数据提取工作了 。

 

  当用户在主数据窗口中插入一行或提取主数据窗口的数据时 PowerBuilder 也自动地提取出子数据窗口的数据 但是 如果子数据窗口带有提取参数 那么PowerBuilder 将显示一个对话框 让用户输入提取参数的值 要想不让PowerBuilder 显示该对话框 应用程序中可以在修改主数据窗口之前先显式地提取出子数据窗口的数据。需要注意的是,如果嵌套报表的数据源为外部数据源,那么应用程序不能使用 GetChild()函数得到子报表的引用。使用数据窗口控件的对象函数 Modify()修改数据窗口的某些属性后,先前执行 GetChild()函数得到的子数据窗口对象引用可能不再有效。此时 需要重新调用 GetChild() 函数来得到有效的子数据窗口对象引用

 

  示例:本例中 主数据窗口的 emp_state 列是个子数据窗口对象,该子数据窗口对象需要一个 地区 值作为提取参数,为了不让PowerBuilder 显示输入提取参数的对话框代码中首先检索了子数据窗口的数据 ,之后再提取主数据窗口的数据

 

  DataWindowChild state_child //说明一个DataWindowChild 类型的变量

 

  integer rtncode

 

  rtncode = dw_1.GetChild("emp_state", state_child)

 

  // 得到名称为 emp_state 的子数据窗口对象的引用

 

  IF rtncode = -1 THEN MessageBox( "错误", "不是子数据窗口")

 

  // 如果未与数据库建立连接时首先建立连接

 

  CONNECT USING SQLCA;

 

  // 设置子数据窗口使用的事务对象

 

  state_child.SetTransObject(SQLCA)

 

  // 使用地区值 北京 检索子数据窗口对象的数据

 

  state_child.Retrieve("East")

 

  // 设置主数据窗口使用的事务对象并提取数据

 

  dw_1.SetTransObject(SQLCA)

 

  dw_1.Retrieve()


PowerBuilder Getchild函数主要被用来得到一个数据窗口的子数据窗口

该函数在两种情况下可以使用,1、取出数据窗口对象的下拉式数据窗口;

2、取出复合风格(composite)数据窗口对象里所嵌入的子数据窗口对象。

语法:integer dwcontrol.GetChild (string name, REF DataWindowChild

dwchildvariable )

例子1 这段程序取出一个composite数据窗口对象的两个子数据窗口,并对他们进行过滤,和排序的操作。

/*dw_dy是连接一个composite数据窗口对象的一个数据窗口控件。dw_1、dw_2分别是嵌套的数据窗口的NAME*/

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)等方式操作子数据窗口中的数据。

访问复合数据窗口对象.方法 :dw_dy.o b j e c t.dw_1.o b j e c t.对象

例子2 下拉数据窗口动态过滤

在数据窗口dw_1的ItemFocusChanged事件中写入如下脚本:

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条件子句, 如原Sql 语句中须有Where条件子句,此处则需进行较

//复杂的处理,应视具体情况而定。

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()//取得满足条件的数据