回复 楼主 反璞归真
看了下你的dbf搜索论坛:交叉表
https://bbs.bc-cn.net/viewthread.php?tid=102270&highlight=%BD%BB%B2%E6%B1%ED
调用方法: USE mytable jcbqh(ALIAS(),1,3,4,.T.) &&或者jcbqh('mytable',1,3,4) 参数1:为打开表的alias(),也就是别名,当前在哪个工作区无所谓,指定别名即可。 参数2:为字符字段,也就是竖轴的field(),指当前mytable中的第几个字段。 参数3:为字符字段,也就是横轴的field(),指当前mytable中的第几个字段。 参数4:为数值型或货币型字段,也就是交叉数值区的field(),指当前mytable中的第几个字段。 参数5:为逻辑型,.T. OR .F.,.T.为行列求和。.F.为不求和。 参数返回:目标工作区别名 FUNCTION jcbqh &&交叉表求和 LPARAMETERS tctablename,f1,f2,f3,lifsum &&此参数接收alias(),不接受dbf() lifsum参数关于是否合计 * DIMENSION dtj(255) IF PARAMETERS()<4 MESSAGEBOX("至少要有4个参数!") RETURN ENDIF *当前函数只用到三个字段,第1字段为字符型(纵轴),第2字段为字符型(横轴),第3字段为数值型 IF !USED(tctablename) MESSAGEBOX("表没有打开!",0+48+256,"系统提示") RETU ENDIF mtable=tctablename && 源表 SELECT (mtable) IF TYPE(FIELD(f1))<>'C' MESSAGEBOX("第1参数类型错误!") RETU ENDIF IF TYPE(FIELD(f2))<>'C' MESSAGEBOX("第2参数类型错误!") RETU ENDIF IF (TYPE(FIELD(f3))<>'Y' AND TYPE(FIELD(f3))<>'N') MESSAGEBOX("第3参数类型错误!") RETU ENDIF field_temp=ALLTRIM(FIELD(f2)) * SELECT ALLTRIM(EVAL(FIELD(f2))) DIST FROM &mtable INTO ARRAY dtj SELECT &field_temp DIST FROM &mtable INTO ARRAY dtj IF ALEN(dtj)>=100 MESSAGEBOX("横轴字段过多!",0+48+256,"返回") RETU ENDIF kls=ALEN(dtj,1) SELECT (mtable) *BROWSE mbt=FIELD(f1) aa=ALLTRIM(FIELD(f1)) mlist=aa+' as '+mbt FOR j =1 TO kls jj=TRAN(j) jjj=dtj(j) bb=FIELD(f2) cc=FIELD(f3) mlist=mlist+',sum(IIF('+bb+'=dtj(&jj),'+cc+',0.00)) as &jjj' ENDFOR mlist=mlist+IIF(lifsum,",sum(0.00) as 合计","")+" from "+mtable+" group by "+aa IF USED("_temp") USE IN _temp ENDIF SELECT &mlist INTO DBF _temp &&结果表 IF lifsum TOTAL ON 合计 TO lsk APPE FROM lsk SCAN FOR j=1 TO kls REPL 合计 WITH 合计+EVALUA(FIELD(j+1)) ENDFOR ENDSCAN GO BOTT REPLACE &aa WITH '合计' ENDIF GO TOP ERASE lsk.DBF BROWSE &&可以注释掉 RETURN ALIAS() ENDFUNC