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

Вниз

Проблема с SQL запросом.   Найти похожие ветки 

 
SergP.   (2005-08-29 18:23) [0]

БД Access

Имеется параметрический запрос, который не хочет работать так как нужно:

INSERT INTO temp ( type, data, voda, kanal, kvart, musor )
SELECT 3 as type, :dt as data, sum(voda) as voda,sum(kanal),sum(kvart),sum(musor)
FROM sview where data<:dt and ls=:nls

Проблема в том что  в таблице temp в результате запроса получается запись где поля voda, kanal,kvart,musor незаполненые, т.е. нулевые...

Если я убираю дату:
INSERT INTO temp ( type, voda, kanal, kvart, musor )
SELECT 3 as type, sum(voda) as voda,sum(kanal),sum(kvart),sum(musor)
FROM sview where data<:dt and ls=:nls

то все нормально... Почему?
Как сделать чтобы первый запрос работал так как мне нужно?


 
Desdechado ©   (2005-08-29 18:56) [1]

data у тебя встречается как реальное поле и как псевдоним колонки, сервер просто не понимает, что ты от него хочешь


 
DiamondShark ©   (2005-08-29 19:25) [2]


> FROM sview where data<:dt and ls=:nls

FROM sview where sview.data<:dt and ls=:nls


 
SergP ©   (2005-08-30 07:50) [3]


> FROM sview where sview.data<:dt and ls=:nls


Вот блин... Как-то и не заметил.

Но это все равно не помогло... Даже не помогло то что я в представлении sview изменил имя поля data на другое (ну и соответственно в запросе тоже).

INSERT INTO temp ( type, data, voda, kanal, kvart, musor )
SELECT 3 as type, :dt as data, sum(voda) as voda,sum(kanal),sum(kvart),sum(musor)
FROM sview where sview.datax<:dt and ls=:nls

Не могу понять чего оно еще хочет...


 
sniknik ©   (2005-08-30 08:15) [4]

может нормального присвоения значений параметрам, правильных по типам?

потому как (если это не BDE конечно) два одноименных параметра в запросе это не нормально. не гооря об остальном (непоказаном).


 
SergP ©   (2005-08-30 08:26) [5]


>  [4] sniknik ©   (30.08.05 08:15)
> может нормального присвоения значений параметрам, правильных
> по типам?
>
> потому как (если это не BDE конечно) два одноименных параметра
> в запросе это не нормально. не гооря об остальном (непоказаном).


Вот кусок кода, если это что-то даст...


   repeat
     dt:=IncMonth(dt);
     with ACmd do
     begin
       CommandText:="INSERT INTO temp ( type, data, voda, kanal, kvart, musor ) "
          +"SELECT 3 as type, :dt as data, sum(voda), sum(kanal), sum(kvart), sum(musor) "
          +"FROM sview where sview.datax<:dt and ls=:nls";
         Parameters.ParamByName("nls").DataType:=ftInteger;
         Parameters.ParamByName("nls").Value := nls;
         Parameters.ParamByName("dt").DataType:=ftDate;
         Parameters.ParamByName("dt").Value := dt;
       Execute;
     end;
   until dt>=dtmx;



:dt - это не два одноименных параметра, это один и тот же параметр, просто примененный в запросе 2 раза, или так делать нельзя?


 
evvcom ©   (2005-08-30 08:34) [6]


> или так делать нельзя?

А ты попробуй. Замени его на "третий" параметр (естественно, дав ему другое имя), а потом нам расскажешь.


 
SergP ©   (2005-08-30 08:35) [7]

Сделал так:

   repeat
     dt:=IncMonth(dt);
     with ACmd do
     begin
       CommandText:="INSERT INTO temp ( type, data, voda, kanal, kvart, musor ) "
          +"SELECT 3 as type, :dt as data, sum(voda), sum(kanal), sum(kvart), sum(musor) "
          +"FROM sview where sview.datax<:dm and ls=:nls";
         Parameters.ParamByName("nls").DataType:=ftInteger;
         Parameters.ParamByName("nls").Value := nls;
         Parameters.ParamByName("dt").DataType:=ftDate;
         Parameters.ParamByName("dt").Value := dt;
         Parameters.ParamByName("dm").DataType:=ftDate;
         Parameters.ParamByName("dm").Value := dt;


       Execute;
     end;
   until dt>=dtmx;


Теперь все работает. Только я все равно не могу понять почему один параметр нельзя использовать в запросе несколько раз?


 
evvcom ©   (2005-08-30 09:01) [8]


> почему один параметр нельзя использовать в запросе несколько
> раз?

Все зависит от движка, как он ЭТО понимает.


 
sniknik ©   (2005-08-30 10:33) [9]

> Вот кусок кода, если это что-то даст...
это всегда что-то дает. как и остальная исходная инфа, по движкам, компонентам и т.д.

как было сказано для BDE запрос с несколькими одноименными параметрами вполне нормален.


 
Alavar   (2005-08-30 10:51) [10]

Слушай я использую тоже D6 и Access, ну вот не знаю как вытащить определённое значение ячейки БД и присвоить это значение какой либо переменной, чтоб дальше работать с ней? может подскажешь?


 
Anatoly Podgoretsky ©   (2005-08-30 11:48) [11]

SergP ©   (30.08.05 08:26) [5]
Это два разных параметра (parameters[0] и parameters[1]), но по какому то недоразумению имеющих одинаковый алиас.


 
SergP ©   (2005-08-30 14:58) [12]


>  [11] Anatoly Podgoretsky ©   (30.08.05 11:48)
> SergP ©   (30.08.05 08:26) [5]
> Это два разных параметра (parameters[0] и parameters[1]),
> но по какому то недоразумению имеющих одинаковый алиас.


Понятно... Но все равно это нехорошо.... Если у меня параметр в запросе должен подставляться в запрос N раз, то получается я должен сделать N разных параметров и присваивать им всем одно и то же значение...
Вобщем все ясно, но нехорошо и неудобно...


>  [10] Alavar   (30.08.05 10:51)
> Слушай я использую тоже D6 и Access, ну вот не знаю как
> вытащить определённое значение ячейки БД и присвоить это
> значение какой либо переменной, чтоб дальше работать с ней?
> может подскажешь?


Вопрос слишком неконкретный...


 
sniknik ©   (2005-08-30 15:09) [13]

> Вобщем все ясно, но нехорошо и неудобно...
переделай парсер "выцепляющий" параметры на менер BDE-шного.


 
Desdechado ©   (2005-08-30 18:41) [14]

2 shiknik
Вообще-то БДЕ как раз не понимает одноименных параметров. Он их создает разными, но с одним именем. И присваивает (если обращаться по имени) значение первому встречному всегда, игнорируя остальные. Но ошибок не дает при этом.


 
Anatoly Podgoretsky ©   (2005-08-30 19:44) [15]

SergP ©   (30.08.05 14:58) [12]
>  [11] Anatoly Podgoretsky ©   (30.08.05 11:48)
> SergP ©   (30.08.05 08:26) [5]
> Это два разных параметра (parameters[0] и parameters[1]),
> но по какому то недоразумению имеющих одинаковый алиас.

Понятно... Но все равно это нехорошо.... Если у меня параметр в запросе должен подставляться в запрос N раз, то получается я должен сделать N разных параметров и присваивать им всем одно и то же значение...
Вобщем все ясно, но нехорошо и неудобно...


Просто ты ожидаешь от него большего, чем на самом деле есть, но дело поправимое, можно написать свою реализацию.
Но давай посмотрим немного по другому, вот псевдокод.

parameter[0] := 0
parameter[1] := 1
S := ParamByName("dt")

может это объямнит сущность, что это именно два разных параметра, а не один как кажется. Имя это псевдоним, алиас, для удобства. Если дать одно и тоже имя двум разным параметрам, то возникает неодназначность.

INSERT INTO temp (type, data, voda, kanal, kvart, musor )
SELECT 3 as type, :dtValue as data, sum(voda) as voda,sum(kanal),sum(kvart),sum(musor)
FROM sview where data<:dtExpr and ls=:nls

Вот так правильно и например для меня более понятно.


 
sniknik ©   (2005-08-31 01:13) [16]

Desdechado ©   (30.08.05 18:41) [14]
> Вообще-то БДЕ как раз не понимает одноименных параметров. Он их создает разными, но с одним именем. И присваивает
> (если обращаться по имени) значение первому встречному всегда, игнорируя остальные. Но ошибок не дает при этом.
правда? а я считал всегда что оно всем одноименным одно значение присваивает...
ну тогда нет ни одного компанента который это поддерживает.


 
sniknik ©   (2005-08-31 01:33) [17]

Desdechado ©   (30.08.05 18:41) [14]
и всетаки нет, BDE все очень хорошо разруливает ... (а значит и понимает, пусть даже игнорируя остальные (с чего взял кстати?)...)

простейшая проверка
запрос

select SEANS, :DT AS DT from DATA.DBF
where SEANS = :DT

вызов

Query1.ParamByName("DT").AsInteger:= 2;
Query1.Open;

дают 2 столбика двоек (из таблици с набором цифр)... значит и в первый параметр значение параметра попало и во второй (условие сработало), и это при еденичном присвоении...

p.s. беру свое "покаяние" из > sniknik ©   (31.08.05 01:13) [16] обраратно. ;)



Страницы: 1 вся ветка

Текущий архив: 2005.10.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
10-1105421249
Руслан
2005-01-11 08:27
2005.10.09
ExcelApplication


14-1126612790
McSimm
2005-09-13 15:59
2005.10.09
тест


14-1127144234
Juice
2005-09-19 19:37
2005.10.09
Самые крутые db-aware ?


14-1126990328
WonderfulDay
2005-09-18 00:52
2005.10.09
За сколько времени можно выучить Дэлфи?


3-1125167604
lookin
2005-08-27 22:33
2005.10.09
База данных