| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > Связь двух запросов по ключевому полю |
| Автор: salik 2.2.2015, 11:30 | ||||||
| Здравствуйте уважаемые эксперты. Помогите разобраться как построить связь один ко многим на простом примере. Есть запрос, назовем его sel1
И запрос sel2
Проверил, по отдельности эти запросы работают без ошибок. Дальше настраиваю вторую таблицу заполняю mastersource, masterfield, indexfielname. С помощью компонента sqlMonitor видно, следующее
Если бы был второй запрос простой (без union), то (where id_table = 1) делфи дописал в конец и все было бы замечательно. А так постоянно ставит на это место и сами видите запрос становится ошибочным. |
| Автор: ТоляМБА 2.2.2015, 13:15 |
| Кто ставит? В делфи можно формировать запросы динамически используя переменные и параметры. Напишите как должен выглядеть ваш запрос. |
| Автор: salik 2.2.2015, 13:51 | ||||||||||||||
| Попытаюсь объяснить более подробно с вставками кода. Есть SimpleDataSet1 в котором CommandText
Есть SimpleDataSet2 в котором CommandText
Далее кликаю по Active
Когда же кликаю
Выходит ошибка. Смотрю в sqlMonitor какой же запрос он шлет на сервер. SqlMonitor показывает
А правильный запрос должен быть таким
|
| Автор: ТоляМБА 2.2.2015, 14:13 |
| Попытаюсь понять что вы хотели: есть некая таблица table в которой в поле id_table хранятся целочисленные значения. Вы хотите сделать вывод следующих данных: если id_table =1 то вывести "1 | 'какой-то текст1'" если id_table = 2 то вывести "2 | 'какой-то текст2'" и так далее. Я правильно понял, нет? |
| Автор: salik 2.2.2015, 15:06 | ||
Вы меня совершенно правильно поняли. Хранимая процедура на срвере генерирует динамический запрос, структуру которого я описал в примере. Заострять внимание на вычисляемых полях и откуда они берутся не стал, поэтму написал "какой-то текст" |
| Автор: ТоляМБА 2.2.2015, 15:21 | ||
Не? |
| Автор: salik 2.2.2015, 16:16 | ||||||||||
Спасибо, что пытаетесь помочь. Делфи отправляет такой запрос
Как не бьюсь программа вставляет (where id_table = '1') после второго селекта. Если посылать такой запрос:
то получается
Я так понял это глюк компонента, он не понимает составные запросы. |
| Автор: ТоляМБА 2.2.2015, 16:26 |
| Я не использовал SimpleDataSet, всегда работал с Query и проблем не возникало. Попробуйте через него. |
| Автор: salik 2.2.2015, 16:35 | ||
Я использую технологию доступа к данным dbExpress, в компоненте TSQLQuery с соответствующей вкладки нет такого свойства как MasterSourse. Это принципиально важно при формировании master-detail отчетов в FastReport. |
| Автор: salik 3.2.2015, 08:10 | ||||
Тогда не будет работать вторая выборка по условию и будет выбрасывать весь набор данных. Принял решение получить набор записей в одном запросе, а красоту наведу с помощью скрипта FastReport. |
| Автор: ТоляМБА 3.2.2015, 09:30 |
| А какое условие то? Его можно включить в код запроса с помощью параметра. |
| Автор: salik 3.2.2015, 09:46 | ||||||
[QUOTE=ТоляМБА,3.2.2015, 10:30]
Если организовать связь компонентов таким образом:
В момент вызова отчёта FastReport
будет происходить автоматический перебор записей первого уровня (MasterData), а в запрос второго уровня будет вносится автоматическая корректировка, в нашем случае это where id_table = 1, where id_table = 2 и так далее. Это подставляются значения поля (MasterFields) из главной выборки. Можно написать запрос с помощью параметра, значения которого контролирует сам программист, тогда логику подстановки нужно описать в скрипте или процедуре. |
| Автор: ТоляМБА 3.2.2015, 10:17 | ||
То что вы делали средствами делфи (объединяя 2 sql-запроса) я написал с помощью одного sql-запроса. Или есть ещё какие-то условия? Каком скрипте? |
| Автор: salik 4.2.2015, 08:12 | ||
Не надо искать черную кошку в черной комнате, если ее там нет. Со связью таблиц главная и подчиненная я разобрался, спасибо. Помощь в написании запроса не требуется. Тема закрыта, вопрос решен. Еще раз спасибо за участие. |