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

Вниз

Вычисляемые поля   Найти похожие ветки 

 
AndrewK   (2007-09-06 11:21) [0]

Добрый день.

Подскажите как можно сделать это.

Есть DataSet, получаемый запросом. Надо добавить виртуальное поле, в которое надо положить значение, вычисляемое уже после получения DataSet-а. Это значение будет вычисляться один раз при заполнении DataSet-а и меняться далее не будет.

Если использовать вычисляемое поле (fkCalculated), то новое поле создается, но записать в него я ничего не могу, так как его значение рассчитывается на OnCalc.

Если использовать вычисляемое поле с изменениями (fkInternalCalc), то при создании поля в рантайм вываливается ошибка, что указанного имени поля не существует. Делать фиктивную колонку в запросе не желательно.

Можно ли динамически добавить к датасету поле, в которое можно было бы вручную записывать данные и которое хранило бы эти данные в течении сеанса?

Заранее благодарен.


 
clickmaker ©   (2007-09-06 11:24) [1]

а computed column средствами MS SQL не подойдет?


 
Вася Правильный   (2007-09-06 11:37) [2]


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

и хде тут вычисления, если тебе просто дырка нужна?


 
AndrewK   (2007-09-06 11:43) [3]

> clickmaker:
Получать колонку запросом не удобно, так как придется в каждый запрос добавлять фиктивные колонки. Или я не правильно понял?

>Вася Правильный:
Мне по сути нужна пустая сервисная колонка, в которую я могу записать все, что хочу и которая существует только в памяти в рантайме. Вычисления буду проводить при открытии датасета. Например, запишу туда цвет строки в зависимости от какого-либо поля. А потом буду раскрашивать грид по этим данным.


 
clickmaker ©   (2007-09-06 11:45) [4]


> Например, запишу туда цвет строки в зависимости от какого-либо
> поля

так если "в зависимости", то это OnCalc как раз и есть, разве не так?


 
AndrewK   (2007-09-06 11:48) [5]

Если условие довольно сложное или при своем вычислении будет запросы к базе делать, то OnCalc тормозить может. Поэтому и возник вопрос о поиске альтернативы.


 
clickmaker ©   (2007-09-06 11:49) [6]

а чем лучше будут тормоза вне OnCalc от тормозов самого OnCalc?


 
AndrewK   (2007-09-06 11:52) [7]

Так я один раз при загрузке все сделаю, а потом буду просто пользоваться данными.
На OnCalc я же буду пересчитывать поле при обращении к нему. Или я не прав?


 
Anatoly Podgoretsky ©   (2007-09-06 11:55) [8]

> AndrewK  (06.09.2007 11:52:07)  [7]

When AutoCalcFields is false, Lookup fields are recalculated and the OnCalcFields event occurs only when

The dataset is opened.
The dataset is put into dsEdit state.
A record is retrieved from a database.


 
sniknik ©   (2007-09-06 11:59) [9]

вообще есть пара тройка способов... но наверное действительно лучше сначала рассмотреть альтернативные(и нормальные) варианты т.к. легко можешь запороть данные и/или добавишь себе проблем в реализацию...

например, запрос
SELECT Field1,Field1 AS Field2 FROM Table1
и установка типа блокировки датасета в ltBatchOptimistic
позволит тебе отдельно редактировать добавленное поле (при условии что оригинал тоже редактируемый) но добавит проблем при сохранении данных из подобного рекордсета.

или можно сделать таблицу в памяти с нужными значениями и полем связки (значение ключа из оригинальной),тогда в добавленном калькулируемом поле брать значения из связанной таблицы для показа.
проблемы будут при массовых обработках таблицы там где используется DisableControls, т.к. он отключает связь и значения могут "перепутаться".

или можно расширить 1 способ, добавлять поле не дубль себя, а из связанной... что позволит при установленном свойстве датасета Unique Table даже редактировать оригинал. но проблемы тоже будут гарантированно...

> Делать фиктивную колонку в запросе не желательно.
без нее в рекордсете не создастся структура/колонка под данные.

вообще лучше бы пересмотрел алгоритм, и решал бы задачу а не проблемы неправильной реализации...


 
sniknik ©   (2007-09-06 12:03) [10]

> На OnCalc я же буду пересчитывать поле при обращении к нему. Или я не прав?
если ты пытаешься сэкономить время обработок то подумай над этим, OnCalc будет вызван только для показанных записей (5-50 сколько их там у тебя в гриде?) + перелистывания (растянуто во времени), а вот твой пересчёт будет действовать на все записи таблицы (50 - 50тыс сколько их там у тебя в датасете?) притом одномоментно, притормаживая открытие.


 
q1   (2007-09-06 12:11) [11]

AutoCalcFields


 
evvcom ©   (2007-09-06 15:18) [12]

Есть вариант с массивом, реализация его заполнения опять же может быть какой угодно, а при OnCalc как раз читать данные из этого массива.



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

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

Наверх




Память: 0.49 MB
Время: 0.011 c
2-1197814557
Stepper
2007-12-16 17:15
2008.01.13
Как подсчитать кол-во символов введенных в TEdit ?


8-1166004227
Николай_Москва
2006-12-13 13:03
2008.01.13
Разложить отрезок по цветам пикселей


2-1197580640
Reals
2007-12-14 00:17
2008.01.13
TreeView: перетащить item в другое место.


15-1197157034
ProgRAMmer Dimonych
2007-12-09 02:37
2008.01.13
Посоветуйте, плз, программу


15-1196924925
TUser
2007-12-06 10:08
2008.01.13
Спам непобедим?