Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.12;
Скачать: CL | DM;

Вниз

DBComboBox   Найти похожие ветки 

 
Юлия   (2003-05-24 19:47) [0]

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


 
Engel ©   (2003-05-24 20:17) [1]

А зачем из этой же? почему бы повторяющиеся значения не вынести в отдельную таблицу?
Вам в этом случае нужен 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;
типа такого - на событие выпадания списка


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

Используй DBLookupComboBox


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

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

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


 
Engel ©   (2003-05-24 21:38) [4]

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

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


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

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


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

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

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

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


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

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


 
I_C_E_   (2003-05-24 22:05) [8]

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


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

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

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 нужен, когда Вы выбираете значение поля из заранее определенного списка.



Страницы: 1 вся ветка

Текущий архив: 2003.06.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
14-34977
paxer
2003-05-26 12:08
2003.06.12
Вот думаю переходить с Д5 на Д6. Стоит ли?


3-34759
dimonf
2003-05-24 16:35
2003.06.12
Помогите разобраться с REPLACE в MSSQL.


14-35052
_0$a_
2003-05-24 00:13
2003.06.12
Народ помогите Как найти Обратную матрицу


14-35042
_MYSTERYO_
2003-05-26 15:47
2003.06.12
Тоже решил выложить демку своего движка...435kb


1-34820
Alexsus
2003-06-02 17:34
2003.06.12
Подскажите, выделяет ли память функция SetLength ..