Browse Source

fcl-db: base: when master dataset is closed leave detail dataset intact. Later if master is reopened relationship will work again. Delphi compatible behavior. Bug #26424 (Grandfather-Father-Son relationship)

git-svn-id: trunk@29679 -
lacak 10 năm trước cách đây
mục cha
commit
0b545308d7

+ 9 - 9
packages/fcl-db/src/base/datasource.inc

@@ -360,12 +360,12 @@ Procedure TMasterDataLink.ActiveChanged;
 begin
   FFields.Clear;
   if Active then
-  try
-    DataSet.GetFieldList(FFields, FFieldNames);
-  except
-    FFields.Clear;
-    raise;
-  end;
+    try
+      DataSet.GetFieldList(FFields, FFieldNames);
+    except
+      FFields.Clear;
+      raise;
+    end;
   if FDetailDataSet.Active and not (csDestroying in FDetailDataSet.ComponentState) then
     if Active and (FFields.Count > 0) then
       DoMasterChange
@@ -502,8 +502,8 @@ Procedure TMasterParamsDataLink.DoMasterDisable;
 
 begin
   Inherited;
-  If Assigned(DetailDataset) and DetailDataset.Active then
-    DetailDataset.Close;
+  // If master dataset is closing, leave detail dataset intact (Delphi compatible behavior)
+  // If master dataset is reopened, relationship will be reestablished
 end;
 
 Procedure TMasterParamsDataLink.DoMasterChange; 
@@ -667,7 +667,7 @@ begin
     else
       FState:=dsInactive;
     // Don't do events if nothing changed.
-    If FState=FlastState then
+    If FState=FLastState then
       exit;
     end
   else

+ 5 - 3
packages/fcl-db/src/base/dsparams.inc

@@ -1148,7 +1148,7 @@ begin
 end;
 
 
-Procedure TParams.CopyParamValuesFromDataset(ADataset: TDataset;
+Procedure TParams.CopyParamValuesFromDataset(ADataSet: TDataSet;
   CopyBound: Boolean);
 
 Var
@@ -1157,13 +1157,15 @@ Var
   F : TField;
 
 begin
-  If (ADataSet<>Nil) then
+  If assigned(ADataSet) then
     For I:=0 to Count-1 do
      begin
      P:=Items[i];
      if CopyBound or (not P.Bound) then
        begin
-       F:=ADataset.FieldByName(P.Name);
+       // Master dataset must be active and unbound parameters must have fields
+       // with same names in master dataset (Delphi compatible behavior)
+       F:=ADataSet.FieldByName(P.Name);
        P.AssignField(F);
        If Not CopyBound then
          P.Bound:=False;

+ 3 - 0
packages/fcl-db/tests/testsqldb.pas

@@ -110,6 +110,9 @@ begin
     CheckEquals('TestName1', DetailQuery.Fields[0].AsString);
     MasterQuery.MoveBy(3);
     CheckEquals('TestName4', DetailQuery.Fields[0].AsString);
+
+    MasterQuery.Close;
+    CheckTrue(DetailQuery.Active, 'Detail dataset should remain intact, when master dataset is closed');
   finally
     MasterSource.Free;
   end;