Операция должна использовать обновляемый запрос. (Ошибка 3073) Microsoft Access - PullRequest
21 голосов
/ 04 октября 2008

На некоторые запросы Microsoft Access я получаю следующее сообщение: Операция должна использовать обновляемый запрос. (Ошибка 3073). Я работаю над этим, используя временные таблицы, но мне интересно, есть ли лучший способ. Все задействованные таблицы имеют первичный ключ. Вот код:

UPDATE CLOG SET CLOG.NEXTDUE = (
    SELECT H1.paidthru 
    FROM CTRHIST as H1
    WHERE H1.ACCT = clog.ACCT AND
    H1.SEQNO = (
        SELECT MAX(SEQNO) 
        FROM CTRHIST 
        WHERE CTRHIST.ACCT = Clog.ACCT AND 
        CTRHIST.AMTPAID > 0 AND
        CTRHIST.DATEPAID < CLOG.UPDATED_ON
    )
)
WHERE CLOG.NEXTDUE IS NULL;

Ответы [ 21 ]

1 голос
/ 17 сентября 2010

(Немного опоздал на вечеринку ...)

В прошлом я обошел эту проблему тремя способами:

  1. Ссылка на текстовое поле в открытой форме
  2. DSum
  3. DLookup
0 голосов
/ 15 августа 2012

Когда я получил эту ошибку, это могло произойти из-за неправильного синтаксиса моего ОБНОВЛЕНИЯ, но после того, как я исправил запрос на обновление, я снова получил ту же ошибку ... поэтому я пошел к ODBC Data Source Administrator и обнаружил, что мое соединение был только для чтения. После того, как я установил соединение для чтения и записи и снова подключился, все заработало.

0 голосов
/ 21 октября 2014

проверьте вашу БД (разрешение базы данных) и дайте полное разрешение

Перейдите в папку БД-> щелкните правой кнопкой мыши свойства-> Безопасность-> Изменить-> Дайте полный контроль Меню & Пуск -> run-> наберите "uac" и выключите его (если оно высокое)

0 голосов
/ 05 мая 2014

Для дальнейшего ответа на то, что DRUA упоминает в своем ответе ...

Я разрабатываю свои базы данных в Access 2007. Мои пользователи используют Access 2007 Runtime. У них есть разрешения на чтение для папки database_Front (front end) и права на чтение / запись для папки database_Back.

При развертывании новой базы данных пользователь не следовал полным инструкциям копирования внешнего интерфейса на свой компьютер, а вместо этого создал ярлык. Запуск интерфейса через ярлык создаст условие, при котором запрос не может быть обновлен из-за ограничений записи в файл.

Копирование внешнего интерфейса в папку с документами решает проблему.

Да, это усложняет ситуацию, когда пользователям необходимо получить обновленную версию клиентского интерфейса, но, по крайней мере, запрос работает, не прибегая к временным таблицам и тому подобному.

0 голосов
/ 02 декабря 2008

Я получал одну и ту же ошибку, пока не сделал связующее поле уникальным индексом в обеих соединительных таблицах. Только тогда запрос стал обновляемым.

Филипп Стилианос

0 голосов
/ 12 марта 2013

Вы всегда можете написать код в VBA, который обновляется аналогичным образом. У меня тоже была эта проблема, и мой обходной путь заключался в том, чтобы сделать запрос на выборку со всеми объединениями, в котором были все данные, которые я искал, чтобы иметь возможность обновлять, создав этот набор записей и многократно выполняя запрос на обновление в качестве только таблица обновлений, только поиск по критериям, которые вы ищете

    Dim updatingItems As Recordset
    Dim clientName As String
    Dim tableID As String
    Set updatingItems = CurrentDb.OpenRecordset("*insert SELECT SQL here*");", dbOpenDynaset)
    Do Until updatingItems .EOF
        clientName = updatingItems .Fields("strName")
        tableID = updatingItems .Fields("ID")
        DoCmd.RunSQL "UPDATE *ONLY TABLE TO UPDATE* SET *TABLE*.strClientName= '" & clientName & "' WHERE (((*TABLE*.ID)=" & tableID & "))"
        updatingItems.MoveNext
    Loop

Я делаю это только для 60 записей в день, для нескольких тысяч это может занять гораздо больше времени, так как запрос выполняется от начала до конца несколько раз, вместо того, чтобы просто выбирать общую группу и вносить изменения. Вам может понадобиться '' в кавычках для tableID, так как это строка, но я уверен, что это то, что сработало для меня.

0 голосов
/ 17 января 2013

Здесь есть другой сценарий, который применим. Файл, который был извлечен из Visual Source Safe, для тех, кто все еще его использует, которому не было присвоено «Writeablity» ни в параметре «Просмотр», ни в «Извлечении», также получит это сообщение об ошибке.

Решение состоит в том, чтобы повторно получить файл из Source Safe и применить настройку Writeability.

0 голосов
/ 06 октября 2008

По сути, хотя ваш SQL выглядит вполне разумно, Jet никогда не поддерживал стандартный синтаксис SQL для UPDATE. Вместо этого он использует собственный проприетарный синтаксис (опять же отличающийся от проприетарного UPDATE синтаксиса SQL Server), который очень ограничен. Часто единственные обходные пути «Операция должна использовать обновляемый запрос» очень болезненны. Серьезно подумайте о переходе на более способный продукт SQL.

Дополнительные сведения о конкретных проблемах и возможных обходных путях см. В Обновление запроса на основе общих ошибок запроса .

0 голосов
/ 16 мая 2012

Я продолжал получать ту же ошибку, но все SQL выполняются в Access очень хорошо .

и когда я изменил разрешение AccessFile.

проблема исправлена ​​!!

Я даю разрешение на полный контроль учетной записи Network Service , эта учетная запись, если для IIS

0 голосов
/ 30 ноября 2016

Ответ, данный выше iDevlop, работал для меня. Обратите внимание, что мне не удалось найти свойство RecordsetType в моем запросе на обновление. Однако я смог найти это свойство, изменив свой запрос на запрос выбора, установив это свойство как отмеченное iDevlop, а затем изменив свой запрос на запрос обновления. Это сработало, нет необходимости во временной таблице.

Мне бы хотелось, чтобы это был просто комментарий к тому, что iDevlop опубликовал, чтобы оно вытекало из его решения, но у меня недостаточно высокий балл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...