Страница 1 из 1

Связь нескольких ADOQuery

Добавлено: 07 дек 2005, 11:59
Viktor Zull
У ADOQuery есть свойство DataSource, определяющее источник данных. У меня есть 2 ADOQuery. В первом выполняется запрос, в котором есть вычисляемые поля. Можноли связать второй ADOQuery С первым и сформировать в нем запрос по данным первого,т.е. в SQL написать например: Select * from ADOQuery1?

Добавлено: 07 дек 2005, 15:18
Игорь Акопян
немного поподробнее можно? вам хечется сделать выборку по вычислимым полям первого ADOQuery?
Select * from ADOQuery1
так низя...

Добавлено: 08 дек 2005, 00:19
Viktor Zull
Ну нельзя так нельзя. Тогда можно сохранить результаты первого запроса во временной таблице и по ней уже построить второй запрос. Верно?

Добавлено: 08 дек 2005, 10:38
Naeel Maqsudov
Верно.

Кроме того, если второй запрос должен пользоваться вычисляемыми данными не в педложении SELECT, а только в WHERE, то интересен может оказаться также вариант связывания запросов отношением Master-Detail. Временных таблиц не надо, но второй запрос может возвращать данные, которые связаны с вычисляемым полем (т.е. критерием отбора будет вычисленное значение в текущей строке).

А какого рода вычисляемые поля?
Я так понимаю, что используются поля, где вычисление производится обработчиками OnCalculate?

Если это так, то надо задуматься над возможностью вычислений не на клиенте, а на сервере.
Т.е. производить вычисления средствами SQL.
Что это даст?
1) первый запрос можно будет переделать в INSERT INTO TempTable SELECT <bla-bla-bla>. Для сохранения во временной таблице.
2) можно будет вобще без временных таблиц обойтись, так как второй запрос может быть вложенным.

Добавлено: 09 дек 2005, 12:43
Viktor Zull
Вот какая штука: есть таблица Table1 в базе. Есть 2 ADOQuery.
В ADOQuery1 пишу:
select pole1,pole2,pole3 into ##Table2
from Table1
where(...)
order by(...)

Здесь создается временная таблица ##Table2 в которую сохранябтся результаты запроса.

В ADOQuery2 пишу:
select *
from ##Table2

Хочу прочитать то что было сохранено.
Вылетает ошибка:
There is already an object name '##Table2' in the dataset
Почему?

Добавлено: 09 дек 2005, 16:14
Naeel Maqsudov
Может ошибка вылетает не в мометн выборки вторым запросом, а в момент сохранения первым?
База данных какая используется?

Добавлено: 11 дек 2005, 15:13
Viktor Zull
База данных на MS SQL Server. А нельзя ли все же не используя временные таблицы как нибыдь составить второй запрос по результатам первого, а то с временными таблицами в моем случае трудно. Почему просто нелязя написать во втором запросе select * from ADOQuery1.

Добавлено: 12 дек 2005, 04:14
Naeel Maqsudov
Нельзя, потому что запрос этот будет выполнять SQL Server, а он понятия не имеет, что такое ADOQuery1, так как ADOQurery1 - это имя которое присутствует только в исходном коде вашей программы (и больше нигде) и означает адрес области памяти, где хранится экземпляр объекта, работающего с другим объектом (TADOConnection), представляющим собой инструмент для взаимодействи клиента с сервером.

Вот поэтому-то и нельзя.

Если вычисляемые поля можно вычислить средствами SQL, то можно будет создать на сервере VIEW. А выборку производить из этого VIEW (как из таблицы). Кроме того, можно будет даже написать
SELECT ... FROM (SELECT...) AS TBL1

Я уже спрашивал, какие вычисления производятся в вычисляемых полях.
Надо копать в эту сторону. Это решит много проблем. Все вычисления, которые можно сделать на сервере надо обязательно делать на сервере, а не на клиенте!