Миshук |
Отправлено: 17.08.2005, 05:57 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
Простой пример. Использую компонент DBLockupComboBox для отображения пола человека. При открытии набора данных, из справочника пола(Таблица базы данных MS SQL c двумя полями:
SexID (int) | Sex (char)
1 | мужской
2 | женский
) в DBLockupComboBox загружаются соответствующие записи.
Как сделать чтобы при нажатии на активном DBLockupComboBox на еденичку показывало "мужской" а при нажатии на 2- "женский". Вообще это можно сделать на стадии проектирования?
|
|
** Rius |
Отправлено: 17.08.2005, 07:06 |
|
Не зарегистрирован
|
Смотрите свойство Values у поля таблицы или у DBLookupComboBox |
|
Миshук |
Отправлено: 17.08.2005, 10:05 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
Может я что-то не понимаю, но причем тут поля таблицы. Мне необходимо чтобы когда фокус будет на DBLookupComboBox , при нажатии на 1, у меня текущим значением была надпись "мужской" а при нажатии 2- "женский". Грубо говоря надо чтобы в момент нажатия клавиши открывался заполненный данными справочника список и выделялась та запись, которой соответсвует нажатая цифра (см. первое сообщение).
А у компанента DBLookupComboBox разве есть свойство Values?
|
|
Миshук |
Отправлено: 17.08.2005, 13:35 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
Ну хотябы намекните пожалуйста!
|
|
Guest |
Отправлено: 20.08.2005, 19:29 |
|
Не зарегистрирован
|
Народ! Ну хотябы скажите такое возможно сделать или нет? Спрашивал у знакомых (работают с Delphi) , сказали что делать ничего не надо, все стоит по умолчанию. Т.е. какое поле указано в свойстве ListField , по тому и будет осуществлятся быстрый поиск(т.е нажал 1 — и выделяется поле "мужской" и т.д.) У меня это дейсьвует только ели в свойстве ListField указано поле Sex (тип поля-char).Я набираю букву "м" и получаю "мужской", нажимаю "ж" -получаю соответсвенно "женский" . А вот с числовым полем не получается. Ну пожалуйста подскажите в чем проблема!!! PLIZZZZ!!! |
|
** Admin |
Отправлено: 21.08.2005, 22:28 |
|
Не зарегистрирован
|
Наверное самая большая проблема в данном случае -
в неправильном проектировании базы данных.
Думаю что не стоит создавать таблицу-справочник полов,
состоящую из двух записей. Это извращение.
А для ввода-отображения используйте DBComboBox,
введя туда в конструкторе 2 строчки — "мужской", "женский"
или еще проще буквы "м" и "ж".
А уж как будет в основной таблице, где указывается пол -
это вам виднее, но лучше не извращаться а так и заносить
у каждой записи мужской — женский или еще проще -
буквы 'м' или 'ж'
|
|
Миshук |
Отправлено: 22.08.2005, 11:11 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
Ну наконец-то дождался ответа! Спасибо! Но понимаете в чем дело, справочник пола — это все лишь примитивный примерчик, чтобы вопрос понятен был. У меня есть справочники (например кодов организаций) и там от 100 до 500 записей а то и больше. Становится очень удобным набирать не название организации а только ее код по которому из справочника берется соответствующее название. На мой взгляд DBLookupComboBox для это подходит лучше всего. Хотя я слышал что со справочником более 1000 записей время работы этого компанента увеличивается в много раз. Так вот, проблема в том что поиск в DBLookupComboBox осуществляется только по текстовым полям (поиск по первой букве записи) а мне надо чтобы поиск осуществлялся и по числовому полю.(int) Почему-то не работает, разве это не предусмотрено?
|
|
Admin |
Отправлено: 22.08.2005, 11:34 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE | Спрашивал у знакомых (работают с Delphi) , сказали что делать ничего не надо, все стоит по умолчанию. Т.е. какое поле указано в свойстве ListField , по тому и будет осуществлятся быстрый поиск(т.е нажал 1 — и выделяется поле "мужской" и т.д.) |
Какое поле указано в свойстве ListField , по тому и будет осуществлятся быстрый поиск, это вовсе не значит что
QUOTE | нажал 1 — и выделяется поле "мужской" | .
По видимому ключевое поле у вас KeyField — это SexID (int),
а поле просмотра ListField — это Sex (char), и естественно,
что поиск будет осуществляться по полю, указанному в
в свойстве ListField — то есть Sex (char), а не SexID (int).
|
|
Миshук |
Отправлено: 23.08.2005, 19:30 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
Все верно! Ключевое поле у меня SexID(int), но ведь в поле просмотра (ListField) можно указывать два поля через точку с запятой и по тому которое стоит первым и будет осуществлятся поиск. Таким образом что мы имеем:
KeyField — SexID
ListField — SexID;Sex
В итоге при открытии локапа в выпадающем списке у меня две колонки — в одной цифра а в другой соответствующая ей запись. Так вот я вижу что еденичке соответствует "мужской" а двойке-"женский", однако к моему сожаление поиск в таком случае по полю SexID не работает сколько бы я не нажимал эти еденички и двойки. Вот какая штука!
|
|
Gedeon |
Отправлено: 25.08.2005, 12:13 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Это у Вас чисто теоретические изыски? Не представляю для чего это понадобится может.
|
|
olegenty |
Отправлено: 25.08.2005, 12:20 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
а мне не понятно, зачем столько времени тратить на такую ерунду. нет, в БД я бы хранил (для справки), табличку с полами, но никогда ею не пользовался (кроме как если забыл бы, что значит 1, а что 2). а уж выбор пола по нажатию на цифру организовать — ну минуту-две надо потратить, потолок...
|
|
Миshук |
Отправлено: 26.08.2005, 06:56 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
Слушайте! Как мне картинку выложить(*.bmp) вместе с сообщением. Хочу чтоб вы до конца поняли в чем у меня проблема?
|
|
AVC |
Отправлено: 26.08.2005, 08:10 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
К слову.
Я для полей, имеющих два состояний использую тип number со значениями 0 или 1, а для показа ставлю формат типа "x";"x";""
Т.е. в вашем случае это может быть так:
допустим 0 — ж а не 0 — м (Null == 0)
тогда формат "м";"м";"ж"
и при вводе 0 в поле вы будете видеть ж или м в противном случае, как только выйдете из редактора поля.
PS.
Такого же можно добиться используюя поля типа Boolean, но, к сожалению, не все сервера БД их имеют.
PPS.
Для выкладывания картинки нужно зарегистрироваться. |
|
Миshук |
Отправлено: 26.08.2005, 08:40 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
Уважаемые! Уважаемые! Подождите! К черту этот пол!
У меня вот в чем неясность.Как пример смотрите чужое
творение (прикрепленный фаил) Под красной жирной цифрой
1 — видите сколько много страховых компаний и у каждой есть код.
Этот рисунок-это обрывок формы регистрации пациентов.
Оператор когда доходит до занесения значения в поле "страхователь"
не начинает набивать название этого страхователя а всего лишь
набирает его код.( А набивает оператор информацию с бумажного
талона в котором указан этот код) Таким образом оператору даже
неважно какой там страхователь, лишь бы код был. Под цифрой 2
показано наглядно как происходит поиск по коду. Так вот у меня
не получается выбрать из выпадающего списка значение по его коду.
Ну никак не воспринимается нажатие цифр. Незнаю почему.
Может DBLookupComboBox этого не поддерживает?
Теперь я думаю вы меня поймете.
Присоединить изображение
|
|
olegenty |
Отправлено: 26.08.2005, 08:57 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
раньше для таких целей пользовался TRxLookupEdit (чтоб ничего своими руками не делать)
|
|
gvg |
Отправлено: 26.08.2005, 14:11 |
|
Машинист паровоза
Группа: Участник
Сообщений: 222
|
Скорее здесь код — часть наименования, поэтому и происходит отбор по первым символам. Для дальнейшего примениения первые N знаков с кодом можно отбросить. |
|
Guest |
Отправлено: 26.08.2005, 15:22 |
|
Не зарегистрирован
|
А с чего вы решили, что это здесь 2 поля ?
(и одно из них типа integer)
Или что поле с кодами в этом примере типа integer а не varchar ?
(012 , 015) — чтобы был первый 0 ??? это надо постараться
для типа integer сделать(через форматирование и пр.)
Вполне возможно что поле с кодом имеет тип varchar вот все и
работает.
Кроме того, почему вы решили, что все должно работать
автоматом, без написания с вашей стороны ни строчки кода ?
Обрабатывайте событие OnChange компонента DBLookupComboBox
как вам нужно, например:
CODE |
void __fastcall TForm1::DBLookupComboBoxChange(TObject *Sender)
{
AnsiString s = DBLookupComboBox->Text;
if(s != "") DataSet->Locate("SexID", StrToInt(s), TLocateOptions());
}
//---------------------------------------------------------------------------
|
вот и получите то что хотели.
(только поставьте Style=csDropDown и сделайте проверку на нецифры
например в событии OnKeyPress компонента DBLookupComboBox)
Отредактировано Admin — 26/08/2005, 15:46 |
|
** Admin |
Отправлено: 26.08.2005, 15:34 |
|
Не зарегистрирован
|
Кроме того, если вы возьмете компонент
RxDBLookupCombo из RxLib, то все заработает
как вам надо и без этого кода.
В свойство LookupField вписываете: SexID
в LookupDisplay: SexID;Sex
и все заработает как в примере,
то есть по 1 — 2 будете получать
нужную строку.
P.S. К стыду библиотеки EhLib должен с сожалением
заметить что в ней компонент DBLookupComboboxEh
также не работает в отличие от компонента из RxLib.
Отредактировано Admin — 26/08/2005, 15:38 |
|
Миshук |
Отправлено: 26.08.2005, 16:15 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
Ну ладно,по порядку! Вы уж извените что развез здесь тигамотину.
Блин не знаю как цитату сделать , но ладно. Этот рисунок — это прога моего начальника, он очень занятой человек, сидит в другом здании и его очень редко можно найти. Работает он в основном с Delphi + SQL Server. Сам я начинаю работать с Builder и знакомлюсь с базами SQL. Много смотрел его базы и скажу вам точно что к примеру (см. рисунок) под цифрой 1 — коды это точно отдельное поле таблицы БД, а не часть одного поля. У него на делфе все работает. На счет второй цифры 2 — вполне возможно что это "varchar" не спорю. Это ответ "gvg" и "Guest". И тут же "Guest" тебе — ничего не могу понять но для компанента DBLookupComboBox в инспекторе объектов у меня почему-то нет события OnChange(почему сам понять не могу). И теперь Вам "**Admin" и "olegenty"- У меня нет библиотеки RxLib. Что сильно советуете? Мне начальник тут дал JVCL(Джеди компаненты) и там я нашел компанент JvDBLookupCombo — поюзал и все ПОЛУЧИЛОСЬ. (Что из этих двух библиотек посоветуете?) Так что ребята закрываем эту тему. Всем ОГРОМНОЕ СПАСИБО!!! Я просто студент и решил на диплом кое-что сделать ( если честно опыта у меня в этих делах мало- но я стараюсь) поэтому если Вы не против, то по мере продвижения я буду задавать Вам непонятные мне вопросики! ОК? Еще раз Всем спасибо? И про библиотеки выскажите пожалуйста свое мнение.
|
|
** Admin |
Отправлено: 26.08.2005, 16:19 |
|
Не зарегистрирован
|
Потому-что это компонент из библиотеки Ehlib
в котором это событие есть, очень редко приходиться
применять обычный из C++Builder
Что касается — Мне начальник тут дал JVCL —
так это и есть библиотека с включенными туда
компонентами RxLib !!! |
|
Миshук |
Отправлено: 26.08.2005, 17:25 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 36
|
QUOTE (** Admin @ 26/08/2005, 16:19) | Что касается — Мне начальник тут дал JVCL —
так это и есть библиотека с включенными туда
компонентами RxLib !!! |
Ну теперь понятно! СПАСИБО!
|
|