Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамически добавить вычисляемое поле [D7, MSSQL]


Vladimir_Shk2 ©   (2004-03-06 13:37:00) 

Я написал что-то вроде:

procedure AddCalcField(DS : Tdataset);
var Fld : TField;
begin
   Fld:=TDateTimeField.Create(DS);
   Fld.FieldKind:=ftCalculated;
   Fld.Name:='чё-то';
   DS.Fields.Add(Fld);
end;

Процедура выполняется без ошибок, но после ее выполнения, судя по всему датасет разрушается, потому что исчезают поля которые там были, обращение к ним дает ошибку типа 'Field not found'.

Я пробовал вместо DS.Fields.Add(Fld) выполнить Fld.Dataset:=DS, так как прочитал в справке, что Add выполняется автоматически. Но эффект получился тот же самый.

Вопрос: можно ли в run-time корректно добавить вычисляемое (ftCalculated) поле в ADO датасет?


Vladimir_Shk   (2004-03-06 21:07:00) [1]

2 just me
Спасибо за помощь, окончательно код выглядит так:

procedure AddCalcFields(Source,Dest : TDataset);
var i,j : integer;
   Fld : TField;
begin
   Dest.FieldDefs.Update; // иначе в цикле[j] Count = 0
   for i:=0 to Source.FieldCount - 1 do begin
       if Source.Fields[i].FieldKind = fkCalculated then begin
           Fld:=TDateTimeField.Create(Dest);
           Fld.FieldKind:=fkCalculated;
           Fld.FieldName:=Source.Fields[i].FieldName;
           Fld.Name:=Source.Fields[i].Name;
           for j:=0 to Dest.FieldDefs.Count - 1 do
               Dest.FieldDefs.Items[j].CreateField(Dest);
           Fld.DataSet:=Dest; // если добавлять перед циклом[j]
           // то, датасет портится.
       end;
   end;
end;


just me   (2004-03-06 15:14:00) [2]

var
 fld    : TField;
 nIndex : integer;
begin
 DS.Close();
 fld := TIntegerField.Create(Self);
 fld.FieldName := 'bla-bla-bla';
 fld.FieldKind := fkCalculated;
 fld.Name := 'bla-bla-bla';
 fld.DataSet := DS;
 for nIndex := 0 to DS.FieldDefs.Count - 1 do
   DS.FieldDefs.Items[nIndex].CreateField(DS);
 DS.FieldDefs.UpDate();
 DS.Open();


asp   (2004-03-06 14:26:00) [3]

Потому что прежние поля наверняка не были созданы явно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо