![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADOQuery [D5, MSSQL]
Valeri © (2004-07-26 11:22:00)Помогите, Мастера!
Есть ADOQuery c параметрами. На самом деле там два параметра - даты, но в тексте запроса они встречаются 28 раз, (там куча полей вычисляемых). В ObjectInspector они также вылезают 28 раз!
Теперь мне приходится 28 раз писать такую бодягу:
ADOQuery1.Parameters[i].Value := ...;
Есть риск перепутать их порядок. ParamByName ADOQuery вроде не поддерживает. Как быть ?
Всем спасибо!!!
Valeri (2004-07-26 16:34:00) [1]А, понял, спасибо тебе, stone © !!!
А также и всем остальным большое спасибо!
stone (2004-07-26 16:25:00) [2]
> А дальше - > Valeri © (26.07.04 14:36) [8]
а надо
SELECT Character.Id, Character.Name,
CASE WHEN Area > 0
THEN
9600 * DATEDIFF(HOUR,
(CASE WHEN date_defin < @d1THEN @d1 ELSE date_defin END),
(CASE WHEN date_remov > @d2THEN @d2ELSE date_remov END)) * Area * SQRT(Press)
ELSE
CASE WHEN (Formula = 1) ...
и далее в том же духе
Valeri (2004-07-26 15:56:00) [3]А дальше - > Valeri © (26.07.04 14:36) [8]
stone (2004-07-26 15:53:00) [4]
> select @d1 = :d1,
> @d2 = :d2
>
> SELECT ...
ну а дальше что?
Valeri (2004-07-26 15:46:00) [5]Вроде работает -> ЮЮ © (26.07.04 11:26) [1]
Valeri (2004-07-26 15:45:00) [6]->stone © (26.07.04 15:43) [13]
Попробовал так:
declare
@d1 datetime,
@d2 datetime
select @d1 = :d1,
@d2 = :d2
SELECT ...
stone (2004-07-26 15:43:00) [7]
> А вообще, в ADOQuery.SQL - можно так писать?
а ты еще не пробовал? покажи как ты написал код с
> declare
> @Date1 datetime,
> @Date2 datetime
Valeri (2004-07-26 15:33:00) [8]-> stone © (26.07.04 14:55) [11]
Все равно 28 параметров лезет. А вообще, в ADOQuery.SQL - можно так писать?
stone (2004-07-26 14:55:00) [9]
> Valeri © (26.07.04 14:49) [10]
в каком смысле?
Valeri (2004-07-26 14:49:00) [10]-> stone © (26.07.04 11:32) [2]
Не помогает!
Ega23 (2004-07-26 14:41:00) [11]Вот пример того порочного пути, когда клиент обращается с запросом напрямую к базе, минуя хранимые процедуры. Пара-тройка таких запросов, и если структура базы поменялась - запаришься клиента ребилдить.
Valeri (2004-07-26 14:36:00) [12]->Соловьев © (26.07.04 11:34) [5]
А запрос такой
SELECT Character.Id, Character.Name,
CASE WHEN Area > 0
THEN
9600 * DATEDIFF(HOUR,
(CASE WHEN date_defin < :d1 THEN :d1 ELSE date_defin END),
(CASE WHEN date_remov > :d2 THEN :d2 ELSE date_remov END)) * Area * SQRT(Press)
ELSE
CASE WHEN (Formula = 1)
AND (DATEDIFF(HOUR,(CASE WHEN date_defin < :d1 THEN :d1
WHEN date_defin > :d2 THEN :d2
ELSE date_defin
END),
(CASE WHEN date_remov > :d2 THEN :d2
WHEN date_remov < :d1 THEN :d1
ELSE date_remov
END)) /*К-во часов в заданном периоде*/ <= 24) THEN
46 * SQRT(Press)
WHEN (Formula = 1)
AND (DATEDIFF(HOUR,(CASE WHEN date_defin < :d1 THEN :d1
WHEN date_defin > :d2 THEN :d2
ELSE date_defin
END),
(CASE WHEN date_remov > :d2 THEN :d2
WHEN date_remov < :d1 THEN :d1
ELSE date_remov
END)) /*К-во часов в заданном периоде*/ > 24) THEN
1.92 * DATEDIFF(HOUR,(CASE WHEN date_defin < :d1 THEN :d1
WHEN date_defin > :d2 THEN :d2
ELSE date_defin
END),
(CASE WHEN date_remov > :d2 THEN :d2
WHEN date_remov < :d1 THEN :d1
ELSE date_remov
END)) * SQRT(Press)
WHEN (Formula = 2) THEN
9200 * SQUARE(Diameter/100) * SQRT(Press)
WHEN (Formula = 3) THEN
17000 * SQUARE(Diameter/100) * SQRT(Press)
END
END As SVolume
FROM Pipes, Character
WHERE Pipes.Id_Character = Character.id
где date_defin, date_remov - даты возникновения и устранения аварии на трубопроводе
d1, d2 - период, за который надо узнать, сколько воды утекло через дыру в трубе
@Lex (2004-07-26 11:36:00) [13]ADOQuery1.Parameters.ParamValues['name'] :=
Fay (2004-07-26 11:35:00) [14]2stone © (26.07.04 11:32) [2]
8)
Соловьев (2004-07-26 11:34:00) [15]
> На самом деле там два параметра - даты, но в тексте запроса
> они встречаются 28 раз,
а можно увидеть запрос? может его можно минимизировать
Fay (2004-07-26 11:34:00) [16]declare
@par1 datetime,
@par2 datetime
select
@par1 = :par1,
@par2 = :par2
select ...
Теперь можешь упоминать их (как @par1 и par2) до позеления
Соловьев (2004-07-26 11:32:00) [17]
> ParamByName ADOQuery
поддерживает не он, а свойство Parameters.ParamByName
stone (2004-07-26 11:32:00) [18]declare
@Date1 datetime,
@Date2 datetime
set @Date1 = :Date1
set @Date2 = :Date2
и дальше в запросе используешь @Date1 и @Date2, в списке параметров в ObjectInspector ты увидишь лишь 2 параметра Date1
и Date2
ЮЮ (2004-07-26 11:26:00) [19]for i := ADOQuery1.Parameters.Count - 1 do
if SameText(ADOQuery1.Parameters[i].Name, 'Date') then
ADOQuery1.Parameters[i].Value := ...
else if SameText(ADOQuery1.Parameters[i].Name, '...') then
ADOQuery1.Parameters[i].Value := ...