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 :


Last Reviewed: August 25, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.