回复 楼主 王咸美
前些天讨论 https://bbs.bc-cn.net/thread-514544-2-1.html 第19楼已经给出了解决办法,只需要将竖表变横表就可以啦。
程序代码:
***************
* 名称:将费用明细转换成按项目列表
* 来源:https://bbs.bc-/thread-514545-1-1.html
* 时间:2025-10-20
* 思路:因原表费用明细中的记录缺少规律,第一步去掉 “,”号,使之有规律性;
* 第二步提取“XX费”的名称;第三步创建统计;第四步进行统计;第五步算合计。
* 以上五步中有一个BUG,即 当“XX费”的长度超过5个汉字,会出错。
***************
SET SAFETY off
SET engi 70
CLOSE DATABASES
SELECT * from 费用明细帐 into table ls
SELECT ls
REPLACE 费用明细 with STRTRAN(费用明细,[,],[]) ALL &&& 第一步完成
zfc=[,]
SELECT ls
GO top
SCAN
fymx=费用明细
n=OCCURS([费],fymx)
k1=1
FOR i=1 to n
k2=AT([费],fymx,i)
y=AT([元],fymx,i)
c_zf=SUBSTR(fymx,k1,k2-k1+2)
IF !c_zf$zfc
zfc=zfc+[0000000.00 as ]+c_zf+[,]
ENDIF
k1=y+2
ENDFOR
SELECT ls
ENDSCAN &&& 第二步完成
c_zdm=[日期]+zfc+[合计]
SELECT &c_zdm. from ls into table 费用统计表 &&& 第三步完成
SELECT 费用统计表
USE 费用统计表 alia bmk
SELECT ls
GO top
SCAN
fymx=费用明细
n=OCCURS([费],fymx)
k1=1
FOR i=1 to n
k2=AT([费],fymx,i)
y=AT([元],fymx,i)
zdm=SUBSTR(fymx,k1,k2-k1+2)
n_rmb=VAL(SUBSTR(fymx,k2+2,y-k2-2))
SELECT bmk
LOCATE for bmk.日期=ls.日期
IF FOUND()
REPLACE ([bmk.]+zdm) with n_rmb
ENDIF
k1=y+2
ENDFOR
SELECT ls
ENDSCAN &&& 第四步完成
SELECT bmk
GO top
SCAN
sn=0
FOR i=2 to FCOUNT()-1
sn=sn+EVALUATE(FIELD(i))
ENDFOR
REPLACE 合计 with sn
SELECT bmk
ENDSCAN &&& 第五步完成
CLOSE DATABASES
QUIT
