есть 2 таблицы: клиенты и объекты. Задается имя клиента, нужно выбрать только те объекты которые принадлежат ему. Связь 2 табл через Id_klient.
Что я не так делаю?
if edit1.Text='' then showmessage('Введите условие поиска');
if (edit1.Text<>'' ) then begin s:=edit1.Text;
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select Id_klienta');
adoquery1.SQL.Add('From Klienti');
adoquery1.SQL.Add('where ((Klienti.Familiya)="'+s+'");');
adoquery1.Open;
DBGrid2.DataSource:=datasource1;
i:=1;
sd:=dbgrid2.DataSource.DataSet.RecordCount;
while i<=sd do
begin s2:=dbgrid2.DataSource.DataSet.Fields[i-1].AsString;
inc(i);
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select Klienti.Id_klienta, Klienti.Familiya, Klienti.Imya,Klienti.Otchestvo, '+tab+'.*');
adoquery2.SQL.Add('from Klienti inner join '+tab+' on Klienti.Id_klienta=Obekti.Sobstvennik');
ADOQuery2.SQL.Add('WHERE ((Klienti.Id_klienta='+s2+'));');
adoquery2.Open;
DBGrid1.DataSource:=datasource2;
end; end;
Здравствуйте, Pois, Вы писали:
P>есть 2 таблицы: клиенты и объекты. Задается имя клиента, нужно выбрать только те объекты которые принадлежат ему. Связь 2 табл через Id_klient.
P>Что я не так делаю?
P> ...big skipped...
А что получается то, что не так?
Вообще запросы, в которые что-то вставляется извне, лучше делать с параметрами, так, для чистоты кода.
P>i:=1;
P>sd:=dbgrid2.DataSource.DataSet.RecordCount;
P>while i<=sd do
P>begin s2:=dbgrid2.DataSource.DataSet.Fields[i-1].AsString;
P>inc(i);
Здесь ты пробегаешься не по записям таблицы, содержащей id клиента с фамилиями, а последовательно по полям одной записи.
В цикле в DBGrid1 в конце концов останется только записи, соотв. последнему id клиента. Других там попросту не будет, поскольку следующий запрос у тебя затирает данные предыдущего.
Вообще это можно сделать одним запросом.
И еще технический вопрос. А как ты доступаешься к данным, у которых нет визуальных контролов, гридов и пр.?
Не проше (и правильнее) написать
Table1.Fields[1].AsString
вместо
dbgrid2.DataSource.DataSet.Fields[1].AsString
В гриде ты видешь только визуальное представление данных, а не сами данные, и доступаться к ним через грид — неправильно.