PB中的DataStore是个好东西

编程过程中想在窗口中加一个下拉列表(DDLB),原来听同学说过可以动态改变下拉列表的值,数据库中的表改变,前台客户端的下拉列表就会变,记得当时同学说的是用一个叫下拉数据窗口(DDDW)的东西做的,一直没试过,今天遇到了这样的问题,想试一下,于是在网上查找例子,但似乎都不合我的意,下面简单说下需求:


涉及表:1、dm_yhzl (银行种类代码表)


                    字段:yhzl _dm(银行种类代码,如1100、1200等) ,yhzl_mc(银行种类名称,如中国工商银行等)


2、dm_yh(银行名称代码表)


     字段:yhzl_dm(银行种类代码),yh_dm(银行代码,如1101等),yh_mc(具体银行名称)


需求:窗口中有一个下拉列表,里面的ITEM中包含dm_yhzl中所有的银行种类,下拉列表中的内容随着银行种类代码表中数据增加而增加,然后数据窗口中的具体银行信息为下拉列表中银行种类下的所有分行等信息。


 


实现:因听同学说DDDW可以连接到数据表进行取数,开始便想试着弄一下,但DDDW好像只能在数据窗口中使用,如Freeform等类型的数据窗口,但我想要的是窗口中的DDLB,所以不满足我的需求,于是想到了用游标的方式来实现,于是上网查询游标的使用方法(原来没用过,小白一下),但PBer们好像都反映游标不好用,查询速度慢,建议使用DataStore来代替游标,于是便又接触到了新鲜事物:DataStore(哈,再小白一下),根据网上的介绍,感觉应该可以满足我的需求,于是试着做了起来。


 


第一步,创建一个数据窗口(Grid型),选择dm_yhzl表中的两列,如需过滤可设置where条件等,起名为dw_yhzl。


第二步,再创建一个Grid型的银行信息数据窗口,选择dm_yh中的yh_dm和yh_mc列,起名为dw_yh。


第三步,在窗口控件中添加下拉列表(DDLB),起名为ddlb_yhzl,下面添加数据窗口控件,对应的数据窗口为刚才建立的dw_yh。


第四步,在窗口控件的open事件中写如下代码:


string ls_yhzl


long ll_row,ll_row_count


 


datastore ds_yhzl   //声明Datastore变量


ds_yhzl = create datastore   //将Datastore实例化


ds_yhzl.dataobject = "dw_yhzl"   //为datastore分配数据窗口对象


ds_yhzl.settransobject(sqlca)   //指定连接实例


ds_yhzl.retrieve()   //提取数据


 


ll_row_count = ds_yhzl.rowcount()   //将所取数据的行数存储在ll_row_count变量中


 


for ll_row = 1 to ll_row_count   //创建循环语句进行取值


   ls_yhzl = ds_yhzl.getitemstring(ll_row,"yhzl_mc")    //取当前行的yhzl_mc字段对应的值


   ddlb_yhzl.additem(ls_yhzl)   //将取到的当前行的值添加到下拉列表中


next       //取下一条记录


destroy ds_yhzl   //释放datastore


 


通过以上操作,在打开窗口控件时,下拉列表中自动添加了银行种类代码表中的所有银行种类,想查询银行种类下的具体银行信息,可以添加查询按钮,在查询按钮的clicked事件中添加如下代码(也可以在下拉列表的selectionchanged事件中添加,但数据较多时可能会速度慢):


string old_select,setselect,setwhere


old_select=dw_1.describe("datawindow.table.sqlselect")   //将当前数据窗口的SQL语句存入变量old_select


setselect="select yh_dm,yh_mc from dm_yhzl a,dm_yh b "   //设置select语句,注意最后的双引号前要加一个空格


setwhere="a.yhzl_dm=b.yhzl_dm"   //设置where条件


if trim(ddlb_yhzl.text)<>'' then   //如果在下拉列表中选择了银行种类,则在查询条件中加入如下条件语句


   setwhere+=" and a.yhzl_mc=' " + ddbl_yhzl.text + " ' "


end if


dw_1.object.datawindow.table.select=setselect+setwhere   //动态修改数据窗口的查询语句


dw_1.settransobject(sqlca)   //指定连接实例


dw_1.retrieve()   //按修改后的条件提取数据


dw_1.object.datawindow.table.select=old_select   //将数据窗口的查询语句重置为原来的查询语句


 


好了,大功告成,运行程序,打开窗口,下拉列表中出现了所有银行种类,如不进行选择,点击查询按钮,数据窗口中显示出所有银行信息,如工行的各分行、建行的各分行、农行的各分行等。如果在银行种类中选择中国工商银行,点击查询控钮,则列出工行的所有分行信息。


在此例中学到了datastore的应用,感觉非常有用,这样使用后,如果有新的银行信息加入时,只要对数据库中的银行种类表进行维护,客户端的下拉列表即可同时更新,非常方便。

转自:http://blog.163.com/wufeng_1213/blog/static/167783313201062741833933/

猜你喜欢

转载自blog.csdn.net/happymagic/article/details/80369742