隨便說個例子吧,代碼裡面出現了具體的、數目有限的科目名稱,而當設計的數據表科目有增減或名稱變動時,就要改代碼了,這叫硬編碼。後面那一堆UPDATE,就是很明顯的微小差別語句重複,很礙眼的。
授人以渔,不授人以鱼。
SET TALK OFF *-创建一个分数段标准表,这个标准表可以是自由表,也可以是临时表 CREATE CURSOR bz (下限 N(3),上限 N(3)) NUM=10 && 10分一个分数段,或者手工建一个自由表,前提是分数必须为整数 FSD=80 && 按照总成绩的满分设置分数段,共设置FSD个分数段 FOR I=1 TO FSD IF I=1 INSERT INTO BZ VALUES (0,NUM-I) ELSE INSERT INTO BZ VALUES (NUM1+1,NUM1+NUM) ENDIF NUM1=上限 ENDFOR * 统一格式,便于统计(列记录转换为行记录),获取字段数,表中各门功课成绩排在所有非成绩字段的后面 SELECT * FROM CJ INTO CURSOR CJ1 NZDS=AFIELDS(AZDM,[CJ1]) CSQL=[] FOR I=2 TO NZDS && 本示例中,从第2个字段开始为各门课程的成绩字段 CSQL=CSQL+IIF(I>2,[UNION ALL ],[])+[SELECT 班级,']+AZDM[I,1]+[' 课程,]+AZDM[I,1]+[ 成绩]+[,' ]+SPACE(7)+[' 分数段 FROM CJ ]+IIF(I=NZDS,[INTO CURSOR CJ2 READWRITE],[]) ENDFOR * 执行SQL命令 EXECSCRIPT(CSQL) * 划分分数段 UPDATE CJ2 SET 分数段=PADL(BZ.下限,3,[0])+[-]+PADL(BZ.上限,3,[0]) FROM BZ WHERE BETWEEN(CJ2.成绩,BZ.下限,BZ.上限) * 统计不同分数段(按课程分)的人数 SELECT 班级,课程,分数段,COUNT(*) 人数 FROM CJ2 GROUP BY 1,2,3 INTO CURSOR CJ3 * 生成不同班级,不同课程的分数段 SELECT A.*,PADL(B.下限,3,[0])+[-]+PADL(B.上限,3,[0]) 分数段 FROM (SELECT 班级,课程 FROM CJ3 GROUP BY 1,2) A,BZ B INTO CURSOR BJKC * 填补每门课程不存在的分数段 SELECT A.班级,A.课程,A.分数段,NVL(B.人数,0) 人数 FROM BJKC A LEFT JOIN CJ3 B ON A.分数段=B.分数段 AND A.班级=B.班级 AND A.课程=B.课程 INTO CURSOR CJ4 * 生成分数段最后统计表(行记录转换为列记录) SELECT 课程 FROM CJ3 GROUP BY 1 INTO CURSOR KC CSQL="SELECT 班级,分数段" SCAN CSQL=CSQL+",CAST(SUM(IIF(ALLTRIM(课程)=='"+ALLTRIM(课程)+"',人数,0)) AS N(4)) AS "+ALLTRIM(课程)+; IIF(RECNO()<RECCOUNT(),[],[,0000 小计 FROM CJ4 GROUP BY 1,2 INTO CURSOR CJTJB READWRITE]) ENDSCAN EXECSCRIPT(CSQL) * 行记录计算 XJ=[] FOR I=3 TO FCOUNT()-2 && 从第三个字段开始统计行记录小计,最后两个字段分别是 总分、小计 字段 XJ=XJ+(FIELD(I))+IIF(I<FCOUNT()-2,[+],[]) ENDFOR REPLACE ALL [小计] WITH &XJ * 列记录计算 NZDS=AFIELDS(AZDM,[CJTJB]) CSQL=[SELECT ALLTRIM(班级)+'合' 班级,SPACE(7) 分数段] SET ENGINEBEHAVIOR 70 FOR I=3 TO NZDS CSQL=CSQL+",CAST(SUM("+AZDM[I,1]+") AS N(4)) AS "+AZDM[I,1]+IIF(I<NZDS," "," FROM CJTJB GROUP BY 班级") ENDFOR CSQL=[INSERT INTO CJTJB ]+CSQL EXECSCRIPT(CSQL) SELECT * FROM CJTJB ORDER BY 1 INTO CURSOR CJTJ READWRITE FOR I=3 TO FCOUNT() IF TYPE(FIELD(I))="N" *--- 清空数值型字段内容为"0"的记录 BLANK FIELD (FIELD(I)) FOR EVALUATE(FIELD(I))=0 ENDIF ENDFOR BROWSE SET ENGINEBEHAVIOR 90
CREATE CURSOR BZ (下限 N(3),上限 N(3)) NUM=10 && 10分一个分数段,或者手工建一个自由表,前提是分数必须为整数 FSD=80 && 按照总成绩的满分设置分数段,共设置FSD个分数段 FOR I=1 TO FSD IF I=1 INSERT INTO BZ VALUES (0,NUM-I) ELSE INSERT INTO BZ VALUES (NUM1+1,NUM1+NUM) ENDIF NUM1=上限 ENDFOR SELECT XH,TOT1,SPACE(7) 分数段 FROM BK INTO CURSOR T1 READWRITE UPDATE T1 SET 分数段=PADL(BZ.下限,3,[0])+[-]+PADL(BZ.上限,3,[0]) FROM BZ WHERE BETWEEN(T1.TOT1,BZ.下限,BZ.上限) SELECT 分数段,COUNT(*) 人数 FROM T1 GROUP BY 分数段 INTO CURSOR T2 SELECT PADL(BZ.下限,3,[0])+[-]+PADL(BZ.上限,3,[0]) 分数段,NVL(人数,0) 人数 FROM BZ LEFT JOIN T2 ON PADL(BZ.下限,3,[0])+[-]+PADL(BZ.上限,3,[0])=T2.分数段 INTO CURSOR T3 READWRITE INSERT INTO T3 SELECT [合计],SUM(人数) FROM T3 BROWSE