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

Вниз

Как запросу динамически добавить вычисляемое поле?   Найти похожие ветки 

 
Mishenka   (2006-08-21 11:23) [0]

В программе динамически создаётся запрос, в котором надо создать вычисляемое поле (CalcField), которое будет вычисляться по событию OnCalcFields. Когда запрос нединамический, то оно легко создаётся путём добавления нового поля, а как его добавить при динамическом запросе?


 
Dok   (2006-08-21 11:57) [1]


> то оно легко создаётся путём добавления нового поля

это мираж. все дело в мышке.


> в котором надо создать вычисляемое поле (CalcField), которое
> будет вычисляться по событию OnCalcFields

а что за вычисления? можно увидеть?


 
Mishenka   (2006-08-21 13:54) [2]


> Dok   (21.08.06 11:57) [1]
> а что за вычисления? можно увидеть?


procedure TdmStandart.qrInDataCalcFields(DataSet: TDataSet);
begin
 DataSet.Fields[3].AsString := TypeToSign(Copy(DataSet.Fields[0].AsString, 1, 3));
end;


где TypeToSign это моя функция


 
evvcom ©   (2006-08-21 14:12) [3]

Пишешь наследника

 TMyQuery = class(TQuery)
 private
   FOnCreateFields: TDataSetNotifyEvent;
 protected
   procedure CreateFields; override;
 public
   function CreateCalcField(FieldName: string; DataType: TFieldType): TField;
 published
   property OnCreateFields: TDataSetNotifyEvent read FOnCreateFields write FOnCreateFields;
 end;

implementation

procedure TMyQuery.CreateFields;
begin
 inherited;
 if Assigned(FOnCreateFields) then
   FOnCreateFields(Self);
end;

function TMyQuery.CreateCalcField(FieldName: string; DataType: TFieldType): TField;
var l_FieldClass: TFieldClass;
begin
 l_FieldClass := GetFieldClass(DataType);
 if Assigned(l_FieldClass) then begin
   Result := l_FieldClass.Create(Self);
   Result.FieldName := FieldName;
   Result.FieldKind := fkCalculated;
   Result.DataSet   := Self;
 end
 else
   Result := nil;
end;

Можешь зарегистрировать компонент, а можешь, раз уж все равно динамически создаешь, и не регистрировать, а создавать объект динамически, присваивать обработчик OnCreateFields, а в нем вызывать CreateCalcField.


 
Mishenka   (2006-08-23 10:40) [4]

A можно это сделать через SQL ?


 
Dok   (2006-08-23 10:41) [5]

а парадоксе нет


 
Плохиш ©   (2006-08-23 11:10) [6]

SUBSTRING(Field0 FROM 1 FOR 3)?


 
Dok   (2006-08-23 11:11) [7]


> где TypeToSign это моя функция

а это? :)


 
Плохиш ©   (2006-08-23 11:13) [8]


> Dok   (23.08.06 11:11) [7]
>
> > где TypeToSign это моя функция
>
> а это? :)

О, не обратил внимания :-)


 
Mishenka   (2006-08-23 15:08) [9]


> evvcom ©   (21.08.06 14:12) [3]
> Пишешь наследника

А процедура GetFieldClass из какого unit"а? А то что-то он пишет Undeclared ...


 
MsGuns ©   (2006-08-23 15:14) [10]

>evvcom ©   (21.08.06 14:12) [3]
Это из серии "Как чесать ухо с помощью телескопа и левой пятки ?"

>Mishenka   (23.08.06 10:40) [4]
>A можно это сделать через SQL ?

ЧТО сделать ? Функцию TypeToSign ? Или то, что это ф-я выполняет ?
И причем тут парадокс ?

>Dok   (23.08.06 10:41) [5]
>а парадоксе нет

Ну да, парадоксом можно только гвозди в доски забивать ;))


 
Dok   (2006-08-23 15:18) [11]


> Ну да, парадоксом можно только гвозди в доски забивать ;
> ))

нет, еще и шпаклевать немгого :)


 
MsGuns ©   (2006-08-23 15:26) [12]

>Dok   (23.08.06 15:18) [11]
>нет, еще и шпаклевать немгого :)

Для тех, кто в танке:
Не надо путать парадокс и стандарты сиквеля, зависящие от того, при помощи каких средств идет работа с этим самым парадоксом.

Даже средствами "родного" парадоксу Local SQL можно творить самые невероятные казалось бы вещи. Ну и, конечно, ничто не мешает засовывать в грид вообще что угодно, получая его непосредственно на "клиенте" - все богатство компиллятора + используемые библиотеки к твоим услугам


 
Dok   (2006-08-23 15:58) [13]


> MsGuns ©   (23.08.06 15:26) [12]

Извини, нивкоем случае не хотел тебя обидеть. Сам с парадоксом работал мало и то в чисто ознакомительных целях. Чувствую, что ты на этом собаку сьел. Поэтому не буду тут насмехаться, да незачем, если на парадоксе существуют достотачно проектов и рабочих(что самое главное), то Парадокс достоин существования.


 
Mishenka   (2006-08-23 16:35) [14]


> MsGuns ©   (23.08.06 15:14) [10]
> ЧТО сделать ? Функцию TypeToSign ? Или то, что это ф-я выполняет ?
> И причем тут парадокс ?


Просто когда работаешь со статическими запросами, там просто пишешь в свойство SQL - SQLзапрос, жмёшь добавить все столбцы, а потом отдельно создаются подстановочные и вычислительные поля. А мне нужно проделать всё тоже самое,  но динамически. Я подставил свойство SQL, но не могу разобраться как добавить столбцы :(


 
MsGuns ©   (2006-08-23 16:56) [15]

>Mishenka   (23.08.06 16:35) [14]
>Просто когда работаешь со статическими запросами, там просто пишешь в свойство SQL - SQLзапрос, жмёшь добавить все столбцы, а потом отдельно создаются подстановочные и вычислительные поля. А мне нужно проделать всё тоже самое,  но динамически. Я подставил свойство SQL, но не могу разобраться как добавить столбцы :(

"Добавить столбцы" и "Отображать что-то в соответсвующем столбце грида" - это две большие разницы.

Первое делается, например, так:

Select *, 1 as MyNewField From Table

И получаем доп.поле с единицей во всех записях

или

Select a,b,c..., FAM+" "+Substring(Name from 1 for 1)+"."+Substring(Name2 from 1 for 1)+"." as FIO

и получаем стандартное ФИО в вычисленном на сервере доп.поле датасета

Второе можно сделать с помощью простого добавления в грид колонке со ссылкой на поле, которое не нужно отображать, а далее либо в событии того самого неотображаемого поля OnGetText написать
 Text := все, что угодно

либо рисовать в этой колоне в событии OnDrawColumnCell все, что угодно


 
Mishenka   (2006-08-24 16:35) [16]


> MsGuns ©   (23.08.06 16:56) [15]
> "Добавить столбцы" и "Отображать что-то в соответсвующем
> столбце грида" - это две большие разницы.

Нет, ну в с гридом уж как-нибудь. Просто при обращении Query.Fields[0] выдаётся ошибка EListError with message "List index out of bounds (0)", то есть для обращения к столбцу видимо недостаточно проcто указать текст SQL, а видимо ещё надо добавить столбцы. Так вот я никак не разберусь как их добавлять.


 
evvcom ©   (2006-08-25 09:02) [17]

> [9] Mishenka   (23.08.06 15:08)
> А процедура GetFieldClass из какого unit"а?

Это protected виртуальный метод класса TDataSet. TDataSet в юните DB.

> [10] MsGuns ©   (23.08.06 15:14)
> >evvcom ©   (21.08.06 14:12) [3]
> Это из серии "Как чесать ухо с помощью телескопа и левой
> пятки ?"

Чем тебя развеселило мое предложение? В [0] было спрошено

> надо создать вычисляемое поле (CalcField), ...
> как его добавить при динамическом запросе?

Я ответил четко на поставленный вопрос. В чем по-твоему я не прав?

> [15] MsGuns ©   (23.08.06 16:56)
> "Добавить столбцы" ...
> делается, например, так:
> Select *, 1 as MyNewField From Table

Можно и так, да можно хоть как. Только, во-первых, запрос в твоем случае будет возвращать "ненужные" данные, которые были созданы только ради простого создания столбца на клиенте, это естественно вызовет дополнительную (хоть и не большую) нагрузку на сервер, сеть (в случае не Local SQL). И во-вторых, потомки, которым достанется твой код, будут чесать свою репу и думать "а нафига ж этот горе-программист добавил какую-то единицу по всем записям?" Не надо мешать мух и котлеты в одной каше. Имхо.



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

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

Наверх




Память: 0.52 MB
Время: 0.043 c
6-1148593979
Тфьу
2006-05-26 01:52
2006.10.22
Не могу передать массив в PHP


4-1149174929
salexn
2006-06-01 19:15
2006.10.22
Измерить скорость чтения диска


4-1149174309
Валерий
2006-06-01 19:05
2006.10.22
Закрыть Internet Explorer


15-1159418753
Climber
2006-09-28 08:45
2006.10.22
sql-запросы


15-1159193758
MeF Dei Corvi
2006-09-25 18:15
2006.10.22
MySQL и SQLite: что быстрее?