Search code examples
databasedelphidatasettclientdataset

How can I add fields to a clientdataset at runtime?


I have a TClientDataSet, which is provided by a TTable’s dataset. The dataset has two fields: postalcode (string, 5) and street (string, 20)

At runtime I want to display a third field (string, 20). The routine of this field is getting the postalcode as a parameter and gives back the city belongs to this postalcode.

The problem is only about adding a calculated field to the already existing ones. Filling the data itself is not the problem.

I tried:

  cds.SetProvider(Table1);
  cds.FieldDefs.Add('city', ftString, 20);

  cds.Open;

  cds.Edit;
  cds.FieldByName('city').AsString := 'Test';  // --> errormessage (field not found)
  cds.Post;

cds is my clientdataset, Table1 is a paradox Table, but the problem is the same with other databases.

Thanks in advance


Solution

  • If you want to add additional fields other than those exist in the underlying data, you need to also add the existing fields manually as well. The dataset needs to be closed when you're adding fields, but you can have the necessary metadata with FieldDefs.Update if you don't want to track all field details manually. Basically something like this:

    var
      i: Integer;
      Field: TField;
    begin    
      cds.SetProvider(Table1);
    
      // add existing fields
      cds.FieldDefs.Update;
      for i := 0 to cds.FieldDefs.Count - 1 do 
        cds.FieldDefs[i].CreateField(cds);
    
      // add calculated field
      Field := TStringField.Create(cds);
      Field.FieldName := 'city';
      Field.Calculated := True;
      Field.DataSet := cds;
    
      cds.Open;
    end;
    


    Also see this excellent article by Cary Jensen.