Значение по умолчанию поля из запроса в MS Access - PullRequest
2 голосов
/ 01 октября 2008

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

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

Ответы [ 5 ]

5 голосов
/ 03 октября 2008

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

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

3 голосов
/ 02 октября 2008

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

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

Public Function InsertDefaultSomeID() As String

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

End Function

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

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

=InsertDefaultSomeID()

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

0 голосов
/ 02 октября 2008

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

0 голосов
/ 01 октября 2008

Ты прав. Вы не можете установить для свойства значения по умолчанию элемента управления значение, которое не известно во время компиляции. Это значение будет определено во время выполнения. Поэтому решение состоит в том, чтобы установить свойство 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
0 голосов
/ 01 октября 2008

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...