Microsoft KB Archive/174530

= FIX: TABLEREVERT with Table Buffering Results in Page Fault =

Article ID: 174530

Article Last Modified on 10/15/2003

-

APPLIES TO


 * Microsoft Visual FoxPro 3.0b Standard Edition
 * Microsoft Visual FoxPro 3.0b for Macintosh

-



This article was previously published under Q174530



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 </li>  Add a Command button with the following code in the click event: =TABLEREVERT(.T.,'test2') CLOSE TABLES ALL Release ThisForm </li> Save and run the form.</li></ol>

Additional query words: Grid Column ControlSource RecordSource Buffering

Keywords: kbbug kbfix KB174530

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.