Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 538

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Подскажите, пожалуйста, как реализовать запрос в БД, чтобы данные фильтровались по текущей строке.

Например:
Есть 2 таблицы - марка и модель
Таблица "марка" содержит код и марку автомобиля:
1 - ВАЗ
2 - Toyota
и т.д.

Таблица "модель" содержит код модели, код марки и модель
1 - 1 - 2110
2 - 1 - 2109
3 - 2 - Rav 4
4 - 2 - Corolla
и т.д.

В Delphi на форме имеются 2 DBGrid и 2 кнопки
1 DBGrid отображает данные таблицы "марка"
2 кнопки обеспечивают переход по строчкам в этом DBGrid

Возможно ли сделать так, чтобы во втором DBGrid отображались только те модели, марка которых находится в текущей строке, т.е. при запуске текущей является первая строчка - "1 - ВАЗ", значит во 2 DBGrid отображаются только "1 - 1 - 2110" и "2 - 1 - 2109"
при нажатии на кнопку, текущей становиться следующая строка "2 - Toyota", а значит отображаться во 2 DBGrid должны будут следующие строчки "3 - 2 - Rav 4" и "4 - 2 - Corolla"

Может через какое-то событие это можно сделать?

Сама БД сделана в MSSQL

Цирцея Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Цирцея (статус: Посетитель)
Вопрос отправлен: 3 июня 2014, 22:04
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: ANBsoft

Здравствуйте, Цирцея!
DBGrid получает данные из DataSource, у которого есть событие OnDataChange.
В этом событии для первого грида ставим переоткрытие второго запроса с фильтром по текущей марке.

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 3 июня 2014, 22:46
Оценка за ответ: 5

Комментарий к оценке: Спасибо за быстрый ответ и за пояснения =)

Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 4 июня 2014, 13:29; участников в обсуждении: 2.
Цирцея

Цирцея (статус: Посетитель), 3 июня 2014, 22:55 [#1]:

ANBsoft, спасибо за ответ!

Расскажите пожалуйста поподробней о:
"переоткрытие второго запроса с фильтром по текущей марке."
В этом событии просто нужно прописать запрос и всё?
Самый страшный вирус всегда сидит перед компьютером.
ANBsoft

ANBsoft (статус: Студент), 3 июня 2014, 23:00 [#2]:

я не работал с MSSQL, но принцип везде один.
в этом событии прописываем
Query2.Close;
Query2.SQL[1]:='WHERE (Marka='+IntToStr(Query1.FieldByName('ID').AsInteger)+')';
Query2.Open;
Как-то так.
При том что во втором Query примерно такой запрос:
SELECT * FROM Model
WHERE (Marka=1)
ANBsoft

ANBsoft (статус: Студент), 3 июня 2014, 23:05 [#3]:

В принципе у наследников TDataSet есть свойство DataSource, в котором можно указать родительский DataSet при изменении которого можно будет переоткрывать зависимый, но у разных компонентов он может вести себя немного по разному, поэтому я описао общий случай без него.
Цирцея

Цирцея (статус: Посетитель), 3 июня 2014, 23:06 [#4]:

ANBsoft, спасибо, попробую сделать :-)
Самый страшный вирус всегда сидит перед компьютером.
Цирцея

Цирцея (статус: Посетитель), 3 июня 2014, 23:09 [#5]:

Я через DataSource настраивала. Его подключала к ADOQuery, а ADOQuery к ADOConnection.
ADODataSet не использовала
Самый страшный вирус всегда сидит перед компьютером.
ANBsoft

ANBsoft (статус: Студент), 3 июня 2014, 23:15 [#6]:

все верно, любой Query (ADOQuery в том числе) является потомком TDataSet и наследует его свойства и методы
Цирцея

Цирцея (статус: Посетитель), 4 июня 2014, 01:08 [#7]:

Выдает мне ошибку, что поле найти не может Оо
Завтра еще раз попробую сделать
Самый страшный вирус всегда сидит перед компьютером.
ANBsoft

ANBsoft (статус: Студент), 4 июня 2014, 01:12 [#8]:

я условно написал поле "Marka", замените его на соответствующее поле из второй таблицы, которое определяет привязку модели к марке машины
Цирцея

Цирцея (статус: Посетитель), 4 июня 2014, 13:29 [#9]:

ANBsoft, да, подставила свое, спасибо.
Пример ведь тоже привела условный.. в работе все намного сложнее и запутаннее =(
Самый страшный вирус всегда сидит перед компьютером.

4 июня 2014, 15:03: Статус вопроса изменён на решённый (изменил автор вопроса — Цирцея)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.03 сек.