打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
交叉表行列转换

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
AAAA你知道吗?“以貌取人”其实是科学的
aaaa
AAAA
IPv4与IPv6协议的区别、比较
两个数字字段的值相加并存到同一表的另一个字段
IPv6简介
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服