FIX: Pack Closes Index File But Does Not Update It
ID: Q135040
|
The information in this article applies to:
-
Microsoft Visual FoxPro for Windows, versions 3.0, 3.0b
SYMPTOMS
When Visual FoxPro packs a table to remove deleted records, any
non-structural index open at the time is closed. However, when a program
subsequently uses the table that depends on its indexed order, the program
will not perform as expected and may give unexpected error messages.
When Visual FoxPro packs a table to remove deleted records, any regular
structural compound index (one with the same name as the
table and with a .cdx extension) open at the time is not closed.
This is different from the behavior of previous versions of FoxPro.
WORKAROUND
Explicitly re-open the index file and use the REINDEX command before
proceeding with the program.
STATUS
Microsoft has confirmed this to be a problem in the Microsoft products
listed at the beginning of this article. The problem has been fixed in
Visual FoxPro 5.0.
MORE INFORMATION
Steps to Reproduce Problem
Type the following commands into a Visual FoxPro program, and then run it.
*** Program to demonstrate the effect of PACK
*** on open index files in Visual FoxPro
*** Test program named Testpack.prg
CLEAR
SET SAFETY OFF
CLEAR ALL
CLOSE ALL
********Creation of testfile
DECLARE new_dbf[1,4]
new_dbf[1,1] = "Pagenum"
new_dbf[1,2] = "N"
new_dbf[1,3] = 4
new_dbf[1,4] = 0
SELECT 0
CREATE TABLE temptabl FROM ARRAY new_dbf && It's in USE
INDEX ON Deleted() TAG Deleted && .CDX is also in USE
INDEX ON Pagenum TAG Pagenum
SET ORDER TO
COPY TO Temptbl2 WITH PRODUCTION && On the disk so
RENAME Temptbl2.dbf TO testfile.dbf && Can rename.
RENAME Temptbl2.cdx TO testfile.pax && Now not structural.
* Index file has multiple tags. It is a non-structural compound
* index file. A single index file with the extension of .idx
* will also demonstrate the issue.
USE testfile INDEX testfile.pax ALIAS testfile EXCLUSIVE
SET ORDER TO
**** Add some records then delete some
SELECT testfile
FOR q = -10 to 50 && 60 records
APPEND BLANK
REPLACE Pagenum WITH q
IF q/3 == INT(q/3) && Every third record
DELETE
ENDIF
ENDFOR
CLEAR
WAIT WINDOW "About to display status." ;
+ chr(13) + ;
"Please notice that the table has its index file open."
DISPLAY STATUS
WAIT
CLEAR
WAIT WINDOW "About to pack."
PACK
WAIT WINDOW "About to display status again." ;
+ chr(13) + ;
"Please notice that the index file has been closed."
DISPLAY STATUS
WAIT
WAIT WINDOW "Use Alt+I to bypass the next message, but" ;
+ chr(13) + ;
"read it first - you're trying to use a closed index."
SET ORDER TO 1
BROWSE NOWAIT
WAIT WINDOW "Every 3rd record was deleted. Packing removed them." ;
+ chr(13) + ;
"But, as you have seen, the index file was closed." ;
+ chr(13) + ;
"See if the index still exists. Watch the status bar."
ERASE testfile.pax
WAIT WINDOW "The message - File has been deleted - says" ;
+ chr(13) + ;
"The index file was closed and could be deleted."
CLOSE ALL
ERASE temptabl.dbf && Clean up afterwards.
ERASE temptabl.cdx
ERASE temptbl2.dbf
ERASE temptbl2.cdx
ERASE testfile.dbf
ERASE testfile.pax
CLEAR
RETURN
***** End of test program.
Additional query words:
Keywords : kbVFp kbVFp300bbug kbVFp500fix buglist3.00 FxprgTable
Version : 3.00 3.00b
Platform : WINDOWS
Issue type :