Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
47 / 27 / 8
Регистрация: 11.05.2010
Сообщений: 169

Изменение запроса в зависимости от выбранных строк в нескольких DbGrid (в SQL получить значения из нескольких DataSet)

26.03.2018, 09:29. Показов 4107. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.


Есть таблицы и компоненты:

Tbl_authors – Таблица авторов.
С ней связаны компоненты:
- ADOTable_authors,
- DataSource_authors,
- DBGrid_authors.

Tbl_books – Таблица книг.
С ней связаны компоненты:
- ADOTable_books,
- DataSource_books,
- DBGrid_books.

Tbl_books-authors – Таблица книг по авторам.
С ней связаны компоненты:
- ADOQuery_booksauthors
- DataSource_booksauthors,
- DBGrid_booksauthors.

Требуется отобразить в DBGrid_booksauthors только те записи, которые соответствуют выбранным строкам в DBGrid_authors и DBGrid_books.
Иными словами, требуется отобразить написанные конкретным автором книги выбранного наименования.
И отображать результат в DBGrid_booksauthors при выборе строк в DBGrid_authors и DBGrid_books (при перемещении по этим гридам).

Для этого, как я понимаю, надо в SQL-запросе обработать параметры из нескольких датасетов.
Например, так (параметр :Id_Author соответствует полю Id_Author в таблице Tbl_authors, параметр :Id_Book соответствует полю Id_Book в таблице Tbl_books):
SQL
1
2
3
4
5
6
SELECT Tbl_books.Book_Name AS [Наименование книги], Tbl_authors.Author_Name AS [Фамилия автора]
FROM Tbl_books, Tbl_authors, Tbl_BooksAuthors
WHERE Tbl_BooksAuthors.Id_Author = :Id_Author AND
      Tbl_BooksAuthors.Id_Book = :Id_Book AND
      Tbl_books.Id_Book = Tbl_BooksAuthors.Id_Book AND
      Tbl_authors.Id_Author = Tbl_BooksAuthors.Id_Author
Как с одного датасета получать в запросе значение - я разобрался (решение написано на форуме в этой теме: Как отобразить значения в таблице, соответствующие коду в другой таблице...).

Но вот как получить параметры из нескольких датасетов - не понимаю.

Подскажите, куда копать?

Заранее спасибо за ответ(ы).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.03.2018, 09:29
Ответы с готовыми решениями:

DataSet и изменение запроса в зависимости от выбранной строки DbGrid
Привет. Есть 2 компонента. DBGridSuppliers (содержит постащиков) и DBGridSuppliersGoods (содержит товары поставщиков, одно из полей записи...

Результат Sql запроса состоит из нескольких строк отличающихся одним полем
Составляю отчеты из БД, делаю выборку. Ее результат это две строки ну дальше будет и больше. Так вот эти строки различаются только Id...

Перенос нескольких строк DbGrid
У меня есть 2 DBGrida , задача: Я выделяю несколько строк в 1Гриде и надо перенести во второй, только все выделенные значения должны...

30
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
28.03.2018, 11:26
Студворк — интернет-сервис помощи студентам
Запросы в Аксесс чувствительны к скобкам. Такой слегка модифицированный запрос ошибок не дает:
SQL
1
2
3
4
5
SELECT Tbl_books.Book_Name, Tbl_authors.Author_Name
FROM (Tbl_BooksAuthors INNER JOIN Tbl_books ON Tbl_books.Id_Book = Tbl_BooksAuthors.Id_Book)
     INNER JOIN Tbl_authors ON Tbl_authors.Id_Author = Tbl_BooksAuthors.Id_Author 
WHERE Tbl_BooksAuthors.Id_Author = :Id_Author AND
      Tbl_BooksAuthors.Id_Book = :Id_Book
И без INNER брыкается. К Аксесс подходит только одно слово - "отстой" (для студентов).
1
47 / 27 / 8
Регистрация: 11.05.2010
Сообщений: 169
28.03.2018, 14:13  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
нельзя хранить 2 значения в 1 ячейке
Цитата Сообщение от qwertehok Посмотреть сообщение
нельзя так делать
ид_книги | ид_автора
На рис "002.jpg" во вложении нарисованы таблицы с реальной информацией.
Цветом выделены какие книги с каким автором связаны.



Авторы и их книги:

Сидерский Андрей написал книги:
- "Йога восьми кругов",
- "Йога как технология",
- "Омнио-треннинг",
- "Третье открытие силы".

Бойко Виктор написал книги:
- "Йога. Искусство коммуникации",
- "Йога в вопросах и ответах".

Лаппа Андрей написал книги:
- "Динамические практики в классической йоге",
- "Йога: Традиция Единения".


Как я понимаю, в одной ячейке хранится по одному значению.
Эта структура получилось в результате приведения к третьей нормальной форме - теорию брал тут: Часть 3.8: Третья нормальная форма (3NF)

На мой взгляд, полностью сделано как в приведенной теории по третьей нормальной форме.

В использованном примере в теории по 3NF тоже в таблицах Books(3nt) / Books(2nt) есть поля (см. во вложении рис "3nfer.png" и "2nfer.png"):
- Author
- Publish
которые ссылаются на соответствующие ключевые поля
- idAuthor в таблицах Author(3nt) / Author(2nt)
- idPublish в таблицах Publish(3nt) / Publish(2nt)

Или же мне надо в свой таблице Tbl_books-authors поле "Id_Book" назвать, например, "Book", а поле "Id_Author" назвать, например, "Author"?

И таблица тогда будет иметь структуру:

Tbl_books-authors – Таблица книг по авторам
- Id (первичный ключ). Тип Integer.
- Book. Тип Integer.
- Author. Тип Integer.

В этом была ошибка?

Или я опять что-то не понимаю?
Миниатюры
Изменение запроса в зависимости от выбранных строк в нескольких DbGrid (в SQL получить значения из нескольких DataSet)   Изменение запроса в зависимости от выбранных строк в нескольких DbGrid (в SQL получить значения из нескольких DataSet)  
0
5998 / 4573 / 1096
Регистрация: 29.08.2013
Сообщений: 28,248
Записей в блоге: 3
28.03.2018, 14:16
Цитата Сообщение от il-ir Посмотреть сообщение
В этом была ошибка?
надо спрашивать - сейчас правильно? - да
1
47 / 27 / 8
Регистрация: 11.05.2010
Сообщений: 169
28.03.2018, 14:56  [ТС]
qwertehok, спасибо.

Цитата Сообщение от qwertehok Посмотреть сообщение
так у тебя даже не MSSQL?
Цитата Сообщение от Скандербег Посмотреть сообщение
К Аксесс подходит только одно слово - "отстой" (для студентов).
Надеюсь, крайний вопрос в теме.
Какой бы SQL сервер могли бы посоветовать - проект не очень нагруженный, пользователей не много.
Понятно, что вопрос не однозначный и при некоторой настойчивости эту тему я криво или прямо расковыряю...

Но вот по не знанию, например, как с именами полей Book вместо Id_Book (что отметил qwertehok) и использовании явного объединения на основе предложения JOIN (что отметил Скандербег) - могу исполнять зажигательный танец на граблях, прежде чем пойму, что и как надо делать...
0
5998 / 4573 / 1096
Регистрация: 29.08.2013
Сообщений: 28,248
Записей в блоге: 3
28.03.2018, 14:59
Цитата Сообщение от il-ir Посмотреть сообщение
Какой бы SQL сервер могли бы посоветовать
MS SQL Express
1
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
28.03.2018, 15:09
Присоединяюсь - MS SQL Server Express, Бесплатный сервер.
Можно рассмотреть и вариант так же с бесплатным Firebird. Который, к тому же, устанавливается слегка проще.

И тот и другой для разработки БД требуют инструментальной программы (для создания объектов БД: таблиц, хранимых процедур и пр.).
Для MS SQL есть "Среда SQL Server Management Studio". Для Firebird, чаще, используют IBExpert.
1
28.03.2018, 15:17

Не по теме:

Цитата Сообщение от Скандербег Посмотреть сообщение
Который, к тому же, устанавливается слегка проще.
это FB то проще?

0
28.03.2018, 15:26

Не по теме:

Цитата Сообщение от qwertehok Посмотреть сообщение
это FB то проще?
Речь шла ТОЛЬКО об установке серверов в систему, а не о работе с ними.

0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,681
Записей в блоге: 21
28.03.2018, 16:40
FB имхо действительно проще )
0
47 / 27 / 8
Регистрация: 11.05.2010
Сообщений: 169
29.03.2018, 18:22  [ТС]
Спасибо всем, кто помог разобраться в задаваемых вопросах.

Добавлено через 7 часов 17 минут



Я опять с вопросами


Цитата Сообщение от qwertehok Посмотреть сообщение
клик по DBGrid отлавливать
Цитата Сообщение от Скандербег Посмотреть сообщение
есть событие AfterScroll, которое реагирует на любое перемещение по DBGrid, чем бы это перемещение не было вызвано


Отлавливаю событие OnCellClick и AfterScroll.
Событие OnCellClick имеется у объекта TDBGrid, событие AfterScroll у объекта TADOTable.

На форме объект DBGrid_AuthorsList через DataSource связан с таблицей ADOTable_Tbl_Authors.

Использую такой код:

Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.DBGrid_AuthorsListCellClick(Column: TColumn);
begin
  ShowMessage('CellClick');
end;
 
procedure TForm1.ADOTable_Tbl_AuthorsAfterScroll(DataSet: TDataSet);
begin
  ShowMessage('AfterScroll');
end;
И вопрос вот в чём.
Если в событии AfterScroll есть какой-то код, то не срабатывает событие OnCellClick.
То есть, если мышой ткнуть в ячейку DBGrid, то должно появиться сообщение 'CellClick' из процедуры:
Delphi
1
2
3
4
procedure TForm1.DBGrid_AuthorsListCellClick(Column: TColumn);
begin
  ShowMessage('CellClick');
end;
Но нифига не появляется это сообщение - выскакивает только сообщение из второй процедуры про 'AfterScroll'.
Причем, если "закоментировать" оператор ShowMessage('AfterScroll'), то сообщение 'CellClick' выдаётся:
Delphi
1
2
3
4
procedure TForm1.ADOTable_Tbl_AuthorsAfterScroll(DataSet: TDataSet);
begin
//  ShowMessage('AfterScroll');
end;
Это так и надо или у моего компилятора какой-то глюк?
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
29.03.2018, 18:33
Событие AfterScroll возникает всегда при перемещении указателя в датасете. Причем неважно каким образом: клавиатурой это делается или мышкой. Поэтому нет нужды держать обработку двух событий - достаточно одного AfterScroll.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2018, 18:33

Поиск нескольких строк в DBGrid
Добрый вечер. Я для поиска в DBGrid использую: Table1.Locate('Fio klienta',Edit1.Text,); Да, оно работает. Но вопрос в следующем...

Изменение числа в ячейке, в зависимости от нескольких аргументов
Здравствуйте, подскажите пожалуйста возможное решение моей проблемы. Суть условия: есть ячейка, к примеру A1, в ней стоит число...

Экспорт из DBGrid нескольких строк в Excel
Здравствуйте, помогите начинающему. Имеется обработчик на кнопку экспорта в эксель с готовым шаблоном. Как сделать так, что бы заполненные...

Создание запроса Sql из нескольких таблиц
1. Найти фамилию и телефон клиента, оформившего заказ с заданным номером.

Расчет значения в зависимости от нескольких условий
Определить сумму «к выплате», которая получена в результате расчетов заработной платы работникам сектора (пять работников), если начисления...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru