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

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

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 := ...


Наверх

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