| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 125 人关注过本帖
标题:下列代码为什么字段列表名称显示不全
取消只看楼主 加入收藏
王咸美
Rank: 1
等 级:新手上路
帖 子:827
专家分:3
注 册:2018-1-4
结帖率:97.41%
收藏
已结贴  问题点数:20 回复次数:5 
下列代码为什么字段列表名称显示不全
下列代码为什么字段列表名称显示不全(如“薯片”显示“薯”,“牛奶”显示“奶”),代码是DeepSeek自动生成的,如何修改?
请高手赐教,万分感谢!(由于个人爱好vfp,不喜勿喷,全当路过)
开支明细帐.rar (569 Bytes)


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编辑过]

搜索更多相关主题的帖子: IF 字段 统计 EXIT LOCAL 
昨天 12:10
王咸美
Rank: 1
等 级:新手上路
帖 子:827
专家分:3
注 册:2018-1-4
收藏
得分:0 
是的,因为“开支明细帐.dbf"中数据没有涉及到小数。
昨晚 20:00
王咸美
Rank: 1
等 级:新手上路
帖 子:827
专家分:3
注 册:2018-1-4
收藏
得分:0 
@吹水佬 谢谢!如何改,盼赐教!
12 小时前
王咸美
Rank: 1
等 级:新手上路
帖 子:827
专家分:3
注 册:2018-1-4
收藏
得分:0 
下列程序怎样修改将“开支统计表.dbf"中“合计”放到最后面?请高手赐教,万分感谢!!!
图片附件: 游客没有浏览图片的权限,请 登录注册


【VFP9代码】(待修改)
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)
   
    * 显示结果
    = 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 = STRTRAN(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 = SUBSTR(cTemp, nStart, nNumStart - nStart)
        
        * 清理商品名称:去除前后空格和可能的标点
        cItem = ALLTRIM(cItem)
        cItem = STRTRAN(cItem, ',,', '')   && 去除可能误包含的逗号
        
        * 添加到商品数组(如果不重复)
        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, j, lFieldExists
   
    * 如果表已存在则删除
    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.
            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, j
        
        cTemp = cExpense
        cTemp = STRTRAN(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
               
                *使用与ParseExpense相同的逻辑提取商品名称
                cItem = SUBSTR(cTemp, nStart, nNumStart - nStart)
                cItem = ALLTRIM(cItem)
                cItem = STRTRAN(cItem, ',,', '')
               
                * 在统计表中更新对应字段
                IF   !EMPTY(cItem)
                    LOCAL   nFieldPos, cFieldName, lFieldFound
                    nFieldPos = ASCAN(aItems, cItem)
                    IF   nFieldPos > 0
                        cFieldName = aItems[nFieldPos]
                        
                        * 处理字段名长度限制
                        IF   LEN(cFieldName) > 10
                            cFieldName = LEFT(cFieldName, 10)
                        ENDIF
                        
                        * 检查字段是否存在并更新
                        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
                        
                        * 如果没找到完全匹配的字段,尝试部分匹配
                        IF   !lFieldFound
                            FOR   j = 2   TO   FCOUNT() - 1
                                * 检查字段名是否以商品名称开头
                                IF  UPPER(cFieldName) == UPPER(LEFT(FIELD(j), LEN(cFieldName)))
                                    REPLACE   (FIELD(j))   WITH   nAmount
                                    nTotal = nTotal + nAmount
                                    lFieldFound = .T.
                                    EXIT
                                ENDIF
                            ENDFOR
                        ENDIF
                    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, cFieldName
    nFieldCount = FCOUNT()
    FOR   i = 1   TO   nFieldCount
        ? "字段" + TRANSFORM(i) + ": " + FIELD(i)
    ENDFOR
   
    ?  " "
    ?  "数据预览(前5条记录):"
    ?  REPLICATE("-", (nFieldCount-1)*10+5)
   
    GO   TOP
    nCount = 0
   
    *  显示字段标题
    cHeader = " "
    FOR   i = 1   TO   nFieldCount
        cHeader = cHeader + PADR(FIELD(i), 10)
    ENDFOR
    ?  cHeader
    ?  REPLICATE("-", (nFieldCount-1)*10+5)
   
    *  显示数据
    SCAN   WHILE   nCount < 5
        cRow = " "
        FOR   i = 1   TO   nFieldCount
            cFieldName = FIELD(i)
            IF   TYPE(cFieldName) = 'N'
                cRow = cRow + PADR(TRANSFORM(EVALUATE(ALIAS()+"."+cFieldName)), 10)
            ELSE
                cRow = cRow + PADR(EVALUATE(ALIAS()+"."+cFieldName), 10)
            ENDIF
        ENDFOR
        ?  cRow
        nCount = nCount + 1
    ENDSCAN
   
    ?  REPLICATE("-", (nFieldCount-1)*10+5)
    ?  "总记录数:" + TRANSFORM(RECCOUNT())
    ?  "总字段数:" + TRANSFORM(nFieldCount)
RETURN   .T.

9 小时前
王咸美
Rank: 1
等 级:新手上路
帖 子:827
专家分:3
注 册:2018-1-4
收藏
得分:0 
前面提到的问题已解决,如何将“合计”放到最后面
8 小时前
王咸美
Rank: 1
等 级:新手上路
帖 子:827
专家分:3
注 册:2018-1-4
收藏
得分:0 
谢谢!

8 小时前
快速回复:下列代码为什么字段列表名称显示不全
数据加载中...
 
   



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

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