Как получить значение формы в SQL-запросе?

Я пытаюсь получить SQL-запрос Access, который делает это (полупсевдокод ниже)

UPDATE SignIn SET SignIn.Complete=True, CompletedBy=(Select [FirstName] & " " & [LastName] AS EmployeeName From UserList where POid = Forms!HiddenUserCheck!txtPOid), CompletedDateTime=Now()

Таким образом, после запуска запроса данные в базе данных будут выглядеть так:

Complete EmployeeName CompletedDateTime
True     John Smith   3/23/2017 8:34:10 AM

Запрос на обновление не работает из-за синтаксиса и не уверен, как это исправить.

Точное сообщение об ошибке

Неверный объект Memo, OLE или HyperLink в подзапросе '[FirstName] & " " & [LastName]'.


person software is fun    schedule 23.03.2017    source источник
comment
Это обновит все записи в SignIn. Вероятно, это не то, что вы хотите.   -  person Gustav    schedule 23.03.2017
comment
это то, что я хотел   -  person software is fun    schedule 23.03.2017
comment
О, я пропустил вашу точную ошибку. Смотрите редактировать, пожалуйста.   -  person Gustav    schedule 23.03.2017
comment
Я бы использовал DLookup() вместо подзапроса.   -  person Andre    schedule 23.03.2017


Ответы (2)


Запрос может быть неверным из-за двойных восклицательных знаков. Вместо

Forms!HiddenUserCheck!txtPOid

Пытаться

Forms!HiddenUserCheck.txtPOid

У вас также есть лишний ) в конце вашего заявления WHERE.

person Pants    schedule 23.03.2017
comment
Я заметил это и исправил, но он жалуется на [FirstName] & & [LastName]. В частности, в подзапросе [FirstName] & & [LastName] говорится о недопустимой заметке, OLE или объекте гиперссылки. - person software is fun; 23.03.2017

ОК, тогда ваша проблема может заключаться в том, что подзапрос может возвращать более одной записи:

UPDATE 
    SignIn 
SET 
    SignIn.Complete=True, 
    CompletedBy = 
        (Select First([FirstName] & " " & [LastName]) AS EmployeeName 
        From UserList 
        Where POid = Forms!HiddenUserCheck!txtPOid), 
    CompletedDateTime = Now()

Если ваши поля имени являются полями Memo/LongText, это может быть источником ошибки. Если да, попробуйте:

UPDATE 
    SignIn 
SET 
    SignIn.Complete=True, 
    CompletedBy = 
        (Select First(Left([FirstName], 255) & " " & Left([LastName], 255)) AS EmployeeName 
        From UserList 
        Where POid = Forms!HiddenUserCheck!txtPOid), 
    CompletedDateTime = Now()

Редактировать.

Вы можете попробовать использовать DLookup для подзапроса:

UPDATE 
    SignIn 
SET 
    SignIn.Complete=True, 
    CompletedBy = 
        DLookup("[FirstName] & " " & [LastName]", "UserList", "POid = " & Forms!HiddenUserCheck!txtPOid & ""), 
    CompletedDateTime = Now()
person Gustav    schedule 23.03.2017
comment
Все поля являются коротким текстом, полями «Да/Нет» или «Дата/время» в таблице входа. В списке пользователей имя и фамилия являются длинным текстом. - person software is fun; 23.03.2017
comment
Я использовал созданный вами запрос. Я получаю сообщение о том, что операция должна использовать обновляемый запрос. Я добавил строку в конец вашего запроса, чтобы проверить его с помощью 1 строки. Добавлена ​​строка WHERE SignInID=9231; - person software is fun; 23.03.2017