Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Динамически добавить вычисляемое поле   Найти похожие ветки 

 
Vladimir_Shk2   (2004-03-06 13:37) [0]

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

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 датасет?


 
asp ©   (2004-03-06 14:26) [1]

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


 
just me   (2004-03-06 15:14) [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();


 
Vladimir_Shk ©   (2004-03-06 21:07) [3]

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;



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.067 c
7-1074221596
Марат
2004-01-16 05:53
2004.04.04
Принтер


7-1075148330
Djon007
2004-01-26 23:18
2004.04.04
Ctrl+Alt+Delete Старый вопрос..................


4-1075355382
Alexander666
2004-01-29 08:49
2004.04.04
Замена процедуры окна через хук


1-1079197532
Александр1
2004-03-13 20:05
2004.04.04
MSExcel.dcu


1-1079693529
АМБ
2004-03-19 13:52
2004.04.04
Скомпилированный файл имеет малые размеры