Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
9-1083916238
Маг Гыр
2004-05-07 11:50
2004.08.22
Видеопамять


14-1091355954
dimon_programmer
2004-08-01 14:25
2004.08.22
Как достать темы для XP, подскажите!


1-1092133649
Cosinus
2004-08-10 14:27
2004.08.22
Работа с функциями, находящимеся в отдельном модуле


10-1029755420
Condor_av
2002-08-19 15:10
2004.08.22
Несколько вопросов по idl2pas &amp; Corba


14-1091439762
TUser
2004-08-02 13:42
2004.08.22
Фень Юань