注册 登录
编程论坛 VFP论坛

为王咸美特开一贴

wengjl 发布于 2025-10-27 12:49, 183 次点击
只是为了给王咸美老师提供一个思路

只有本站会员才能查看附件,请 登录


依次执行二个PRG文档,即可得到结果

分二个PRG 相当于小学数学应用题的分步列式计算

[此贴子已经被作者于2025-10-27 14:05编辑过]

8 回复
#2
王咸美2025-10-27 20:55
谢谢!谢谢🙏
#3
wengjl2025-10-28 07:51
感谢kangss赠送鲜花,谢谢!
#4
王咸美2025-10-28 10:34
可以将两个prg文件作为过程文件写到一个程序里吗?我刚试了一下没成功。请予指点,谢谢!
#5
wengjl2025-10-28 10:43
可以直接合并成一个的
分二个是中途可以停下,手工打开kzmx.dbf观察
也是让你看的时候,思路更清晰一些而已



[此贴子已经被作者于2025-10-28 10:45编辑过]

#6
wengjl2025-10-28 10:50
程序代码:

       ***************
       * 名称:将开支明细转换成按物品清单列表
       * 来源: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



将二个粘贴到一起,删除连接处注释部分,执行一次就成了
能理解就有大进步的

#7
chychychy2025-10-28 11:01
回复 6楼 wengjl
,学习了
#8
王咸美2025-10-28 12:01
谢谢!
#9
星光闪闪5132025-10-28 20:25
1