Форум: "Базы";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Вниз
Динамически добавить вычисляемое поле Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.036 c