【问题标题】:Foxpro String Variable combination in ForloopFor循环中的Foxpro字符串变量组合
【发布时间】:2017-06-30 01:09:05
【问题描述】:

如标题所示,我在 FOR 循环中的第一个代码中存在错误:命令包含无法识别的短语。我在想是不是string+variable的方法错了。

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

感谢您的帮助。

【问题讨论】:

  • @KenWhite 感谢您的回复。意思是说我必须一个一个地使用 REPLACE 命令?因为组合不能以这种方式工作。
  • @KenWhite,这不是真的。只要将变量视为名称表达式,就可以使用变量引用替换命令中的字段。

标签: sql visual-foxpro


【解决方案1】:

您在上面发布的代码有很多问题。 Cetin 提到了其中的一些,所以如果我重复其中的一些,我深表歉意。

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

问题 2 - 您不能像使用 prm+irbon+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 是我通常使用的调试命令,以便程序执行将停止并自动打开跟踪窗口以查看代码执行和/或变量值。

【讨论】:

  • 感谢您的回复。 Cetin 的解决方案适用于“prm”和“rbon”,但不适用于全部,因为它显示“数据类型不匹配”。我已经使用您的命令定义了每个字段名称,并且成功运行。谢谢。
【解决方案2】:

您的意思是您有代表月份的名为 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 上的常见问题解答 50 为数据创建代码),也许会更好。

【讨论】:

  • 您的回答正是我的 cmets 所做的(您反对)。我只是无法写出答案,因为我目前无法访问 FoxPro,而且我很久以前就知道您不会在此处发布未经测试的代码。 :-) 我已经删除了上面的 cmets 以避免任何混淆。
  • @KenWhite,我得到你的 cmets 说你不能这样做。也许我误解了你的句子。
  • 抱歉回复晚了。答案是肯定的。我试图使用 while 循环,它非常混乱,因为它不断为每个 i 重复相同的命令。感谢您的帮助,它已减少到大约 5 行编码!
猜你喜欢
  • 1970-01-01
  • 2020-05-22
  • 2012-05-25
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
相关资源
最近更新 更多