注册 登录
编程论坛 VFP论坛

VFP 程序设计_嵌套循环_错在哪儿了_只有第一行的dpth计算正确,第二行的计算结果就不对了

Heris_Lau 发布于 2023-12-27 14:06, 360 次点击
程序代码:
GOTO TOP
DO WHILE .NOT. EOF()
    S=0
    FOR k=1 TO ALEN(B)+1
        IF k=ALEN(B)+1
            REPLACE dpth WITH k
        ELSE
            Y=B(k)
            S=S+&Y
            ?"S=",S
            IF S<(yxkc_All+ykzt_all)
                LOOP
            ELSE
                REPLACE dpth WITH IIF(ISNULL(k-1+1-(S-yxkc_all-ykzt_all)/&Y)=.T.,0,(k-1+1-(S-yxkc_all-ykzt_all)/&Y)) FOR &Y>0
                EXIT  &&这里使用exit到底是只跳出for..endfor循环,还是跳出了do while... enddo 的循环
            ENDIF
        ENDIF
    ENDFOR
    SKIP +1
ENDDO
10 回复
#2
sdta2023-12-27 14:17
for endfor 中的EXIT 只跳出FOR ENDFOR循环
这段代码共有多少行,楼主说的第一行、第二行代码指的是什么内容?

[此贴子已经被作者于2023-12-27 14:18编辑过]

#3
Heris_Lau2023-12-27 14:22
回复 2楼 sdta
我说第一行,计算正确确切是指第一条记录计算正确,而从第二条记录开始计算结果就是错误的
#4
sdta2023-12-27 14:52
以下是引用Heris_Lau在2023-12-27 14:22:59的发言:

我说第一行,计算正确确切是指第一条记录计算正确,而从第二条记录开始计算结果就是错误的

上传相关数据表及计算要求
#5
Heris_Lau2023-12-27 16:13
只有本站会员才能查看附件,请 登录

程序计算的目标是:是计算库存(yxkc_all)和在途(ykzt_all)能满足未来几个月(dpth)的需求,Q202401是指2024年1月的预测需求,Q202402是指2024年2月的预测需求,以此类推,目前附件中第一行的计算结果正确dpth 5.26,意思是库存和在途能满足未来5.26个月的需求,但是从第二条记录开始,dpth就计算错误了,但计算dpth的公式IIF(ISNULL(k-1+1-(S-yxkc_all-ykzt_all)/&Y)=.T.,0,(k-1+1-(S-yxkc_all-ykzt_all)/&Y))是正确的
#6
Heris_Lau2023-12-27 16:22
上楼是涉及的数据表格,请大神指点。我比较怀疑的一个点是 exit的应用,程序执行到exit后到底是跳出endfor的循环,还是跳出do while enddo的循环
#7
sdta2023-12-27 16:26
数组B从何而来
#8
Heris_Lau2023-12-27 16:47
回复 7楼 sdta
数组B处理之前的数据的,这里主要是通过数组指向Q202401,Q202402,等这几个字段的,我这个程序 skip +1 也没发挥作用,程序没有逐条记录计算
#9
Heris_Lau2023-12-27 16:51
只有本站会员才能查看附件,请 登录

这图片是我尝试转程序,VFP提示,在没有逐条计算的情况下,就到表尾了,这个有问题,但是我不知道错在哪儿
#10
Heris_Lau2023-12-27 17:03
我找到错误了,是在 if的命令语句 REPLACE dpth WITH IIF(ISNULL(k-1+1-(S-yxkc_all-ykzt_all)/&Y)=.T.,0,(k-1+1-(S-yxkc_all-ykzt_all)/&Y)) for &Y>0,把&Y>0去掉就可以了,因为加上for条件,这条命令就对整体表格起作用了,指针直接到表尾了,因此报错,已到表尾,无法逐条计算
#11
sdta2023-12-27 17:09
以下是引用Heris_Lau在2023-12-27 16:22:49的发言:

上楼是涉及的数据表格,请大神指点。我比较怀疑的一个点是 exit的应用,程序执行到exit后到底是跳出endfor的循环,还是跳出do while enddo的循环

看2楼回复
把DO WHILE 改为SCAN ENDSCAN试试
1