数据窗口如何去掉重复记录

时间:2022-09-04 06:24:59
有两个数据窗口1、2, 1显示人员列表,用户可以通过shift、ctrl键选择多个人员,通过rowscopy复制到2中,并进行下一步处理。
现在问题是多次选择后,数据窗口2可能会出现重复记录;如果拷贝前就通过主键判断数据窗口2是否有重复记录时,在记录达到万条左右时判断过程会变的非常慢!
请高手们赐教。

23 个解决方案

#1


换个思路,在rowscopy后,把1中拷出的数据删除(或设定标志不显示等等),避免重复

#2


现在问题是多次选择后,数据窗口2可能会出现重复记录;

拷贝前先将dw2清空.
dw2.reset()

#3


rowscopy之前先在DW2中find一下,存在或不存在你再根据情况处理

#4


reset 最简单了

#5


你用ROWMOVE吧這樣子你先過去的DW1都沒有這條記錄了

#6


引用 1 楼 liubocy 的回复:
换个思路,在rowscopy后,把1中拷出的数据删除(或设定标志不显示等等),避免重复

赞同!!!!
============
楼主请注意及时结贴,你的结贴率已经很底了。9.09%

#7


一楼方法可行 

我觉得还是在数据窗口1中增加一个字段比较好,使用这个字段标识是否copy过 ,如果copy过的话,就不让选中了就可以了 
或者是copy的时候判断这个字段 

#8


帮顶

#9


对,已经复制过的标记一下

#10


感谢各位回复,共同提供思路!

现在再对这个需求进行分析一下:
1、数据窗口1不能deleterow,因为该数据窗口是主窗口,人员只是进行选择并没有删除,如果删除则不符合需求和逻辑,且该数据窗口上可以编辑、自动update,无疑进行了人员彻底删除;其次,窗口内还有treeview,选择不同单位可以显示相应人员,如deleterow后,切换单位还可以显示已选择人员。

2、数据窗口2不能reset,因为选择过程是个累加过程,不能要求用户一次把人员选择准确。

3、因为人员情况有主键即身份号,最理想的方法是挖掘数据窗口潜力,看能否通过主键控制达到选择数据唯一性。

4、如3不能实现,则只能通过加字段或做标记以区分以选择人员,但同样存在问题,即对数据窗口2已选人员进行清除时,还要遍历数据窗口1,以恢复该人员的选择状态。

5、问题的症结在于能否避免两个数据窗口的遍历,既提高选择效率又达到选择数据的唯一!

谢谢!

#11


本帖最后由 SummerHeart 于 2008-09-17 23:43:27 编辑
有解了
string ls_str
string ls_name
ls_name="黄豆"
ls_str= dw_1.describe( "Evaluate('sum( case( name when ~""+ls_code+"~" then 1  else 0))', 0)")

ls_str>0时说明已经有名字为“黄豆”的记录了。楼主可以照着改为你的“人员编号”

#12


LZ应该要换个方向去考虑这个问题,上万条记录让用户来选择,这本身就是有点问题吧,翻页都翻死人了,要设些过滤条件,这样问题就简单了

#13


通过主键控制达到选择数据唯一性。 
拷贝后立即提交,不能提交的则提示已拷贝.

#14


试试社区专家SummerHeart的方法!

请教13楼:拷贝后怎么提交,update还是commit?不能提交时则有系统提示窗口,这时让用户怎么处理,程序怎么判断哪条记录是重复记录?

#15


直接用getitem来判断主键的重复是很慢的,其实可以用数组的方法判断速度很快

String ls_key[]

ls_key = dw_1.object.data[开始行,列,结束行,列]//具体的行列看pb help

for li_i = 1 to upperbound(ls_key)
 if ls_key[li_i] = .... then


  end if
next

#16


15楼:我一般用dw_1.object.data.身份号[i],你的方法试了,ls_key[]好象是二维的.

现在又有新问题,欢迎探讨!
还是有两个数据窗口,想达到数据对应,但结构不一样,不能用rowscopy等,我现在用的方法是对第1个数据窗口逐条读出身份号,再对第2个数据窗口的retrievestart事件内写入return 2,并按身份号累加检索实现两个窗口数据对应,但缺点也显而易见,就是有点慢.看看大家有什么更好的方法!

#17


不重复问题例:
dw_1对映表1,dw_2对映表2
dw_1的检索用:select * from 表1 where 表1.外键字段 not in (select 表2.主键字段 from 表2) ;

#18


设计本身存在问题,lz应另建立个窗口来实现你说的功能。
所有字段都不可编辑,对单选多选都比较方便,而且可以有个字段来设置是否已拷出来防止重复

比如2个数据窗口,一个是放未拷贝的,一个已拷贝的,拷贝后2个数据窗口都刷新下。或者代码里写update,数据窗口deleterow,避免刷新后难以定位到原来的位置。

再者让客户在上万条数据里选择本身是件很难为的事情,客户会诅咒你的。
可以考虑对人员分组,操作组的方式来减少数据量。当然这也要看是否符合你系统的需求。

#19


用 find 速度會快一點吧

#20


起先对你要显示唯一值的列进行排序:"city A",然后增加如下过滤字符串:" city < > city [-1] or GetRow () = 1"

不知道这个可行

#21


我还是认为设置复制标志,1表示已经复制,0表示未复制,这样方便,在选择的时候不用提示什么,在COPY过程中逐个检索,是1的就不复制啊,

#22


已复制过的数据将期删除是个好方法.

#23


用distinct

#1


换个思路,在rowscopy后,把1中拷出的数据删除(或设定标志不显示等等),避免重复

#2


现在问题是多次选择后,数据窗口2可能会出现重复记录;

拷贝前先将dw2清空.
dw2.reset()

#3


rowscopy之前先在DW2中find一下,存在或不存在你再根据情况处理

#4


reset 最简单了

#5


你用ROWMOVE吧這樣子你先過去的DW1都沒有這條記錄了

#6


引用 1 楼 liubocy 的回复:
换个思路,在rowscopy后,把1中拷出的数据删除(或设定标志不显示等等),避免重复

赞同!!!!
============
楼主请注意及时结贴,你的结贴率已经很底了。9.09%

#7


一楼方法可行 

我觉得还是在数据窗口1中增加一个字段比较好,使用这个字段标识是否copy过 ,如果copy过的话,就不让选中了就可以了 
或者是copy的时候判断这个字段 

#8


帮顶

#9


对,已经复制过的标记一下

#10


感谢各位回复,共同提供思路!

现在再对这个需求进行分析一下:
1、数据窗口1不能deleterow,因为该数据窗口是主窗口,人员只是进行选择并没有删除,如果删除则不符合需求和逻辑,且该数据窗口上可以编辑、自动update,无疑进行了人员彻底删除;其次,窗口内还有treeview,选择不同单位可以显示相应人员,如deleterow后,切换单位还可以显示已选择人员。

2、数据窗口2不能reset,因为选择过程是个累加过程,不能要求用户一次把人员选择准确。

3、因为人员情况有主键即身份号,最理想的方法是挖掘数据窗口潜力,看能否通过主键控制达到选择数据唯一性。

4、如3不能实现,则只能通过加字段或做标记以区分以选择人员,但同样存在问题,即对数据窗口2已选人员进行清除时,还要遍历数据窗口1,以恢复该人员的选择状态。

5、问题的症结在于能否避免两个数据窗口的遍历,既提高选择效率又达到选择数据的唯一!

谢谢!

#11


本帖最后由 SummerHeart 于 2008-09-17 23:43:27 编辑
有解了
string ls_str
string ls_name
ls_name="黄豆"
ls_str= dw_1.describe( "Evaluate('sum( case( name when ~""+ls_code+"~" then 1  else 0))', 0)")

ls_str>0时说明已经有名字为“黄豆”的记录了。楼主可以照着改为你的“人员编号”

#12


LZ应该要换个方向去考虑这个问题,上万条记录让用户来选择,这本身就是有点问题吧,翻页都翻死人了,要设些过滤条件,这样问题就简单了

#13


通过主键控制达到选择数据唯一性。 
拷贝后立即提交,不能提交的则提示已拷贝.

#14


试试社区专家SummerHeart的方法!

请教13楼:拷贝后怎么提交,update还是commit?不能提交时则有系统提示窗口,这时让用户怎么处理,程序怎么判断哪条记录是重复记录?

#15


直接用getitem来判断主键的重复是很慢的,其实可以用数组的方法判断速度很快

String ls_key[]

ls_key = dw_1.object.data[开始行,列,结束行,列]//具体的行列看pb help

for li_i = 1 to upperbound(ls_key)
 if ls_key[li_i] = .... then


  end if
next

#16


15楼:我一般用dw_1.object.data.身份号[i],你的方法试了,ls_key[]好象是二维的.

现在又有新问题,欢迎探讨!
还是有两个数据窗口,想达到数据对应,但结构不一样,不能用rowscopy等,我现在用的方法是对第1个数据窗口逐条读出身份号,再对第2个数据窗口的retrievestart事件内写入return 2,并按身份号累加检索实现两个窗口数据对应,但缺点也显而易见,就是有点慢.看看大家有什么更好的方法!

#17


不重复问题例:
dw_1对映表1,dw_2对映表2
dw_1的检索用:select * from 表1 where 表1.外键字段 not in (select 表2.主键字段 from 表2) ;

#18


设计本身存在问题,lz应另建立个窗口来实现你说的功能。
所有字段都不可编辑,对单选多选都比较方便,而且可以有个字段来设置是否已拷出来防止重复

比如2个数据窗口,一个是放未拷贝的,一个已拷贝的,拷贝后2个数据窗口都刷新下。或者代码里写update,数据窗口deleterow,避免刷新后难以定位到原来的位置。

再者让客户在上万条数据里选择本身是件很难为的事情,客户会诅咒你的。
可以考虑对人员分组,操作组的方式来减少数据量。当然这也要看是否符合你系统的需求。

#19


用 find 速度會快一點吧

#20


起先对你要显示唯一值的列进行排序:"city A",然后增加如下过滤字符串:" city < > city [-1] or GetRow () = 1"

不知道这个可行

#21


我还是认为设置复制标志,1表示已经复制,0表示未复制,这样方便,在选择的时候不用提示什么,在COPY过程中逐个检索,是1的就不复制啊,

#22


已复制过的数据将期删除是个好方法.

#23


用distinct