Консультация № 150417
13.11.2008, 11:33
0.00 руб.
0 3 2
Уважаемые эксперты. У меня две связанные таблицы (связь:один-ко-многим). Как правильно обратиться к таблице, так чтобы, при выборе значения из Combobox в ListBox отображалась бы её связь? Мне бы хотя бы хоть какую-нибудь наводку, потому что даже не представляю с чего начать.

Обсуждение

Неизвестный
13.11.2008, 12:56
общий
это ответ
Здравствуйте, Шушкова Марина Сергеевна!
Проще всего - это сделать следующее.
1. Добавить компонент ADOQuery1 (он будет использован для вывода данных в ListBox1)
2. Сделать обработчик события для Вашего ComboBox1. В нем примерно написать следующее
procedure TForm1.ComboBox1Select(Sender: TObject);
var
i: integer;
begin
ListBox1.Clear;
{Запрос ко второй таблице}

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:= 'Select [нужное Вам поле из 2-й таблицы] from [имя 2-й таблицы] where [поле связи] =' + QuotedStr(ComboBox1.Text);
ADOQuery1.Open; ADOQuery1.First;
for i:= 1 to ADOQuery1.RecordCount do
begin
ListBox1.Items.Add(ADOQuery1.FieldByName([нужное Вам поле из 2-й таблицы]).AsString);
ADOQuery1.Next;
end;
ADOQuery1.Close;
end;

Примерно так.
Вопросы пишите в форум.
Неизвестный
13.11.2008, 17:10
общий
это ответ
Здравствуйте, Шушкова Марина Сергеевна!

Сначала, надо заполнить значения ComboBox. Потом, определить его событие OnChange (просто щелкните дважды по нему мышкой). В приведенном коде это все есть.
Код:
 {тут мы заполняем выподающий список значением}
procedure TForm1.FormCreate(Sender: TObject); // это конструктор формы
begin
ComboBox1.Style := csDropDownList; // не редактируемый, выподающий список, пользователь может только выбирать.
ComboBox1.Items.Clear; // очистим если что есть
ADOTable1.Active:= true; // активируем таблицу
ADOTable1.DisableControls; // запретим отображать изменения/перемещения по таблице
ADOTable1.First; // установим курсор таблицы в самое начало
while(not AdoTable1.Eof)do // пока не достигнут конец таблицы
begin
ComboBox1.Items.Add(ADOTable1.fieldbyname('name_p').AsString); // добовляем значения по которым быдем фильтровать
Adotable1.Next; // переместимся на одну запись в перед
end;
ADOTable1.EnableControls;// разрешаем контролы для таблицы
ComboBox1.ItemIndex := 0;// устанавливаем первый элемент в ComboBox
end;
{это событие выбора в ComboBox}
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
ADOTable2.DisableControls; //отключаем контролы
ADOTable2.Filtered := false; // отключаем фильтр
ADOTable2.Filter := Format('pole1 = %s',[QuotedStr(ComboBox1.Text)]); // устанавливаем фильтр
ADOTable2.Filtered := true;// включаем фильтр
ADOTable2.First; // на первую запись
ListBox1.Clear;// очистим лист
while not ADOTable2.Eof do // пока есть что читать
begin
ListBox1.Items.Add(ADOTable2.FieldByName('ваше поле').AsString); // заносим в лист
ADOTable2.Next; // на следующую запись
end;
ADOTable2.First; // если нет контролов, можно не использовать, иначе, вернемся в начало
ADOTable2.EnableControls; // разрешим контролы (реакцию компонентов отображения связаных с таблицей)
{ для Query аналогично.}
end;


Неизвестный
14.11.2008, 06:12
общий
использование конструкции
Код:
while not ADOQuery1.Eof do
begin
ComboBox1.Items.Add(ADOQuery1.fieldbyname('name_p').AsString);
ADOQuery1.Next;
end;


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