![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Назначение параметров запросу содержащемуся в SQL файле [D5, Paradox]
Тучудище © (2005-05-24 08:31:00)Доброго времени суток уважаемые мастера!
Дело такое:
Есть некий файл Procedure.sql
Который содержит следующий запрос
SELECT ....... WHERE DateDoc BETWEEN :Param1 AND :Param2....
хотелось бы узнать, существует ли возможность назначить каким либо образом из Delphi эти самые :Param1 и :Param2
Заранее спасибо за ответ!
Val (2005-05-24 10:44:00) [41]>[24] Sergey13 © (24.05.05 10:37)
? см. local views в Local SQL Help.
> автору
лучший выход - действительно динамический sql.
Sergey13 (2005-05-24 10:37:00) [42]2[17] ЮЮ © (24.05.05 09:51)
>и где ты тут ошибку видишь?
А можно селектить текст запроса?
Тучудище (2005-05-24 10:18:00) [43]Вот в принципе суть проблемы может я и не оттуда начал,
Данный запрос
SELECT
Nomklat,
Sum(PrihRash) AS DebetCredit
FROM
PrihRash
WHERE
DateDoc BETWEEN :Param1 AND :Param2
GROUP BY Nomklat HAVING Sum (PrihRash)<>0
UNION ALL
SELECT
Nomklat,
Sum(Ostatok) AS DebetCredit
FROM
POstatki
WHERE
ActualDate:=Param1;
GROUP BY Nomklat HAVING Sum (Ostatok)<>0
возвращает именно в LOCAL SQL такую белеберду
я пробовал исполнять его на InterBase и MySQL все работает ок
возвращаемый набор данных
Tovar DebetCredit
1 70
123 60
132 90
500 2
700 6
При исполнении его же в Local SQL я получаю что то вроде
Tovar DebetCredit
1 100
1 -30
123 60
132 90
500 4
500 -2
700 6
Я думаю суть ясна... вот что конкретно побудило меня искать извращенные пути решения проблемы.... может кто то подскажет по каим принципам Local SQL делает UNION
Виталий Панасенко (2005-05-24 10:02:00) [44]1) Выполнить запрос №1
1.1) Определить тип(имена (не очень существенно)) полей, создать ВРЕМЕННУЮ таблицу с аналогичной структурой. Перегнать данные из запроса в таблицу
2)Обработать временную таблицу запросом №2
Anatoly Podgoretsky (2005-05-24 10:00:00) [45]Ни каких колизий если этот файл будет на локальной машине. Соответственно пункт 2 исчезает.
Тучудище (2005-05-24 09:58:00) [46]Честно сказать, не проблема мне зашить этот запрос в таком виде как он должен быть, т.е. вместо Param1 и Param2 подставить конкретные числа... т.е. даты какая к черту разница, опасаюсь следующего
1) Поскольку доступ к БД многопользовательский, возможны колизии при обращении к этому файло...(доступ к данному механизму будет осуществлятся достаточно часто)
2) Возиться с разными именами файлов следить за уникальностью и т.п. ну честно ну ГЕМОРОЙ, должно быть простое решение суть в том что я пока не чую какое......
Anatoly Podgoretsky (2005-05-24 09:57:00) [47]Тебе же подсказали, вместо параметрического запроса используй динамический. Других вариантов у тебя нет, разве что рыться в потрахах БДЕ.
По сути у тебя получается запрос из временной таблицы, которая формируется вне рамок твоего приложения движком БДЕ.
Тучудище (2005-05-24 09:53:00) [48][11] мне нужно получить результат запроса содержащегося в Procedure.sql и , чтобы не обрабатываеть его по тупому через
While not eof.... бла бла бла Next; выполнить к этому результату еще один запрос, делать результаты запроса permanent нет ни желания ни времени возиться с этим....
To all:
Может подскажите какой нибудь другой вариант?
Скажу что нужно,
1)Выполнить запрос № 1 из [7]
2)Обработать результаты запроса №1 запросом №2 из [7]
вот по сути и все...
ЮЮ (2005-05-24 09:51:00) [49]>Sergey13 © (24.05.05 09:41) [14]
и где ты тут ошибку видишь?
А вот параметры в запросе "Procedure.sql" использовать нельзя, т.к. текст должен содержать SQL предложение, а параметры - это уже фича от TQuery
Anatoly Podgoretsky (2005-05-24 09:50:00) [50]Через *.SQL
msguns (2005-05-24 09:48:00) [51]А что, биде умеет работать с запросами
SELECT FROM (SELECT) ?
Sergey13 (2005-05-24 09:41:00) [52]Да у него ошибка не тут, а в
Далее я вызываю пытаюсь выполнить запрос вида
SELECT Nomklat, SUM(DebetCredit) AS OstatokNaKonetz
FROM "Procedure.sql"
GROUP BY Nomklat HAVING SUM(DebetCredit)<>0
ЮЮ (2005-05-24 09:41:00) [53]>[9] - [11]
Это подзапрос, а не полный запрос
ЮЮ (2005-05-24 09:39:00) [54]Procedure.sql - текстовый файл. Запиши его м нужными значениями, не параметрами.
Если клиент многопользовательский, то
1) уникальные имена для sql-файлов
2) + локальная БД и гетерогенные запросы
msguns (2005-05-24 09:37:00) [55]А нельзя так:
with Query1 do
try
SQL.LoadFromFile('Procedure.sql');
Params[0].As... :=
Params[1].As... :=
Open;
except
ShowMessage('Shos probzdilo u datskomu korolivstvi');
end;
Virgo_Style (2005-05-24 09:36:00) [56]Тучудище (24.05.05 9:32) [8]
А если сделать TQuery.SQL.LoadFromFile('procedure.sql'), а потом работать с TQuery.Params?
Sergey13 (2005-05-24 09:35:00) [57]2[7] Тучудище (24.05.05 09:29)
Ты поступаешь в корне неправильно. Выкинь нафиг свой Procedure.sql - это тупик.
Тучудище (2005-05-24 09:32:00) [58][6]
Количество команд зашито жестко
Количество данных может изменяться
Делается все это для того, чтобы избежать(как мне кажется) лишних телодвижений с количеством запросов и сложных алгоритмов обработки данных
Тучудище (2005-05-24 09:29:00) [59]Вот текст Procedure.sql
SELECT
Nomklat,
Sum(PrihRash) AS DebetCredit
FROM
PrihRash
WHERE
DateDoc BETWEEN :Param1 AND :Param2
GROUP BY Nomklat HAVING Sum (PrihRash)<>0
UNION ALL
SELECT
Nomklat,
Sum(Ostatok) AS DebetCredit
FROM
POstatki
WHERE
ActualDate:=Param1;
GROUP BY Nomklat HAVING Sum (Ostatok)<>0
Далее я вызываю пытаюсь выполнить запрос вида
SELECT Nomklat, SUM(DebetCredit) AS OstatokNaKonetz
FROM "Procedure.sql"
GROUP BY Nomklat HAVING SUM(DebetCredit)<>0
Собственно все замечательно, только вопрос стоит в том как передать этому Procedure.SQL Param1 и Param2
[5] спасибо за совет попробовал, но в момент TQuery.Prepare уже выдается сообщение 'Parameter not set in query string'
Sergey13 (2005-05-24 09:15:00) [60]Что за Procedure.sql? Какого он формата? Сколько в нем записей/команд?
Если ты делаешь SELECT * FROM "Procedure.sql" то стало быть потом идет выполнение содержащихся в файле запросов? Вот на этом этапе и надо присваивать значения параметрам.
Только нафига это все я не понял? Записей в Procedure.sql и количество параметров в них всегда одинаково?