Текущий архив: 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