
程序代码:
       ***************
       * 名称:将开支明细转换成按物品清单列表
       * 来源: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 
       * 边试边写,已成功
       * 原始表中的开支明细记载方法 属于不可取的方法
王老师,要在初始数据表设计上下功夫,代码可以很简单的!
上午没什么事,帮你做了。其他人做代码是可以再精简一些的!