关于逻辑表达式的FoxPro错误

时间:2011-04-20 14:15:15

标签: visual-foxpro

假设我正在使用名为Org的FoxPro表,并且在其众多列中有一个名为“comm_typ”的列。如果我当前选择了Org,我说:

SET FILTER TO comm_typ = 'A'

非常简单,对吧?它工作正常;没有错误,只返回comm_typ值为'A'的记录。

但是,如果我尝试使用相同的逻辑表达式来削减APPEND FROM命令,FoxPro不喜欢它。如果我发出以下命令:

Use Org in 1
Use Temp in 2
Select Temp    
APPEND FROM Org for comm_typ = 'A'

我在APPEND FROM上收到此错误:'您必须使用带有FOR或WHILE子句的逻辑表达式。'

我已经对APPEND FROM命令中的预期语法进行了双重和三重检查,我已经确认实际上有一些记录的comm_typ值为'A',这些记录将被追加。

编辑: 我想通了。

插入APPEND FROM ... FOR ...命令时出现错误的所有列都有一个共同点:它们包含NULL值。不只是一个空字段,一个实际的.NULL。这是APPEND FROM窒息的原因。在我的Org表上,我发出了这个命令:

REPLACE comm_typ WITH '' FOR ISNULL(comm_typ)

然后我再次尝试追加,它起作用了。 另一种可能的解决方法,而不是用空格替换所有空值,是调整FOR子句以考虑空值,如下所示:

APPEND FROM Org FOR comm_typ = 'A' .and. !ISNULL(comm_typ)

这些空值存在是因为我的办公室正处于从FoxPro到SQL Server的过渡期间,并且在某些情况下我们有数据在FoxPro和SQL Server之间来回反弹。当一个空的FoxPro字段映射到SQL Server时,它表示为NULL,当它被转储回FoxPro远程视图时,它表示为.NULL。

2 个答案:

答案 0 :(得分:0)

首先,你正在做的事情没有意义......除了尝试复制所有类型的记录并放回到原始的Org表中......这是用于测试命令语法还是什么。如果您有其他目的,请告诉我们。

你的语法是正确的,否则......但是可以肯定的是,你可以做这样的测试

close tables 
use Org
select 0
use Org AGAIN alias OrgVersion2
append from Org for comm_typ = 'A'

从更多的澄清,我想我可能知道是什么了。你的SECOND表中你正在拉记录INTO有一个名为“Comm_typ”的列,如果不是,那就是你的问题。 'FOR'子句适用于您正在使用的表,而不是来自其中的表。所以... Ex:

组织表 Comm_typ,Fld1,Fld2,Fld3,Fld4

第二张表 Fld1,Fld2,fld3,Fld4

并且您的“第二”表格具有焦点 选择SECOND 然后呢 从Org追加Comm_Typ ='A'将失败,因为追加来自基于ITS的表结构。它几乎就像来自ORG的记录是ALL进入SECOND表结构的初始记录持有者(它没有Comm_Typ列),然后对这个“临时记录持有者”应用FOR子句并允许插入或抛出它。在这种情况下,该列不存在,并且给出了错误的错误...

你可能想做的是......

* / THIS将过滤应用于单独的游标,其中的条件预先限制了您想要的记录。

select * from org where comm_typ = 'A' into cursor C_MyTempExtraction readwrite

* /现在,追加,因为你知道它是一套干净的记录。

select Second
Append from C_MyTempExtraction

答案 1 :(得分:0)

关闭表格

使用组织

选择0

使用Org AGAIN别名OrgVersion2

来自Org的comm_typ ='A'

以上是尝试将记录附加到'org'表,因为OrgVersion2是具有不同别名的SAME表

我用两个不同的表尝试了上面的代码,它在VFP8中运行良好

如下: -

使用计数器

将struct复制到tmp

选择0

使用tmp

从计数器追加身份='发票'