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

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

Виртуальный столбец данных [D6, FireBird]


Andriano ©   (2002-11-13 09:04:00) 

Если кто-нибудь знает, ответьте пожалуйста.
Что делать когда необходима редактируемая колонка в DataSet, кот. нет в базе?
Это нужно, чтобы сделать какие-то временные изменения (довольно продолжительные). А потом с помощью их обработать данные в БД. Например расставить галочки напротив строк в таблице и затем что-то сделать с этими строками.
Поля типа Calculated не редактируются, да и как там хранить данные. Добавлять колонку в таблицу тоже никак - что будет если с ней параллельно будут работать другие пользователи.


KSergey   (2002-11-14 07:13:00) [1]

Неьзя ли поподробнее про fkInternalCalc? Что-то ни в интете ни в книжках своих я про него не нашел толком описания что оно и как делает. Хелп есть, я понимаю, но не совсем понятно что там и как (лично мне во всяком случае).
Может кто-нибудь потрудится на благо народа и опишет по-русски что с ним и как?


boa   (2002-11-14 05:55:00) [2]

Используйте тип поля - fkInternalCalc.


Белка   (2002-11-13 11:10:00) [3]

select field1, ... , fieldn, 0 editfield from table1 where ...


Урри   (2002-11-13 11:06:00) [4]

Можно перекрыть CanEditModify в DBGrid - я убрал проверку Field.CanModify - она возвращает false для Calculated полей - после этого грид дает их редактировать


Andriano   (2002-11-13 10:39:00) [5]

Всем спасибо за оперативные ответы.
Попробую и RxMemoryData.
По-моему уже ничего нового не придумать...


Sergey13   (2002-11-13 10:34:00) [6]

Я решал через RxMemoryData. Копировал в нее датасет и добавлял еще одно поле "для галочки". Потом совал в грид уже ее, а не исходный датасет. Работает прекрасно.


Andriano   (2002-11-13 10:27:00) [7]

> ЮЮ ©
StringGrid не умеет прятать столбцы (PrimaryKey по которому затем надо идентифицировать записи). Для CheckListBox придётся держать TList с теми же PrimaryKey. Всё это выход, но у меня фильтр хранит состояние четырех таблиц. В этом случае это не самое простое решение. Спасибо.


Johnmen   (2002-11-13 10:27:00) [8]

Идея проста, если надо редактировать НД без отображения изменений в таблицы - холостые InsertSQL, UpdateSQL и т.д., а потом - реальные запросы по НД...


Andriano   (2002-11-13 10:20:00) [9]

> Johnmen ©
Компонент-держатель - FIBDataSet.

> z0ne ©
Да, я примерно то же самое придумал, только вместо user ID, у меня уникальный номер подключения к базе (это чтобы не заботиться о вхождение одного пользователя однажды), кот. выдаётся генератором. Но у этого метода есть недостаток. Что если в таблицу для обработки добавиться запись, тогда и во врем. таблицу придётся добавлять запись с выделением=0 для seans_ID (у меня) или user_ID (у тебя). Да и при подключении синхронизировать обрабатываемую и временную таблицы. Я даже написал все эти хранимые процедуры и тригеры и проверил - работает. Цель моего вопроса - узнать как вы решили такую проблему, и выбрать гениальное и простое. Спасибо за метод. Может у кого-нибудь есть ещё какие-нибудь идеи.


ЮЮ   (2002-11-13 10:08:00) [10]

Если это групповая обработка записей, основанная лишь на том, выбрана запись или нет, то нет надобности использовать и DBGrid. Так как записей немного, можно использовать "виртуальную таблицу" вместо "виртуального столбца": DrawGrid, StringGrid или CheckListBox, возможно в совокупности с TList для храненения ключей записей и признака выбора.

А для изменения запросом использовать конструкцию
IN (val1,...,Valn), формируемую диномически по результатам выбора.


Johnmen   (2002-11-13 10:03:00) [11]

Просто добавь поле в запрос.
И кстати, какой компонент-держатель НД ?


z0ne   (2002-11-13 09:56:00) [12]

Я держал отдельную таблицу со структурой

- user // код или ID пользователя ИНДЕКС ОБЯЗАТЕЛЬНО
- data // те данные, которые есть желание сохранять
- recID // ключ связанной записи ИНДЕКС


Соответственно делал запросы типа
select t1.field1, ..., xt.data
from table t1, temptable xt
where (user="USER") and (t1.kod=xt.recID)

Плюсы: можно сохранять выбор для следующего сеанса


Andriano   (2002-11-13 09:44:00) [13]

Да, конечно, данные в результате обрабатываются одни и те же.

Записей немного, но не хотелось бы, чтобы была зависимость от количества.

Изменения одним запросом конечно лучше, но это прокатит только если эта добавочная колонка в таблице данных.


ЮЮ   (2002-11-13 09:22:00) [14]

>Нет, другие пользователи не должны видеть эти изменения
Речь не о галочках. Выбрав одну и ту же запись они собираются внести реальныеизменения в однe и тe же запись.

И много записей ты показываешь в ДатаSete? Много из них могут быть отобраны. Изменения ты собираешься делать одним запросом, или пробегая по каждой отобранной записи?


Andriano   (2002-11-13 09:14:00) [15]

Нет, другие пользователи не должны видеть эти изменения (галочки к примеру). Это временные изменения (для этой виртуальной колонки), кот. точно отменятся.


ЮЮ   (2002-11-13 09:11:00) [16]

>что будет если с ней параллельно будут работать другие пользователи
Это смотря что ты хочешь получить в результате того, что два пользователя одновременно и по-разному корректируют одну и ту же запись :-)


Наверх

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