Форум: "Базы";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Вниз
ADOQuery Найти похожие ветки
← →
Valeri © (2004-07-26 11:22) [0]Помогите, Мастера!
Есть ADOQuery c параметрами. На самом деле там два параметра - даты, но в тексте запроса они встречаются 28 раз, (там куча полей вычисляемых). В ObjectInspector они также вылезают 28 раз!
Теперь мне приходится 28 раз писать такую бодягу:ADOQuery1.Parameters[i].Value := ...;
Есть риск перепутать их порядок. ParamByName ADOQuery вроде не поддерживает. Как быть ?
Всем спасибо!!!
← →
ЮЮ © (2004-07-26 11:26) [1]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 := ...
← →
stone © (2004-07-26 11:32) [2]declare
@Date1 datetime,
@Date2 datetime
set @Date1 = :Date1
set @Date2 = :Date2
и дальше в запросе используешь @Date1 и @Date2, в списке параметров в ObjectInspector ты увидишь лишь 2 параметра Date1
и Date2
← →
Соловьев © (2004-07-26 11:32) [3]
> ParamByName ADOQuery
поддерживает не он, а свойство Parameters.ParamByName
← →
Fay © (2004-07-26 11:34) [4]declare
@par1 datetime,
@par2 datetime
select
@par1 = :par1,
@par2 = :par2
select ...
Теперь можешь упоминать их (как @par1 и par2) до позеления
← →
Соловьев © (2004-07-26 11:34) [5]
> На самом деле там два параметра - даты, но в тексте запроса
> они встречаются 28 раз,
а можно увидеть запрос? может его можно минимизировать
← →
Fay © (2004-07-26 11:35) [6]2stone © (26.07.04 11:32) [2]
8)
← →
@Lex © (2004-07-26 11:36) [7]ADOQuery1.Parameters.ParamValues["name"] :=
← →
Valeri © (2004-07-26 14:36) [8]->Соловьев © (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 - период, за который надо узнать, сколько воды утекло через дыру в трубе
← →
Ega23 © (2004-07-26 14:41) [9]Вот пример того порочного пути, когда клиент обращается с запросом напрямую к базе, минуя хранимые процедуры. Пара-тройка таких запросов, и если структура базы поменялась - запаришься клиента ребилдить.
← →
Valeri © (2004-07-26 14:49) [10]-> stone © (26.07.04 11:32) [2]
Не помогает!
← →
stone © (2004-07-26 14:55) [11]
> Valeri © (26.07.04 14:49) [10]
в каком смысле?
← →
Valeri © (2004-07-26 15:33) [12]-> stone © (26.07.04 14:55) [11]
Все равно 28 параметров лезет. А вообще, в ADOQuery.SQL - можно так писать?
← →
stone © (2004-07-26 15:43) [13]
> А вообще, в ADOQuery.SQL - можно так писать?
а ты еще не пробовал? покажи как ты написал код с
> declare
> @Date1 datetime,
> @Date2 datetime
← →
Valeri © (2004-07-26 15:45) [14]->stone © (26.07.04 15:43) [13]
Попробовал так:declare
@d1 datetime,
@d2 datetime
select @d1 = :d1,
@d2 = :d2
SELECT ...
← →
Valeri © (2004-07-26 15:46) [15]Вроде работает -> ЮЮ © (26.07.04 11:26) [1]
← →
stone © (2004-07-26 15:53) [16]
> select @d1 = :d1,
> @d2 = :d2
>
> SELECT ...
ну а дальше что?
← →
Valeri © (2004-07-26 15:56) [17]А дальше - > Valeri © (26.07.04 14:36) [8]
← →
stone © (2004-07-26 16:25) [18]
> А дальше - > Valeri © (26.07.04 14:36) [8]
а надо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) ...
и далее в том же духе
← →
Valeri © (2004-07-26 16:34) [19]А, понял, спасибо тебе, stone © !!!
А также и всем остальным большое спасибо!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c