下列代码为什么字段列表名称显示不全
下列代码为什么字段列表名称显示不全(如“薯片”显示“薯”,“牛奶”显示“奶”),代码是DeepSeek自动生成的,如何修改?请高手赐教,万分感谢!(由于个人爱好vfp,不喜勿喷,全当路过)
Vfp代码如下:
* 动态生成开支统计表(待验证)
CLOSE DATABASES
CLEAR ALL
cPath=ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)
* 设置工作环境
SET SAFETY OFF
SET TALK OFF
SET EXCLUSIVE ON
* 主程序
DO MainProcess
PROCEDURE MainProcess
* 打开开支明细帐表
IF !USED('开支明细帐')
USE 开支明细帐 IN 0
ENDIF
SELECT 开支明细帐
* 收集所有不重复的商品名称
LOCAL ARRAY aItems[1]
LOCAL nItemCount
nItemCount = 0
DIMENSION aItems[1]
aItems[1] = " "
* 扫描表解析商品名称
SCAN
LOCAL cExpense
cExpense = ALLTRIM(支出明细)
* 解析支出明细 - 修正调用语法
= ParseExpense(cExpense, @aItems, @nItemCount)
ENDSCAN
* 创建开支统计表
= CreateStatTable(@aItems, nItemCount)
* 填充数据
= FillStatData(@aItems, nItemCount)
*确保合计字段在最后位置
* =EnsureLastPosition()
* 显示结果
= ShowResults()
* 清理
USE IN 开支明细帐
USE IN 开支统计表
SET TALK ON
SET SAFETY ON
RETURN
PROCEDURE ParseExpense(cExpense, aItems, nItemCount)
* 解析支出明细字符串,提取商品名称
LOCAL nPos, cItem, cTemp, i, nNumStart, nStart
* 替换可能的全角逗号
cExpense = CHRTRAN(cExpense, ',', ',')
cTemp = cExpense
DO WHILE .T.
* 查找"元"的位置
nPos = AT('元', cTemp)
IF nPos = 0
EXIT
ENDIF
* 从后往前找数字的开始位置
nNumStart = 0
FOR i = nPos - 1 TO 1 STEP -1
IF !ISDIGIT(SUBSTR(cTemp, i, 1))
nNumStart = i + 1
EXIT
ENDIF
ENDFOR
IF nNumStart = 0
nNumStart = 1
ENDIF
* 在数字前找商品名称的开始(逗号或开头)
nStart = 1
FOR i = nNumStart - 1 TO 1 STEP -1
IF SUBSTR(cTemp, i, 1) $ ', '
nStart = i + 1
EXIT
ENDIF
ENDFOR
* 提取商品名称
cItem = ALLTRIM(SUBSTR(cTemp, nStart, nNumStart - nStart))
* 添加到商品数组(如果不重复)
IF !EMPTY(cItem) AND ASCAN(aItems, cItem) = 0
nItemCount = nItemCount + 1
DIMENSION aItems[nItemCount]
aItems[nItemCount] = cItem
ENDIF
* 移动到下一个项目
cTemp = SUBSTR(cTemp, nPos + 1)
IF EMPTY(cTemp)
EXIT
ENDIF
ENDDO
RETURN
FUNCTION CreateStatTable(aItems, nItemCount)
* 创建开支统计表结构
LOCAL i, cFieldName, cOrigFieldName, nSuffix
* 如果表已存在则删除
IF FILE('开支统计表.dbf')
DELETE FILE 开支统计表.dbf
ENDIF
* 创建新表结构
CREATE TABLE 开支统计表 (姓名 C(10))
* 添加商品字段
FOR i = 1 TO nItemCount
cFieldName = aItems[i]
* 处理字段名长度限制(VFP字段名最长10字符)
IF LEN(cFieldName) > 10
cFieldName = LEFT(cFieldName, 10)
ENDIF
* 检查字段名是否重复
nSuffix = 1
cOrigFieldName = cFieldName
DO WHILE .T.
LOCAL lFieldExists
lFieldExists = .F.
FOR j = 1 TO FCOUNT('开支统计表')
IF UPPER(FIELD(j, '开支统计表')) == UPPER(cFieldName)
lFieldExists = .T.
EXIT
ENDIF
ENDFOR
IF lFieldExists
cFieldName = LEFT(cOrigFieldName, 8) + ALLTRIM(STR(nSuffix))
nSuffix = nSuffix + 1
ELSE
EXIT
ENDIF
ENDDO
ALTER TABLE 开支统计表 ADD COLUMN (cFieldName) N(8,0)
ENDFOR
* 添加合计字段(放在最后)
ALTER TABLE 开支统计表 ADD COLUMN 合计 N(10,0)
USE IN 开支统计表
USE 开支统计表 IN 0
RETURN .T.
FUNCTION FillStatData(aItems, nItemCount)
* 填充开支统计表数据
SELECT 开支明细帐
GO TOP
SCAN
LOCAL cName, cExpense, nTotal
cName = ALLTRIM(姓名)
cExpense = ALLTRIM(支出明细)
nTotal = 0
* 在开支统计表中添加新记录
SELECT 开支统计表
APPEND BLANK
REPLACE 姓名 WITH cName
* 解析并填充各项支出
LOCAL cTemp, nPos, i, nNumStart, nStart, nAmount, cItem
cTemp = cExpense
cTemp = CHRTRAN(cTemp, ',', ',')
DO WHILE .T.
nPos = AT('元', cTemp)
IF nPos = 0
EXIT
ENDIF
* 提取金额和商品名称
nNumStart = 0
* 在"元"前找数字的开始
FOR i = nPos - 1 TO 1 STEP -1
IF !ISDIGIT(SUBSTR(cTemp, i, 1))
nNumStart = i + 1
EXIT
ENDIF
ENDFOR
IF nNumStart > 0
nAmount = VAL(SUBSTR(cTemp, nNumStart, nPos - nNumStart))
* 找商品名称的开始
nStart = 1
FOR i = nNumStart - 1 TO 1 STEP -1
IF SUBSTR(cTemp, i, 1) $ ', '
nStart = i + 1
EXIT
ENDIF
ENDFOR
cItem = ALLTRIM(SUBSTR(cTemp, nStart, nNumStart - nStart))
* 在统计表中更新对应字段
IF !EMPTY(cItem)
LOCAL nFieldPos, cFieldName
nFieldPos = ASCAN(aItems, cItem)
IF nFieldPos > 0
cFieldName = aItems[nFieldPos]
IF LEN(cFieldName) > 10
cFieldName = LEFT(cFieldName, 10)
ENDIF
* 检查字段是否存在并更新
LOCAL lFieldFound
lFieldFound = .F.
FOR j = 2 TO FCOUNT() - 1 && 跳过姓名和合计字段
IF UPPER(FIELD(j)) == UPPER(cFieldName)
REPLACE (FIELD(j)) WITH nAmount
nTotal = nTotal + nAmount
lFieldFound = .T.
EXIT
ENDIF
ENDFOR
ENDIF
ENDIF
ENDIF
* 移动到下一个项目
cTemp = SUBSTR(cTemp, nPos + 1)
IF EMPTY(cTemp)
EXIT
ENDIF
ENDDO
* 更新合计字段
SELECT 开支统计表
REPLACE 合计 WITH nTotal
SELECT 开支明细帐
ENDSCAN
RETURN .T.
FUNCTION ShowResults
* 显示生成结果
CLEAR
? "开支统计表生成完成!"
? "字段列表:"
SELECT 开支统计表
LOCAL nFieldCount, i, cHeader, cRow, nCount
nFieldCount = FCOUNT()
FOR i = 1 TO nFieldCount
? "字段" + TRANSFORM(i) + ": " + FIELD(i)
ENDFOR
? " "
? "数据预览(前5条记录):"
? REPLICATE("-", 204)
GO TOP
nCount = 0
* 显示字段标题
cHeader = ""
FOR i = 1 TO nFieldCount
cHeader = cHeader + PADR(FIELD(i), 10)
ENDFOR
? cHeader
? REPLICATE("-", 204)
* 显示数据
SCAN WHILE nCount < 5
cRow = " "
FOR i = 1 TO nFieldCount
LOCAL cFieldName
cFieldName = FIELD(i)
IF TYPE(cFieldName) = 'N'
* cRow = cRow + PADR(TRANSFORM(EVALUATE(cFieldName)), 12)*
cRow =cRow + PADR(TRANSFORM(EVALUATE(ALIAS()+"."+cFieldName)),10)
ELSE
* cRow = cRow + PADR(EVALUATE(cFieldName), 12)
cRow =cRow + PADR(EVALUATE(ALIAS()+"."+cFieldName),10) &&
ENDIF
ENDFOR
? cRow
nCount = nCount + 1
ENDSCAN
? REPLICATE("-", 204)
? "总记录数:" + TRANSFORM(RECCOUNT())
? "总字段数:" + TRANSFORM(nFieldCount)
RETURN .T.
[此贴子已经被作者于2025-10-25 12:23编辑过]






