什么被删除?

时间:2017-06-29 16:16:27

标签: visual-foxpro

我正在浏览一些对我来说很新的Visual Foxpro 7.0。我在使用两个不同的工作区域解析DO WHILE中的DELETE命令时遇到了一些麻烦。

我还不清楚实际被删除的内容。当发出DELETE命令时,我使用工作区1但我没有循环遍历任何记录。如果DELETE命令被用于对付tblpay(工作区1),那么它似乎正在删除刚刚插入的记录,这是没有意义的。有人能告诉我吗?

select 1 (tblpay)
USE tblpay

select 2 (tblfac)
USE tblfac
GOTO top

DO WHILE NOT EOF()
    lcfy = fy
    lcindex_no = index_no
    lcpca = pca
    lnpys = padl(alltrim(str(cum_pys)),13,' ')
    select 1 (tblpay)
    LOCATE FOR fy = lcfy AND index_no = lcindex_no AND pca = lcpca
    IF NOT FOUND()
        INSERT INTO tblpay(exp_1,fy,exp_3,exp_4,exp_5,exp_6,index_no,exp_8,pca,cum_pys,reversal) ;
            values('805',lcfy,SPACE(37),lcdoc_date,lccurdoc,'00',lcindex_no,'99802',lcpca,lnpys,'R')
        DELETE
    ENDIF
    select 2 (tblfac)
    SKIP
ENDDO

2 个答案:

答案 0 :(得分:2)

不可否认,您展示的代码不是很清楚。

一些建议的更改:

select 1 (tblpay)  
USE tblpay  

应该是

USE tblpay IN 0  && Open table tblpay into next available workspace  

select 2 (tblfac)
USE tblfac  

应该是

USE tblfac IN 0  && Open table tblfac into next available workspace  

然后您将不再需要记住 SELECT 1 SELECT 2 - 现在我在#1或#2中有什么? 相反,您可以通过 Alias 选择表格,例如: SELECT tblpac

其余代码也没有多大意义 *您选择表 tblfac 并扫描其值的记录 *然后你去表 tblpay 并尝试找到一个或多个特定记录
*如果 tblpay **记录未找到,则使用** tblfac (和其他信息)中的值并使用SQL命令将新记录插入 tblpay (您也可以使用VFP命令: APPEND BLANK ,然后是 REPLACE ) *后面的DELETE将删除它当前指向的表记录 - 但是编写代码的方式可能不是您想要的。

它看起来的样子,好像你在 tblpay 中没有找到匹配的记录,你的记录指针仍然指向那个表,但它现在处于EOF()(文件结束)而不是任何实际记录。并试图删除它不会做任何事情。

在VFP开发模式下,您应该使用Debug方法实际“看到”哪个表表记录指针“正在查看”以及哪条记录。
为此,您可能希望以下列方式使用** SET STEP ON **。

IF NOT FOUND()
    INSERT INTO tblpay(exp_1,fy,exp_3,exp_4,exp_5,exp_6,index_no,exp_8,pca,cum_pys,reversal) ;
        values('805',lcfy,SPACE(37),lcdoc_date,lccurdoc,'00',lcindex_no,'99802',lcpca,lnpys,'R')
    SET STEP ON  && Added Here for Debug Purposes ONLY
    DELETE
ENDIF  

然后,当您在VFP开发模式下执行代码并执行命中该行时,它将暂停执行并打开Debug TRACE窗口 - 从而允许您调查记录指针等。

祝你好运

答案 1 :(得分:1)

Dhugalmac所说的是部分正确但不完全正确。如果找不到搜索到的记录,则表示您正在插入记录,然后删除该新插入的记录。指针不是在EOF,而是在新记录中。

正如Dhugalmac所说,不要使用工作区编号而是使用别名。上面的代码不是真正的代码,它不会在没有错误的情况下运行。

如果您正在使用此代码及其用于学习的文本,请立即停止阅读并将其转储。代码很糟糕,听起来没有目的(除了有错误)。

如果您的目的是学习如何从VB.Net中删除,只需使用VFPOLEDB和DELETE - SQL命令与ExecuteNonQuery(就像对SQL服务器,PostgreSQL,MySql ......任何ANSI数据库一样)。使用VB.Net,大多数xbase命令都没有位置(这些命令都没有...跳过... enddo - 即使你不会在VFP中使用它。)