现在问题是多次选择后,数据窗口2可能会出现重复记录;如果拷贝前就通过主键判断数据窗口2是否有重复记录时,在记录达到万条左右时判断过程会变的非常慢!
请高手们赐教。
23 个解决方案
#1
换个思路,在rowscopy后,把1中拷出的数据删除(或设定标志不显示等等),避免重复
#2
现在问题是多次选择后,数据窗口2可能会出现重复记录;
拷贝前先将dw2清空.
dw2.reset()
拷贝前先将dw2清空.
dw2.reset()
#3
rowscopy之前先在DW2中find一下,存在或不存在你再根据情况处理
#4
reset 最简单了
#5
你用ROWMOVE吧這樣子你先過去的DW1都沒有這條記錄了
#6
赞同!!!!
============
楼主请注意及时结贴,你的结贴率已经很底了。9.09%
#7
一楼方法可行
我觉得还是在数据窗口1中增加一个字段比较好,使用这个字段标识是否copy过 ,如果copy过的话,就不让选中了就可以了
或者是copy的时候判断这个字段
我觉得还是在数据窗口1中增加一个字段比较好,使用这个字段标识是否copy过 ,如果copy过的话,就不让选中了就可以了
或者是copy的时候判断这个字段
#8
帮顶
#9
对,已经复制过的标记一下
#10
感谢各位回复,共同提供思路!
现在再对这个需求进行分析一下:
1、数据窗口1不能deleterow,因为该数据窗口是主窗口,人员只是进行选择并没有删除,如果删除则不符合需求和逻辑,且该数据窗口上可以编辑、自动update,无疑进行了人员彻底删除;其次,窗口内还有treeview,选择不同单位可以显示相应人员,如deleterow后,切换单位还可以显示已选择人员。
2、数据窗口2不能reset,因为选择过程是个累加过程,不能要求用户一次把人员选择准确。
3、因为人员情况有主键即身份号,最理想的方法是挖掘数据窗口潜力,看能否通过主键控制达到选择数据唯一性。
4、如3不能实现,则只能通过加字段或做标记以区分以选择人员,但同样存在问题,即对数据窗口2已选人员进行清除时,还要遍历数据窗口1,以恢复该人员的选择状态。
5、问题的症结在于能否避免两个数据窗口的遍历,既提高选择效率又达到选择数据的唯一!
谢谢!
现在再对这个需求进行分析一下:
1、数据窗口1不能deleterow,因为该数据窗口是主窗口,人员只是进行选择并没有删除,如果删除则不符合需求和逻辑,且该数据窗口上可以编辑、自动update,无疑进行了人员彻底删除;其次,窗口内还有treeview,选择不同单位可以显示相应人员,如deleterow后,切换单位还可以显示已选择人员。
2、数据窗口2不能reset,因为选择过程是个累加过程,不能要求用户一次把人员选择准确。
3、因为人员情况有主键即身份号,最理想的方法是挖掘数据窗口潜力,看能否通过主键控制达到选择数据唯一性。
4、如3不能实现,则只能通过加字段或做标记以区分以选择人员,但同样存在问题,即对数据窗口2已选人员进行清除时,还要遍历数据窗口1,以恢复该人员的选择状态。
5、问题的症结在于能否避免两个数据窗口的遍历,既提高选择效率又达到选择数据的唯一!
谢谢!
#11
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?不能提交时则有系统提示窗口,这时让用户怎么处理,程序怎么判断哪条记录是重复记录?
请教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
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,并按身份号累加检索实现两个窗口数据对应,但缺点也显而易见,就是有点慢.看看大家有什么更好的方法!
现在又有新问题,欢迎探讨!
还是有两个数据窗口,想达到数据对应,但结构不一样,不能用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) ;
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,避免刷新后难以定位到原来的位置。
再者让客户在上万条数据里选择本身是件很难为的事情,客户会诅咒你的。
可以考虑对人员分组,操作组的方式来减少数据量。当然这也要看是否符合你系统的需求。
所有字段都不可编辑,对单选多选都比较方便,而且可以有个字段来设置是否已拷出来防止重复
比如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()
拷贝前先将dw2清空.
dw2.reset()
#3
rowscopy之前先在DW2中find一下,存在或不存在你再根据情况处理
#4
reset 最简单了
#5
你用ROWMOVE吧這樣子你先過去的DW1都沒有這條記錄了
#6
赞同!!!!
============
楼主请注意及时结贴,你的结贴率已经很底了。9.09%
#7
一楼方法可行
我觉得还是在数据窗口1中增加一个字段比较好,使用这个字段标识是否copy过 ,如果copy过的话,就不让选中了就可以了
或者是copy的时候判断这个字段
我觉得还是在数据窗口1中增加一个字段比较好,使用这个字段标识是否copy过 ,如果copy过的话,就不让选中了就可以了
或者是copy的时候判断这个字段
#8
帮顶
#9
对,已经复制过的标记一下
#10
感谢各位回复,共同提供思路!
现在再对这个需求进行分析一下:
1、数据窗口1不能deleterow,因为该数据窗口是主窗口,人员只是进行选择并没有删除,如果删除则不符合需求和逻辑,且该数据窗口上可以编辑、自动update,无疑进行了人员彻底删除;其次,窗口内还有treeview,选择不同单位可以显示相应人员,如deleterow后,切换单位还可以显示已选择人员。
2、数据窗口2不能reset,因为选择过程是个累加过程,不能要求用户一次把人员选择准确。
3、因为人员情况有主键即身份号,最理想的方法是挖掘数据窗口潜力,看能否通过主键控制达到选择数据唯一性。
4、如3不能实现,则只能通过加字段或做标记以区分以选择人员,但同样存在问题,即对数据窗口2已选人员进行清除时,还要遍历数据窗口1,以恢复该人员的选择状态。
5、问题的症结在于能否避免两个数据窗口的遍历,既提高选择效率又达到选择数据的唯一!
谢谢!
现在再对这个需求进行分析一下:
1、数据窗口1不能deleterow,因为该数据窗口是主窗口,人员只是进行选择并没有删除,如果删除则不符合需求和逻辑,且该数据窗口上可以编辑、自动update,无疑进行了人员彻底删除;其次,窗口内还有treeview,选择不同单位可以显示相应人员,如deleterow后,切换单位还可以显示已选择人员。
2、数据窗口2不能reset,因为选择过程是个累加过程,不能要求用户一次把人员选择准确。
3、因为人员情况有主键即身份号,最理想的方法是挖掘数据窗口潜力,看能否通过主键控制达到选择数据唯一性。
4、如3不能实现,则只能通过加字段或做标记以区分以选择人员,但同样存在问题,即对数据窗口2已选人员进行清除时,还要遍历数据窗口1,以恢复该人员的选择状态。
5、问题的症结在于能否避免两个数据窗口的遍历,既提高选择效率又达到选择数据的唯一!
谢谢!
#11
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?不能提交时则有系统提示窗口,这时让用户怎么处理,程序怎么判断哪条记录是重复记录?
请教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
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,并按身份号累加检索实现两个窗口数据对应,但缺点也显而易见,就是有点慢.看看大家有什么更好的方法!
现在又有新问题,欢迎探讨!
还是有两个数据窗口,想达到数据对应,但结构不一样,不能用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) ;
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,避免刷新后难以定位到原来的位置。
再者让客户在上万条数据里选择本身是件很难为的事情,客户会诅咒你的。
可以考虑对人员分组,操作组的方式来减少数据量。当然这也要看是否符合你系统的需求。
所有字段都不可编辑,对单选多选都比较方便,而且可以有个字段来设置是否已拷出来防止重复
比如2个数据窗口,一个是放未拷贝的,一个已拷贝的,拷贝后2个数据窗口都刷新下。或者代码里写update,数据窗口deleterow,避免刷新后难以定位到原来的位置。
再者让客户在上万条数据里选择本身是件很难为的事情,客户会诅咒你的。
可以考虑对人员分组,操作组的方式来减少数据量。当然这也要看是否符合你系统的需求。
#19
用 find 速度會快一點吧
#20
起先对你要显示唯一值的列进行排序:"city A",然后增加如下过滤字符串:" city < > city [-1] or GetRow () = 1"
不知道这个可行
不知道这个可行
#21
我还是认为设置复制标志,1表示已经复制,0表示未复制,这样方便,在选择的时候不用提示什么,在COPY过程中逐个检索,是1的就不复制啊,
#22
已复制过的数据将期删除是个好方法.
#23
用distinct