有关DW中DropDownDW事件处理问题请教!

cheriss 2003-05-22 11:30:21
在DW中定义了两个列col_1,col_2都为DropDownDW类型,通过itemchanged能够取得col_1的选择结果,现在想将这个结果作为参数传给col_2,以改变col_2关联的DataWindow所显示的数据。该如何实现呢?请教了!
...全文
193 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheriss 2003-05-23
  • 打赏
  • 举报
回复
谢谢大家了!
devil_heart 2003-05-22
  • 打赏
  • 举报
回复
itemchanged event:
DataWindowChild ldwc_child
integer li_rt
li_rt= dw_1.GetChild('col_2', ldwc_child)

IF li_rt = -1 THEN
MessageBox( "提示","未取得子窗口")
return 1
end if
ldwc_child.SetTransObject(SQLCA)
ldwc_child.Retrieve(这里放上col_1的选择结果)
joss 2003-05-22
  • 打赏
  • 举报
回复
实现原理:
DW 明细改变事件触发
利用子数据窗口过滤,达到同时改变数据窗口相关条件内容的目的!
joss 2003-05-22
  • 打赏
  • 举报
回复
好好看看实例吧,不要完全照抄写,自己动手修改!
在数据窗口itemchanged 事件中写脚本:
AcceptText()
CHOOSE CASE dwo.name
CASE "zb"
string ls_zb,ls_filter
ls_zb=getitemstring(row,"zb")
//定义一个子数据窗口
DatawindowChild ldwc_xhdw
int li_rtn
//得到子数据窗口
if dw_1.GetChild("xhdw",ldwc_xhdw) = -1 then
MessageBox("提示","子数据窗口没有找到!")
End if
ldwc_xhdw.settransobject(sqlca)
if ls_zb <> "" and not isnull(ls_zb) then
sle_1.text=ls_zb
ls_filter ="zb="+"'"+ls_zb+"'"
end if
ldwc_xhdw.SetFilter(ls_filter)
ldwc_xhdw.Filter()
CASE "xhdw"
string ls_zb2
long ll_row
//定义一个子数据窗口
DatawindowChild ldwc_xhdw2
//得到子数据窗口
if dw_1.GetChild("xhdw",ldwc_xhdw2) = -1 then
MessageBox("提示","子数据窗口没有找到!")
End if
ldwc_xhdw2.settransobject(sqlca)
ll_row=ldwc_xhdw2.getrow()
ls_zb2=ldwc_xhdw2.getitemstring(ll_row,"zb")
setitem(row,"zb",ls_zb2)
CASE "ghdw"
//string ls_lb
long ll_row1
//定义一个子数据窗口
DatawindowChild ldwc_ghdw2
//得到子数据窗口
if dw_1.GetChild("ghdw",ldwc_ghdw2) = -1 then
MessageBox("提示","子数据窗口没有找到!")
End if
ldwc_ghdw2.settransobject(sqlca)
ll_row1=ldwc_ghdw2.getrow()
gs_lb=ldwc_ghdw2.getitemstring(ll_row1,"lb")
if gs_lb <> "1" then
gs_lb = "2"
end if
if dw_2.getitemstring(dw_2.getrow(),"lb")="" or isnull &
(dw_2.getitemstring (dw_2.getrow(),"lb")) then
dw_2.setitem(dw_2.getrow(),"lb",gs_lb)
end if
END CHOOSE

基本没有多少脚本是别人帮忙完全写好,不要寄希望于别人帮你完全写好脚本,多总结吧!
同样的问题就不要多次发了!

上面的例子是为了实现不同组对应不同的销货单位,例如选择了a组,那销货单位是a组的销货单位
我想楼主的意思也是想实现这样的功能吧!

birdslin 2003-05-22
  • 打赏
  • 举报
回复
假设你已经知道col_1的值为ls_str
在col_1的itemchanged写上
datawindowchild dwc_subject
dw_2.getchild("subjectid",dwc_subject)
dwc_subject.settransobject(sqlca)
dwc_subject.retrieve(Ls_str)
如果dwc_subject没有检索条件,可以用
dwc_subject.retrieve()
然后用setfilter方法去过滤。
xirumin 2003-05-22
  • 打赏
  • 举报
回复
这类问题你肯定不只问此一个问题,因为会一个接一个的出,比如打开窗口询问参数等。
1. 最好是改变界面及数据逻辑,取消动态传递参数
2. 实在不行的话可这样
a. 在dw的itemchanged中取得col_1的选择结果, 比如是ll_col1
同时,
DataWindowChild state_child
integer rtncode
rtncode = dw_1.GetChild('col_2', state_child)

IF rtncode = -1 THEN MessageBox( &
"Error", "Not a DataWindowChild")

// Establish the connection

CONNECT USING SQLCA;

// Set the transaction object for the child

state_child.SetTransObject(SQLCA)

// Populate with values for eastern states

state_child.Retrieve(ll_col2)//传递刚得到的参数

// Set transaction object for main DW and retrieve

hnwczgw 2003-05-22
  • 打赏
  • 举报
回复
在col_1的itemchanged写上
string ls_column
datawindowchild dw_child1,dw_child2

dw_1.getchild(列名1,dw_child1)
dw_child1.settransobject(sqlca)
ls_column=dw_child1.getitemstring(1,列名)

dw_1.getchild(列名2,dw_child2)
dw_child2.settransobject(sqlca)
dw_child2.retrieve(ls_column)即可

如果dw_child2没有检索条件,可以用
dw_child2.retrieve()
然后用setfilter方法去过滤。
dw_child.setfilter("列名 = '"+ls_column+"'")
dw_child2.filter()
即可
safenxiao 2003-05-22
  • 打赏
  • 举报
回复
datawindowchild idddw_guige

if dw_list.getChild('s_material_guige_no',idddw_guige) = -1 then
messagebox('系统提示','Not a DataWindowChild!')
else
idddw_guige.setfilter("s_guige_no like '" + ls_no + "%'")
idddw_guige.filter()
end if
cheriss 2003-05-22
  • 打赏
  • 举报
回复
还有个新的问题:现在不是有两列吗,我想在选择了col_1后,不管col_2是否已有数据都先将col_2置成空的,我在itemchanged中写了this.setitem(getrow(),'col_2',''),可是col_2中原有的数据消不掉,可是如果对一个普通的列(edit)却可以,是不是这种DDDw型的要用其它方式置空?请教!
cheriss 2003-05-22
  • 打赏
  • 举报
回复
找到了一个解决办法,公布出来:

string vclmc,vsql,ls_filter
datawindowchild dw_child

choose case dwo.name
case 'clmc'
vclmc=data
this.getchild('bpdxh',dw_child) //传递子数据窗口对象给变量
dw_child.settransobject(sqlca)
vsql=dw_child.GetSQLSelect() //得到子数据窗口的SQL语句
ls_filter=vsql+"where clmc='"+vclmc+"'" //重置子数据窗口的SQL语句
if dw_child.SetSQLSelect(ls_filter)=-1 then //检查SQL语句
messagebox('警告','检索失败!',stopsign!)
return
else
dw_child.Settransobject(sqlca) //执行SQL语句
dw_child.Retrieve()
dw_child.SetSQLSelect(vsql) //重置SQL,恢复原来状态
end if
end choose

使用SetSQLSelect实现了功能,可是我还有不明白的就是为什么使用filter实现不了呢?还有细节要注意吗?有待诸位指教了!
cheriss 2003-05-22
  • 打赏
  • 举报
回复
很是感谢大家帮助,可是问题还没解决!
现在我遇到的情况是这样的:
方案一:
choose case dwo.name
case 'clmc'
vclmc=data
this.getchild('bpdxh',bpd_dw)
bpd_dw.settransobject(sqlca)
bpd_dw.setfilter("clmc='"+vclmc+"'")
bpd_dw.filter()
end choose
结果是bpdxh所对应的下拉数据窗口数据没有任何变化,就像setfilter没起作用。
方案二:
choose case dwo.name
case 'clmc'
vclmc=data
this.getchild('bpdxh',bpd_dw)
bpd_dw.settransobject(sqlca)
bpd_dw.retireve(vclmc)
end choose
结果是,因为要在bpdxh对应窗口中加上参数,导致改进入界面时系统总会弹出参数询问窗口。

唉,如何解决啊?愁啊!
zhoufenghubei 2003-05-22
  • 打赏
  • 举报
回复
insertrow(0)插入一空行!以欺骗下拉datawindow,让它以为也有了数据,:
代码如下:
datawindowchild dw_waredw

dw_parent.getchild('列名',dw_waredw)
dw_waredw.insertrow(0)
dw_waredw.retrive()

接着完成父窗口的检索后,删除子窗口插入的哑元(空行)!
joss 2003-05-22
  • 打赏
  • 举报
回复
filter要求与sefilter()语句配合使用!
cheriss 2003-05-22
  • 打赏
  • 举报
回复
我用filter可是数据一直没有变化!还有哪些环节没注意到吗?
cheriss 2003-05-22
  • 打赏
  • 举报
回复
klbt(快乐白兔) ( ) 信誉:101 2003-05-22 14:38:00 得分:0
使用Retrieve前需要对子数据窗口插入一个空行。。

请明示!


cheriss 2003-05-22
  • 打赏
  • 举报
回复
choose case dwo.name
case 'clmc'
vclmc=data
this.getchild('bpdxh',bpd_dw)
bpd_dw.settransobject(sqlca)
bpd_dw.setfilter("clmc='"+vclmc+"'")
bpd_dw.filter()
end choose
我是这么写的!可是不行!
klbt 2003-05-22
  • 打赏
  • 举报
回复
使用Retrieve前需要对子数据窗口插入一个空行。。
cheriss 2003-05-22
  • 打赏
  • 举报
回复
我使用Filter时为什么总是不成功呢?
使用Retrieve时倒是能变化数据,可是这样一来由于开始时没有参数传进去,总是会弹出参数窗口,这又该如何解决?

611

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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