为王咸美特开一贴
只是为了给王咸美老师提供一个思路依次执行二个PRG文档,即可得到结果
分二个PRG 相当于小学数学应用题的分步列式计算
[此贴子已经被作者于2025-10-27 14:05编辑过]
[此贴子已经被作者于2025-10-27 14:05编辑过]
程序代码:
***************
* 名称:将开支明细转换成按物品清单列表
* 来源:https://bbs.bc-/thread-514547-1-1.html
* 时间:2025-10-24
* 思路:因原表开支明细中的记录缺少规律,创建结果表;
* 第二步将“,”号和“,”号进行统一,使之有规律性;
* 第三步提取“物品”的名称和金额;
***************
CLEAR
SET SAFETY off
SET engi 70
CLOSE DATABASES
CREATE TABLE kzmx ( xm c(10) ,mc c(10) ,je n(7,2)) &&& 第一步完成(如不要小数,将 n(7,2) 改成 n(4) 即可)
SELECT * from 开支明细帐 into table ls
SELECT ls
REPLACE 支出明细 with STRTRAN(支出明细,[,],[,]) ALL &&& 第二步完成(每一笔开支间的分隔符“,,”都取消,方便后续判断)
zfc=[,]
SELECT ls
GO top
SCAN
ygxm=姓名
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) &&& 得到 物品名称
bb=[]
FOR ii=1 to LEN(c_zf)
IF SUBSTR(c_zf,ii,1)$[0123456789.]
bb=bb+SUBSTR(c_zf,ii,1) &&& 得到 金额 文本
ENDIF
ENDFOR
SELECT kzmx
APPEND BLANK &&& 增加记录,写入姓名,物品名称,金额
REPLACE kzmx.xm with ygxm
REPLACE kzmx.mc with aa
REPLACE kzmx.je with VAL(bb)
k1=k2+3
ENDFOR
SELECT ls
ENDSCAN &&& 完成转换
CLOSE DATABASES
*!* QUIT
*!*
*!* ***************
*!* * 名称:将开支明细转换成按物品清单列表
*!* * 来源:https://bbs.bc-/thread-514547-1-1.html
*!* * 时间:2025-10-24
*!* * 思路:依据第一步转换得到的表 kzmx.dbf 进行处理:
*!* * 第一步取得物品名称的唯一,即得横表的字段名;第二步创建横表;
*!* * 第三步按人员、分“物品”进行统计;第四步对横表求合计。
*!* ***************
*!* CLEAR
*!* SET SAFETY off
*!* SET engi 70
*!* CLOSE DATABASES
SELECT 0
USE kzmx alia kg
SELECT mc from kg grou by mc into cursor tmp &&& 第一步完成
zfc=[,]
SELECT tmp
SCAN
zfc=zfc+ALLTRIM(mc)+[ n(4),] &&& n(4) 中的数字可以根据开支金额大小修正,如写成 n(7,2)则是有二位小数的,特为王老师注
ENDSCAN
bjg=[姓名 c(10)]+zfc+[合计 n(4)] &&& 此处合计是尾部,即符合 王老师的要求,在最右侧
CREATE TABLE 开支统计(横式)表 (&bjg.) &&& 第二步完成
*---
CLOSE DATABASES
SELECT 0
USE 开支统计(横式)表 alia bmk
SELECT 0
USE kzmx alia kg
SCAN
zdm=[bmk.]+ALLTRIM(kg.mc)
SELECT bmk
LOCATE for bmk.姓名=kg.xm
IF FOUND()
REPLACE &zdm. with kg.je
ELSE
APPEND BLANK
REPLACE bmk.姓名 with kg.xm
REPLACE &zdm. with kg.je
ENDIF
SELECT kg
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
