我正在浏览一些对我来说很新的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
答案 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中使用它。)