| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 246 人关注过本帖
标题:再次求助:如何根据“开支明细”动态生成“开支统计表.dbf”
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10814
专家分:43424
注 册:2014-5-20
收藏
得分:0 
以下是引用王咸美在2025-10-30 07:24:19的发言:

谢谢!我想用上表文件“开支明细表.dbf",动态生成如附件所示的“开支统计表.dbf",不知如何操作,请指点!

每条记录的各项费用项目名称和金额都能得到了,还有什么问题?
重温一下之前的贴不就是同一个问题吗?
总结一下之前类同的贴就OK

前天 07:40
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2329
专家分:4205
注 册:2007-4-27
收藏
得分:3 
以下是引用王咸美在2025-10-29 12:38:53的发言:

现有“开支明细表.dbf",我想根据其中的“支出明细”动态生成“开支统计表.dbf",开支统计表中的字段名由“开支明细表.dbf的“开支明细”动态生成,请各位高手不吝赐教,万分感谢!(纯属个人爱好,不喜勿喷,全当路过)


“开支统计表.dbf"样式如下:


从你再次发贴看,你是没看懂为你特开(想着你我是同行,且我退休6年了,地域又远,代码都给你了(作了详细的注释),感觉你的问题是根基不牢)的一贴!

第一步,从“开支明细表”到 kzmx ,中间的ls 就是你现在的无“,,”号的表,是凭“元”字作的区分标志。后面的代码中,均完成了你再次提问的内容,仔细地学研就会得到你想要的。

只求每天有一丁点儿的进步就可以了
前天 08:11
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:303
专家分:2272
注 册:2023-6-29
收藏
得分:3 
数据处理科学过程: 1.数据采集-->2.清洗--->3.转换-->4.分析;    第一步数据采集有了, 就是你采集到的支出明细, 第二步就是上面讨论了的支出明细要用分隔符分开,如果有其他不标准化的数据还需要标准化,有元没元都需要处理,品名中有元或数字的也需要处理, 第三步就是转成便于分析的数据,要能识别品名和价格,第四步就是你的第二个表,就是分析的结果.  每一步都要将结果数据存储起来, 如果有问题便于分析问题出现在那一步
前天 10:03
王咸美
Rank: 1
等 级:新手上路
帖 子:837
专家分:3
注 册:2018-1-4
收藏
得分:0 
下列程序不知问题出自哪里,现贴上代码,请高手赐教,谢谢!!!
开支明细表2.rar (534 Bytes)

图片附件: 游客没有浏览图片的权限,请 登录注册

待修改代码如下:
CLOSE DATABASES
CLEAR ALL
PUBLIC  cPath
cPath=ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)

DECLARE long sscanf IN msvcrt long,string,single@,long@
DECLARE long strcpy IN msvcrt string@,string
DECLARE long strcpy IN msvcrt as strcpy_ptr long,string

cBuffer = REPLICATE(0h00,256)
pBuffer = strcpy(@cBuffer, "")


LOCAL a as Single, n as Long, p as Long, ph as Long
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,"")
      p=strcpy_ptr(@pBuffer,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)
           p  = p+n
           ph = p
           
        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 开支统计表


前天 12:30
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10814
专家分:43424
注 册:2014-5-20
收藏
得分:0 
回复 14楼 王咸美
不能照抄
先要理解每行代码在做什么,不明白的地方可以参考自己的学习笔记,或提出问题让大家共同探讨。
之前的 开支明细表 与 现在的 开支明细表 不是简单的有无“,”,不能随便用""改改就是的。
还有要注意一些细节:
SET RELATION TO 姓名 INTO "开支统计表 "
这句的"开支统计表 "应该是"开支统计表"

[此贴子已经被作者于2025-10-30 15:00编辑过]

前天 14:59
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10814
专家分:43424
注 册:2014-5-20
收藏
得分:0 
要人家给代码,你也要看得明白,还要认真测试一下看看有什么其他的问题,绝对不能照抄。
尤其是我给的代码,甚至连基本的变量声明定义都没有,只能局部问题测试参考,照抄很有可能会出大问题。

前天 15:09
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10814
专家分:43424
注 册:2014-5-20
收藏
得分:14 
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
SET DEFAULT TO (ADDBS(JUSTPATH(SYS(16))))
DECLARE long sscanf IN msvcrt long,string,long,single@,long@
DECLARE long strcpy IN msvcrt string@,string
DECLARE long strcpy IN msvcrt as strcpy_ptr long,string
DECLARE long strlen IN msvcrt long
cBuffer = REPLICATE(0h00,256)
pBuffer = strcpy(@cBuffer, "")
cString = REPLICATE(0h00,256)
pString = strcpy(@cString, "")
CREATE CURSOR tt (姓名 C(10),项目 V(10),金额 N(6,2))
USE 开支明细表2 ALIAS tb IN 0
SELECT tb
SCAN
    getExpenditureRecord(ALLTRIM(tb.支出明细))
ENDSCAN
cmd="CREATE TABLE 开支统计表 (姓名 C(10)"
SELECT DISTINCT 项目 FROM tt INTO CURSOR tmp
SCAN
  cmd=cmd+","+项目+ " n(5,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 开支统计表
CLOSE TABLES ALL 
CLEAR ALL 
RETURN

FUNCTION getExpenditureRecord(er)
    LOCAL a, n, p
    a = 0.00
    n = 0
    p = pBuffer
    strcpy_ptr(p, er)
    DO WHILE SYS(2600,p,1) != 0h00
        IF sscanf(p,"%[^0-9.]%f%n",pString,@a,@n) == 2
            INSERT INTO tt VALUES (tb.姓名, LEFT(SYS(2600,pString,256),strlen(pString)), a)
            p = p+n
        ELSE
            p = p+1
        ENDIF
    ENDDO
ENDFUNC
前天 15:13
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10814
专家分:43424
注 册:2014-5-20
收藏
得分:0 
不用API函数可能容易理解点
程序代码:
SET DEFAULT TO (ADDBS(JUSTPATH(SYS(16))))
CREATE CURSOR tt (姓名 C(10),项目 V(10),金额 N(6,2))
USE 开支明细表2 ALIAS tb IN 0
SELECT tb
SCAN
    getExpenditureRecord(ALLTRIM(tb.支出明细))
ENDSCAN
cmd="CREATE TABLE 开支统计表 (姓名 C(10)"
SELECT DISTINCT 项目 FROM tt INTO CURSOR tmp
SCAN
  cmd=cmd+","+项目+ " n(5,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 开支统计表
CLOSE TABLES ALL 
CLEAR ALL 
RETURN

FUNCTION getExpenditureRecord(er)
    s = ""
    i = 1
    len = LEN(er)
    DO WHILE i <= len
        ch = SUBSTR(er,i,1)
        IF ISDIGIT(ch) OR ch=="."
            a = VAL(SUBSTR(er,i))
            INSERT INTO tt VALUES (tb.姓名, s, a)
            s = ""
            n = i
            DO WHILE ISDIGIT(ch) OR ch=="."
                n = n+1
                ch = SUBSTR(er,n,1)
            ENDDO
            i = n
        ELSE
            s = s+ch
            i = i+1
        ENDIF
    ENDDO
ENDFUNC


前天 15:51
王咸美
Rank: 1
等 级:新手上路
帖 子:837
专家分:3
注 册:2018-1-4
收藏
得分:0 
谢谢!!!
前天 16:30
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1033
专家分:1564
注 册:2021-10-13
收藏
得分:0 
举一反三,举一反三,举一反三。。。

前天 18:57
快速回复:再次求助:如何根据“开支明细”动态生成“开支统计表.dbf”
数据加载中...
 
   



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

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