C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Помогите!
Ми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 — biggrin.gif biggrin.gif biggrin.gif
так это и есть библиотека с включенными туда
компонентами RxLib !!!
Миshук
Отправлено: 26.08.2005, 17:25


Дежурный стрелочник

Группа: Участник
Сообщений: 36



QUOTE (** Admin @ 26/08/2005, 16:19)
Что касается — Мне начальник тут дал JVCL —  biggrin.gif  biggrin.gif  biggrin.gif
так это и есть библиотека с включенными туда
компонентами RxLib !!!

Ну теперь понятно! СПАСИБО!

Вернуться в Работа с базами данных в C++Builder