Microsoft Access 2010: использование данных из текстового поля в операторе обновления SQL

Можно ли вызвать данные, хранящиеся в текстовом поле формы, в операторе SQL? Я поместил следующий оператор в действие RunSQL после действия SaveRecord моей кнопки.

UPDATE (Material 
INNER JOIN [Transaction] ON Material.Material = Transaction.Material)
INNER JOIN Ordered ON Transaction.[No] = Ordered.[No]
WHERE [Forms]![Order Material]![textBox_No] = Transaction.[No]
SET Material.[On Order] = [On Order]+[Amount];

Я пытаюсь извлечь данные, хранящиеся в текстовом поле (textBox_No) в моей форме (Материал заказа), и сравнить их с результатами, полученными запросом на обновление. Я хочу, чтобы On Order обновлялся только в том случае, если данные в *textBox_No* равны полю No в Transaction.

Когда я нажимаю кнопку, данные, введенные в форму, обновляются правильно, однако, когда оператор SQL запускается, он дает мне синтаксическую ошибку.

Исследование

Я пытался найти руководства по синтаксису для запроса на обновление, однако на веб-сайте Microsoft приведены примеры только для выберите тип запроса. Я нашел, как мне казалось, полезное руководство по вытягиванию данных из текстового поля в форме, однако руководство предназначено для гораздо более старой версии Microsoft Access, чем я использую. В этом руководстве я получил [Forms]![Order Material]![textBox_No], который я пытаюсь использовать для извлечения данных из текстового поля.


person Coloumb    schedule 08.03.2012    source источник
comment
Вот скриншот того, как я настроил кнопку в форме. Изображение может объяснить, как я настроил кнопку лучше, чем я.   -  person Coloumb    schedule 08.03.2012


Ответы (1)


Предложение WHERE должно стоять после предложения SET. Кроме того, «Транзакция» — это зарезервированное слово, поэтому оно должно заключать в квадратные скобки повсюду.

UPDATE (Material 
INNER JOIN [Transaction] ON Material.Material = [Transaction].Material)
INNER JOIN Ordered ON [Transaction].[No] = Ordered.[No]
SET Material.[On Order] = [On Order]+[Amount]
WHERE [Forms]![Order Material]![textBox_No] = [Transaction].[No];

Хорошей практикой является (и просто в целом это упрощает жизнь) избегать именования таблиц и полей зарезервированными словами. Полный список зарезервированных слов можно найти по ссылке выше.

person mwolfe02    schedule 08.03.2012
comment
Странно, Access не жаловался, когда я установил Transaction в качестве имени таблицы. Я буду помнить о списке зарезервированных слов в будущем. Большое спасибо за Вашу помощь! - person Coloumb; 08.03.2012
comment
Нет, Access не будет жаловаться. Вы можете назвать свои таблицы как угодно: Select, From, Where, Order By и т. д. Но Access будет жаловаться, как только вы начнете пытаться использовать эти имена в запросах и других местах. Вы сойдете с ума, везде квадратные скобки. - person mwolfe02; 08.03.2012
comment
@ mwolfe02 Раньше Access не жаловался, в 2010 году он начал жаловаться. Если вы попытаетесь использовать name, вы получите сообщение, но не для transaction. - person Fionnuala; 09.03.2012
comment
Нет проблем в запросе Access со словом transaction : Set rs = CurrentDb.OpenRecordset("SELECT ID, Transaction FROM Transaction") - person Fionnuala; 09.03.2012
comment
@Remou: Хорошая информация. Я еще не использовал Access 2010; предупреждение кажется подходящим улучшением. - person mwolfe02; 09.03.2012
comment
@Remou: Интересно, что Transaction не вызывает проблем. Оно указано как зарезервированное слово Jet 4.0: Список зарезервированных слов в Jet 4.0 - person mwolfe02; 09.03.2012
comment
@ mwolfe02 mwolfe02 Итак, вы не можете использовать transaction для запроса, выполняемого с использованием ADODB, но вы можете выполнять его с DAO в Access. - person Fionnuala; 09.03.2012