Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > сырье для Запроса


Автор: Кит 11.12.2005, 15:58
Имеется база данных в Access и доступ ней через ADO
Таблица Болезней (Bolezni) связана с Таблицей симптомов
(Simptomi) как "many-to-many" через
промежуточную таблицу Codes_1

Выглядит это так "Bolezni"
Kod_bolezni Nazvanie_bolezni
1 Аритмия
2 Атеросклероз
3 Гипотония
и т.д.

Simptomi
Kod_simptoma Nazvanie_simptoma
1 Нарушение ритма сердца
2 Боли в животе
3 Боли в пояснице
4 Температура
и т.д.

Codes_1
Kod_bolezni Kod_simptoma
1 1
2 1
2 4
1 3
и т.д.
Bolezni связана с Codes_1 как один ко многимпо полю Kod_bolezni
Simptomi связана с Codes_1 как один ко многим по полю Kod_simptoma

Я хочу бы чтобы по выбору нескольких симптомов из Simptomi
в ListView1 происходил бы выбор соответствующих болезней
Сам ListView1 я заполняю при активации формы так
Код

procedure TMainForm.FormActivate(Sender: TObject);
 var
NewColumn: TListColumn;
begin
ListView1.ViewStyle:=vsReport;
ListView1.RowSelect:=true;
NewColumn := ListView1.Columns.Add;
NewColumn.Caption := '';
NewColumn := ListView1.Columns.Add;
NewColumn.Caption := 'Название симптома';
ListView1.Columns[0].Width:=17;
ListView1.Columns[1].Width:=200;
FindQuery.SQL.Text:='SELECT Nazvanie_simptoma, Kod_simptoma FROM Simptomi';
FindQuery.Open;
While not FindQuery.Eof do
begin
ListView1.Items.Add;
ListView1.Items[FindQuery.RecNo-1].SubItems.Add(FindQuery.FieldByName('Nazvanie_simptoma').AsString);
ListView1.Items[FindQuery.RecNo-1].Caption:=FindQuery.FieldByName('Kod_simptoma').AsString;
FindQuery.Next;
end;
end;

Где поле Kod_simptoma невидимо. Оно будет необходимо для другого
запроса.
Теперь я сделал SQL-запрос для вывода в ListView2 всех болезней
соответствующих выбранным симптомам и повесил на кнопку
Код

procedure TMainForm.Button1Click(Sender: TObject);
   var
NewColumn: TListColumn;
begin
ListView2.ViewStyle:=vsReport;
ListView2.RowSelect:=true;
NewColumn := ListView2.Columns.Add;
NewColumn.Caption := 'Код болезни';
NewColumn := ListView2.Columns.Add;
NewColumn.Caption := 'Название болезни';
ListView2.Columns[0].Width:=17;
ListView2.Columns[1].Width:=200;

BolezniQuery.SQL.Text:='SELECT distinct Nazvanie_bolezni FROM Simptomi INNER JOIN (Bolezni INNER JOIN Codes_1 ON Bolezni.Kod_bolezni = Codes_1.Kod_bolezni)'
+'ON Simptomi.Kod_simptoma = Codes_1.Kod_simptoma WHERE (Codes_1.Kod_simptoma) In (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,365,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,'
+'55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,'
+'107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158)';
BolezniQuery.Open;
While not BolezniQuery.Eof do
begin
ListView2.Items.Add;
FieldByName('Kod_bolezni').AsString;
ListView2.Items[BolezniQuery.RecNo-1].SubItems.Add(BolezniQuery.FieldByName('Nazvanie_bolezni').AsString);
BolezniQuery.Next;
end;
end;

Он работает, но заполняет ListView2 всеми болезнями из базы

НАКОНЕЦ, САМ ВОПРОС: КАК МНЕ И КУДА ПЕРЕДАТЬ В ПРЕД. ЗАПРОС
ИНДЕКСЫ ВЫБРАННЫХ СТРОК ListView1(симптомы)(ВМЕСТЕ С Kod_simptoma)
ДЛЯ ТОГО ЧТОБЫ ОН ОТОБРАЗИЛ ТОЛЬКО СООТВЕТСТВУЮЩИЕ БОЛЕЗНИ.

СПАСИБО, ЧТО ДОЧИТАЛИ ДО КОНЦА! :wink:

Автор: Vit 19.12.2005, 19:38
Варианты:

1. Генерить запрос динамически с тем количеством параметров которое необходимо и параметры заполнять из листа
2. Сделать временную таблицу, заполнять её запрашиваемыми параметрами и добавлять её в Join

Первый способ предпочтительнее если лист не очень большой, второй при больших массивах данных


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)