Главная страница
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.039 c
6-1075625924
hirlik
2004-02-01 11:58
2004.04.11
мониторинг порта


3-1081528134
iov13
2004-04-09 20:28
2004.04.11
MSSQL &amp; ADO


4-1079172047
Sur
2004-03-13 13:00
2004.04.11
TProcessEntry32


1-1082637525
CSTR
2004-04-22 16:38
2004.04.11
Возведение в степень...


14-1079351112
Dmitriy O.
2004-03-15 14:45
2004.04.11
Прога почти ИИ "Avtoshema V 1.5"