Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2010, 14:48   #1
mark-iz
 
Регистрация: 05.12.2010
Сообщений: 4
По умолчанию Вопрос по UPDATE

Здравстуйте!
При попытке выполнить запрос появляется ошибка: "в операции должен использоваться обновляемый запрос". Выяснил, что проблема возникает в месте, где выполняем SET - ему не нравится результат подзапроса после знака равенства, хотя он возвращает единственное значение. Подскажите, что я делаю не так?

Код:
PARAMETERS введите_ндок Short;
UPDATE Заказы SET Сумма_RUR = (
SELECT Sum(C)
FROM
(
SELECT Заказы_данные.нпоз, Sum(Колво*Цена_RUR) AS C
FROM Заказы_данные
WHERE Заказы_данные.ндок=введите_ндок
GROUP BY Заказы_данные.нпоз
)

);

Последний раз редактировалось Stilet; 05.12.2010 в 16:08.
mark-iz вне форума Ответить с цитированием
Старый 05.12.2010, 15:18   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

точно не скажу.
просто в рамках предположения:
а что, в таблице Заказы всего одна запись, которую Вы и хотите обновить?
Если не одна, то где задание ограничение на обновляемые записи (после последней скобки Where Заказы.ID = ....)
или, если это не так - то нужно внутренний запрос связать с внешним...

p.s. выложите в архиве небольшую тестовую базу, чтобы можно было проверить...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.12.2010, 15:36   #3
mark-iz
 
Регистрация: 05.12.2010
Сообщений: 4
По умолчанию

Да, потерял при копировании в конце строку:
WHERE Заказы.ндок=введите_ндок
Вложения
Тип файла: zip test bd.zip (500.1 Кб, 9 просмотров)
mark-iz вне форума Ответить с цитированием
Старый 06.12.2010, 13:51   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не знал, что в MS Access ещё и такое ограничение есть

по советам с сайта sql.ru
можно:
Цитата:
Участие группировки в вашем запросе делает его необновляемым. попробуйе использовать вместо суммирующего подзапроса функцию DSum.
или
Цитата:
select SUM(...) в переменную, а затем используйте ее в UPDATE.

например, как вариант:
Код:
PARAMETERS введите_ндок Short;
UPDATE Заказы SET Сумма_RUR =  DSum( "Заказы_данные.Колво*Заказы_данные.Цена_RUR",  "[Заказы_данные]", "Заказы_данные.ндок="+Str(введите_ндок))
WHERE Заказы.ндок=введите_ндок;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.12.2010, 18:58   #5
mark-iz
 
Регистрация: 05.12.2010
Сообщений: 4
По умолчанию

Решение:
PARAMETERS введите_ндок Short;
UPDATE Заказы INNER JOIN Заказы_данные ON Заказы.ндок=Заказы_данные.ндок SET Сумма_RUR = Сумма_RUR+Цена_RUR*Колво
WHERE Заказы.ндок=введите_ндок;


В Jet SQL при использовании UPDATE можно использовать либо конкретные значения, либо данные из изменяемой таблицы, поэтому применяется конструкция с INNER JOIN.
mark-iz вне форума Ответить с цитированием
Старый 07.12.2010, 22:57   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
UPDATE Заказы INNER JOIN Заказы_данные ON Заказы.ндок=Заказы_данные.ндок SET Сумма_RUR = Сумма_RUR+Цена_RUR*Колво
имхо, это неправильное решение....
Вызовите этот запрос для, например, документа с ндок = 1 несколько раз!
Если я правильно понял логику запроса - то значение Сумма_RUR всё время будет накапливаться...
тогда уже надо предварительно её очищать (присваивать ноль).

p.s. предположение о неверной работе запроса сделано прямо тут, на форуме, я в БД не проверял...

p.p.s. а чем мой вариант выше не подошёл?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.12.2010, 14:05   #7
mark-iz
 
Регистрация: 05.12.2010
Сообщений: 4
По умолчанию

Насчет накапливания вы правы, просто в условиях моей задачи невозможен перерасчет для одной величины более чем один раз, если такое возможно, то просто вызываем перед этим запрос который выставляет значение на 0 и все
mark-iz вне форума Ответить с цитированием
Старый 08.12.2010, 14:08   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

mark-iz, ладно. устраивает, значит хорошо.

так расскажите, а чем вариант через DSum не подошёл?
я же тоже учусь (точнее узнаю новое )...
может быть, он не всегда работает или ещё что-то нехорошее/скрытое есть в предложенном мною варианте?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Update usmesn PHP 3 02.06.2010 17:23
directorylistbox1.update; Leo20 Общие вопросы Delphi 2 13.12.2009 14:09
update shad0w SQL, базы данных 3 27.10.2009 11:44
UPDATE с параметрами QQmb SQL, базы данных 11 06.05.2009 15:20
c# and Access - update MAcK Общие вопросы .NET 3 20.10.2008 12:58