![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамически добавить вычисляемое поле [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]Потому что прежние поля наверняка не были созданы явно.