注册 登录
编程论坛 VFP论坛

帮忙优化数据组合的代码

fdqzy 发布于 2020-08-12 10:20, 2030 次点击
昨天发了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、不会用数组
求此计算的优化代码,谢谢!
9 回复
#2
sdta2020-08-12 11:31
上一个问题贴中回复的示例代码,具备一定通用性,稍加修改后就能达到楼主的要求。
代码中的自定义函数,实际上是乐透型彩票的组号代码,只要理解了代码的思路,你的问题肯定能得到解决。
至于是否要用数组,在你的这个问题中,我认为是不需要的。
#3
fdqzy2020-08-12 12:45
回复 2楼 sdta

说实话,自定义有点看不懂.
#4
sdta2020-08-12 12:51
根据自己的需要,先试着编些小的程序,然后改为自定义函数
#5
吹水佬2020-08-12 15:30
以下是引用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编辑过]

#6
fdqzy2020-08-12 15:52
回复 5楼 吹水佬
多谢,方便多了,正是我想要的结果!!!

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

#7
fdqzy2020-08-12 16:26
以下是引用吹水佬在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编辑过]

#8
吹水佬2020-08-12 17:09
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
#9
fdqzy2020-08-12 18:51
以下是引用吹水佬在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

这样好看多了,谢谢!
#10
sdta2021-03-08 23:42
如果某一组数据没参与组合,只有两组数据参与组合,前面的所有代码就会出现问题
1