Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как в Access подставить в поле по умолчанию имя пользователя?

266
06 сентября 2004 года
mhaturov
901 / / 23.10.2003
Беда. Имею Jet-таблицу. В одно из её полей должно писаться имя юзверя, который добавляет запись. Задаю значение по умолчанию. Нифига не выходит. Пытался задавать тип поля Текст (255) и МЕМО. Пытался использовать следующие методы:
1). Пытаюсь подставить в поле значение системной функции GetUser(). Сообщает, что такой нет.
2). Пишу в модуле свою функцию, возвращающую имя текущегог пользователя, но не заню, как подключить пользовательскую функцию (или её изначально надо откомпилить как библиотеку?).
3). Написал запрос, ну типа Select GetUser(). Пытаюсь по умолчанию подсовывать результат выполнения этого запроса. Оказываюсь посланым.
Что делать? Как установить по умолчанию имя текщего пользователя? Делать нужно именно в Access - такова задача, к сожалению...
Заранее всем спасибо!
258
06 сентября 2004 года
SergeySV
1.5K / / 19.03.2003
Завтра гляну, помойму у Гетца был готовый пример...
а у тебя что за база? mdb сетевая, к которой пользователи подключаются и тянут таблицы?
266
06 сентября 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by SergeySV
Завтра гляну, помойму у Гетца был готовый пример...
а у тебя что за база? mdb сетевая, к которой пользователи подключаются и тянут таблицы?


Не, вариант до глупого прост. БД локальная (при запуске копируется). Состоит сплошь из прилинкованных таблиц, но нужна 1 таблица на уровне Jet, то есть mdb - файла в которой нужно отслеживать имена юзверей, производящих изменения какие-либо. Причём работать это должно как при обращении из кода (что само по себе легко), так и при обращении непосредственно к таблицы через интерфейсы СУБД.

258
07 сентября 2004 года
SergeySV
1.5K / / 19.03.2003
Хм, не знаю то ли тебе нужно, но вот ADO позволяет создавать наборы записей с информацией о текущих пользователях базы данных: имя компьютера, имя пользователя, статус коннекта..
258
07 сентября 2004 года
SergeySV
1.5K / / 19.03.2003
и вторая часть:
266
07 сентября 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by SergeySV
и вторая часть:


Спасибо, но это - немного не то. Дело в том, что у меня имеется таблица, в которой в одно поле автоматом должно писаться имя пользователя, добавляющего запись. Ну, по дефолту, то есть. А в Акцессе НЕТ системной функции, которую можно было бы в этом случае прописать по дефолту.
Функция 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", а то тама люди ждут меня, а у меня сейчас траблы и некогда отвечать на посты. ОК? Огромное спасибо, что подхватил их во время моего отпуска.

258
07 сентября 2004 года
SergeySV
1.5K / / 19.03.2003
А понял, это к вопросу о триггерах. Проблема в том, чтобы в овую запись автоматом заполнялось одно из полей!? К сожалению, это не возможно, в Access нельзя для значения по умолч. задавать СВОИ функции, только встроенные. Остается отлавливать событие добавление/изменение записи в таблице и самому заполнять это поле именем пользователя. Но это уже триггеры, которых в Access тоже нет. Единственная возможность реализации такого псевдотриггера для Access я вижу только в ограничение работы пользователей опр. формами (как правила во всех базах пользователь работает не напрямую с данными, а через форму) и уже в самой форме сделать контроль добавления/изменения данных в таблице, это уже реализовать средствами VB можно... Просто у Access такая концепция заложена, что пользователь в базе работает с данными именно через формы (у них и формы спец., с подсоед. Recordset), а уже в них ты как разработчик средствами VB можешь реализовать все что задумано, т.е. логика конечно чисто клиентская, в том смысле что если mdb и выполняет роль сервера (файл сервера, а клиентов mbd прилинкованные с него таблицы), то всю логику по контролю придется закладывать именно в клиентские mdb, а иначе это уже надо переходить на MS SQL в качестве сервера где ты уже не зависишь от клиентов и можешь вертеть данными как хочешь вне зависимости че там себе клиент пыхтит



Цитата:
Originally posted by mhaturov
И ещё, SergeySV, если не трудно, поведи, плз, пока темы "http://forum.codenet.ru/showthread.php?threadid=15556&goto=newpost" и "http://forum.codenet.ru/showthread.php?threadid=15810&goto=newpost", а то тама люди ждут меня, а у меня сейчас траблы и некогда отвечать на посты. ОК? Огромное спасибо, что подхватил их во время моего отпуска.



ОК

266
07 сентября 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by SergeySV
А понял, это к вопросу о триггерах. Проблема в том, чтобы в овую запись автоматом заполнялось одно из полей!? К сожалению, это не возможно, в Access нельзя для значения по умолч. задавать СВОИ функции, только встроенные. Остается отлавливать событие добавление/изменение записи в таблице и самому заполнять это поле именем пользователя. Но это уже триггеры, которых в Access тоже нет. Единственная возможность реализации такого псевдотриггера для Access я вижу только в ограничение работы пользователей опр. формами (как правила во всех базах пользователь работает не напрямую с данными, а через форму) и уже в самой форме сделать контроль добавления/изменения данных в таблице, это уже реализовать средствами VB можно... Просто у Access такая концепция заложена, что пользователь в базе работает с данными именно через формы (у них и формы спец., с подсоед. Recordset), а уже в них ты как разработчик средствами VB можешь реализовать все что задумано, т.е. логика конечно чисто клиентская, в том смысле что если mdb и выполняет роль сервера (файл сервера, а клиентов mbd прилинкованные с него таблицы), то всю логику по контролю придется закладывать именно в клиентские mdb, а иначе это уже надо переходить на MS SQL в качестве сервера где ты уже не зависишь от клиентов и можешь вертеть данными как хочешь вне зависимости че там себе клиент пыхтит





ОК



У меня беда следующая, на самом деле. Имеется некая таблица, все события в которой должны протоколироваться. Причём это должна быть Jet-таблица в самом mdb, ну по определённым требованиям. Группы Access 2000 тоже создавать нельзя по определённым требованиям. Пользователь работает с ней через формы. Но, блин, некоторые особо умные пользователи, как накосячат, бегут к программистам и просят "немножко поправить данные в самой базе", да и "особо продвинутые" юзверя тоже попадаются. Если это не критично - нет проблем. Но именно в этой таблице ВСЕ данные должны протооколироваться. Я хочу, что бы из таблицы ничего не удалялось. Только, в случае удаления записи, менялся флаг использования записи и проставлялась дата её удаления, а взамен появлялась аналогичная ей с новыми параметрами. В удалённой записи появлялось имя пользователя, который её удалил, а в новой - имя пользователя, который её добавил. Таким образом, всегда можно отследить, кто и что менял. Таблица особо дуться не будет, так как она для действий, что производятся 1 раз в год.
В принципе, можно предупредить программисто о том, что бы данную таблицу не трогали. Но человеческий фактор исключить нельзя. И, если, например, есть у нас в SQL - БД триггер, который ведёт лог-файл, то программисту может просто лень будет его отключать или чистить лог и он откажет нерадивому юзверю. А в нашем случае программеру НИЧЕГо не мешает нарушить правила. Да и потом не стоит забывать. что программист просто может забыть о правилах, а отслеживание изменений в этой таблице очень критично...

266
07 сентября 2004 года
mhaturov
901 / / 23.10.2003
Сергей, у меня не открываются файлы, что ты тут выложил. Пишет, что у меня - старая версия Access (у меня 2000-й). Скинь пример получения имени машины и пользователя? ОК? Я сам сейчас воспользовался GetComputerNameA
258
07 сентября 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by mhaturov
Сергей, у меня не открываются файлы, что ты тут выложил. Пишет, что у меня - старая версия Access (у меня 2000-й). Скинь пример получения имени машины и пользователя? ОК? Я сам сейчас воспользовался GetComputerNameA



Упс.. не получится, вот код функции:

Код:
Sub ListUsers()

    ' 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. при закрытии базы делаем сравнение таблиц, выясняем изменения в таблице и зная номера измененных записей в исходной таблице поставляем имя тек. пользователя.

если база зависнет, то конечно никакие изменения не отразятся, но для пущей гарантии, при желании, можно и таймер забабахать, чтобы например каждые полчаса сравнивала и помечала в таблице сделанные пользователем действия.
266
07 сентября 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by SergeySV


Упс.. не получится, вот код функции:
Код:
Sub ListUsers()

    ' 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-шниках есть стартовые формы, поэтому для отладки они токрываются с шифтом. И вот тут-то никакая скрытая форма не сработает...:{

258
07 сентября 2004 года
SergeySV
1.5K / / 19.03.2003
На счет списка пользователей.... у Microsoft все работает и в Acc2000: http://support.microsoft.com/default.aspx?scid=kb;en-us;198755

не знаю почему у меня на Acc2000 такие глюки
258
07 сентября 2004 года
SergeySV
1.5K / / 19.03.2003
Может тогда пусть эта таблица лежит в отдельной mdb, а во всех остальных mdb-ка пусть прилинкуют эту таблицу, в работе с этой таблицей они разницу непочувствуют, ну а с файл-серверной mdb-кой можно уже и поколдовать
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог