标题:帮忙优化数据组合的代码
只看楼主
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
结帖率:76.81%
已结贴  问题点数:20 回复次数:9 
帮忙优化数据组合的代码
昨天发了1个数据组合问题,得到了sata版主的帮助,由于了帖匆忙,没把问题讲清,今天再发一帖,求帮助。
问题:
有三组人员(这里用sz1,sz2,sz3表示),sz1有3名人员(即3个元素),sz2有2名人员(即2个元素),sz3有4个人员(即4个元素 。每次分别从sz1取2名人员、sz2取1名人员、sz3 取3名人员组成一组(6人,每组都为6人)。列出所有6人1组的全部人员。
我的笨方法如下:
创建4个表,bb(总表,反映全部人员)
           b1(sz1人员组合表 )
           b2(sz2人员组合表 )
           b1(sz3人员组合表 )
先列出各组人员组合表,再汇总到总表bb
代码如下:
create cursor bb (m1 c(2),m2 c(2),m3 c(2),m4 c(2),m5 c(2),m6 c(2))
create cursor b1 (m1 c(2),m2 c(2),m3 c(2),m4 c(2),m5 c(2),m6 c(2))
create cursor b2 (m1 c(2),m2 c(2),m3 c(2),m4 c(2),m5 c(2),m6 c(2))
create cursor b3 (m1 c(2),m2 c(2),m3 c(2),m4 c(2),m5 c(2),m6 c(2))

Dimension sz1(3),sz2(2),sz3(4)
sz1(1)='a1'
sz1(2)='a2'
sz1(3)='a3'

sz2(1)='b1'
sz2(2)='b2'

sz3(1)='c1'
sz3(2)='c2'
sz3(3)='c3'
sz3(4)='c4'
****第1组人员组合
SELECT b1

FOR i=1 TO 2
    FOR j=2 TO 3
    IF i=j   &&&去掉同一组重复人员
    LOOP
    else
    Append Blank
    REPLACE m1 WITH sz1(i),m2 WITH sz1(j)
    endif
   
   ENDFOR
        
   
ENDFOR

****第2组人员组合
SELECT b2
  
FOR i=1 TO 2
    Append Blank
    REPLACE m3 WITH sz2(i)
  
ENDFOR
SELECT b3  
****第3组人员组合
FOR i=1 TO 2
    FOR j=2 TO 3
        FOR n=3 TO 4
        IF i=j OR j=n  &&&去掉同一组重复人员
        LOOP
        else
        Append Blank
        kk=Recno()
        REPLACE m4 WITH sz3(i), m5 WITH sz3(j), m6 WITH sz3(n)  
        ENDIF
        endfor
    ENDFOR
ENDFOR

****3组人员汇总
Select b1

For i=1 To Reccount()
    Go i
    Select b2
    For j=1 To Reccount()
        Go j
        Select b3
        For n=1 To Reccount()
            Go n
            Select bb
            Append Blank
            Go Bott
            Replace m1 With b1.m1,;
                m2 With b1.m2,;
                m3 With b2.m3,;
                m4 With b3.m4 ,;
                m5 With b3.m5,;
                m6 With b3.m6

            Select b3
        Endfor
        Select b2
    Endfor


    Select b1
Endfor
SELECT bb

brow
此方法太笨,
1、组内取的人员多了嵌套层太多
2、每组抽取人员所占字段是硬计算出来的,不具备通用性
3、不会用数组
求此计算的优化代码,谢谢!
搜索更多相关主题的帖子: 组合 WITH SELECT 代码 FOR 
2020-08-12 10:20
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
上一个问题贴中回复的示例代码,具备一定通用性,稍加修改后就能达到楼主的要求。
代码中的自定义函数,实际上是乐透型彩票的组号代码,只要理解了代码的思路,你的问题肯定能得到解决。
至于是否要用数组,在你的这个问题中,我认为是不需要的。

坚守VFP最后的阵地
2020-08-12 11:31
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
回复 2楼 sdta

说实话,自定义有点看不懂.
2020-08-12 12:45
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:10 
根据自己的需要,先试着编些小的程序,然后改为自定义函数

坚守VFP最后的阵地
2020-08-12 12:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:10 
以下是引用fdqzy在2020-8-12 10:20:07的发言:
1、组内取的人员多了嵌套层太多
2、每组抽取人员所占字段是硬计算出来的,不具备通用性

1、循环嵌套层次多效率会明显下降,且循环嵌套层次是有限的。
2、要通用性可试试用动态生成语句。
实际的数据不明,从提供的代码猜想,按2、1、3 硬算:

CREATE CURSOR sz1 (sz C(2))
INSERT INTO sz1 VALUES ("a1")
INSERT INTO sz1 VALUES ("a2")
INSERT INTO sz1 VALUES ("a3")
CREATE CURSOR sz2 (sz C(2))
INSERT INTO sz2 VALUES ("b1")
INSERT INTO sz2 VALUES ("b2")
CREATE CURSOR sz3 (sz C(2))
INSERT INTO sz3 VALUES ("c1")
INSERT INTO sz3 VALUES ("c2")
INSERT INTO sz3 VALUES ("c3")
INSERT INTO sz3 VALUES ("c4")
SELECT a1.sz m1, b1.sz m2, a2.sz m3, a3.sz m4, b3.sz m5, c3.sz m6;
    FROM sz1 a1, sz1 b1, sz2 a2, sz3 a3, sz3 b3, sz3 c3;
    WHERE a1.sz<b1.sz AND a3.sz<b3.sz AND b3.sz<c3.sz;
    INTO CURSOR bb
SELECT bb
BROWSE

[此贴子已经被作者于2020-8-12 15:34编辑过]

2020-08-12 15:30
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
回复 5楼 吹水佬
多谢,方便多了,正是我想要的结果!!!

[此贴子已经被作者于2020-8-12 15:53编辑过]

2020-08-12 15:52
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用吹水佬在2020-8-12 15:30:39的发言:


1、循环嵌套层次多效率会明显下降,且循环嵌套层次是有限的。
2、要通用性可试试用动态生成语句。
实际的数据不明,从提供的代码猜想,按2、1、3 硬算:

CREATE CURSOR sz1 (sz C(2))
INSERT INTO sz1 VALUES ("a1")
INSERT INTO sz1 VALUES ("a2")
INSERT INTO sz1 VALUES ("a3")
CREATE CURSOR sz2 (sz C(2))
INSERT INTO sz2 VALUES ("b1")
INSERT INTO sz2 VALUES ("b2")
CREATE CURSOR sz3 (sz C(2))
INSERT INTO sz3 VALUES ("c1")
INSERT INTO sz3 VALUES ("c2")
INSERT INTO sz3 VALUES ("c3")
INSERT INTO sz3 VALUES ("c4")
SELECT a1.sz m1, b1.sz m2, a2.sz m3, a3.sz m4, b3.sz m5, c3.sz m6;
    FROM sz1 a1, sz1 b1, sz2 a2, sz3 a3, sz3 b3, sz3 c3;
    WHERE a1.sz<b1.sz AND a3.sz<b3.sz AND b3.sz<c3.sz;
    INTO CURSOR bb
SELECT bb
BROWSE


版主,本人学识浅,在
SELECT a1.sz m1, b1.sz m2, a2.sz m3, a3.sz m4, b3.sz m5, c3.sz m6;
    FROM sz1 a1, sz1 b1, sz2 a2, sz3 a3, sz3 b3, sz3 c3;
    WHERE a1.sz<b1.sz AND a3.sz<b3.sz AND b3.sz<c3.sz;
    INTO CURSOR bb
中,如a1.sz,b1.sz,a2.sz....是什么意思?其中a1,b1就是1表中要取的个数,占用字段m1,m2.
还有其他用参数表示的更简便的方法吗?
谢谢!

[此贴子已经被作者于2020-8-12 17:02编辑过]

2020-08-12 16:26
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
a1,b1,c什么的是自定义的表别名,改为这样好看点
对于 2,2,2 硬算
SELECT a1.sz m1, a2.sz m2, b1.sz m3, b2.sz m4, c1.sz m5, c2.sz m6;
    FROM sz1 a1, sz1 a2, sz2 b1, sz2 b2, sz3 c1, sz3 c2;
    WHERE a1.sz<a2.sz AND b1.sz<b2.sz AND c1.sz<c2.sz;
    INTO CURSOR bb
2020-08-12 17:09
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用吹水佬在2020-8-12 17:09:53的发言:

a1,b1,c什么的是自定义的表别名,改为这样好看点
对于 2,2,2 硬算
SELECT a1.sz m1, a2.sz m2, b1.sz m3, b2.sz m4, c1.sz m5, c2.sz m6;
    FROM sz1 a1, sz1 a2, sz2 b1, sz2 b2, sz3 c1, sz3 c2;
    WHERE a1.sz<a2.sz AND b1.sz<b2.sz AND c1.sz<c2.sz;
    INTO CURSOR bb

这样好看多了,谢谢!
2020-08-12 18:51
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
如果某一组数据没参与组合,只有两组数据参与组合,前面的所有代码就会出现问题

坚守VFP最后的阵地
2021-03-08 23:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502821-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.526087 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved