当前位置: 代码迷 >> PB >> datawindow在中的filter解决方案
  详细解决方案

datawindow在中的filter解决方案

热度:129   发布时间:2016-04-29 10:05:06.0
datawindow在中的filter
messagebox(1,dw_print.rowcount())

ls_presc_no='';ls_presc_no1=''
IF ls_presc_type='0' OR ls_presc_type='1' OR ls_presc_type='3' THEN
FOR i=1 TO dw_print.rowcount()
ls_presc_no1=dw_print.object.sheet_number[i]
IF ls_presc_no1=ls_presc_no THEN
dw_print.object.costs[i]=lde_all_costs
ELSE
lde_all_costs=0
dw_print.setfilter("sheet_number='"+ls_presc_no1+"'")
dw_print.filter()
FOR j=1 TO dw_print.rowcount()
lde_costs=dw_print.object.costs[j]
lde_all_costs=lde_all_costs+lde_costs
NEXT
dw_print.object.costs[i]=lde_all_costs
dw_print.setfilter('')
dw_print.filter()
END IF
ls_presc_no=ls_presc_no1
NEXT
END IF

messagebox(2,dw_print.rowcount())

发现dw_print.rowcount()前后不一致,后面的rowcount大于前面的rowcount,也就是说这个datawindow里凭空多了几行
实际数据只有3行,这样处理后变为了5行,经过测试,是由于filter造成的
求助:多余的行是怎么来的

------解决方案--------------------
查看你的数据窗口绘制的时候是不是有过滤条件,行数前后从现有代码看应该前后一致。
另:在设置过滤条件并调用filter()后应立即将条件还原
dw_print.setfilter("sheet_number='"+ls_presc_no1+"'") 
dw_print.filter() 
dw_print.setfilter("") 

------解决方案--------------------
long ll_count,ll_new_count

ll_count = dw_print.rowcount() 

messagebox(1,dw_print.rowcount()) 

ls_presc_no='';ls_presc_no1='' 
IF ls_presc_type='0' OR ls_presc_type='1' OR ls_presc_type='3' THEN 
FOR i=1 TO ll_count 
ls_presc_no1=dw_print.object.sheet_number[i] 
IF ls_presc_no1=ls_presc_no THEN 
dw_print.object.costs[i]=lde_all_costs 
ELSE 
lde_all_costs=0 
dw_print.setfilter("sheet_number='"+ls_presc_no1+"'") 
dw_print.filter() 
ll_new_count = dw_print.rowcount()
FOR j=1 TO ll_new_count
lde_costs=dw_print.object.costs[j] 
lde_all_costs=lde_all_costs+lde_costs 
NEXT 
dw_print.object.costs[i]=lde_all_costs 
dw_print.setfilter('') 
dw_print.filter() 
END IF 
ls_presc_no=ls_presc_no1 
NEXT 
END IF 

messagebox(2,dw_print.rowcount()) 

试试看看对不?
------解决方案--------------------
原因出在object赋值上,而且也是因为在循环里做了filter。
比如原来只有3行,那么i最大是3,而你filter以后,可能没有那么多行了,这时候object方式给一个不存在的行赋值,相当于insert了一条记录。
比如
dw_print.object.costs[i]=lde_all_costs 
改成
dw_print.setitem(i,"costs",lde_all_costs)
就不会出现记录多的情况。
当然这只是解释了这个现象,pb8的话还是很有道理的。 

------解决方案--------------------
探讨
引用:
原因出在object赋值上,而且也是因为在循环里做了filter。
比如原来只有3行,那么i最大是3,而你filter以后,可能没有那么多行了,这时候object方式给一个不存在的行赋值,相当于insert了一条记录。
比如
dw_print.object.costs[i]=lde_all_costs
改成
dw_print.setitem(i,"costs",lde_all_costs)
就不会出现记录多的情况。
当然这只是解释了这个现象,pb8的话还是很有道理的。



给一个不存在的行赋值,难道不会报错?

------解决方案--------------------
采用dot notation方式引用时,
cost可以理解为一动态数组,
如果i大于0且小于等于UpperBound(cost)+1
cost[i]=a
是成立的,这样就会自增一个元素~~
如果i值大于UpperBound(cost)+1,则会出错,就是楼上有位朋友说的有时出错有时不会了~~
  相关解决方案