回复 楼主 反璞归真
看了下你的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
程序代码:close all
select *,val(fz) as fs,(icase(alltrim(kmdm)="06",[化学],alltrim(kmdm)="07","生物学",alltrim(kmdm)="08","历史",alltrim(kmdm)="09","地理","")) as xk from kczcb into cursor ttt
select distinct xk from ttt into array laclasses
lcsql = "select zxdm"
for each lcclass in laclasses
lcsql = lcsql + ", " + "sum(iif(alltrim(xk) = [" + lcclass + "], fs, 0) ) as " + lcclass
endfor
m.lcsql = m.lcsql + " order by zxdm group by zxdm from ttt into table result"
&lcsql
select result
browse