注册 登录
编程论坛 VFP论坛

求助:怎么将考场信息表高效整理成考场科目清单,格式如表

yangdf 发布于 2023-06-04 11:38, 835 次点击
现有考场信息表,包含考点名称、考点代码、科目、考场号、座号,现需要统计整理成考场科目清单,之前都是Excel表格手工整理,考点多的时候效率非常低,能否帮助用vfp程序代码实现。
只有本站会员才能查看附件,请 登录

效果:
只有本站会员才能查看附件,请 登录
6 回复
#2
sdta2023-06-04 14:15
英语科目001-002共两个考场60人,1楼只有30人是什么意思
#3
yangdf2023-06-04 15:24
回复 2楼 sdta
指的是001考场、002考场的30人都是这个科目,这个段内的考场不涉及多个科目。
#4
sdta2023-06-04 15:35
程序代码:
CLOSE DATABASES
CREATE CURSOR kckmqd (考点代码 c(4), 考点名称 c(20), 考场号 c(3), 座号 c(10), 人数 n(2), 科目 c(8))
INDEX ON 考点代码 + 考点名称 + 考场号 + 科目 TAG kcxx
SELECT kddm, kdmc, SUBSTR(ALLTRIM(kch),5,3) kch, zh, km FROM 考场信息表 INTO CURSOR kcxxb
SCAN
    IF SEEK(kcxxb.kddm + kcxxb.kdmc + kcxxb.kch + kcxxb.km, "kckmqd", "kcxx") = .F.
        INSERT INTO kckmqd (考点代码, 考点名称, 考场号, 科目) VALUES (kcxxb.kddm, kcxxb.kdmc, kcxxb.kch, kcxxb.km)
    ENDIF
    REPLACE 座号 WITH IIF(EMPTY(座号), SPACE(0), LEFT(座号, 2) + "-") + PADL(kcxxb.zh, 2, "0"), 人数 WITH 人数 + 1 IN kckmqd
ENDSCAN
SELECT kckmqd
SET ORDER TO
BROWSE

结果:
只有本站会员才能查看附件,请 登录
#5
yangdf2023-06-04 17:37
回复 4楼 sdta
感谢版主
#6
yangdf2023-06-09 09:50
程序代码:
        CLOSE DATABASES
        CREATE CURSOR kckmqd (考点代码 c(4), 考点名称 c(20), 考场号 c(3), 座号区间 c(5), 人数 n(2), 科目 c(8))
        INDEX ON 考点代码 + 考点名称 + 考场号 + 科目 TAG kcxx
        SELECT kddm, kdmc, SUBSTR(ALLTRIM(kch),5,3) kch, zh, km FROM 考场信息表 INTO CURSOR kcxxb
        SCAN
            IF SEEK(kcxxb.kddm + kcxxb.kdmc + kcxxb.kch + kcxxb.km, "kckmqd", "kcxx") = .F.
                INSERT INTO kckmqd (考点代码, 考点名称, 考场号, 科目) VALUES (kcxxb.kddm, kcxxb.kdmc, kcxxb.kch, kcxxb.km)
            ENDIF
            REPLACE 座号区间 WITH IIF(EMPTY(座号区间), SPACE(0), LEFT(座号区间, 2) + "-") + PADL(kcxxb.zh, 2, "0"), 人数 WITH 人数 + 1 IN kckmqd
        ENDSCAN
        SELECT kckmqd
        SET ORDER TO   &&取消索引后,默认按照考点、考场号、座号区间排序。

*--* 第二阶段:对考场科目清单“考点相同、科目相同、考场连续满场”的继续整理,减少数据行        
        CREATE CURSOR kckmqdhz (考点代码 c(4), 考点名称 c(20), 考场区间 c(7), 座号区间 c(5), 场内人数 n(2), 科目 c(8))
        SELECT kckmqd
        SCAN
            IF kckmqdhz.考点代码 == kckmqd.考点代码 AND kckmqd.座号区间 == "01-30" AND kckmqdhz.场内人数 = 30 AND kckmqdhz.科目 == kckmqd.科目
                REPLACE kckmqdhz.考场区间 WITH LEFT(kckmqdhz.考场区间 ,3) + "-" +kckmqd.考场号 IN kckmqdhz
            ELSE
                INSERT INTO kckmqdhz(考点代码, 考点名称, 考场区间, 座号区间, 场内人数, 科目) VALUES (kckmqd.考点代码, kckmqd.考点名称, kckmqd.考场号, kckmqd.座号区间, kckmqd.人数, kckmqd.科目)
            ENDIF
        ENDSCAN
        SELECT kckmqdhz
        BROWSE
            
               
               
#7
sdta2023-06-09 20:50
以下是引用yangdf在2023-6-9 09:50:09的发言:

        CLOSE DATABASES
        CREATE CURSOR kckmqd (考点代码 c(4), 考点名称 c(20), 考场号 c(3), 座号区间 c(5), 人数 n(2), 科目 c(8))
        INDEX ON 考点代码 + 考点名称 + 考场号 + 科目 TAG kcxx
        SELECT kddm, kdmc, SUBSTR(ALLTRIM(kch),5,3) kch, zh, km FROM 考场信息表 INTO CURSOR kcxxb
        SCAN
            IF SEEK(kcxxb.kddm + kcxxb.kdmc + kcxxb.kch + kcxxb.km, "kckmqd", "kcxx") = .F.
                INSERT INTO kckmqd (考点代码, 考点名称, 考场号, 科目) VALUES (kcxxb.kddm, kcxxb.kdmc, kcxxb.kch, kcxxb.km)
            ENDIF
            REPLACE 座号区间 WITH IIF(EMPTY(座号区间), SPACE(0), LEFT(座号区间, 2) + "-") + PADL(kcxxb.zh, 2, "0"), 人数 WITH 人数 + 1 IN kckmqd
        ENDSCAN
        SELECT kckmqd
        SET ORDER TO   &&取消索引后,默认按照考点、考场号、座号区间排序。

*--* 第二阶段:对考场科目清单“考点相同、科目相同、考场连续满场”的继续整理,减少数据行        
        CREATE CURSOR kckmqdhz (考点代码 c(4), 考点名称 c(20), 考场区间 c(7), 座号区间 c(5), 场内人数 n(2), 科目 c(8))
        SELECT kckmqd
        SCAN
            IF kckmqdhz.考点代码 == kckmqd.考点代码 AND kckmqd.座号区间 == "01-30" AND kckmqdhz.场内人数 = 30 AND kckmqdhz.科目 == kckmqd.科目
                REPLACE kckmqdhz.考场区间 WITH LEFT(kckmqdhz.考场区间 ,3) + "-" +kckmqd.考场号 IN kckmqdhz
            ELSE
                INSERT INTO kckmqdhz(考点代码, 考点名称, 考场区间, 座号区间, 场内人数, 科目) VALUES (kckmqd.考点代码, kckmqd.考点名称, kckmqd.考场号, kckmqd.座号区间, kckmqd.人数, kckmqd.科目)
            ENDIF
        ENDSCAN
        SELECT kckmqdhz
        BROWSE
            
                              

第二阶段代码处理的很好,向楼主学习
1