| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 847 人关注过本帖
标题:请问这段程序那里错了?
只看楼主 加入收藏
oogami
Rank: 2
等 级:论坛游民
帖 子:62
专家分:16
注 册:2013-1-29
结帖率:75%
收藏
已结贴  问题点数:10 回复次数:12 
请问这段程序那里错了?
SET TALK OFF
CLOSE TABLES ALL
SET DELETED ON

USE f:\评估\VFP\保单信息20121231.dbf IN 0 ALIAS 保单信息20121231

SELECT 保单信息20121231

SCAN
    DO CASE
        CASE 产品代码="00110100" OR 产品代码="00112500"
            REPLACE 有效保额 WITH MAX(基本保额*(1+保单年度*0.05),年保费*MIN(保单年度,交费期限))
        
        CASE INLIST(产品代码,"00126600","00321500","00231000")  
            REPLACE 有效保额 WITH 基本保额
        OTHERWISE
            SELECT 保单信息20121231
        
    ENDCASE
ENDSCAN

REPLACE ALL 风险保额2 WITH MAX(有效保额,基本保额)-未到期责任 FOR !EMPTY(有效保额)
 

SET DELETED OFF
CLOSE TABLES ALL
SET TALK ON



一跑就出现nesting error
看了下帮助,scan 也有endscan,do case也有endcase
不知道哪里错了?
搜索更多相关主题的帖子: 信息 产品 
2013-04-16 14:24
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:2 
以下是引用oogami在2013-4-16 14:24:06的发言:

SET TALK OFF  
CLOSE TABLES ALL  
SET DELETED ON
 
USE f:\评估\VFP\保单信息20121231.dbf IN 0 ALIAS 保单信息20121231
 
SELECT 保单信息20121231
 
SCAN
    DO CASE  
        CASE ALLTRIM(产品代码)=="00110100" OR ALLTRIM(产品代码)=="00112500"
            REPLACE 有效保额 WITH MAX(基本保额*(1+保单年度*0.05),年保费*MIN(保单年度,交费期限))
         
        CASE INLIST(ALLTRIM(产品代码),"00126600","00321500","00231000")   
            REPLACE 有效保额 WITH 基本保额
        OTHERWISE
            SELECT 保单信息20121231
         
    ENDCASE  
ENDSCAN
 
REPLACE ALL 风险保额2 WITH MAX(有效保额,基本保额)-未到期责任 FOR !EMPTY(有效保额)
  
 
SET DELETED OFF  
CLOSE TABLES ALL  
SET TALK ON
 
 
 
一跑就出现nesting error
看了下帮助,scan 也有endscan,do case也有endcase
不知道哪里错了?
上传表看看

[ 本帖最后由 sdta 于 2013-4-16 15:13 编辑 ]

坚守VFP最后的阵地
2013-04-16 14:54
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:2 
虽然不知道你的表文件数据,也不知道你程序的意义。但是,凭直觉,问题出在第一个REPLACE和最后一个REPLACE的MAX()、MIN()函数上。这两个函数在普通场合和SELECT-SQL场合意义是不同的:在普通场合,仅仅对函数括号中的各表达式结果取最大/最小值,没有扫描表文件记录的作用;而在SELECT-SQL中,这两个函数有扫描表文件记录的作用,且失去了普通场合中的作用,而且不能嵌套使用。我看你第一个REPLACE中的MIN()和最后一个REPLACE中的MAX(),好像都是用于扫描表文件记录,从而找出最小/最大值。若真的这样,问题就出在这里。不知道我的猜测是否正确。
2013-04-16 14:57
oogami
Rank: 2
等 级:论坛游民
帖 子:62
专家分:16
注 册:2013-1-29
收藏
得分:0 
回复 2楼 sdta
表太大了,2个G差不多。

应该不是这个问题,我平时在command里面用命令都是直接 产品代码=“123456789”这样子的
2013-04-16 15:51
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:2 
这代码看不出什么问题,放大范围,检查下其它代码。
2013-04-16 16:01
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用oogami在2013-4-16 15:51:12的发言:

表太大了,2个G差不多。
 
应该不是这个问题,我平时在command里面用命令都是直接 产品代码=“123456789”这样子的
取100条记录看看,保人姓名可以清空

坚守VFP最后的阵地
2013-04-16 16:03
oogami
Rank: 2
等 级:论坛游民
帖 子:62
专家分:16
注 册:2013-1-29
收藏
得分:0 
对不住大家了,我找出原因了,程序中少了几个括号,还有个if 没有endif
不好意思让大家帮我看了。

另外能否再问一个问题,如果有很多case要写,有没有什么简便的方法来的?
2013-04-16 16:58
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
SCAN
    DO CASE  
        CASE ALLTRIM(产品代码)=="00110100" OR ALLTRIM(产品代码)=="00112500"
            REPLACE 有效保额 WITH MAX(基本保额*(1+保单年度*0.05),年保费*MIN(保单年度,交费期限))
         
        CASE INLIST(ALLTRIM(产品代码),"00126600","00321500","00231000")   
            REPLACE 有效保额 WITH 基本保额
        OTHERWISE
            SELECT 保单信息20121231
         
    ENDCASE  
ENDSCAN

以上的可以写成这样
REPLACE all 有效保额 WITH MAX(基本保额*(1+保单年度*0.05),年保费*MIN(保单年度,交费期限)) for ALLTRIM(产品代码)=="00110100" OR ALLTRIM(产品代码)=="00112500"  in 保单信息20121231
REPLACE all 有效保额 WITH 基本保额 for INLIST(ALLTRIM(产品代码),"00126600","00321500","00231000") in 保单信息20121231






2013-04-16 17:09
chenjie1983
Rank: 1
等 级:新手上路
帖 子:14
专家分:4
注 册:2013-4-15
收藏
得分:2 
我用临时表测试过楼主的代码,没有报错。应该是其他的问题吧?
2013-04-16 17:14
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
SCAN
    DO CASE  
        CASE ALLTRIM(产品代码)=="00110100" OR ALLTRIM(产品代码)=="00112500"
            REPLACE 有效保额 WITH MAX(基本保额*(1+保单年度*0.05),年保费*MIN(保单年度,交费期限))
         
        CASE INLIST(ALLTRIM(产品代码),"00126600","00321500","00231000")   
            REPLACE 有效保额 WITH 基本保额
        OTHERWISE
            SELECT 保单信息20121231
         
    ENDCASE  
ENDSCAN
可改为(vfp9)
REPLACE ALL 有效保额 WITH ICASE(INLIST(ALLTRIM(产品代码),"00110100","00112500"),MAX(基本保额*(1+保单年度*0.05),年保费*MIN(保单年度,交费期限)),INLIST(ALLTRIM(产品代码),"00126600","00321500","00231000"),基本保额,0)



坚守VFP最后的阵地
2013-04-16 17:40
快速回复:请问这段程序那里错了?
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026720 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved