FIX: Pack Closes Index File But Does Not Update ItLast reviewed: October 29, 1997Article ID: Q135040 |
3.00 3.00b
WINDOWS
kbprg kbbuglist kbfixlist
The information in this article applies to:
SYMPTOMSWhen 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.
WORKAROUNDExplicitly re-open the index file and use the REINDEX command before proceeding with the program.
STATUSMicrosoft 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 ProblemType 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. |
KBCategory: kbprg kbbuglist kbfixlist
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |