Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: access 2010
 
 автор: duh_si   (23.07.2013 в 12:04)   личное сообщение
43 Кб.
 
 

День добрый. Помогите пожалуйста с функцией(я начинающий и пока сам код пишу очень плохо) Суть такова см.рис на форме у меня кнопки, в кнопке в событии на вход я обращаюсь к публичной функции ObjName, в параметр я пишу название этой самой кнопки,..теперь вопрос: как в функции

Option Compare Database

Public Function ObjName(NameControl As String)
 S = 'и тут код для получения названия
End Function

получить название этой кнопки в переменную(в моем случае "Кнопка2")

  Ответить  
 
 автор: osmor   (23.07.2013 в 12:08)   личное сообщение
 
 

Вопрос не совсем понятен.
Если вы передаете название кнопки, то оно и есть значение переменной NameControl...
Вообще посмотрите screen.activecontrol

  Ответить  
 
 автор: duh_si   (23.07.2013 в 12:34)   личное сообщение
 
 

да, возможно плохо описал задачу, да и всех тонкостей VBA я еще не знаю(плохо еще что нельзя на словах объяснить. так понятнее было бы сразу). Смотрите повесил я эту функцию на "кнопку2"

Public Function ObjName(Кнопка2 As String)
 
т.е и писать нужно таким образом?
мне просто нужно потом сделать тоже самое с "Кнопкой3" и т.д
т.е уже будет
Public Function ObjName(Кнопка3 As String)
это же куча функции для каждой кнопки, а меня интересует возможно ли обращаться к одной функции но изменяться будет только название кнопок или это каким другим способом организовать можно..

  Ответить  
 
 автор: osmor   (23.07.2013 в 14:50)   личное сообщение
 
 

так попробуйте.

Public Function objName()
debug.print screen.activecontrol.Name
end function

  Ответить  
 
 автор: duh_si   (23.07.2013 в 17:02)   личное сообщение
48 Кб.
 
 

Спасибо за подсказку...возможно если я вам полностью опишу все задачу то вам будет понятнее что за функцию я пытаюсь сделать( и так как у вас опыта в VBA больше чем у меня возможно вы подскажете какие нибудь альтернативы и лучшие варианты). В общем задача у меня стоит сделать права доступа по пользователям, сейчас вроде как финишняя премая (и время поджимает и начальник не добро смотрит на меня), для чего мне нужна эта функция, см.рис - запрос1 сделан на основе таблицы в которой занесенны: Формы, объекты которые на ней находятся и имена этих объектов,.. Закуп, иниц, вед - это роли пользователей, у пользователя своя роль и соответственно при ней какие то объекты доступны какие то нет.(Р-редактирование, Ч-чтение,НД-недоступно,НВ-невидимо) Столбец Право - это ранг опции, чтобы они могли перекрывать друг друга. т.е Р всегда будет главнее Ч,НД,НВ... Ч будет главнее НД,НВ и т.д....
Для чего мне нужна переменная с именем объекта, чтобы сделать фильтрацию, т.е в Условие отбора я ставлю эту переменную Obj

Public Function ObjName()
Obj = Screen.ActiveControl.Name
End Function
может в условие отбора нужно поставить ObjName (здесь я прошу поправить меня, если я ошибаюсь и в условие отбора как то иначе нужно помещать эту переменную)
Далее после того как произойдет фильт в запросе останется одна строка, в моем случае Кнопка2, дальше запросом из столбца Право берем значение которое там находится помещаем это в переменную Prav
Ну а дальше функция продолжает свою работу
If Prav = Нд Then
Ме.кнопка2.Enabled = false
Else
If Prav = ч Then
ну и т.д
И в итоге объект будет либо доступен толь для чтения , редактирования или вообще будет скрыт.
Еще большой вопрос для меня в какое событие это все должно выполнятся, т.е при запуске формы пользователь уже должен видеть что закрыто от него, а что доступно.

  Ответить  
 
 автор: osmor   (23.07.2013 в 18:13)   личное сообщение
 
 

вникать нет сил...


Public Function ObjName() as string
ObjName = Screen.ActiveControl.Name
End Function 

запрос в этом случае будет выглядеть так

select ..... from .... where [НазваниеОбъекта] = ObjName

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

  Ответить  
 
 автор: osmor   (23.07.2013 в 19:54)   личное сообщение
 
 

Общая идея наверное должна быть такой.
Если таблицы определяющие: Роли, пользователей, соответствие пользователей Ролям, и доступность контролов разным Ролям (именно ролям, а не пользователям, так проще управлять)
При загрузке формы, делаются доступными контролы доступные Роли текущего пользователя.
реализации могут быть разные. Правильнее всего, наверное, вынести этот функционал в отдельный класс. Но я так понимаю это ПОКА не Ваш случай (со всем уважением).
Тогда функция.
Если не нужно управлять доступностью на уровне записей, а только для формы целиком, то "Вешается" на событие загрузка формы.
В функцию в качестве параметра передается объект Form, текущей формы (ME).
В функции делается запрос к таблице определяющей доступность контролов. С условиями:
- текущая роль пользователя (должна браться из сеанса,пользователь, же авторизуется?)
- название открывающейся формы, его можно получить из переданного объекта
Результат запроса в рекордсет (Recordset)
После этого перебирая записи рекордсета устанавливаете свойства контролов, обратиться к контролам можно через переданных объект формы
frmCurrent.Controls("ИмяКонтрола).НужноеСвойство = ......

Ну вот как-то так

  Ответить  
 
 автор: snipe   (23.07.2013 в 20:34)   личное сообщение
 
 

маленькое предложение
форму авторизации юзера не закрывать, а скрывать (т.е. вместо команды закрытия формы сделать так forms!"Авторизация".Visible=false)
в этом случае возможно считывание данных с формы (без использования публичных переменных, которые при возникновении ошибки слетают)

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList