PB 实现dddw联动

  • Post author:
  • Post category:其他


转自:

https://blog.csdn.net/bjash/article/details/42970379?utm_source=blogxgwz0

最近在自学PB,在网上找了很久,没有找到下拉数据窗口联动的例子,自己花了一下午的时间做了一个小例子,现在写出来给大家参考一下,望高手指点.

一、创建表

//用来存储区域信息

create table gb_area_info

(c_areano char(12) primary key,

c_areaname char(40),

c_fullname char(80,

i_usecount decimal(5,0),

c_other char(50),

c_input char(25),

c_hospital char(12))

//用户表

create table t_users

(userid char(10) primary key,

username char(20),

pwd char(30),

ctime datetime,

homeaddress)

二、创建数据窗口

1.创建 gb_area_info表数据窗口

按ctrl+n 选择dataWindow中的Grid,如下图

点击OK按钮,在choose data source for grid dataWindow窗口,选择SQLSelect数据源,

如下图

点击Next按钮,出现Select Tables窗口,选择表gb_area_info

点击Open按钮,出现如下界面

在aerainfo Type列中右击,选择Select All,选中所有的列,然后单击Return按钮,如图

点击Next按钮,然后点击Finish按钮,转到如下界面中

在菜单栏中选择Edit–Select–Select Columns或Select Text可以对列或文本进行设置,设置好之后,按Ctrl+S保存,将数据窗口的名字存为d_areainfo

2.创建 t_users表数据窗口

创建步骤同上,数据窗口的风格选择Freeform,选择表t_users,创建之后点击工具栏上的SQL,然后在Syntax中选择Syntax,再选择菜单栏中的Design—Convert To Syntax,在SQL语句中添加

left(homeaddress,2) as province,

left(homeaddress,4) as city,

left(homeaddress,6) as county,

left(homeaddress,8) as street,

left(homeaddress,10) as village,如下图

然后点击Return按钮返回,选中所有的Columns,将Border改为-Underline(4)

选中Province 列,在属性Tab中所选择Edit,将Style Type改为 Drop DownDW,选中Allow Editing和V ScrollBar,在DataWindow中选择d_areainfo数据窗口,Display Column中选择c_areaname,Data Column选择c_areano,city、county、street、village的属性和province一样,我就不再列举了。

homeaddress的属性Display Column 选择c_fullname,其它的都和上面的一样,修改好之后,

按Ctrl+S保存为d_area_test如下图

三、创建Window

按Ctrl+N,选择PB Object–Window,如图

然后在工具栏中拖一个数据窗口控件,或在菜单栏中选择Insert–Control–DataWindow,

选择DataWindowControl,在属性中的DataObject选择 d_area_test,再添加三个按钮,修改后保存为w_user_area,如图

然后在工具栏中拖一个数据窗口控件,或在菜单栏中选择Insert–Control–DataWindow,

选择DataWindowControl,在属性中的DataObject选择 d_area_test,再添加三个按钮,修改后保存为w_user_area,如图

四、在itemfocuschanged和itemchanged事件中添加代码

itemfocuschanged中的代码如下:

//声明子数据窗口

dataWindowChild province_childDataWind;

//市子数据窗口

dataWindowChild city_childDataWind;

//县子数据窗口

dataWindowChild county_childDataWind;

//地址子数据窗口

dataWindowChild homeaddress_childDataWind;

Integer flag;

string province_oldsql;

string province_newsql;

string city_oldsql;

string city_newsql;

string homeaddress_oldsql;

string homeaddress_newsql;

string province;

string city;

Integer index_where;

Integer index_from;

string where_cond;

string from_table;

Integer row_total;

Integer i;

choose case lower(getColumnName())

//如果列名是省份

case ‘province’

//获取香省份下拉数据窗口的子数据窗口

flag=dw_1.getChild(‘province’,province_childDataWind);

//获取子数据窗口的查询语句

province_oldsql=province_childDataWind.getSQLSelect();

//如果获取子数据窗口成功

if flag>0 then

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

province_childDataWind.setTransObject(sqlca);

//判断子数据窗口查询语句中是否有 where条件

index_where=pos(province_oldsql,’where’);

//如果存在where 条件

if index_where>0 then

//将where条件取出

where_cond=right(province_oldsql,pos(province_oldsql,’where’));

//将 from 取出

from_table=left(province_oldsql,pos(province_oldsql,’FROM’)+4);

province_oldsql=from_table+” gb_area_info “;

province_newsql=province_oldsql+” where len(c_areano)=2  “;

province_childDataWind.setSQLSelect(province_newsql);

province_childDataWind.retrieve();

else

index_from=pos(province_oldsql,’FROM’);

province_oldsql=left(province_oldsql,index_from+4)+” gb_area_info “;

province_newsql=province_oldsql+” where len(c_areano)=2  “;

province_childDataWind.setSQLSelect(province_newsql);

province_childDataWind.retrieve();

end if

end if

case ‘city’

flag=dw_1.getChild(‘city’,city_childDataWind);

if flag>0 then

//设置事务对象

city_childDataWind.setTransObject(sqlca);

//获取查询语句

city_oldsql=city_childDataWind.getSqlSelect();

province=dw_1.getItemString(getRow(),’province’);

index_where=pos(city_oldsql,’where1′);

if (index_where>0) then

city_oldsql=left(city_oldsql,pos(city_oldsql,’where’));

if pos(city_oldsql,’w’)>0 then

city_oldsql=left(city_oldsql,len(city_oldsql)-1);

end if

city_newsql=city_oldsql+” where left(c_areano,2)='”+province+”‘ and len(c_areano)>2 “;

city_childDataWind.setSqlSelect(city_newsql);

city_childDataWind.retrieve();

else

city_oldsql=left(city_oldsql,pos(city_oldsql,’FROM’)+4)+” gb_area_info “;

city_newsql=city_oldsql+” where left(c_areano,2)='”+province+”‘ and len(c_areano)>2 “;

city_childDataWind.setSqlSelect(city_newsql);

city_childDataWind.retrieve();

end if

city_childDataWind.scrollToRow(city_childDataWind.getRow());

city=city_childDataWind.getItemString(city_childDataWind.getRow(),’c_areano’);

city_childDataWind.selectRow(city_childDataWind.getRow(),true);

dw_1.setItem(getRow(),’homeaddress’,city);

end if

case ‘homeaddress’

//设置事务对象

homeaddress_childDataWind.setTransObject(sqlca);

homeaddress_childDataWind.retrieve();

city=dw_1.getItemString(getRow(),’city’);

if (dw_1.getChild(‘homeaddress’,homeaddress_childDataWind)=1) then

homeaddress_childDataWind.retrieve();

row_total=homeaddress_childDataWind.RowCount();

//遍历所有的行

for i=1 to row_total

if homeaddress_childDataWind.getItemString(i,’c_areano’)=city then

homeaddress_childDataWind.scrollToRow(i);

homeaddress_childDataWind.selectRow(i,true);

end if

next

end if

end choose

itemchanged中有代码如下:

string city;

int r_num;

dataWindowChild city_childDataWind;

dw_1.getChild(‘city’,city_childDataWind);

r_num=city_childDataWind.getRow();

choose case lower(getColumnName())

case ‘city’

city=city_childDataWind.getItemString(r_num,’c_areano’);

city_childDataWind.scrollToRow(r_num);

dw_1.setItem(getRow(),’homeaddress’,city);

end choose

五、在Application中添加open(w_user_area),运行测试效果如下图:

问:在数据窗口对象画板中可以设定列的编辑风格为下拉数据窗口(DropDownDataWindow),请问在程序中可以动态实现这项功能吗?

答:可以的,假设所设定列为部门号”department_id”,相关连的子数据窗口为”d_dddw_dep”,显示列为部门名称”dept_name”,数据列为部门号”dept_id”,实现方法如下:

dw_1.Modify(“department_id.DDDW.Name=d_dddw_dep “)

dw_1.Modify(“department_id.DDDW.DisplayColumn=”dept_name” “)

dw_1.Modify(“department_id.DDDW.DataColumn=”dept_id” “)

或:

dw_1.object.department_id.dddw.name = “d_dddw_dep”

dw_1.object.department_id.DDDW.DisplayColumn = “dept_name” dw_1.object.department_id.DDDW.DataColumn = “dept_id”

注:PowerBuilder有一个小工具DWSyntax(程序名为:dwsyn60.exe),提供了获得及修改数据窗口、列等的各项属性值的语法,对编程非常有帮助。上述脚本在DWSyntax中都能找到new->tool ->datawindow syntax。