Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.015 c
1-1127214094
Leonid
2005-09-20 15:01
2005.10.09
Как отловить неиспользуемые процедуры


2-1125055920
KyRo
2005-08-26 15:32
2005.10.09
Как отслеживать первую запись ?


2-1125652918
Андрей гость
2005-09-02 13:21
2005.10.09
база данных типа *.txt, как с ней работать


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


2-1125150534
shaih
2005-08-27 17:48
2005.10.09
Запись изображения и последующее отображение из бд





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский