回复 楼主 王咸美
前些天讨论 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