сложный запрос T-sql в Tfrxadoqeury

отредактировано 17:27 Раздел: FastReport 4.0
Здравствуйте!

Нельзя ли в TfrxADOQuery выполнить сложный запрос для MS SQL Server, вроде такого:
IF EXISTS (SELECT OBJECT_NAME('#s'))
    DROP PROCEDURE #s 
    
GO

CREATE PROCEDURE #s AS    
BEGIN
    SELECT * FROM dbo.TABLE;
END  
GO
  
EXEC #s
GO

Насколько я понимаю, движок FR парсит запрос и, естественно, выдает ошибку.
Хотелось бы, чтобы запрос просто напрямую шел к серверу, без парсинга.

Хранимые процедуры, VIEW и т.п. использовать нежелательно, хотелось бы всё держать внутри запроса.


Можно ли что-то вроде этого?

Комментарии

  • gpigpi
    отредактировано 17:27
    Попробуйте открывать запрос через ExecSQL
  • отредактировано 17:27
    gpi написал: »
    Попробуйте открывать запрос через ExecSQL

    Дело в том, что упомянутый компонент является подчиненным для другого. Т.е. у него указан параметр Master.
    И вот тут я не понял где именно вызывать ExecSQL.
    Единственное что приходит в голову - в OnBeforePrint вызывать ExecSQL, а в OnAfterPrint - Close
  • gpigpi
    отредактировано 17:27
    Попробуйте в TfrxMasterData.OnBeforePrint полностью формировать текст ADOQuery и выполнять ExecSQL
  • отредактировано 17:27
    gpi написал: »
    Попробуйте в TfrxMasterData.OnBeforePrint полностью формировать текст ADOQuery и выполнять ExecSQL
    Класс! Всё работает, спасибо.
  • отредактировано September 2011
    Как же я измучился с этими сложными T-SQL

    Указанный метод не подходит при использовании master-detail, когда в master датасете текст SQL формируется "на лету".
  • perceptronperceptron Минск
    отредактировано February 2012
    Действительно
    Если есть Master-Detail и в ADOQuery_Detail идёт вызов exec dbo.моя_хранимка :param1
    а в dbo.моя_хранимка делается динамическое формирование запроса с exec(@my_sql_str)
    то такой способ не фунциклирует и отчёт не строится

    ругается на символ '*' при парсинге - хотя * у меня в запросе нигде нет - ошибка фастрепорта

    Прескорбно :)
    Может кто подскажет выход из положения ?
  • отредактировано 17:27
    perceptron написал: »
    Действительно
    Если есть Master-Detail и в ADOQuery_Detail идёт вызов exec dbo.моя_хранимка :param1
    а в dbo.моя_хранимка делается динамическое формирование запроса с exec(@my_sql_str)
    то такой способ не фунциклирует и отчёт не строится

    ругается на символ '*' при парсинге - хотя * у меня в запросе нигде нет - ошибка фастрепорта

    Прескорбно :)
    Может кто подскажет выход из положения ?

    я бы не создавал процедуры в детейле
    меняйте идеологию
  • perceptronperceptron Минск
    отредактировано February 2012
    а где написано что я создаю процедуры в детали ?

    у меня лежит ADOQuery_master и ADOQuery_detail
    на сервере процедура, которая вызывается этими 2-мя запросами
    то есть в ADOQuery_master.SQL и в ADOQuery_detail.SQL происходит вызов exec dbo.моя_хранимка :par1, :par2

    В детали в эту процедуру передаётся :ID_Master из результирующего рекордсета при выполнении ADOQuery_master

    и все нормально работает с одним лишь условием - в теле моей dbo.моя_хранимка на серевере должен выполняться непосредственно Select
    и он должен вызываться ЯВНО - а не собираться внутри dbo.моя_хранимка в строку и тамже вызываться в Exec чего собственно говоря и хотелось бы...
    Но фастрепорт не принимает такой рекордсет и не заполняет параметр :ID_Master у ADOQuery_detail
  • gpigpi
    отредактировано 17:27
    А с TADOQuery в Delphi Ваш вариант работает?
  • perceptronperceptron Минск
    отредактировано 17:27
    Конечно работает
    Я ж написал, что и в FastReport работает мой вариант
    НЕ работает только если в хранимке на сервере, которую я вызываю из TADOQuery в FastReport
    пишу так:
    DECLARE @sql varchar(8000)
    SET @sql = 'SELECT pole1, pole2 FROM TABLE1'
    exec(@sql)

    Если я пишу в хранимке на сервере просто
    SELECT pole1, pole2 FROM TABLE1
    То отчёт нормально строится. В фасте выполняется сперва ADOQuery_master.SQL
    потом выполняется ADOQuery_Detail.SQL в котором инициализируется автоматом параметр :masterID значением из master-рекордсета

    Причём вышеприведённый запрос с exec замечательно отрабатывает в Enterprise Manager SQL Server
    К запросу никаких нареканий
    К инициализации переменных отчёта тоже претензий нет

    Есть проблема именно если в вызываемой хранимке применяется exec(@sql) возвращающий набор данных, который должен уйти в фастрепорт для вывода отчёта

    Но этого не происходит.

  • отредактировано 17:27
    задумайся, во что превращается запрос

    SELECT pole1, pole2 FROM TABLE1,
    "в котором инициализируется автоматом параметр :masterID значением из master-рекордсета"


    и что АДО, по-твоему, должен автоматом сделать с кодом

    DECLARE @sql varchar(8000)
    SET @sql = 'SELECT pole1, pole2 FROM TABLE1'
    exec(@sql)
  • отредактировано 17:27
    кстати, некоторые компоненты позволяют управлять детейлом не переписывая запросы, а через фильтр
  • perceptronperceptron Минск
    отредактировано February 2012
    2 andreymx:

    у меня для ADOQuery_Master в хранимке идёт вызов наподобии
    SET @sql = 'SELECT ID_Master, pole1, pole2 FROM MASTER_TABLE WHERE...'
    exec(@sql)

    в ADOQuery отчёта вызывается моя хранимка с параметрами, а уже в этой хранимке вызывается exec, который возвращает рекордсет с выборкой

    а насчёт задуматься над запросом - ты на что конкретно намекаешь ?

    я просто для детали не писал полный текст запроса - суть проблемы от этого не изменится
    для детали в этой же хранимке вызывается
    SELECT pole1, pole2 FROM TABLE2 WHERE ID_Master = @ID_Master,
    где @ID_Master - это передаваемый параметр, который должен браться по Master-связи из ADOQuery_master

    и какие именно компоненты ты имеешь ввиду ?

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.