*************************************************************************************************************** * 函数名称: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"
|