周末王讲故事全集:VFP交叉表(行列转换_通用代码转换程序)

来源:百度文库 编辑:中财网 时间:2024/04/29 04:53:47

PARAMETERS CTABLE,NFS
CLEAR
CLOSE TABLES
SET SAFETY OFF
*!* SELECT DISTINCT * FROM B1 GROUP BY MC1 INTO CURSOR TEMP
*!* COUNT TO X0 &&统计一级名称字段的记录数
USE &CTABLE EXCLUSIVE
CNAME=FIELD(2)
SELECT DISTINCT * FROM &CTABLE GROUP BY &CNAME INTO CURSOR TEMP
COUNT TO X1 &&统计二级名称字段的记录数
NLEN=ALLTRIM(STR(FSIZE(FIELD(2))))
MM=""
IF X1>254
   MESSAGEBOX("该表不能转换为其它表",48,"系统信息")
   RETURN
ENDIF
DO CASE
   CASE TYPE(FIELD(1))="D"
        CTYPE="D"
   CASE TYPE(FIELD(1))="C"
        CTYPE="C"
        ZDLEN=ALLTRIM(STR(FSIZE(FIELD(1))))
ENDCASE
* 创建字段名结构表
FOR I=1 TO RECCOUNT()
    GO I
    MM=MM+ALLTRIM(EVALUATE(FIELD(2)))+" N("+NLEN+")"+IIF(IENDFOR


DO CASE
   CASE NFS=0 OR NFS=2 && =0 行列无小(合)计,=2 列合计
        MM="("+FIELD(1)+" "+CTYPE+IIF(CTYPE="C","("+ZDLEN+"),",",")+MM+")"
   CASE NFS=1 OR NFS=3 && =1 行小计,=3 列合计、行小计
        MM="("+FIELD(1)+" "+CTYPE+IIF(CTYPE="C","("+ZDLEN+"),",",")+MM+",小计 "+"N(10"+"))"
ENDCASE
CLOSE TABLES

SELECT 1
CREATE DBF LSB.LSB &MM &&生成临时表
SELECT 2
USE (CTABLE)
FOR I=1 TO RECCOUNT()
    GO I
    CZD1=EVALUATE(FIELD(1)) && 取值
    CZD2=EVALUATE(FIELD(2))
    NZD3=EVALUATE(FIELD(3))
    SELECT A
    IF I=1 OR CZD1!=MC1
       APPEND BLANK
       REPLACE (FIELD(1)) WITH CZD1
       MC1=EVALUATE(FIELD(1))
    ENDIF
    FOR I1=1 TO FCOUNT()
        REPLACE NEXT 1 (FIELD(I1)) WITH NZD3 FOR ALLTRIM(FIELD(I1))==ALLTRIM(CZD2) AND ALLTRIM(MC1)==ALLTRIM(CZD1)
    ENDFOR
    SELECT B
ENDFOR
SELECT A
DO CASE
   CASE NFS=0
   CASE NFS=1 && 行小计
        FOR I=1 TO RECCOUNT()
            GO I
            NXJ=0
            FOR I1=2 TO FCOUNT()-1
                NXJ1=EVALUATE(FIELD(I1))
                NXJ=NXJ+NXJ1
            ENDFOR
            REPLACE NEXT 1 小计 WITH NXJ
        ENDFOR
   CASE NFS=2 && 列合计
        APPEND BLANK
        REPLACE (FIELD(1)) WITH "合计"
        FOR I=2 TO FCOUNT()
            MYZD=FIELD(I)
            SUM &MYZD TO NHJ
            GO BOTTOM
            REPLACE (FIELD(I)) WITH NHJ
        ENDFOR
   CASE NFS=3 && 列合计、行小计
        FOR I=1 TO RECCOUNT()
            GO I
            NXJ=0
            FOR I1=2 TO FCOUNT()-1
                NXJ1=EVALUATE(FIELD(I1))
                NXJ=NXJ+NXJ1
            ENDFOR
            REPLACE NEXT 1 小计 WITH NXJ
        ENDFOR
        APPEND BLANK
        REPLACE (FIELD(1)) WITH "合计"
        FOR I=2 TO FCOUNT()
            MYZD=FIELD(I)
            SUM &MYZD TO NHJ
            GO BOTTOM
            REPLACE (FIELD(I)) WITH NHJ
        ENDFOR
ENDCASE
BNAME="LSB.LSB"
RETURN (BNAME)