«Операция должна использовать обновляемый запрос» в Access с серверной частью MYSQL и действительно простым запросом

#mysql #vba #ms-access

Вопрос:

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

Я использую Access 2013 в качестве внешнего интерфейса, MYSQL 8.0.23 на заднем конце и MYSQL ODBC connector 8.0.23 Win32.

Когда я запускаю (либо через VBA, либо непосредственно из запроса):

 UPDATE Account1 SET LC = (Select Land_Company from Parameters2)
 

Я понял ошибку. Если я просто запущу Select Land_Company from Parameters2 , он вернет 420. Если я тогда побегу:

 UPDATE Account1 SET LC = 420
 

это прекрасно работает.

Как в таблице Account1, так и в таблице Parameters2 есть PKs. В таблице Account1 есть одна и только одна запись. Я также пытался:

 UPDATE Account1 SET LC = (Select Land_Company from Parameters2) where ID=4
 

так что это может повлиять только на одну строку, так как идентификатор является первичным ключом. Я даже пытался:

 UPDATE DISTINCTROW Account1 SET LC = (Select Land_Company from Parameters2) where ID=4
 

что тоже не работает. Оба Счета1.LC и параметры.Land_Company являются INT, поэтому проблемы с конвертацией нет. Я упускаю из виду что-то простое?

Итак, чтобы помочь, я сократил фактический запрос, который я выполняю, до приведенного выше, запрос в моем коде, который изначально не удался, был:

 Update Account1 Set Other_Expenses=(Select Sum(Expenses.Amount) from Expenses INNER JOIN Accounts On Accounts.Account_Number=Expenses.Account Where Accounts.Account_Type=10 and Expenses.Account <> '60000345' and Expenses.Account <> '60000115' and Expenses.Account <> '60000270' and Expenses.Account <> '17000230' and Expenses.Account <> '60000015' and Expenses.Account <> '40000005' and Expenses.Account <> '40000035' and Expenses.Account <> '60000190' and Expenses.Land_Company =420 and Expenses.Date>= '2020-01-01' and Expenses.Date<= '2020-12-31')
 

Я предполагаю, что если я исправлю, почему простой запрос не работает, я смогу исправить более длинный запрос. Извините за любую путаницу.

Комментарии:

1. «Действительно простой запрос» на самом деле состоит из 2 запросов (примечание, в WHERE предложении может использоваться a NOT IN (...) , и в любом случае им обоим придется выполнять — вы рассматривали возможность их выполнения отдельно и параметризации внешнего с выводом внутреннего запроса?

Ответ №1:

Используйте выражение DLookup вместо подзапроса, чтобы извлечь это Land_Company значение из Parameters2 таблицы:

 UPDATE Account1 
SET LC = DLookup('Land_Company', 'Parameters2')
WHERE ID = 4;
 

Комментарии:

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

2. Обновить Счет1 Установить Другие расходы=(Выберите Сумму(Расходы. Сумма) из Расходов По ВНУТРЕННИМ Счетам ПРИСОЕДИНЕНИЯ На Счетах. Номер счета=Расходы. Учетная Запись, Где Учетные Записи. Тип счета=10 и Расходы. Счет <> «60000345» и расходы. Счет <> «60000115» и расходы. Счет <> «60000270» и расходы. Счет <> «17000230» и расходы. Счет <> «60000015» и расходы. Счет <> «40000005» и расходы. Счет <> «40000035» и расходы. Счет <> «60000190» и расходы. Земельная компания =420 и расходы. Дата>= ‘2020-01-01’ и расходы. Дата

3. Мое подозрение состояло в том, что подзапрос заставил Access рассматривать UPDATE его как не обновляемый. Поэтому я использовал DLookup для извлечения то же значение, которое было возвращено подзапросом. Сработало ли это?

4. @AllanHall сначала вы запускаете внутренний запрос и используете его выходные данные для параметризации внешнего запроса, если драйвер не позволит вам убить двух зайцев одним и тем же камнем.

5. Также.. WHERE ... AND Expenses.Account NOT IN ('600000345','600000115','600000270','17000230','600000015','40000005','40000035','600000190') AND ... 😉