Форум: "Начинающим";
Текущий архив: 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