***************************************************************************************************************
* 函数名称:JCB_HLZH
* 函数功能:相关行转换成列
* 调用方式:JCB_HLZH(cTablename,nTotal,nMaincol,nCrosscol,ncalcol)
* 函数返回值: 字符型 转换后的表名称
* 例如:USE (rowtocol("b1",3,4,1,2))
** BROWSE
* 使用说明: cTablename 指定需要转换的源表
** nTotal 指定是否需要行(列)小(合)计:0:无行小计、列合计,1:行小计,2:列合计,3:行小计、列合计
** nMaincol指定主关键字段,数据类型不限
** nCrosscol指定次关键字段必须为不以数字开头的字符型
** ncalcol指定需要计算的字段。
* 使用范围:源表表结构字段数不限,次序不限。
***************************************************************************************************************
PARAMETERS cTablename,nTotal,maincol,Crosscol,calcol
LOCAL cSbmc,cZlzb,cZlzblb,cHjl && 定义局部变量:源表名称,主栏指标,主栏指标列表(供查询用),合计列
LOCAL i,cI && 定义局部变量:循环变量,i 的字符型量
CLEAR
CLOSE TABLES
SET SAFETY OFF
SET CONSOLE OFF
SELECT DISTINCT &Crosscol FROM &cTablename INTO ARRAY Arrblzb && 将次关键字段内容保存到一维数组“宾栏指标”
nSzhs=ALEN(Arrblzb,1) && 返回一维数组的行数—即“宾栏指标”数
IF nSzhs>254
MESSAGEBOX("被转换字段数量超出最大值范围",48,"系统信息")
ENDIF
SELECT (cTablename)
nFieldWidth=FSIZE(FIELD(calcol)) &&存计算字段数据宽度
cZlzb=ALLTRIM(FIELD(maincol)) &&存主关键字段名称
CZLZBLEN=FSIZE(FIELD(maincol)) &&存主关键字段数据宽度,本行后加
CZLZBLEN=IIF(TYPE(cZlzb)="D",CZLZBLEN+2,CZLZBLEN) && 取主关键字段数据宽度,本行后加
cZlzblb="CAST("+cZlzb+" as c(CZLZBLEN))" +" as "+cZlzb &&主关键字段数据类型一律转换为字符型字段
cHjl="" && 合计列
FOR i =1 TO nSzhs
cI=TRANSFORM(i) && 将 i 转换成字符
cZlzblb=cZlzblb+","+"sum(IIF("+FIELD(Crosscol)+"=Arrblzb(&cI),"+FIELD(calcol)+",0)) as &Arrblzb(i)"
cHjl=cHjl+ALLTRIM(Arrblzb(i))+IIF(I<nSzhs,"+","") && 加IIF(I<nSzhs,"+",""),省了下面的cHjl=SUBSTR(cHjl,2)
ENDFOR
cZlzblb=cZlzblb+" from "+cTablename+" group by "+cZlzb
SELECT &cZlzblb INTO Table crosstable1 && 此处原表名为crosstable,现改为crosstable1,原因见下行
COPY STRUCTURE EXTENDED TO AAAA
USE AAAA
REPLACE FIELD_LEN WITH nFieldWidth FOR ALLTRIM(FIELD_TYPE)="N"
CREATE crosstable FROM aaaa
APPEND FROM crosstable1
FOR I=1 TO FCOUNT()
MFIELD=FIELD(I)
IF TYPE(MFIELD)='N'
BLANK FIELD &MFIELD FOR &MFIELD=0
ENDIF
ENDFOR
IF nTotal=1 OR nTotal=3
ALTER TABLE crosstable ADD COLUMN 小计 N(10,0)
UPDATE crosstable SET 小计=&cHjl
ENDIF
IF nTotal=2 OR nTotal=3
INSERT INTO crosstable (&cZlzb) VALUE("合计")
SUM TO ARRAY aheji
GO BOTTOM
FOR i =2 TO FCOUNT()
REPLACE (FIELD(i)) WITH aheji(i-1)
ENDFOR
ENDIF
CLOSE TABLES ALL
ERASE AAAA.DBF
ERASE AAAA.FPT
ERASE crosstable1.DBF
RETURN "crosstable"
联系客服