Форум: "Базы";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];
ВнизВычисляемые поля Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c