2017-06-29 146 views
0

我正在瀏覽一些對我而言是新的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

無可否認,您所顯示的代碼並不十分清晰。

一些修改建議:

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 

然後,你將不再需要記住選擇1選擇2 - 現在我在#1或#2有什麼?
相反,你會選擇表它通過在其別名如:SELECT tblpac

的代碼的其餘部分並沒有太大的意義要麼。
*您選擇表tblfac並掃描其記錄值
*那你去表tblpay,並試圖要找到一個或多個特定的記錄
*如果tblpay **記錄未找到,你然後使用值從** tblfac(和其他信息),並使用SQL命令插入新記錄插入tblpay(你可能還使用了VFP命令:APPEND BLANK接着是更換
*下面的DELETE那將會刪除它當前指向的表記錄 - 但是你寫代碼的方式可能不是你想要的。

它的樣子,就好像如果你還沒有找到()匹配的記錄在tblpay您記錄指針仍然指向該表,但它現在是在EOF()(完文件)而不是任何實際的記錄。而試圖刪除它不會做任何事情。

在您的VFP開發模式中,您應該使用調試方法實際「查看」哪個表表記錄指針在「查看」哪個記錄。
要做到這一點,您可能需要按以下方式使用** 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發展模式中執行代碼並執行打那行,將停止執行,並且打開調試跟蹤窗口 - 從而使您能夠研究記錄指針等

好運

+0

只是爲了清除自己..我沒有寫這個代碼。這是在我工作的300頁文本文件中。我甚至沒有一個項目可以用來調試並親自查看。我會回顧你說的話,看看我能想出什麼。謝謝! – GunnerFan420

+0

只是添加我將此代碼轉換爲vb.net和SQL,所以我只是想弄清楚如果DELETE是針對DO WHILE或INSERT記錄中的當前記錄。再次感謝! – GunnerFan420

+0

執行刪除時,指針位於EOF處是不正確的。它在新插入的記錄上。因此刪除正在刪除插入的記錄。 –

1

Dhugalmac說的是部分正確,但不完全。如果沒有找到搜索到的記錄,那麼您將插入一條記錄,然後刪除該新插入的記錄。指針不在EOF處,而是在新紀錄處。

正如Dhugalmac所說,不要使用工作區號碼,而要使用別名。上面的代碼不是真正的代碼,它不會運行沒有錯誤。

如果您正在使用此代碼及其用於學習的文本,請立即停止閱讀並將其丟棄。代碼很糟糕,聽起來沒有目的(除了有錯誤)。

如果您的目的是學習如何從VB.Net中刪除,只需使用VFPOLEDB和帶有ExecuteNonQuery的DELETE-SQL命令(就像您對SQL服務器,PostgreSQL,MySql ...任何ANSI數據庫所做的那樣)。使用VB.Net,大多數xbase命令都沒有位置(既不會在...... skip ... enddo中執行這些命令 - 即使您不會在VFP中使用它)。

+0

這是真正的代碼,它運行沒有錯誤我只是沒有源項目。我正在將應用程序轉換爲vb.net和sql,並且需要了解DELETE命令實際上正在刪除的內容。我不會對Foxpro進行任何更改。謝謝。 – GunnerFan420

+1

這不是真正的代碼。只需嘗試複製/粘貼並從VFP中運行即可。它只是有語法錯誤。 刪除命令正在刪除插入的記錄,正如我已經說過的。該代碼沒有任何用途(唯一很小的可能性是插入並立即將插入的記錄標記爲在棘手的目的上被刪除)。 –

+0

這是真實的代碼。先生先生。 – GunnerFan420