Значение поля по умолчанию из запроса в MS Access

У меня есть поле таблицы в MS Access, tblMyTable.SomeID, и я хочу установить значение по умолчанию в качестве предпочтения пользователя в tblUserPref.DefaultSomeID. Похоже, я не могу установить значение по умолчанию для использования запроса в определении таблицы tblMyTable. У меня есть форма, где записи вводятся в tblMyTable. Я попытался установить значение по умолчанию для поля в форме, но, похоже, тоже не принимает запрос. Итак, в крайнем случае, я пытаюсь сделать это с помощью VBA. Я могу запросить нужное значение в VBA, но не могу понять, к какому событию прикрепить код.

Я хочу запускать код всякий раз, когда в форме открывается новая пустая запись, прежде чем пользователь начнет вводить ее. Я не хочу запускать код при открытии или редактировании существующей записи. Однако, если код выполняется как для новых пустых записей, так и для существующих записей, я, вероятно, смогу обойти это. До сих пор все события, которые я пробовал на поле и на самой форме, не запускались, когда я этого хотел. Может ли кто-нибудь предложить, какое событие я должен использовать и на каком объекте?


person Jeremy Bourque    schedule 01.10.2008    source источник


Ответы (5)


Я не уверен, что понял проблему, но я думаю, что вы просите вставить значение в поле, полученное из другой таблицы, на основе некоторой информации времени выполнения (например, имени пользователя). В этом случае вы можете использовать функцию поиска домена, DLookup(), и передать ей имя поля, которое вы хотите вернуть, имя таблицы или запроса, из которого вы его ищете, и критерии для ограничение результата одной строкой (что, как я предполагаю, будет зависеть от значений, которые вы можете собрать во время выполнения). Эта формула DLookup() может быть установлена ​​на постоянной основе в качестве значения по умолчанию в элементе управления формы и не приведет к загрязнению формы до того, как вы создадите реальную запись.

Конечно, я мог совершенно неверно истолковать то, что вы пытаетесь сделать, поэтому это может не сработать, но вы, похоже, хотели найти что-то в наборе записей и использовать результат в качестве значения для новых записей, а DLookup() позволяют вам сделать это вообще без какого-либо кодирования (а также с тем преимуществом, что вы не загрязняете запись преждевременно).

person David-W-Fenton    schedule 03.10.2008
comment
Я проголосовал за ответ Дэвида, потому что не могу проголосовать за свой предыдущий ответ, в котором говорилось почти то же самое! ;) (Дэвид, однако, на один шаг проще, потому что он вообще не требует пользовательской функции VBA.) Если это не отвечает на вопрос, я думаю, что вопрос нужно переформулировать. - person Tim Lara; 04.10.2008
comment
Это именно тот ответ, который я искал, хотя ответ Тима Лары был почти таким же. Это просто на один шаг проще. Спасибо вам обоим. - person Jeremy Bourque; 12.10.2008
comment
Кажется, это не работает, если значение, которое вы даете DLookup, исходит из поля, которое вы заполнили ранее. - person user7116; 09.04.2013

Я не знаю, как вы определяете, кто является текущим пользователем, но я предполагаю, что это то, что вы можете вызвать программно. Для простоты я буду использовать в этом примере встроенный в Access метод CurrentUser. (Требуется безопасность на уровне пользователя, в противном случае по умолчанию используется «Администратор».)

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

Public Function InsertDefaultSomeID() As String

InsertDefaultSomeID = DLookup("DefaultSomeID", "tblUserPref", _
                              "UserID='" & CurrentUser & "'")

End Function

В tblUserPref вам нужно поле [UserID] и поле [DefaultSomeID]. Определите значение по умолчанию для текущего пользователя.

Затем в форме, привязанной к tblMyTable, откройте Свойства для поля [SomeID] и установите для свойства Значение по умолчанию значение:

=InsertDefaultSomeID()

Сохраните форму, войдите в систему как пользователь с известным значением по умолчанию и попробуйте вставить новую запись. Ваше значение по умолчанию должно быть автоматически заполнено.

person Tim Lara    schedule 02.10.2008

Вероятно, вы захотите поместить этот код в событие «Перед вставкой» для самой формы (ни одного из объектов в форме).

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

Вы также можете проверить наличие новой записи в событии «Текущие».

Private Sub Form_Current()
    If Me.NewRecord Then
        Me.f2 = "humbug"
    End If
End Sub

Недостатком этого является то, что новая запись создается/помечается как грязная сразу после ее ввода. Таким образом, если вы бездумно пройдетесь по записям, вы можете в конечном итоге запустить конец и создать несколько дополнительных записей только с данными по умолчанию, поэтому вам придется что-то делать, чтобы отловить такое условие (например, обязательное поле, и т.д.)

person BIBD    schedule 01.10.2008

Ты прав. Вы не можете установить для свойства значения по умолчанию элемента управления значение, неизвестное во время компиляции. Это значение будет определено во время выполнения. Таким образом, решение состоит в том, чтобы установить свойство значения элемента управления, а не свойство значения по умолчанию, во время текущего события формы. Обратите внимание, что getUserID() — это общедоступная функция, используемая для определения пользователя.

Private Sub Form_Current()

    On Error GoTo Proc_Err

    Dim rs As DAO.Recordset
    Dim fOpenedRS As Boolean

    If Me.NewRecord = True Then
        Set rs = CurrentDb.OpenRecordset("SELECT DefaultSomeID " _
        & "FROM tblUserPref WHERE UserID = " & getUserID())
        fOpenedRS = True
        rs.MoveFirst
        Me!txtPref.Value = rs!DefaultSomeID
    End If

Proc_Exit:
    If fOpenedRS = True Then
        rs.Close
    End If

    Set rs = Nothing

    Exit Sub

Proc_Err:
    MsgBox Err.Number & vbCrLf & Err.Description
    Err.Clear
    Resume Proc_Exit
End Sub
person Chris OC    schedule 01.10.2008
comment
Свойство Value является свойством по умолчанию для элементов управления Access, поэтому Me!txtPref.Value идентично Me!txtPref . - person David-W-Fenton; 03.10.2008

Он предложил альтернативный подход. Вместо того, чтобы явно ВСТАВЛЯТЬ значение по умолчанию, когда пользователь не указал явное значение, вместо этого оставьте это значение отсутствующим (я, вероятно, смоделировал бы это в специальной таблице и смоделировал бы отсутствующее значение, ну, не ВСТАВЛЯЯ строку, но я знаю многие люди не возражают против того, чтобы в их таблицах было много столбцов, допускающих значение NULL). Затем вы можете заменить отсутствующее значение в запросе. Это может быть или не быть действительным в вашем приложении, поскольку я говорю, что это просто еще один подход к обработке отсутствующих данных :)

person onedaywhen    schedule 02.10.2008