假设我正在使用名为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。
答案 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
从计数器追加身份='发票'