FIX: TABLEREVERT() with Table Buffering Results in Page Fault
ID: Q174530
|
The information in this article applies to:
-
Microsoft Visual FoxPro for Windows, version 3.0b
-
Microsoft Visual FoxPro for Macintosh, version 3.0b
SYMPTOMS
Closing a form containing a grid with two or more related record sources
and table buffering enabled results in an Windows Application Error or
Macintosh error type 11 and termination of Visual FoxPro.
Under some circumstances, closing a form containing a grid with multiple
record sources and table buffering enabled, results in an application error
and abnormal termination of Visual FoxPro. This article describes the
conditions under which an application error may occur and a workaround that
resolves the problem.
CAUSE
The occurrence of an application error and abnormal termination of the
Visual FoxPro session, under these conditions, is dependent on a specific
sequence of events. This behavior occurs only under the following
circumstances:
- A form is created, containing a grid based on two or more related
record sources.
- The child table is USEd in the form's DataEnvironment, Load, or Init
event before the Parent table is USEd.
- A many-to-one relationship is established between the child table and
the parent table.
- The Grid.RecordSourceType Property is set to 1 (ALIAS).
- The Grid.RecordSource Property is the alias of the child table.
- The Grid.ColumnCount is set to a value of at least two.
- The ControlSource Property for at least one column of the Grid is a
field in the parent table.
- The ControlSource Property for at least one column of the Grid is a
field in the child table.
- Table buffering on the child table is enabled.
- A TABLEREVERT(.t.,'Child Table Name') is issued.
- The open tables are closed either in the DataEnvironment or by issuing
a CLOSE TABLES command.
RESOLUTION
Multiple workarounds are available for this condition:
Insert ThisForm.Grid.RecordSource="" before releasing the form or
issuing a 'CLOSE TABLES' command.
-or-
Use a view or SQL Cursor as the record source for the grid.
-or-
Base Grids with multiple record sources on the parent table.
-or-
Instantiate cursors for parent tables prior to instantiating cursors
for child tables.
-or-
Use row buffering instead of table buffering.
STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed
at the beginning of this article. This bug has been corrected in Visual
FoxPro 5.0.
MORE INFORMATION
This behavior is not observed in Visual FoxPro 3.0. It is evident in Visual
FoxPro 3.0b only when table buffering is enabled.
Steps to Reproduce Behavior
- Use the following code to create two related tables:
SET MULTILOCKS ON
IF !FILE('test.dbc')
CREATE DATABASE test
CREATE TABLE test1 (var1 C(10), PRIMARY KEY var1 TAG var1)
CREATE TABLE test2 (var1 c(10), ;
FOREIGN KEY var1 TAG var1 REFERENCES test1 TAG var1)
ENDIF
- Create a form called test.
- Select the DataEnvironment and add table test2, then add table test1
OR place the following code in the form's Load event:
SET MULTILOCKS ON
USE test2 IN 0
USE test1 IN 0
SELECT test1
SET ORDER TO TAG var1
SELECT test2
SET ORDER TO TAG var1
SET RELATION TO var1 INTO test1
- In the INIT event of the form, place the following code:
=CURSORSETPROP('Buffering',5,'test2')
- Add a grid to the form with the following properties:
Form.Grid1.ColumnCount=2
Form.Grid1.RecordSourceType=1
Form.Grid1.RecordSource='test2'
Form.Grid1.Column1.ControlSource=test1.var1
Form.Grid1.Column2.ControlSource=test2.var1
- Add a Command button with the following code in the click event:
=TABLEREVERT(.T.,'test2')
CLOSE TABLES ALL
Release ThisForm
- Save and run the form.
Additional query words:
Grid Column ControlSource RecordSource Buffering
Keywords : kbMAC kbVFp FxprgGrid FxprgTable FxtoolFormdes
Version : MACINTOSH:3.0b; WINDOWS:3.0b
Platform : MACINTOSH WINDOWS
Issue type : kbbug