#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
предложении может использоваться aNOT 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 ...
😉