Нужно знать, кто в вашей компании добавил ту или иную запись? Или кто её последний раз обновлял? Это довольно распространённое требование, но, к сожалению, в Microsoft Access нет встроенной функции для его решения. Простое добавление поля «последний раз обновил» в вашу таблицу (во многих случаях) может удовлетворить большинство потребностей, но как узнать, кто обновил запись, если Access не может вам это показать? Для этого достаточно небольшого фрагмента кода VBA, как покажет эта статья.
Нет необходимости создавать собственную форму входа для ввода имени пользователя.
Если ваша база данных не имеет собственной формы или механизма входа в систему, то единственный способ узнать, кто в настоящее время использует базу данных или вошел в нее, — это использовать один из файлов операционной системы Windows, а именно «mpr.dll». файл. Если вы раньше не использовали внешние dll в своем коде, это может показаться немного пугающим, но, как вы увидите в приведенном ниже коде, на самом деле все довольно просто.
Итак, давайте определим, что мы хотим, чтобы наш код делал…
«Дайте мне имя текущего пользователя, вошедшего в систему»
Во-первых, код:
Declare Function GetUser Lib "mpr.dll" Alias "WNetGetUserA" (ByVal Name As String, ByVal UserName As String, Length As Long) As Long Public Function GetUserName() As String Dim returnStatus As Integer Dim Name, UserName As String 'Allocate space for user name to be stored in UserName = Space(255) ' Call the aliased function in the mpr.dll file. returnStatus = GetUser(Name, UserName, 255) If returnStatus = 0 Then 'Strip the username from the returned string UserName = Left(UserName, InStr(UserName, Chr(0)) - 1) Else ' An error occurred. GetUserName = "Error retrieving the user name." End End If GetUserName = UserName End Function
Код, объяснение
Первое, что вы увидите, это то, что мы делаем ссылку на внешнюю функцию, содержащуюся в файле mpr.dll. Мы делаем это, объявляя локальное имя (GetUser) для общедоступной функции, содержащейся в dll (в данном случае, WNetGetUserA). — мы также определяем, какие параметры необходимы для вызова функции — в данном случае параметры «Имя», «Имя пользователя» и «Длина». Единственное, что нас действительно интересует здесь, это «UserName», но остальные также должны быть предоставлены, поскольку именно так функция настроена в dll.
Теперь, когда это сделано, мы создаем нашу собственную функцию, из которой мы будем вызывать эту внешнюю функцию. Код для нашей функции довольно минимален, но давайте пробежимся по ключевым элементам:
- “UserName = Space(255)” – если вы просмотрите код в отладчике, вы увидите, что при вызове функции “GetUser()” переменная “UserName”, которую мы ей передаем, фактически перезаписывается. Для этого переменной необходимо выделить достаточно памяти для хранения данных, поэтому мы просто выделяем 255 символов пробела для переменной, чего должно быть более чем достаточно для большинства (если не для всех) имен пользователей.
- Мы фиксируем возвращаемое значение из вызова функции в переменной «returnStatus». Ноль (0) здесь означает, что вызов был успешным, все остальное означает, что произошла ошибка.
- Наконец, переменная «UserName» нуждается в очистке, поскольку она будет по существу дополнена нулевыми символами, поэтому мы извлекаем символы, которые находятся в переменной, до того, как будет найден Chr (0).
Видите – это было не так уж и плохо! И теперь, по крайней мере, если вам придется иметь дело с повреждение базы данных mdb, вы будете знать, кто последним использовал базу данных, чтобы кого можно было обвинить! (я тут шучу, конечно!)
Об авторе:
Митчелл Понд — эксперт по восстановлению данных в DataNumen, Inc., которая является мировым лидером в области технологий восстановления данных, включая ремонт SQL Server проблема и программные продукты для восстановления Excel. Для получения дополнительной информации посетите www.datanumen.com
