Foxpro String Forloop中的变量组合

时间:2017-06-30 01:09:05

标签: sql visual-foxpro

与标题一样,我在FOR循环中的第一个代码中存在错误:命令包含无法识别的短语。我在想方法字符串+变量是错误的。

ALTER TABLE table1 ADD COLUMN prod_n c(10)
ALTER TABLE table1 ADD COLUMN prm1 n(19,2)  
ALTER TABLE table1 ADD COLUMN rbon1 n(19,2)
ALTER TABLE table1 ADD COLUMN total1 n(19,2)

有prm2 ......直到total5,其中数字代表月份。

FOR i=1 TO 5
    REPLACE ALL prm+i WITH amount FOR LEFT(ALLTRIM(a),1)="P" AND 
    batch_mth = i
    REPLACE ALL rbon+i WITH amount FOR LEFT(ALLTRIM(a),1)="R" 
AND batch_mth = i
    REPLACE ALL total+i WITH sum((prm+i)+(rbon+i)) FOR batch_mth = i
NEXT
ENDFOR

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你的意思是你有一个名为prm1,prm2,prm3 ... prm12的字段代表几个月你想要在循环中更新它们吗?如果是这样,你需要了解一个" fieldName"是一个名字"因此你需要使用"名称表达式"将它用作变量。那就是:

prm+i

不会工作但是:

( 'pro'+ ltrim(str(m.i)) )

那样。

例如,您的代码已修改:

For i=1 To 5
    Replace All ('prm'+Ltrim(Str(m.i))) With amount For Left(Alltrim(a),1)="P" And batch_mth = m.i
    Replace All ('rbon'+Ltrim(Str(m.i))) With amount For Left(Alltrim(a),1)="R" And batch_mth = m.i
    * ?????????    REPLACE ALL ('total'+Ltrim(Str(m.i))) WITH sum((prm+i)+(rbon+i)) FOR batch_mth = i
Endfor

但是,我必须承认,你的代码对我来说没有意义。也许如果你解释了你想要做的事情会更好,并用你期望的结果给出一些简单的数据(作为代码 - 你可以在foxite上使用FAQ 50来创建数据代码)。

答案 1 :(得分:1)

您在上面发布的代码存在许多问题。 Cetin已经提到过其中的一些,所以如果我复制其中的一些,我会道歉。

问题1 - 在 ALTER TABLE 命令中,我看不到您在哪里创建字段prm2,prm3,prm4,prm5,rbon2,rbon3等。
然而,如果你的代码的其他部分是正确的,你的FOR LOOP将尝试写入那些字段,因为FOR LOOP表达式 i 从1增加到5。

问题2 - 您无法将String连接到整数,以便创建一个字段名称,就像您尝试使用 prm + i rbon + 1

Cetin的代码建议可行(只要您定义了#2,#3等字段)。但是在Foxpro和Visual Foxpro中,您通常可以通过各种方式执行任务。

就个人而言,为了便于阅读,我会像你一样接近你的FOR LOOP:

FOR i=1 TO 5
   * --- Keep in mind that unless fields #2, #3, #4, & #5 are defined ---
   * --- The following will Fail ---
   cFld1 = "prm" + STR(i,1)  && define the 1st field
   cFld2 = "rbon" + STR(i,1)  && define the 2nd field
   cFld3 = "total" + STR(i,1)  && define the 3rd field

   REPLACE ALL &cFld1 WITH amount ;
      FOR LEFT(ALLTRIM(a),1)="P" AND batch_mth = i
   REPLACE ALL &cFld2 WITH amount ;
      FOR LEFT(ALLTRIM(a),1)="R" AND batch_mth = i
   REPLACE ALL &cFld3 WITH sum((prm+i)+(rbon+i)) ;
      FOR batch_mth = i 
NEXT

注意 - 如果您将学习使用VFP的调试工具,以便您可以在VFP开发模式下逐行检查代码执行,这可能会很好。您还可以使用它来检查变量值 断点很好,但您必须已经打开TRACE WINDOW才能让Break工作。
SET STEP ON 是我通常使用的Debug命令,因此程序执行将停止并自动打开TRACE WINDOW以查看代码执行和/或变量值。