| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 526 人关注过本帖
标题:如何由 开支明细帐.dbf 动态生成 开支统计表.dbf
只看楼主 加入收藏
王咸美
Rank: 1
等 级:新手上路
帖 子:821
专家分:3
注 册:2018-1-4
收藏
得分:0 
谢谢指点!我已在程序中加入下列语句,仍不能生成“开支统计表.dbf"
PUBLIC cPath
cPath=ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)

[此贴子已经被作者于2025-10-22 09:55编辑过]

昨天 09:50
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:429
专家分:143
注 册:2015-4-18
收藏
得分:0 
回复 5楼 wengjl
学习了,写程序的习惯非常值得我这样新生学习。细节满满(王老师这次的开支明细表上合计字段 用了 “字符型” !!!★★★ 真 的 讨 厌 ★★★)但是帖主第二版有改成数值型了,按道理数值型更方便
昨天 09:54
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:429
专家分:143
注 册:2015-4-18
收藏
得分:0 
回复 31楼 王咸美
感觉还是路径问题,你用桌面快捷方式先打开vfp程序和先在文件夹里打开dbf数据表或者直接打开prg文件,不同方式导致的默认路径是不一样的。你用吹版的MESSAGEBOX(DBF("开支统计表"))一测试就知道

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

昨天 10:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10794
专家分:43364
注 册:2014-5-20
收藏
得分:0 
以下是引用王咸美在2025-10-22 07:59:50的发言:

@吹水佬 这是供测试用的程序和表文件,请赐教!

不清楚你的代码是不是改过
其中:
FOR i=1 TO ALINES(arr,tb.支出明细,5,",")
注意那个","号,你原数据是全角","号。
应该是:
ALINES(arr,tb.支出明细,5,",")


测试时在命令窗口输入:
do ?
选择那个 cx.prg 就行



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

昨天 10:44
王咸美
Rank: 1
等 级:新手上路
帖 子:821
专家分:3
注 册:2018-1-4
收藏
得分:0 
谢谢!有空再试一下。
昨天 10:52
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:429
专家分:143
注 册:2015-4-18
收藏
得分:0 
吹版真是高手,我用调试器发现中间运行的数据是不完整的,感觉帖主上传程序有问题,肉眼没发现,就用豆包比对发现就是下面这句中逗号分隔符的问题
  *FOR i=1 TO ALINES(arr,tb.支出明细,5,",")&&&帖主用的是英文逗号
    FOR i=1 TO ALINES(arr,tb.支出明细,5,",")&&&吹版源程序中文逗号。
因为数据表里就是中文逗号,数据源的分隔符不匹配,导致程序运行数据提取不准确了

[此贴子已经被作者于2025-10-22 13:37编辑过]

昨天 13:33
王咸美
Rank: 1
等 级:新手上路
帖 子:821
专家分:3
注 册:2018-1-4
收藏
得分:0 
按要求修改以后,仍然没有各项目及有关数据。
昨天 14:45
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:429
专家分:143
注 册:2015-4-18
收藏
得分:0 
回复 37楼 王咸美
按道理是不会的,我这边测试了没有任何问题
程序和表.rar (1.32 KB)

程序代码:
CLOSE DATABASES
CLEAR ALL
PUBLIC cPath
cPath=ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)
DECLARE long sscanf IN msvcr71 long, string, single@, long@
DECLARE long strcpy IN msvcr71 string@, string
buffer = REPLICATE(0h00,256)
a = 0.00
n = 0
CREATE CURSOR tt (姓名 c(10), 项目 v(10), 金额 n(6,2))
USE 开支明细帐.dbf ALIAS tb IN 0
SELECT tb
SCAN 
    *FOR i=1 TO ALINES(arr,tb.支出明细,5,",")
    FOR i=1 TO ALINES(arr,tb.支出明细,5,",")
        p  = strcpy(@buffer, arr[i])
        ph = p
        DO WHILE SYS(2600,p,1) != 0h00
            IF sscanf(p,"%f%n",@a,@n) == 1
                INSERT INTO tt VALUES (tb.姓名, SYS(2600,ph,p-ph), a)
                EXIT
            ELSE
                p = p+1
            ENDIF
        ENDDO
    ENDFOR
ENDSCAN
cmd = "CREATE TABLE 开支统计表 (姓名 c(10)"
SELECT DISTINCT 项目 FROM tt INTO CURSOR tmp
SCAN 
    cmd = cmd + "," + 项目 + " n(6,2)"
ENDSCAN
cmd = cmd + ", 合计 n(6,2))"
EXECSCRIPT(cmd)
SELECT DISTINCT 姓名 FROM tt INTO CURSOR tmp
SELECT 开支统计表
APPEND FROM DBF("tmp")
INDEX on 姓名 TAG 姓名
SELECT tt
SET RELATION TO 姓名 INTO "开支统计表"
SCAN 
    REPLACE (tt.项目) WITH tt.金额, 合计 WITH 合计 + tt.金额 IN "开支统计表"
ENDSCAN
SELECT * FROM 开支统计表
昨天 15:19
王咸美
Rank: 1
等 级:新手上路
帖 子:821
专家分:3
注 册:2018-1-4
收藏
得分:0 
谢谢!可能我的vfp9.0缺少外部DLL函数(msvcr71.DLL)。谁有完整的vfp软件请发送一份,谢谢!!!

[此贴子已经被作者于2025-10-22 19:23编辑过]

昨天 15:40
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:429
专家分:143
注 册:2015-4-18
收藏
得分:0 
回复 39楼 王咸美
测试是没问题,可以直接下载使用。我个人总结:得向论坛内高手上传原始数据和准确表达想达到的目的。你数据表(文件夹等)如果没变直接下载吹版的就可以,如果有变化得自己将他们高手反馈的适当修改(比如你第一次上传合计是文本型、第二次上传合计是数值型)
昨天 15:59
快速回复:如何由 开支明细帐.dbf 动态生成 开支统计表.dbf
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020246 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved