还有一种不用setfilter()而是动态改变数据窗口sql的方法
dw_result.dataobject='d_xxxx'//你的dw_result的数据窗口对象
ls_oldsql=lower(dw_result.GetSQLSelect())//得到原来的sql,转换成小写
str_sql="select Cbianhao from 人物 where 性别=‘男’”
if pos(ls_oldsql,'where') then
ls_newsql=ls_oldsql+" and #1 in (" + str_sql+")"
else
ls_newsql=ls_oldsql++" where #1 in (" + str_sql+")"
end if
dw_result.setsqlselect(ls_newsql)
dw_result.settransobject(sqlca)//重新设置数据窗口对象或者重新设置sql后必须重设是无对象
dw_result.retrieve()
用你的select Cbianhao from 人物 where 性别=‘男’作一个数据窗口dw_bianhao
dw_2.settransobject(sqlca)//设置事务对象
ll_rowcount=dw_2.retrieve()//得到编号列表
ls_filter='1=0 '//应为用or连接各个条件,在没有编号的时候应该条件不成立。这样的目的是不用判断前面是否应经有表达式,可以直接加or ****,不然还要判断第一个前面什么都不佳,后面的才加or
for ll_row=1 to ll_rowcount
ls_bh=dw_2.getitemstring(ll_row,'cbianhao')
ls_filter=ls_filter+ " or 你的dw_result中编号那一列的列名='"+ls_bh+"' "
next
messagebox('',ls_filter) //让你看看拼出来的字符串的内容,真正用程序前把这句注释掉
dw_result.setfilter(ls_filter)
dw_result.filter()