Как в Access подставить в поле по умолчанию имя пользователя?
1). Пытаюсь подставить в поле значение системной функции GetUser(). Сообщает, что такой нет.
2). Пишу в модуле свою функцию, возвращающую имя текущегог пользователя, но не заню, как подключить пользовательскую функцию (или её изначально надо откомпилить как библиотеку?).
3). Написал запрос, ну типа Select GetUser(). Пытаюсь по умолчанию подсовывать результат выполнения этого запроса. Оказываюсь посланым.
Что делать? Как установить по умолчанию имя текщего пользователя? Делать нужно именно в Access - такова задача, к сожалению...
Заранее всем спасибо!
а у тебя что за база? mdb сетевая, к которой пользователи подключаются и тянут таблицы?
Завтра гляну, помойму у Гетца был готовый пример...
а у тебя что за база? mdb сетевая, к которой пользователи подключаются и тянут таблицы?
Не, вариант до глупого прост. БД локальная (при запуске копируется). Состоит сплошь из прилинкованных таблиц, но нужна 1 таблица на уровне Jet, то есть mdb - файла в которой нужно отслеживать имена юзверей, производящих изменения какие-либо. Причём работать это должно как при обращении из кода (что само по себе легко), так и при обращении непосредственно к таблицы через интерфейсы СУБД.
и вторая часть:
Спасибо, но это - немного не то. Дело в том, что у меня имеется таблица, в которой в одно поле автоматом должно писаться имя пользователя, добавляющего запись. Ну, по дефолту, то есть. А в Акцессе НЕТ системной функции, которую можно было бы в этом случае прописать по дефолту.
Функция CurrentUser не воспринимается системой, хотя в коде работает. Запрос (SELECT CurrentUser()), который без проблем обрабатывается в редакторе запросов, тоже не "прокатывает".
Тип поля Текст (255). Пробовал устанавливать МЕМО, но тот же эффект.
Пробовал в модуле писать агнкцию, которая возвращает CurrentUser типа String, но не знаю, как определить для таблицы доступную пользовательскую функцию.:{
И ещё, SergeySV, если не трудно, поведи, плз, пока темы "http://forum.codenet.ru/showthread.php?threadid=15556&goto=newpost" и "http://forum.codenet.ru/showthread.php?threadid=15810&goto=newpost", а то тама люди ждут меня, а у меня сейчас траблы и некогда отвечать на посты. ОК? Огромное спасибо, что подхватил их во время моего отпуска.
И ещё, SergeySV, если не трудно, поведи, плз, пока темы "http://forum.codenet.ru/showthread.php?threadid=15556&goto=newpost" и "http://forum.codenet.ru/showthread.php?threadid=15810&goto=newpost", а то тама люди ждут меня, а у меня сейчас траблы и некогда отвечать на посты. ОК? Огромное спасибо, что подхватил их во время моего отпуска.
ОК
А понял, это к вопросу о триггерах. Проблема в том, чтобы в овую запись автоматом заполнялось одно из полей!? К сожалению, это не возможно, в Access нельзя для значения по умолч. задавать СВОИ функции, только встроенные. Остается отлавливать событие добавление/изменение записи в таблице и самому заполнять это поле именем пользователя. Но это уже триггеры, которых в Access тоже нет. Единственная возможность реализации такого псевдотриггера для Access я вижу только в ограничение работы пользователей опр. формами (как правила во всех базах пользователь работает не напрямую с данными, а через форму) и уже в самой форме сделать контроль добавления/изменения данных в таблице, это уже реализовать средствами VB можно... Просто у Access такая концепция заложена, что пользователь в базе работает с данными именно через формы (у них и формы спец., с подсоед. Recordset), а уже в них ты как разработчик средствами VB можешь реализовать все что задумано, т.е. логика конечно чисто клиентская, в том смысле что если mdb и выполняет роль сервера (файл сервера, а клиентов mbd прилинкованные с него таблицы), то всю логику по контролю придется закладывать именно в клиентские mdb, а иначе это уже надо переходить на MS SQL в качестве сервера где ты уже не зависишь от клиентов и можешь вертеть данными как хочешь вне зависимости че там себе клиент пыхтит
ОК
У меня беда следующая, на самом деле. Имеется некая таблица, все события в которой должны протоколироваться. Причём это должна быть Jet-таблица в самом mdb, ну по определённым требованиям. Группы Access 2000 тоже создавать нельзя по определённым требованиям. Пользователь работает с ней через формы. Но, блин, некоторые особо умные пользователи, как накосячат, бегут к программистам и просят "немножко поправить данные в самой базе", да и "особо продвинутые" юзверя тоже попадаются. Если это не критично - нет проблем. Но именно в этой таблице ВСЕ данные должны протооколироваться. Я хочу, что бы из таблицы ничего не удалялось. Только, в случае удаления записи, менялся флаг использования записи и проставлялась дата её удаления, а взамен появлялась аналогичная ей с новыми параметрами. В удалённой записи появлялось имя пользователя, который её удалил, а в новой - имя пользователя, который её добавил. Таким образом, всегда можно отследить, кто и что менял. Таблица особо дуться не будет, так как она для действий, что производятся 1 раз в год.
В принципе, можно предупредить программисто о том, что бы данную таблицу не трогали. Но человеческий фактор исключить нельзя. И, если, например, есть у нас в SQL - БД триггер, который ведёт лог-файл, то программисту может просто лень будет его отключать или чистить лог и он откажет нерадивому юзверю. А в нашем случае программеру НИЧЕГо не мешает нарушить правила. Да и потом не стоит забывать. что программист просто может забыть о правилах, а отслеживание изменений в этой таблице очень критично...
Сергей, у меня не открываются файлы, что ты тут выложил. Пишет, что у меня - старая версия Access (у меня 2000-й). Скинь пример получения имени машины и пользователя? ОК? Я сам сейчас воспользовался GetComputerNameA
Упс.. не получится, вот код функции:
' Lists the current users of the database to
' the debug window.
' From Access 2002 Enterprise Developer's Handbook
' by Litwin, Getz, and Gunderloy. (Sybex)
' Copyright 2001. All rights reserved.
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim fld As ADODB.Field
Dim intUser As Integer
' The user list schema information requires this magic
' number. Why isn't a constant predefined for this?
' Who knows.
Const adhcUsers = "{947bb102-5d43-11d1-bdbf-00c04fb92675}"
Set cnn = New ADODB.Connection
Set cnn = CurrentProject.Connection
Set rst = cnn.OpenSchema(adSchemaProviderSpecific, , adhcUsers)
With rst
Do Until .EOF
intUser = intUser + 1
Debug.Print "User # " & intUser
For Each fld In .Fields
Debug.Print " " & fld.Name & "=" & fld.Value
Next
.MoveNext
Loop
End With
End Sub
... работает через OpenSchema. В Access 2000 метод OpenSchema вызывает ошибку потому что не понимает константу adhcUsers. Вернее константы как раз нет, а есть код, который Microsoft где-то выложила, по крайне мере Гетц про него занл и в книжке его указал. И вот тут непонятки, толи в Access 2000 OpenSchema вообще не может вернуть такую информацию про пользователей, либо просто коды поменялись и нужно уже другой указывать... это я пока не выяснил и потому указанный выше код работает токо в Acc2002. :(
А у тебя с этой базой сами программисты еще работают, т.е. раздать пользователей с правами ты не можешь (и тем более менять код)?
Могу тогда предложить токо вариант:
1. автом. загрузка скрытой формы при открытие базы
2. создание копии нужной таблицы
3. пока пользователь/программист работает тихо себе висим, ждем
4. при закрытии базы делаем сравнение таблиц, выясняем изменения в таблице и зная номера измененных записей в исходной таблице поставляем имя тек. пользователя.
если база зависнет, то конечно никакие изменения не отразятся, но для пущей гарантии, при желании, можно и таймер забабахать, чтобы например каждые полчаса сравнивала и помечала в таблице сделанные пользователем действия.
Упс.. не получится, вот код функции:
' Lists the current users of the database to
' the debug window.
' From Access 2002 Enterprise Developer's Handbook
' by Litwin, Getz, and Gunderloy. (Sybex)
' Copyright 2001. All rights reserved.
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim fld As ADODB.Field
Dim intUser As Integer
' The user list schema information requires this magic
' number. Why isn't a constant predefined for this?
' Who knows.
Const adhcUsers = "{947bb102-5d43-11d1-bdbf-00c04fb92675}"
Set cnn = New ADODB.Connection
Set cnn = CurrentProject.Connection
Set rst = cnn.OpenSchema(adSchemaProviderSpecific, , adhcUsers)
With rst
Do Until .EOF
intUser = intUser + 1
Debug.Print "User # " & intUser
For Each fld In .Fields
Debug.Print " " & fld.Name & "=" & fld.Value
Next
.MoveNext
Loop
End With
End Sub
... работает через OpenSchema. В Access 2000 метод OpenSchema вызывает ошибку потому что не понимает константу adhcUsers. Вернее константы как раз нет, а есть код, который Microsoft где-то выложила, по крайне мере Гетц про него занл и в книжке его указал. И вот тут непонятки, толи в Access 2000 OpenSchema вообще не может вернуть такую информацию про пользователей, либо просто коды поменялись и нужно уже другой указывать... это я пока не выяснил и потому указанный выше код работает токо в Acc2002. :(
А у тебя с этой базой сами программисты еще работают, т.е. раздать пользователей с правами ты не можешь (и тем более менять код)?
Могу тогда предложить токо вариант:
1. автом. загрузка скрытой формы при открытие базы
2. создание копии нужной таблицы
3. пока пользователь/программист работает тихо себе висим, ждем
4. при закрытии базы делаем сравнение таблиц, выясняем изменения в таблице и зная номера измененных записей в исходной таблице поставляем имя тек. пользователя.
если база зависнет, то конечно никакие изменения не отразятся, но для пущей гарантии, при желании, можно и таймер забабахать, чтобы например каждые полчаса сравнивала и помечала в таблице сделанные пользователем действия.
Опять же вариант не подходит. Во всех mdb-шниках есть стартовые формы, поэтому для отладки они токрываются с шифтом. И вот тут-то никакая скрытая форма не сработает...:{
не знаю почему у меня на Acc2000 такие глюки