![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с SQL запросом. [D6, Access]
SergP. © (2005-08-29 18:23:00)БД 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
то все нормально... Почему?
Как сделать чтобы первый запрос работал так как мне нужно?
sniknik (2005-08-31 01:33:00) [1]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] обраратно. ;)
sniknik (2005-08-31 01:13:00) [2]Desdechado © (30.08.05 18:41) [14]
> Вообще-то БДЕ как раз не понимает одноименных параметров. Он их создает разными, но с одним именем. И присваивает
> (если обращаться по имени) значение первому встречному всегда, игнорируя остальные. Но ошибок не дает при этом.
правда? а я считал всегда что оно всем одноименным одно значение присваивает...
ну тогда нет ни одного компанента который это поддерживает.
Anatoly Podgoretsky (2005-08-30 19:44:00) [3]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, : dtValueas data, sum(voda) as voda,sum(kanal),sum(kvart),sum(musor)
FROM sview where data<: dtExprand ls=:nls
Вот так правильно и например для меня более понятно.
Desdechado (2005-08-30 18:41:00) [4]2 shiknik
Вообще-то БДЕ как раз не понимает одноименных параметров. Он их создает разными, но с одним именем. И присваивает (если обращаться по имени) значение первому встречному всегда, игнорируя остальные. Но ошибок не дает при этом.
sniknik (2005-08-30 15:09:00) [5]> Вобщем все ясно, но нехорошо и неудобно...
переделай парсер "выцепляющий" параметры на менер BDE-шного.
SergP (2005-08-30 14:58:00) [6]
> [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, ну вот не знаю как
> вытащить определённое значение ячейки БД и присвоить это
> значение какой либо переменной, чтоб дальше работать с ней?
> может подскажешь?
Вопрос слишком неконкретный...
Anatoly Podgoretsky (2005-08-30 11:48:00) [7]SergP © (30.08.05 08:26) [5]
Это два разных параметра (parameters[0] и parameters[1]), но по какому то недоразумению имеющих одинаковый алиас.
Alavar (2005-08-30 10:51:00) [8]Слушай я использую тоже D6 и Access, ну вот не знаю как вытащить определённое значение ячейки БД и присвоить это значение какой либо переменной, чтоб дальше работать с ней? может подскажешь?
sniknik (2005-08-30 10:33:00) [9]> Вот кусок кода, если это что-то даст...
это всегда что-тодает. как и остальная исходная инфа, по движкам, компонентам и т.д.
как было сказано для BDE запрос с несколькими одноименными параметрами вполне нормален.
evvcom (2005-08-30 09:01:00) [10]
> почему один параметр нельзя использовать в запросе несколько
> раз?
Все зависит от движка, как он ЭТО понимает.
SergP (2005-08-30 08:35:00) [11]Сделал так:
repeat
dt:=IncMonth(dt);
with ACmd do
begin
CommandText:='INSERT INTO temp ( type, data, voda, kanal, kvart, musor ) '
+'SELECT 3 as type, :dtas data, sum(voda), sum(kanal), sum(kvart), sum(musor) '
+'FROM sview where sview.datax< :dmand 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 08:34:00) [12]
> или так делать нельзя?
А ты попробуй. Замени его на "третий" параметр (естественно, дав ему другое имя), а потом нам расскажешь.
SergP (2005-08-30 08:26:00) [13]
> [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 раза, или так делать нельзя?
sniknik (2005-08-30 08:15:00) [14]может нормального присвоения значений параметрам, правильных по типам?
потому как (если это не BDE конечно) два одноименных параметра в запросе это не нормально. не гооря об остальном (непоказаном).
SergP (2005-08-30 07:50:00) [15]
> 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
Не могу понять чего оно еще хочет...
DiamondShark (2005-08-29 19:25:00) [16]
> FROM sview where data<:dt and ls=:nls
FROM sview where sview.data<:dt and ls=:nls
Desdechado (2005-08-29 18:56:00) [17]data у тебя встречается как реальное поле и как псевдоним колонки, сервер просто не понимает, что ты от него хочешь