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

Вниз

Как динамически добавить поля типа fkCalculated к TADOQuery?   Найти похожие ветки 

 
Nikolai_S ©   (2004-03-15 11:04) [0]

Как динамически добавить поля типа fkCalculated к TADOQuery?

В TADOQuery изначально поля не заданы, так как SQL-запрос задается динамически и перечень полей может быть различным. При вызове метода TADOQuery.Open поля создаются автоматически. Необходимо к основным полям динамически добавить несколько дополнительных полей (вычисляемых - FieldKind = fkCalculated).

Проблема в том, что к открытому TADOQuery добавлять поля нельзя, а если добавить вычисляемые поля к закрытому TADOQuery, то при его открытии базовые поля запроса не добавляются автоматически.


 
KSergey ©   (2004-03-15 11:14) [1]

Примерно так:

Field1 := TStringField.Create (..);
Field1.FieldKind := fkCalculated;
Field1.DataSet := ADODatatSet1;
... и проч. св-ства

Впрочем, если вы в любом яндексе наберете Field.Create и fkCalculated - уверен, найдется куча примеров


 
Nikolai_S ©   (2004-03-15 11:24) [2]

С поиском попробую. Действительно, может что и найду. А вот с Вашим примером я уже пробовал. Как я уже говорил, это работает только для закрытого TADOQuery.

Допустим, я добавил свои вычисляемые поля перед открытием TADOQuery. Теперь другая проблема: при открытии TADOQuery уже не будут автоматически добавлены поля, указанные в SQL-запросе, так как список полей TADOQuery.Fields не пустой.

Т.е., необходимо:
1. Чтобы автоматически добавились поля, указанные в SQL-запросе.
2. Вручную добавить дополнительные вычисляемые поля.

Все вместе, увы, не получается.


 
Alex123   (2004-03-15 16:15) [3]

procedure TForm1.Table1BeforeOpen(DataSet: TDataSet);
var
 I: Integer;
 Field: TField;
begin
 if Table1.FindField("FldUD") <> nil then Exit;

 Table1.FieldDefs.Clear;
 Table1.FieldDefs.Update;
 Table1.Fields.Clear;

 { Вот пример того, как вы можете добавить дополнительные, вычисленные поля }
 Field := TBooleanField.Create(Table1);
 Field.FieldName := "fldUD";
 Field.Calculated := True;
 Field.DisplayLabel := "Удл";
 Field.ReadOnly := true;
 Field.Index := 1;
 Field.DataSet := Table1;

 { Создаем все поля из определений и добавляем к набору данных. }
 for I := 0 to Table1.FieldDefs.Count - 1 do
 begin
   { Вот где мы действительно сообщаем набору данных о необходимости создания поля. }
   { Поле "назначается", но нам нужно не это, нам нужна просто ссылка на новое поле. }
   Field := Table1.FieldDefs[I].CreateField(Table1);
 end;
end;


 
KSergey ©   (2004-03-16 07:45) [4]

> Nikolai_S ©   (15.03.04 11:24) [2]

Да, точно я не помню. Хотя, уверен. посиком вполне можно найти.
Попробуйте вместо

Field1.DataSet := ADODatatSet1;

сделать

ADODatatSet1.Fields.Add(Field1);

После Open, конечно же



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

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

Наверх




Память: 0.48 MB
Время: 0.066 c
1-1080110860
Layner
2004-03-24 09:47
2004.04.11
Помогите отработать действия с TTimer.


1-1082612519
Alexey
2004-04-22 09:41
2004.04.11
расширения файла


9-1068290513
cyborg
2003-11-08 14:21
2004.04.11
Создание игры для начинающих


8-1071850669
zioza
2003-12-19 19:17
2004.04.11
Хинты к кнопкам mediaplayer


7-1079601360
Batoon
2004-03-18 12:16
2004.04.11
Как перезагрузить ЛЮБУЮ винду???