Сетка как у Access

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 29.01.2016 (Пт) 17:42

Сетка как у Access

Сообщение nouyana » 16.05.2016 (Пн) 16:50

Никак не могу понять, как сделать нормальную сетку для своей программки на VB6. Программа является интерфейсом для БД Access 2000 через библиотеку ACE DAO (кто не знает - это библиотека из AccessDatabaseEngine, умеет через DAO подключаться к Excel 2007). Использую TrueDB Grid 8.0 (может, кто посоветует другую сетку? Ищу Janus GridEx 2000).

Что я понимаю под словом "нормальная"? Например, в MS Access - нормальная сетка :D . То есть:
1. Отображает подписи полей Access (свойство Caption объекта Field)
2. Отображает ListField связанного поля также, как это делает DBCombo. Я умею подставлять DBCombo для редактирования поля, но мне хочется, чтобы ListField отображался постоянно, а не только при редактировании
3. Отображает связанную подтаблицу аналогично тому, как это происходит в Access
4. Фильтр, сортировка, группировка
5. Умение подключаться к базе напрямую (без объекта Data) и умение работать с ACE DAO с файлами Excel и Access 2007+ (это я уже лишку дал, наверное...)

Бывает такое счастье?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Сетка как у Access

Сообщение ger_kar » 16.05.2016 (Пн) 17:26

В первую очередь сетка Access - это сетка заточенная конкретно под Access, а например упомянутая TrueDB Grid 8.0 - это универсальная, но зато обладающая гораздо большими потенциальными возможностями. Я честно сказать с DAO работал достаточно давно, в основном использую для общения с базами ADO, и что касается версии TrueDB Grid OLEDB (для ADO), то всё описанное для "нормальной" сетки, в ней очень легко реализуется с помощью программирования. В частности 1, 2, 3, 4. В поставке TrueDB Grid 8.0 идет хорошая документация с кучей примеров.
Бороться и искать, найти и перепрятать

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: Сетка как у Access

Сообщение nouyana » 16.05.2016 (Пн) 19:07

К сожалению, мне пока не удалось в этой "куче" найти то, что мне нужно. Вот скриншот из примера в папке "Samples\OLEDB\Invntry\":
Изображение

В приведённом примере используется специальный объект TDBDropDown для редактирования ячейки (не очень понимаю зачем он нужен когда есть DBCombo). Однако, вне режима редактирования ячейка отображает только значение ключевого поля.

Вот скриншот базы Борей, открытой программкой из папки "Samples\OLEDB\TRUBRWSE\":
Изображение

В хелпе к этому примеру написано примерно так: "Вы можете использовать этот пример как готовое приложение для просмотра файлов баз данных различного формата с возможностью сортировки, редактирования и добавления новых записей...".

А вот пример просмотра той же таблицы в Access:
Изображение

Как говорится - почувствуйте разницу.

Вообщем, если вы имеете в виду какой-то конкретный пример из этой "кучи", то назовите его, пожалуйста.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Сетка как у Access

Сообщение ger_kar » 16.05.2016 (Пн) 21:57

nouyana писал(а):Вообщем, если вы имеете в виду какой-то конкретный пример из этой "кучи", то назовите его, пожалуйста.
Что бы найти, какой либо пример, то эту "кучу" надо иметь, а у меня в данный момент этой кучи нет. Это во первых, а во вторых могу ответственно заявить, что примеры, которые идут в дополнение к хелпу не предназначены для использования по принципу "как есть", т.е. взял скопировал и все, а предназначены для изучения отдельных моментов в довесок к документации. Что бы получилось что то внятное, нужно сначала внимательно изучить предлагаемую гридом объектную модель (для всех составляющих объектов), в процессе изучения, нужно будет читать документацию и обращаться к примерам. Это в общем.
А в частности, по тому примеру, который приведен в топике выше:
Получить искомое (удобочитаемый вид с заменой вторичных ключей на значения) можно кучей способов:
Способ - 1:
Использовать только возможности самого грида и его коллекции ValueItems. Для этого нужно программным способом её заполнить, соответствующими ключам значениями и установить флаг трансляции. Тогда вместо значений ключей, в полях грида будут отображаться соответствующие ключам наименования.
Плюсы этого способа: простота и удобство. Написал класс, на стадии инициализации подключил его к гриду и вуаля. Если изначально продумать систему наименований для таблиц и полей базы данных, то можно вообще все автоматизировать. Я бы сделал так (один из множества вариантов): Всем полям с первичным ключом присваивал имя ID, а вторичным ключам комбинацию названия таблицы и "ID". При таком раскладе можно получить ссылку на рекордсет, обойти его поля, и выявляя поля вторичных ключей по динамическим свойствам получать имена таблиц из названия поля, и далее генерируя соответствующий запрос и получая данные, заполнять коллекцию ValueItems для каждого связанного с полем вторичного ключа столбца.
Минусы этого способа: низкая производительность. Если таких столбцов будет много, а списки трансляции будут большими, тогда заполнение может начать тормозить. Но у этого способа есть куча методов для существенной оптимизации. Все зависит от того, где и как этот метод планируется применять.

Способ - 2: Использовать объект TDBDropDown. В этом случае, на каждый столбец будет приходится по одному такому объекту (в общем случае). К каждому экземпляру TDBDropDown нужно будет подключить свой рекордсет с данными для трансляции. У этого способа тоже валом подвариантов использования. Например изначально можно кидать на форму один грид и один TDBDropDown, оформленный как элемент массива, и далее при инициализации или при смене источника данных, программно (по принципу из 1 способа) множить экземпляры TDBDropDown, подключать их к соответствующим полям и автоматически генерирую запросы подключать соответствующие рекордсеты.

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

Я описал самые простые из возможных способов и применительно с использованием ADODB (для DAO тоже можно будет аналогично).
Бороться и искать, найти и перепрятать

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: Сетка как у Access

Сообщение nouyana » 16.05.2016 (Пн) 22:25

ger_kar , спасибо за ответ.

С первым способом всё понятно - буду пробовать.

Со вторым способом - не понятно как TDBDropDown поможет мне отображать ValueItems? Насколько я понимаю, TDBDropDown используется только для редактирования текущей ячейки?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Сетка как у Access

Сообщение ger_kar » 16.05.2016 (Пн) 23:50

nouyana писал(а):TDBDropDown используется только для редактирования текущей ячейки?
Нет не только. Он может также транслировать значения ключей в удобочитаемые наименования. С документацией идут Tutorial. Поищи в хелпе Tutorials и в них должен быть Tutorial - "Value Translation".
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Сетка как у Access

Сообщение ger_kar » 17.05.2016 (Вт) 0:12

Я конечно не в курсе, что ты со всем этим собираешься делать, но если ты планируешь использовать кучу форм, с таким гридом, то удобнее всего инкапсулировать его со всеми обвесами и кодом в UserControl и дальше использовать его. Обычно в процессе разработки определяются основные направления использования и такая инкапсуляция очень облегчает дальнейшую жизнь :).
Грид рассчитан на такое огромное количество вариантов использования, и в реальном приложении все такое разнообразие вряд ли бывает необходимым. Лучше выбрать и использовать один способ, чем плодить калейдоскоп. У грида довольно обширная объектная модель в которой достаточно легко заблудиться. Инкапсуляция позволит сделать следующее: Отсечь неиспользуемые возможности, оставив только необходимое. Часть свойств будет обрабатываться кодом и их можно будет исключить из списков для ручного выбора, а оставшиеся организовать в удобные Property Pages. Также в отсутствие наследования это позволяет решить эту проблему хотя бы частично. Например, при типовом использовании можно будет в одном месте (в UserControl) поменять некоторые свойства, и это приведет к изменению оных сразу во всех местах использования, без необходимости вручную править код и свойства в куче мест. Если форм с 10, то это конечно не проблема, но если больше, то это уже головная боль и время затраченное на разработку UserControl потом с лихвой окупится.
Бороться и искать, найти и перепрятать

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: Сетка как у Access

Сообщение nouyana » 17.05.2016 (Вт) 8:12

ger_kar писал(а):Tutorial - "Value Translation"

Спасибо! Работает!

ger_kar писал(а):Если форм с 10, то это конечно не проблема, но если больше, то это уже головная боль и время затраченное на разработку UserControl потом с лихвой окупится.

Я - экономист, и VB для меня - это инструмент автоматизации небольших прикладных задач (сейчас вот, например, базу данных бухгалтерского учёта пишу... :shock: ) Короче, инкапсуляция - это тема, которая мне нафиг не нужна до которой я ещё не добрался, но благодаря тебе буду знать куда копать :) Ещё раз спасибо!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

    TopList