Search code examples
delphiindexingtclientdataset

Delphi 2006 TClientDataSet index issue


I use a ClientDataSet with a DataSetProvider linked to a local DataSet. When I want to edit the data in the DataSet I open the ClientDataSet and add some indexes to it. After I'm done editing the data I close the ClientDataSet. All works fine, except that when I open the ClientDataSet again and I select an index it's throwing an exception with the message "index 'xxx' not found". What I'm doing wrong?

Here is the code for opening the ClientDataSet:

 Application.CreateForm (TfrmCardDep, frmCardDep);
 try
  with DM.tblCCardDep do
   begin
    IndexDefs.Clear;
    if not Active then Open;
    AddIndex ('iDepID', 'DepID', []);
    AddIndex ('iDep', 'Dep', []);
    IndexName := 'iDep';
    FieldByName('Dep').DisplayLabel := 'Departament';
    FieldByName('Dep').DisplayWidth := 50;
    FieldByName('DepID').Visible := false;
   end;

  frmCardDep.ShowModal;
 finally
  if DM.tblCCardDep.Active then DM.tblCCardDep.Close;
  frmCardDep.Free; frmCardDep := nil;
 end;

DM.tblCCardDep is the ClientDataset


Solution

  • After the first round you have IndexName set on the ClientDataSet. When IndexDefs are discarded the index it refers becomes invalid. Clear IndexName before re-opening the dataset, i.e. modify your code to read:

     [..]
     try
      with DM.tblCCardDep do
       begin
        IndexDefs.Clear;
        IndexName := '';      // <- here
        if not Active then Open;
        [..]
    

    Or use something like this: [..]

     try
      with DM.tblCCardDep do
       begin
        if not Active then Open;
        if IndexDefs.Count = 0 then
         begin
          AddIndex ('iDepID', 'DepID', []);
          AddIndex ('iDep', 'Dep', []);
          IndexDefs.Update;             // Update IndexDefs
          IndexName := 'iDep';
         end;
        FieldByName('Dep').DisplayLabel := 'Departament';
        [..]