Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вычисляемые поля


kiril- ©   (2004-02-09 12:17:00) 

Дело в следующем:
есть динамический запрос, напр select Field1, Field2 from Table. Необходимо в компоненте Query расчитывать вычисляемое поле (CalcField1). Как занести все эти поля в список полей в Query.FieldList?
Делаю так:

var
 sf: TStringField;

with Query do
begin
 Close;
 SQL.Clear;
 Fields.Clear;

 SQL.Add('select Field1, Field2 from Table');

 sf:=TStringField.Create(Query);
 sf.FieldName:='CalcField1';
 sf.Name:=Query.Name + sf.FieldName;
 sf.Index:=Query.FieldCount;
 sf.Calculated:=true;
 sf.DataSet:=Query;
 FieldDefs.UpDate;

 Open;
end;
но в результате получаю в Query.FieldList только поле CalcField1. Что не так?


Sandman25+1   (2004-02-26 15:04:00) [1]

[7] Sergey13 ©   (26.02.04 14:43)

Внимание на дату :)


Sergey13   (2004-02-26 14:43:00) [2]

Если запрос динамический, то может проще прям в нем считать?
select Field1, Field2,(Field1+Field2) Field3 from Table

2Sandman25 ©   (09.02.04 13:05) [5]
Опять 25? Это как понимать? 8-)


AlexA   (2004-02-26 14:31:00) [3]

Предлагаю другой вариант

SQL.Add('select Field1, Field2, 0 as total from Table');

и поле 'total' пересчитывать согласно твоему алгоритму.

А меня к тебя вопрос: Как ты собиралься пересчитывать твое вычисляемое поле 'CalcField1'

>Sandman25 ©   (09.02.04 13:05) [5]
вторая часть - вариант! только первый раз надо формировать условие where, чтобы запрос не возращал не одной записи.. Тогда возможно выполнять быстрее


Sandman25   (2004-02-09 13:05:00) [4]

Тип из запроса в общем случае не определить никак. Нужно обращаться к системным таблицам СУБД + делать анализ конструкций типа CAST(myfield as integer)*Month(myDate). Оно Вам надо? :)
Или можно выполнить запрос без вычисляемого поля, перебрать все поля, запомнить их тип/размер, закрыть запрос и открыть заново, предварительно создав все эти поля и дополнительное (вычисляемое) поле. Только скорость упадет примерно вдвое.


kiril-   (2004-02-09 12:59:00) [5]

Ясно, а как тогда выяснить список полей в динамическом запросе и их тип?


Sandman25   (2004-02-09 12:56:00) [6]

Если у Вас запросы могут быть разными, то да. Только все равно придется откуда-то брать тип/размер полей.
Если запрос заранее известен, то можно жестко задать имена и типы константами.


kiril-   (2004-02-09 12:50:00) [7]

А как? Смому идти по всему запросу, вычисляя имена полей?


Sandman25   (2004-02-09 12:20:00) [8]

Надо добавить и все остальные поля из запроса: field1, field2.


Наверх

Титульная страница Поиск, карта сайта Написать письмо