Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DBComboBox [D6, Paradox]


Юлия ©   (2003-05-24 19:47:00) 

как сделать выпадающий список из значений определенного поля?
Например, есть таблица клиент, из списка фамилий выбираем нужную - отображаются сведения из таблицы (пусть даже этой же).
Почему, если ставлю DbComboBox (прописываю datasource и datafield), он отображает одну запись, и не хочет "Выпадать"?


Engel   (2003-05-25 00:03:00) [1]

>Допустим, пользователь выбирает ее. Какие данные отобразятся в остальных элементах управления? Номер полиса, например, для какого из однофамильцев?
Поняла задачу. А так у Вас не получится... Этот компонент только для вставки значения в поле. (по крайней мере я других способов не нашла).
А я делала так:

type TVypAr = array of longint;
var sp_typ:TVypAr;
//динамический массив

procedure TChanMonForm.TypeCBDropDown(Sender: TObject);
var i:integer;
begin
with dmm.sqtyp do begin
close;
commandtext:="select * from typ order by sorttyp";
open;
first;
typecb.items.clear;
sp_Typ:=nil;
setlength(Sp_Typ,recordcount);
i:=0;
while not eof do
begin
typecb.items.add(fieldbyname("nametyp").asstring);
sp_typ[i]:=fieldbyname("idtyp").asinteger;
next;i:=i+1;
end;
end;
end;

procedure TChanMonForm.TypeCBCloseUp(Sender: TObject);
begin
if typecb.ItemIndex <> -1 then t_sstypmon:=inttostr(sp_typ[typeCB.ItemIndex]);
...и дальше с помощью этой переменной фильтруете набор данных или переходите к этой записи по уникальному ключу в таблице.
...
end;

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

Но. Это хорошо, если у Вас 10 записей в таблице. А если 10 тысяч? Лучше сортируйте сам набор данных. Сделайте индекс с сортировкой по фамилии и индекс по полису. Можно обработчиком клика по заголовку менять сортировку... Свойство индекс у таблицы есть.

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


Юлия   (2003-05-24 22:05:00) [2]

Как работает DBComboBox? Какой смысл его вообще использовать, если заполнять его надо вручную. только чтоб отображать текущее значение? А если нужно выбрать значение из списка, как таблица узнает об этом? связь со значениями таблицы существует?


I_C_E_   (2003-05-24 22:05:00) [3]

Вы хотиде невыполнимое по не уникальному ключу найти уникальную запись. Выдавайте все возможные с возможностью выбора из них.


Юлия   (2003-05-24 21:55:00) [4]

Структура таблицы: Фамилия клиента, номер полиса, дата полиса...
Я хочу сделать выпадающий список с фамилиями клиента. И выпадающий список с номерами полиса. (для удобной навигации)
Выбирается фамилия - отображается соответсвующий номер полиса, и все данные ("дата полиса...")
Выбирается номер полиса - отображается для него фамилия и все остальное.

Если несколько одинаковых фамилий, то вашим методом в списке будет одна запись. Допустим, пользователь выбирает ее. Какие данные отобразятся в остальных элементах управления? Номер полиса, например, для какого из однофамильцев?

Если поставить DBLookupComboBox и указать только datasource и datafield, то... работает, но только для одного поля - фамилия, почему-то.


I_C_E_   (2003-05-24 21:46:00) [5]

Придется формировать таблицу с Фамилиями клиентов если не хотите нормализовать .


Engel   (2003-05-24 21:38:00) [6]

Тогда опишите подробно задачу. А то непонятно, зачем Вам знать, какую запись выбрал пользователь, если у Вас все в одной таблице.
Поле-то уже заполняется, если Вы кого-то выбрали.

Если несколько одинаковых фамилий - на то distinct в запросе.


Юлия   (2003-05-24 21:28:00) [7]

Engel: а как определять, какую запись выбрал пользователь? А если несколько одинаковых фамилий клиента? Поле неуникальное!

I_C_E_ : а как использовать? Это же для связи master-detail. А у меня все в одной таблице, и нормализовать нет смысла...


I_C_E_   (2003-05-24 20:19:00) [8]

Используй DBLookupComboBox


Engel   (2003-05-24 20:17:00) [9]

А зачем из этой же? почему бы повторяющиеся значения не вынести в отдельную таблицу?
Вам в этом случае нужен dblookupcombobox - другой компонент.
там есть свойство listsource - из него добавляется список. Но если таблица одна и та же - он Вам все равно не даст этого сделать, потому что получается циклическая ссылка.
Вам или лучше сделать справочные данные в отдельную таблицу, или использовать DbComboBox (или просто ComboBox) заполняя список самой с помощью запроса.

procedure TChanMonForm.TypeCBDropDown(Sender: TObject);
begin
with querytyp do begin
close;
sql.add("select distinct nametyp from typ order by sorttyp");
open;
first;
typecb.items.clear;
while not eof do
typecb.items.add(fieldbyname("nametyp").asstring);
next;
end;
end;
типа такого - на событие выпадания списка


Наверх

Титульная страница Поиск, карта сайта Написать письмо