Форум: "Базы";
Текущий архив: 2002.05.06;
Скачать: [xml.tar.bz2];
ВнизJet SQL, UPDATE и SELECT Найти похожие ветки
← →
Wasp (2002-04-12 11:01) [0]Уважаемые мастера, помогите, пожалуйста, с проблемкой.
Есть БД Access, ADOQuery и такой запрос
UPDATE Ust
SET Дата =
(
SELECT MAX(Дата)
FROM Costs
)
WHERE Ust.Num=100
выдает ошибку "В операции должен использоваться обновляемый запрос"
← →
roottim (2002-04-12 12:23) [1]Метод EcxecSql;
если не то.. то попробуй через ADOCommand чего там выдаст?
← →
Kuusiniemi (2002-04-12 12:37) [2]ADO не может у Вас отличить записи одну от другой. Вот что имелось в виду. У Вас должен быть ключ в таблице или уникальный индекс.
← →
Wasp (2002-04-12 12:39) [3]>roottim попробуй через ADOCommand чего там выдаст?
Да то же самое и выдает. Может такой формы записи UPDATE нет в Jet SQL? Хотя в Local SQL есть, это точно.
← →
Johnmen (2002-04-12 12:46) [4]>Wasp : Уточни - в каком месте выдается ошибка (с кодом) !
← →
roottim (2002-04-12 12:49) [5]у меня на эти русские буквы блин сомнения!
попробуй одной строчкой... чем черт не шутит
и
UPDATE Ust
SET Ust."Дата" =
(
SELECT MAX(Costs."Дата")
FROM Costs
)
WHERE Ust.Num=100
это на всякий пожарный!... а то что в кавычка должно полностью соответствовать названию поля... даже регистром
← →
Wasp (2002-04-12 12:57) [6]>Johnmen ©
Вот кусок кода, немного измененный.
with ADOQuery1,SQL do
begin
Close;
Clear;
Add("update Ust as U");
Add("set U.Cost=");
Add("(");
Add(" select max(C.Cost)");
Add(" from Costs as C");
Add(")");
Add("where U.Number=100");
ExecSQL;
end;
Вот после ExecSQL и выдается
>Kuusiniemi ©
Скорее всего Вы правы. Потому что насчет нарушения индекса тоже говорилось.
← →
roottim (2002-04-12 13:01) [7]2Kuusiniemi © (12.04.02 12:37)
причем тут PK апдейт обновит в этом сл 2 строки.. а из скл видно что там и PK есть поле Num.. и тп..
уточнение
и нсчет "".. этоя для оракл нормально... чего то помнится в аксесе что-то типа [].. скорее всего оле провайдер к джету так и пропустит
← →
Johnmen (2002-04-12 13:03) [8]>>>Add("update Ust as U"); <--- отсутствует пробел после U
← →
roottim (2002-04-12 13:05) [9]2Wasp (12.04.02 12:57)
а чего ты по руски пишеш тогда ?
прогоние его через сам аксес..там ошибка эта тебе более подробно опишется самой субд
сори за 2 стр... в см там больше 8-)
← →
Johnmen (2002-04-12 13:07) [10]>Johnmen © : Чего сказал-то, сам понял ?!
← →
Kuusiniemi (2002-04-12 13:17) [11]2 roottim
"причем тут PK апдейт обновит в этом сл 2 строки.. а из скл видно что там и PK есть поле Num.."
Да что Вы?? И где это из текста
UPDATE Ust
SET Дата =
(
SELECT MAX(Дата)
FROM Costs
)
WHERE Ust.Num=100
видно что здесь Primary Key?????????? Вы, извините, экстрасенс??
← →
Johnmen (2002-04-12 13:35) [12]Попробуй без излишков :
Add("update Ust set Cost=(select max(Cost) from Costs) where Number=100");
Если не работает, то скорее всего функциональность не поддерживается....
← →
Wasp (2002-04-12 13:53) [13]>Johnmen ©
Попробовал, результат тот же. Значит нельзя в UPDATE использовать вложенный SELECT в инструкции SET. А жаль.
← →
Johnmen (2002-04-12 13:58) [14]Спецификация SQL этого не запрещает, видимо дело в ADO+ODBC...
← →
roottim (2002-04-12 14:06) [15]2Kuusiniemi © (12.04.02 13:17)
:-) за экстрасенса спасибо!...
да я не к тому что num это праймери...(что скорее всего) а ктому что апдейт должен обновить лиш одну строку, как вы высказались:
>ADO не может у Вас отличить записи одну от другой
зачем ему отличать .. он обновит все дубликаты... единственное что - это то что если имеются уникальные индексы.. то возможно этот запрос нарушает их уникальность
2Wasp
зайдите всеэе в субд акскс.. и сформируйте там запрос... ваша ошибка проявится с более корректным ответом от субд.. может быть дойдет почему..
запрос сделан нормально.. только бы я убрал as... хотя я знаю что аксесу это по барабану...
← →
Wasp (2002-04-12 14:20) [16]>roottim
Где я только не пробовал, везде одна и та же ошибка (и в Access"е тоже). Кстати насчет индексов: изначально их не было. После того, как я добавил уникальный индекс (поле счетчик), ситуация не изменилась никак.
← →
sniknik (2002-04-12 14:47) [17]попробуй в MSSQL вот так работает
update CashSail set CashNumber=(select max(CheckNumbe) from CashSail)
переходите все на MSSQL! ;-)
← →
Johnmen (2002-04-12 14:54) [18]>sniknik © : Если будешь здесь разводить рекламную кампанию за MSSQL - давай отстегивай в фонд программистов других SQL серверов !!!!!!!!!!!!!!!!!!!1
← →
roottim (2002-04-12 14:57) [19]не! на оракл :))!.. ладно долгий спор!
неполенился залес в этот долбанный аксес.. и действительно байда!
причем аксес держит конструкцию update типа
update t1, t2
set t1.field = t2.field
where t1.id= t2....
убить гея билтса давно пора!... похрен ему на стандарты блин :))
← →
sniknik (2002-04-12 15:01) [20]это не реклама это факт.
кстати пробовал в mdb от офиса XP (не знаю номер) сказал следующее
2 EOleException : В операции должен использоваться обновляемый запрос
(индексов хочет? было такое) но все поля проиндексированы. счас еще попробую из другой товлици вставлять.
← →
Johnmen (2002-04-12 15:09) [21]>sniknik © : У каждого свои факты, правды и резоны !
← →
Wasp (2002-04-12 15:18) [22]Да рад бы перейти на MSSQL и стандартам я не противник, но начальник сказал Access, значит будем грызть Access.
← →
sniknik (2002-04-12 15:28) [23]тогда выход разделить апдате на две операции (по крайней мере пока, а там может выход найдется), кстати ведь он не говорит что ошибочная операция он явно индексы хочет (причем по моему уникальные).
в Access тоже есть плюсы (по сравнению с локал SQl например, поклонники не пинаться!)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.06;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c