Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Назначение параметров запросу содержащемуся в SQL файле [D5, Paradox]


Страницы:   1 2 3 4

Тучудище ©   (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 и количество параметров в них всегда одинаково?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо