
程序代码:
***************
* 名称:将开支明细转换成按物品清单列表
* 来源:https://bbs.bc-/thread-514547-1-1.html
* 时间:2025-10-21
* 思路:因原表开支明细中的记录缺少规律,第一步将“,”号和“,”号进行统一,使之有规律性;
* 第二步提取“物品”的名称;第三步创建统计表;第四步进行统计;第五步算合计。
* ★★★★★★★★以上五步中有一个BUG,即 当“物品”的长度超过5个汉字,会出错★★★★★★★★
***************
CLEAR
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)
c_zf=SUBSTR(fymx,k1,k2-k1+2) &&& 得到如“巧克力9元”的消费内容(后续作字段名用的)
FOR j=1 to LEN(c_zf)
IF SUBSTR(c_zf,j,1)$[0123456789.]
k=j &&& 得到 金额数字开始的位置值
EXIT for
ENDIF
ENDFOR
aa=SUBSTR(c_zf,1,k-1) &&& 得到 物品名称
IF !aa$zfc
zfc=zfc+[0000000.00 as ]+aa+[,] &&& 形成SQL语句中的字段列表
ENDIF
k1=k2+3
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)
c_zf=SUBSTR(fymx,k1,k2-k1+2) &&& 得到如“巧克力9元”的消费内容(后续作字段名用的)
FOR j=1 to LEN(c_zf)
IF SUBSTR(c_zf,j,1)$[0123456789.]
k=j &&& 得到 金额 数字开始的位置值
EXIT for
ENDIF
ENDFOR
zdm=SUBSTR(c_zf,1,k-1) &&& 得到 物品名称
aa=[]
FOR ii=1 to LEN(c_zf)
IF SUBSTR(c_zf,ii,1)$[0123456789.]
aa=aa+SUBSTR(c_zf,ii,1) &&& 得到 金额 文本
ENDIF
ENDFOR
n_rmb=VAL(aa) &&& 金额文本转数值
SELECT bmk
LOCATE for bmk.姓名=ls.姓名
IF FOUND()
REPLACE ([bmk.]+zdm) with n_rmb &&& 记录消费的金额
ENDIF
k1=k2+3 &&& 确定 下一个 取词的起始位置值班
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 ALLTRIM(TRANSFORM(sn,[]))+[元] &&& 写入合计数(王老师这次的开支明细表上合计字段 用了 “字符型” !!!★★★ 真 的 讨 厌 ★★★)
SELECT bmk
ENDSCAN &&& 第五步完成
CLOSE DATABASES
QUIT
* 边试边写,已成功
* 原始表中的开支明细记载方法 属于不可取的方法
王老师,要在初始数据表设计上下功夫,代码可以很简单的!
上午没什么事,帮你做了。其他人做代码是可以再精简一些的!