Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Как в DBGridEh пометить определённые записи?


Автор: BDmV 14.2.2008, 19:50
Использую
  База данных: MySQL
  Конекчусь с помощью ZeosDBO
  Проссматриваю полученные данные через DBGridEh (EhLib 4.2)
  Для отчёта пользую FastReport 4.5

Задача состоит в следующем:
   Есть некая таблица из которой нужно распечатать данные помеченные пользователем.

Попытки её решить:
1. Использовать выделение, встроенное в DBGridEh неудобно, т.к. пользователь всегда может забыть нажать Ctrl перед тем как ткнёт мышкой, после чего ему опять придётся "ползать" по таблице и выделять всё заново. :(

2. Пример приведённый в http://forum.vingrad.ru/forum/topic-180232/kw-checkbox-grid/hl/dbgrideh/index.html тоже несовсем подходит (хотя нравится больше чем №1) т.к. событие DrawColumnCell (прорисовка чекбокса) происходит раньше, чем CellClick (изменение списка нажатых чекбоксов) :( из за этого чекбокс меняет своё состояние после ухода из этой ячейки.

3. Держать в таблице отдельное поле, тоже неподойдёт, т.к. с программой будет рабботать не 1 человек и получить ситуацию, в которой 1 человек метить кучу записей и пока жмёт на кнопку "печать" все пометки скидываются из за того, что 2ой пользователь запустил своего клиента, который выполнил "update table set field_int_bool = 0"

Может есть у кого нибудь, какие нибудь соображение по САБЖу? (Желательно с примерами ;) )

Автор: Vas 15.2.2008, 09:13
Я использую для такого VTable из компонентов ODAC, но думаю и в Zeos есть что-то типа виртуальной таблицы. Перегружаю данные в виртуальную таблицу, добавляю еще одно поле "Печать" тип boolean и все пусть пользователь клацает нужные записи. В репорте уже выводим у которых поле "Печать" отмечено и все smile

Автор: BDmV 15.2.2008, 09:30
В EhLib есть MemoTable, но это не выход из положения, т.к. данные из БД я беру SQL запросом вида:
Код

  Select  t1.*, t2.* from table1 t1 left join table2 t2 on (t2.id=t1.id)

и использую связку TzQuery -> TDataSource -> TDBGridEh

Мне не хочется сюда вставлять, какой нить TMemTableEh и каждый раз при малейшем изменении данных гонять их из таблици памяти в БД и обратно... 

Автор: Vas 15.2.2008, 10:05
Дык я тоже беру запросом, и вообще я Table никогда не использую, токи квери и сторедпрок smile А у тебя что миллион записей пользователю выгружается и он их отметить должен?  smile  
А если выгружается приемлимое количество, то перегон в меморитабл и не заметишь  smile 

Автор: BDmV 15.2.2008, 10:20
Да сколькоб данных небыло... Память у компа не резиновая, и держать все записи в памяти желания нет.. 

Хотя я не знаю, как это с ODAC'ом происходит, Ораклы у мну нет.

Автор: Vas 15.2.2008, 10:24
Цитата(BDmV @  15.2.2008,  10:20 Найти цитируемый пост)
Да сколькоб данных небыло... Память у компа не резиновая, и держать все записи в памяти желания нет.. 

Ну тады рисуй, тока не забывай отмеченные клеточки тоже надо где-то хранить и в FR передавать  smile 

Автор: BDmV 15.2.2008, 10:42
Пытался рисовать, но вот как сделать так, чтоб сначало запоминался клик по чекбоксу, а потоп происходила прорисовка, я не понял. :(

Автор: Vas 15.2.2008, 15:01
Цитата(BDmV @  15.2.2008,  10:42 Найти цитируемый пост)
чтоб сначало запоминался клик по чекбоксу

Дык я к тому и клонил что твой клик и должен где-то запоминаться, ина че при следующей перерисовке все под откос пойдет  smile 

Автор: BDmV 15.2.2008, 16:30
Ну дык я и говорю что я это помню, но перерисовка происходит после того как с этого поля уходишь, а мне нужно чтоб пользователь сразу увидел результат своего клика...   smile 

А как с помощью ODAC Вы юзаете MemTable? Что то я в этих компанентах ничего связанного с MemTable я не вижу. :(

А попытки связать TMemTableEh с TzQuery с последующим добавлением туда левого поля, приводят к тому же что и без TMemTable. :(
Или всётаки Вы действительно каждый раз в цикле заполняете таблицу памяти? 

Автор: Vas 15.2.2008, 18:21
Цитата(Vas @  15.2.2008,  09:13 Найти цитируемый пост)
Я использую для такого VTable из компонентов ODAC

Из ODAC я юзаю VTable, а не MemTable. 
И дальше писал что 
Цитата(Vas @  15.2.2008,  09:13 Найти цитируемый пост)
но думаю и в Zeos есть что-то типа виртуальной таблицы

А MemTable вроде несколько другая хрень, но один фиг MemTable сразу из запроса тянет все данные в память и ниче smile

Цитата(BDmV @  15.2.2008,  10:42 Найти цитируемый пост)
но вот как сделать так, чтоб сначало запоминался клик по чекбоксу, а потоп происходила прорисовка

Отсюда я понял что как раз проблема с запоминанием еще до прорисовки  smile 

Автор: BDmV 15.2.2008, 19:17
Цитата(Vas @  15.2.2008,  18:21 Найти цитируемый пост)
Отсюда я понял что как раз проблема с запоминанием еще до прорисовки  

Если остановится на варианте метить данные чекбоксами, то проблема именно в этом.

А виртуалки в Zeos я не видел. :(

Автор: Vas 16.2.2008, 09:02
Как вариант создаем временную таблицу, на основании запроса, добавляем еще одно поле и из нее отображаем данные пользователю. Как с ней работать закончили, удаляем. 

Автор: BDmV 16.2.2008, 12:49
Пробывал... Неинтересно.
Если я TMemtableEh связываю с датасетом, то я могу туда добавлять поля, но изменять их значение, почему то, не могу, наверное потому что значения пытаются меняться во всей связанной записи. :(
А создавать чисто таблицу в памяти, гонять данные из памяти в БД и обратно, а потом в конце работы удалять её, не хочу.

Кстати, а есть какой нить способ реагировать на нажатие на столбце Indicator? У TDBGridEh я нашёл реакцию только на заголовок Индикатора...  Мож тогда проще будет запоминать ID записи не на событии CellClick, а на нажатие на Индикатор?

Автор: Esperito 20.2.2008, 17:31
Быть может, проще сделать переключатель "Режим выделения / Режим редактирования" для юзера и в режиме выделения использовать стандартное выделение и программно удерживать Ctrl.

Автор: BDmV 23.2.2008, 12:23
Цитата(Esperito @ 20.2.2008,  17:31)
Быть может, проще сделать переключатель "Режим выделения / Режим редактирования" для юзера и в режиме выделения использовать стандартное выделение и программно удерживать Ctrl.

Непроще :( Как я писал:
Цитата(BDmV @  14.2.2008,  19:50 Найти цитируемый пост)
1. Использовать выделение, встроенное в DBGridEh неудобно, т.к. пользователь всегда может забыть нажать Ctrl перед тем как ткнёт мышкой, после чего ему опять придётся "ползать" по таблице и выделять всё заново. :(



Автор: Esperito 23.2.2008, 21:28
Я же говорю, программно удерживать Ctrl, т.е. держать его нажатым (или сделать так, чтобы гриду он кажался нажатым). Чтобы пользователю не приходилось его нажимать самому.

Автор: BustA 6.6.2008, 09:23
Люди помогите, а вот в эту memtable как добавит отдельное поле??? чтоб я потом в него программно данные записывал?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)