Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.006 c
15-1196967066
Light
2007-12-06 21:51
2008.01.13
Вопрос о роуминге


2-1197405115
San1
2007-12-11 23:31
2008.01.13
аргумент функции


15-1197098496
wipr
2007-12-08 10:21
2008.01.13
Как настроить Object Inspector в BDS 2006


4-1182258624
Викетор1985
2007-06-19 17:10
2008.01.13
Как зная имя процесса получить его PID


15-1196919658
Dreamse
2007-12-06 08:40
2008.01.13
Антивирус ( Вопросы по встраиванию защиты в своё приложение )





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский