Microsoft KB Archive/174530
Article ID: 174530
Article Last Modified on 10/15/2003
- Microsoft Visual FoxPro 3.0b Standard Edition
- Microsoft Visual FoxPro 3.0b for Macintosh
This article was previously published under Q174530
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.
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.
Multiple workarounds are available for this condition:
Insert ThisForm.Grid.RecordSource="" before releasing the form or issuing a 'CLOSE TABLES' command.
Use a view or SQL Cursor as the record source for the grid.
Base Grids with multiple record sources on the parent table.
Instantiate cursors for parent tables prior to instantiating cursors for child tables.
Use row buffering instead of table buffering.
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.
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:
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: kbbug kbfix KB174530