以下是引用王咸美在2025-10-30 07:24:19的发言:
谢谢!我想用上表文件“开支明细表.dbf",动态生成如附件所示的“开支统计表.dbf",不知如何操作,请指点!
谢谢!我想用上表文件“开支明细表.dbf",动态生成如附件所示的“开支统计表.dbf",不知如何操作,请指点!
每条记录的各项费用项目名称和金额都能得到了,还有什么问题?
重温一下之前的贴不就是同一个问题吗?
总结一下之前类同的贴就OK

程序代码:
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
程序代码:
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