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

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

Вычисляемые поля [D7, MSSQL]


AndrewK ©   (2007-09-06 11:21:00) 

Добрый день.

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

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

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

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

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

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


evvcom   (2007-09-06 15:18:00) [1]

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


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

AutoCalcFields


sniknik   (2007-09-06 12:03:00) [3]

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


sniknik   (2007-09-06 11:59:00) [4]

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

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

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

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

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

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


Anatoly Podgoretsky   (2007-09-06 11:55:00) [5]

> 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.


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

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


clickmaker   (2007-09-06 11:49:00) [7]

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


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

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


clickmaker   (2007-09-06 11:45:00) [9]


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

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


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

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

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


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


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

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


clickmaker   (2007-09-06 11:24:00) [12]

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


Наверх

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