Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

           Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
           И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - https://clck.ru/fCqwP

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2011, 18:46   #1
lition1
 
Регистрация: 24.06.2010
Сообщений: 8
Вопрос Фильтр по связанным таблицам

Здравствуйте.
Такое дело:

Есть 2 ADOTable связанных по полям.
На форме размещены 2 DBGrid подключенных к ADOTable. Данные во втором компоненте отображаются в зависимости на какой записи установлен курсор в первом компоненте.

Нужно сделать фильтр по втором DBGrid.
Использую событие OnFilterRecord компонента ADOTable2 к которому подключен DBGrid2. Но результат фильтрования выводит данные уже не зависимо на какой записи стоит курсор в DBGrid1.

Код:
begin
        Accept:=pos(AnsiUpperCase(FStock.Edit1.Text),AnsiUpperCase(DataSet['SpName']))<>0;
end;
Помогите уточнить поиск...
lition1 вне форума Ответить с цитированием
Старый 01.04.2011, 19:23   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

а ADOTable2.Filtered в True устанавливаешь?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2011, 19:39   #3
lition1
 
Регистрация: 24.06.2010
Сообщений: 8
По умолчанию

Цитата:
а ADOTable2.Filtered в True устанавливаешь?
Да! В событии EditChange...
Приведенный пример работает, только не так как нужно...
Нужно чтоб фильтровало только те данные, которые относятся к записи на которой курсор в данный момент в DBGrid1.
lition1 вне форума Ответить с цитированием
Старый 01.04.2011, 19:53   #4
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Продублируйте условие связи между таблицами в фильтре. Что-то вроде:
Код:
ADOTable2.Filter:=ADOTable2.Filter+' and полесвязи.AsString=' + ADOTable1.полесвязи.AsString;
asmodey1 вне форума Ответить с цитированием
Старый 01.04.2011, 20:32   #5
lition1
 
Регистрация: 24.06.2010
Сообщений: 8
По умолчанию

Цитата:
Продублируйте условие связи между таблицами в фильтре. Что-то вроде:
Код:

ADOTable2.Filter:=ADOTable2.Filter+ ' and полесвязи.AsString=' + ADOTable1.полесвязи.AsString;
Что-то не получилось. Выдало ошибку:
Filter property cannot be used for ... tables

Может можно как-то уточнить фильтр, по типу:
Код:
 
begin
          Accept:=pos(AnsiUpperCase(FStock.Edit1.Text),AnsiUpperCase(DataSet['SpName']))<>0 and
          DataSet.FieldByName('IdClient').Value = FStock.DBGrid1.SelectedField.DataSet.FieldValues['ClientId'];
end;
lition1 вне форума Ответить с цитированием
Старый 01.04.2011, 20:36   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

нужно в ADOTable1.AfterScrool манипулировать с фильтром если он привязан к данным текущей записи ADOTable1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2011, 20:46   #7
lition1
 
Регистрация: 24.06.2010
Сообщений: 8
По умолчанию

Цитата:
нужно в ADOTable1.AfterScrool манипулировать с фильтром если он привязан к данным текущей записи ADOTable1
А поподробней можно?
lition1 вне форума Ответить с цитированием
Старый 01.04.2011, 21:52   #8
alexvav
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 152
По умолчанию

сдаётся мне, ты требуешь невозможного.
alexvav вне форума Ответить с цитированием
Старый 01.04.2011, 21:56   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Если я правильно понял, то связка идет по полям ClientId в ADOTable1 и IdClient в ADOTable2. Откажитесь от OnFilterRecord и, если они имеют тип Integer, можно использовать код:
Код:
procedure TForm1.ADOTable1AfterScroll(DataSet: TDataSet);
begin
  ADOTable2.Filtered:=False;
  ADOTable2.Filter:=Format('IdClient=%d',[ADOTable1.FieldByName('ClientId').AsInteger]);
  ADOTable2.Filtered:=True;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2011, 22:35   #10
lition1
 
Регистрация: 24.06.2010
Сообщений: 8
По умолчанию

для, Аватар
Спс, попробовал...
Та же фигня, Filter property cannot be used for detail tables...
lition1 вне форума Ответить с цитированием
Ответ

           Интенсив по Python: Работа с API и фреймворками 3-5 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
           Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Информация по электронным таблицам. ardor Помощь студентам 0 16.05.2010 16:05
Простой вопрос по таблицам БД sashok_fotka БД в Delphi 4 23.11.2009 14:58
Вопрос по сводным таблицам Shnyrok Microsoft Office Excel 8 05.11.2009 05:08
Поиск по связанным таблицам Таня84 БД в Delphi 1 22.02.2007 10:37