У меня есть пользовательская форма доступа, которая отправляет данные в таблицу, в таблице есть два поля, которые я хочу автоматически заполнять всякий раз, когда пользователь делает новую запись в форме. Я использую приведенный ниже код vba с этой формой:
Option Compare Database
Public Function GetUserName() As String
Dim obj1 As Object
Set obj1 = CreateObject("WScript.Network")
GetUserName = DLookup("[BAFUser]", "BAF_User", "[BRID] = '" & obj1.UserName & "'")
Set obj1 = Nothing
End Function
Private Sub Form_BeforeInsert(Cancel As Integer)
Owner2 = CreateObject("WScript.Network").UserName
AdvisorName = GetUserName
End Sub
Private Sub Form_Load()
Me.DataForm.Form.Recordset.MoveLast
End Sub
Private Sub SaveBtn_Click()
RunCommand acCmdSaveRecord
Me.Requery
Me.DataForm.Form.Recordset.MoveLast
End Sub
Я могу получить значение в поле «владелец», но не в поле «AdvisorName». Что может быть возможной причиной этого? есть ли ошибка в моем коде или есть ли лучший способ сделать это?
qdf.Execute
? Установите точку останова наqdf.Execute
и, когда она остановится, введите:?qdf.sql
в ближайшее окно и опубликуйте результат. 05.12.2017qdf.Execute
щелкните левой кнопкой мыши сбоку окна. Должна появиться красная точка. Теперь сохраните код, введите представление формы в своей форме и запустите код для запуска. Когда это произойдет, VBE появится, когда он попадет в красную точку. Затем введите?qdf.sql
в часть VBE с надписью Immediate Window и нажмите Enter. Он должен ответить примерно так: INSERT INTO Mau_con (Владелец, AdvisorName) VALUES ('xxxx', 'xxxx'). Вставьте этот вывод сюда. 05.12.2017?qdf.sql
Какую версию Access вы используете? Проверьте каждую из ваших переменных, поэтому в режиме перерыва попробуйте?Owner2
,?AdvisorName
05.12.2017?Owner2
и?AdvisorName
..Sql
является только свойством объекта qdf. 05.12.2017?IsNull(AdvisorName)
, и он должен ответитьTRUE
. 05.12.2017?AdvisorName = " "
06.12.2017?qdf.sql
не работает. Я не могу воспроизвести проблемы, которые вы видите. 06.12.2017Option Compare Database Public Function GetUserName() As String Dim obj1 As Object Set obj1 = CreateObject("WScript.Network") GetUserName = DLookup("[BAFUser]", "BAF_User", "[BRID] = '" & obj1.UserName & "'") Set obj1 = Nothing End Function Private Sub Form_Load() Dim AdvisorName As String AdvisorName = GetUserName MsgBox "Welcome " & AdvisorName End Sub
06.12.2017INSERT INTO Mau_con (Owner, AdvisorName) VALUES ('MyOwner', 'MyAdvisor')
. Затем запустите его. Запись добавлена в таблицу? 06.12.2017GetUserName
. Вам может понадобиться повторно запросить его в определенные моменты, но вы можете привязать его к таблице и избавиться от vba, сохраняющего запись. В противном случае вам придется решить, использовать ли связанную или несвязанную форму. Ошибки с несвязанными формами действительно возникают только в том случае, если вы не планируете все возможные варианты, что делает его более эффективным, но гораздо более гибким. Связанные формы делают дизайн простым и легким, но они немного менее гибкие. Я бы попробовал сначала сделать контроль имени пользователя. Если вы можете заставить его работать, вы можете использовать связанную форму. 06.12.2017Private Sub Form_Load() Me.AdvisorName2.Value = GetUserName Me.DataForm.Form.Recordset.MoveLast End Sub
06.12.2017GetUserName
действительно срабатывает. Я не вижу никаких проблем с этим кодом, и f5 определенно запускает событие Form_Load при переключении из режима разработки, поэтому я не вижу, где еще может произойти сбой. 06.12.2017