![]() |
|
![]() ![]() ![]() |
|
beresa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 2.7.2007 Где: Чита Репутация: 1 Всего: 1 |
Есть главная таблица, с которой связаны внешними ключами справочники. Соответственно для добавления данных в главную таблицу использую компонент DBLoolupCombobox, который связан с lookup-поля набора данных (Dataset) главной таблицы.
Всё бы ничего, но при добавлении с помощью формы в главную таблицу данных, которых нет в справочнике, приходится сначала открывать соответствующий справочник, добавлять в него новые данные и только после этого появляется возможность занесения новых данных в главную таблицу – что очень не удобно. Есть ли какие-нибудь компоненты для работы с lookup-полями, которые при внесении значения, которого ещё нет в справочнике, автоматически создают новую запись в этом справочнике, а полю главной таблицы (внешний ключ) присваивают id созданной записи? |
|||
|
||||
Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
а что тебе мешает сделать рядом с DBLoolupCombobox кнопку которая будет вызывать диалог добавления новой записи в справочник
помоему это удобнее еще вариант после открытия дата сета вставить новую запись есл записей 0 -------------------- Кольцов Виктор Владимирович |
|||
|
||||
beresa |
|
||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 2.7.2007 Где: Чита Репутация: 1 Всего: 1 |
Да, у меня сначала так и было - DBLoolupCombobox, а рядом кнопка. Но, когда на форме около 10 DBLoolupCombobox’ов и столько же кнопок, неуклюже как-то все эти конструкции смотрятся на форме. Хочется, конечно, чтобы было всё идеально – минимум манипуляций, максимум удобства при работе с программой.
Немного непонятна идея |
||||
|
|||||
pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 16 Всего: 40 |
beresa, придется использовать обычный ComboBox.
если есть желание - говори - опишу алгоритм. а может и код выдумаю. -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
aleksh |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 609 Регистрация: 8.7.2008 Репутация: 2 Всего: 13 |
надо либо логику пересмотреть, либо дописать автоматическое добавления данных в соответствующий спавочник, тобишь внесение данных в справочник реализуется через автоподстовляемые переменные имя, тип ну т.д.
|
|||
|
||||
pseud |
|
||||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 16 Всего: 40 |
короче что-то типа такого:
Это сообщение отредактировал(а) pseud - 11.9.2008, 11:56 -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
||||
|
|||||
Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
ИМХО не правельно это что бы вот так без подтверждения пользователя записи вбивались, хотя это зависит от того что за справочник
-------------------- Кольцов Виктор Владимирович |
|||
|
||||
pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 16 Всего: 40 |
можно при ручном внесении текста в справочное поле и ItemIndex = -1 ненавязчиво сообщать об этом пользователю рядом висящим значком каким-нибудь. -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
beresa |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 2.7.2007 Где: Чита Репутация: 1 Всего: 1 |
Да, я такой вариант рассматривал. Думал вместо lookup-ов использовать поля, полученные в результате запроса:
И соответственно для добавления данных в главную таблицу использовать, как вы и предлагаете, ComboBox. Тут конечно, возникают некоторые проблемы, но если подумать, то и решение можно найти: 1) когда редактируем или сохраняем данные, то для каждого поля, связанного внешним ключом со справочником, необходимо определять id записи справочника. В принципе, эту проблемку можно решить, если вместо обычного ComboBox использовать DBComboBox, который был бы связан с датасетом (набором данных) справочника. Но тогда, когда мы будет открывать форму, необходимо будет для каждого справочника определять запись, связанную с редактируемой записью в главной таблице. Согласен, что тут можно использовать метод Locate набора данных справочника. 2) Если же мы работаем с lookup-полями, то очень просто становить сохранять изменения, добавлять данные (методы Edit и Append датасетов). Если же сделаем так, что каждый DBComboBox связан с определенным набором данных-справочником, а редактируем и добавляем через них данные в главную таблицу, то здесь уже усложнятся механизм редактирования через такую форму записей главной таблицы. Да, конечно, при определенных трудозатратах всё это можно реализовать и можно решить вопрос автодобавлении новых записей в подстановочные поля. Но хочется найти уже готовое решение-компонет, который бы позволял просто и легко работать с loolup-полями. |
||||||
|
|||||||
pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 16 Всего: 40 |
beresa, очень много текста, тем более неформатированного. прочитал - но не вник.
вывод: 1. реализовать можно и довольно гибко и красиво. 2. такого компонента, который бы позволял просто и легко работать с lookup-полями, на моей памяти нет. 3. такого универсального компонента и быть не может: - т.к. в оракл записи добавляются по-одному, в информикс по-другому, в парадокс по-третьему - и откуда ему знать (даже если он и определит что введена отсутствующая запись), что надо написать:
-------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
beresa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 2.7.2007 Где: Чита Репутация: 1 Всего: 1 |
pseud, в принципе согласен с вами.
Решил не мучиться и остановиться на кнопочке для добавления новых данных. Как раз в компоненте DBLookupComboboxEh (библиотека Ehlib) есть возможность создания дополнительных кнопок. Всем спасибо за ответы! ![]() Это сообщение отредактировал(а) beresa - 13.9.2008, 07:36 |
|||
|
||||
beresa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 2.7.2007 Где: Чита Репутация: 1 Всего: 1 |
Нашёл оптимальное решение своей проблемы.
Итак, если вы хотите обеспечить максимум комфорта пользователям при добавлении данных в базу, рекомендую следующее. Во-первых и самое главное – использоватать обязательно компонент DBLookupComboboxEh (данных компонент входит в библиотеку Еhlib, которая для «нашего брата» бесплатна). Далее в свойствах этого компонента установите следующее: DataSource – источник данных главной таблицы DataField– поле внешнего ключа, ссылающегося на справочник, в главной таблице ListSource – источник данных справочника KeyField – поле первичного ключа в справочнике ListField – поле, значение которого будут показываться в выпадающем списке. Style = csDropDownEh. (в этом случае появляется возможность вводить в поле ввода такие значения, которых нет в справочнике); DropDownBox->AutoDrop = true. (по мере ввода данных автоматически будет появляться выпадающий список). А теперь исходники:
Я думаю ясно, что событию OnChange нужно назначить процедуру lcbEhChange, OnKeyDown lcbEhKeyDown и т.д. Приведу небольшие комментарии. Фильтрацию данных по мере ввода текста пользователем реализуем в событии OnChange (процедура lcbEhChange). Было замечено, что в некоторых случаях событие OnChange у компонента DBLookupComboboxEh срабатывает несколько раз подряд, поэтому в lcbEhKeyDown свойству Tag компонента присваиваем 1, а в конце процедуры lcbEhChange это свойство делаем равным 0; Процедуры lcbEhKeyDown и lcbEhKeyPress необходимы для того, чтобы при выборе из выпадающего списка каких-либо значений с помощью клавиш стрелка вверх/вниз и нажатии на Enter осуществлялся переход к следующему компоненту. Пришлось использовать процедуру OnKeyDown, т.к. при выборе нажатием на Enter значений из списка, в событие OnKeyPress невозможно перехватить нажатие на Enter (компонент в этом случае при нажатии на Enter присваивает переменной Key код клавиши 0). Ну и соответственно в OnExit проверяем, было ли введено значение, которого нет в справочнике. В конце замечу, что описанное выше идеально подходит для простых справочников, т.е. в которых всего два поля - первичный ключ и какое-либо значение. Если имеем дела со справочниками, у которых несколько полей, то без кнопочки, вызывающей форму для редактирования, тут уж не обойтись. Короче, EhLib супер! ![]() |
|||
|
||||
pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 16 Всего: 40 |
честно говоря, не увидел почему... в смысле, TDBLookupCombobox здесь сработал бы также. Добавлено через 2 минуты и 18 секунд хотел было поднять репу, но код спорный, когда будет время - опишу что не понравилось Это сообщение отредактировал(а) pseud - 16.9.2008, 14:32 -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
обращение к Text лучше поменять на Trim(Text)
-------------------- Кольцов Виктор Владимирович |
|||
|
||||
beresa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 2.7.2007 Где: Чита Репутация: 1 Всего: 1 |
А смысл в том, что в DBLookupCombobox нет свойства Style. Поэтому, если пользователь захочет ввести текст, которого нет в справочнике, у него это не получится. А так, в DBLookupComboboxEh присваиваем Style значение DropDownEh и при выходе из компонента определяем, было ли введено такое значение, которого нет в справочнике. Это как раз таки то, что мне изначально и нужно было. Это сообщение отредактировал(а) beresa - 16.9.2008, 15:51 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |