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

StackOverflow https://stackoverflow.com/questions/157812

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Public Function InsertDefaultSomeID() As String

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

End Function

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

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

=InsertDefaultSomeID()

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

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

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

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

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

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

Ты прав.Вы не можете установить для свойства значения по умолчанию элемента управления значение, которое неизвестно во время компиляции.Это значение будет определено во время выполнения.Таким образом, решение состоит в том, чтобы установить свойство value элемента управления, а не свойство defaultvalue, во время текущего события формы.Обратите внимание: 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top