05.08.2009, 14:17 | #1 |
Сам.AX
|
Расчеты с персоналом. Ограничение доступа к календарям
Приветствую господа!
Помогите разобраться с вопросом ограничения доступа к списку календарей. В целом задача стоит так: Есть несколько человек, которые отвечают каждый за свой отдел (подразделение). Они самостоятельно формируют календари и создают табеля по календарям. Задача сототит в том, чтобы дать им доступ только к своим календарям. Проборвл через Безопасность на уровне записей. Строил запрос Календари - 1:n - Сотрудник - Код подразделения = <подразделение пользователя>. Показывает только его календари (вернее календари из сотрудников его подраздеоения). Это не подходит, потому что если потребуется завести новый календарь, он там отражаться не будет. Посоветуйте как быть. Спасибо. |
|
05.08.2009, 15:20 | #2 |
Участник
|
Задача состоит в том, чтоб каждый ответственный за отдел видел только созданные им календари, или чтоб еще "ответственный над ответственными" например видел все календари.
Мне какется без модификации не обойтись. Если первый вариант - можно на таблице WorkCalendarTable добавить поле в настройках CreatedBy и по нему фильтровать на форме и в лукапе. Форму причем можно фильтровать с помощью стандартного фильтра. Если второй вариант - ИМХО надо создавать таблицу прав для календарей.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
05.08.2009, 15:35 | #3 |
Сам.AX
|
|
|
05.08.2009, 15:39 | #4 |
Сам.AX
|
Тогда календарь будет видеть только тот кто его создал, а, допустим, его заместитель его уже не увидит.
|
|
05.08.2009, 15:40 | #5 |
Сам.AX
|
plumbum,
А про второй вариант можете подробнее немного? |
|
05.08.2009, 16:12 | #6 |
Участник
|
Можно привязать права доступа к пользователю и ко всем
Приведу пример еще и для случая с общими для всех календарями Надо создать таблицу "Права доступа к календарям" (например) такого вида: Table EmplCalendarPermissionTable X++: Fields: TableAll calendarCode - All, . CalendarId calendarRelation - All TableAll emplCode - All, EmplId emplRelation - All Далее создать relation к таблицам EmplTable и WorkCalendarTable X++: EmplCalendarPermissionTable.EmplCode == TableAll::Table && EmplCalendarPermissionTable.EmplRelation == EmplTable.EmplId EmplCalendarPermissionTable.CalendarCode == TableAll::Table && EmplCalendarPermissionTable.CalendarRelation == WorkCalendarTable.CalendarId Посмотрите следующие таблицы: InventPosting PriceDisctTable CustVendExternalItem (форма с таким же названием как раз показывает как фильтровать) Удачи!
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! Последний раз редактировалось plumbum; 05.08.2009 в 16:15. |
|
|
За это сообщение автора поблагодарили: Alexx7 (1). |
06.08.2009, 08:42 | #7 |
Сам.AX
|
А что можно придумать, чтобы не переопределять потом LookUp() в других формах?
|
|
06.08.2009, 10:16 | #8 |
MCITP
|
Цитата:
Примеров таких в АОТ много, например на складских аналитиках - сделайте что-то похожее.
__________________
Zhirenkov Vitaly |
|
06.08.2009, 10:21 | #9 |
Сам.AX
|
to ZVV
Можете немного подробнее? |
|
06.08.2009, 10:44 | #10 |
MCITP
|
Возьмите тип например InventSerialId.
У него в EDT указана форма лукапа: InventSerialIdLookup. Берите эту форму как пример и делайте свою такую же, только у вас будет в 2 раза проще, т.к. в этих формах выбора складских аналитик там обрабатывается связка с номенклатурой и закладка "В наличии". Вам всё это не надо, вам просто свою основную кверю написать в этой форме... Но зато поразбираетесь - интересно. После этого указываете свою новую форму у EDT CalendarId. И вуаля - все лукапы по умолчанию к этому типу данных будут использовать эту новую форму.
__________________
Zhirenkov Vitaly |
|
06.08.2009, 10:57 | #11 |
Сам.AX
|
Я не даун, но вопрос тупой.
А что такое ETD? |
|
06.08.2009, 10:59 | #12 |
MCITP
|
Что такое ETD - сорри, не знаю.
А EDT - Extended Data Type, т.е. тип данных. AOT -> Data Dictionary -> Extended Data Types
__________________
Zhirenkov Vitaly |
|
06.08.2009, 11:02 | #13 |
SAP
|
Я как то делал похожею задачу, сделал ее следующим образам, читал орг. структуру предприятия, определял пользователя который вошел, потом сотрудника, потом всех подчененных его и показывал ему только те данные за которые отвечает он или его сотрудники, а да и еще для ускорения доступа к иерархии пришлось сформировать пакетное задание которое хранило иерархию пользователей в виде дерева, но наверное это слишком сложно и специализировано, Вам лучше подойдет вариант который предложил plumbum.
|
|
06.08.2009, 11:28 | #14 |
Сам.AX
|
|
|
10.08.2009, 09:00 | #15 |
Сам.AX
|
Цитата:
1. Создал форму RPayCalendarLookUp 2. EDT - CalendarID - FormHelp поставил RPayCalendarLookUp сохранил. Не вылазит моя форма. |
|
10.08.2009, 11:34 | #16 |
Участник
|
Посмотрите EDT ConfigId, там все описано как должно быть
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
10.08.2009, 11:54 | #17 |
Сам.AX
|
Ага. Разобрался.
Не туда подставлял просто . Надо было в EDT - RPayCalendarId. Теперь проблема в другом. Никаких фильтров на своей форме (RPayCalendarLookUp ) не делал, а при выборе показывает пустую форму (хотя записи там есть, если открывть её из AOT). Где посмотреть. Подскажите. Спасибо. |
|
10.08.2009, 12:59 | #18 |
Участник
|
1. Посмотрите на вашем типе (EDT) Relations
2. Посмотрите Relations на таблице, которая есть датасоурсом формы-лукапа
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! Последний раз редактировалось plumbum; 10.08.2009 в 13:04. |
|
10.08.2009, 13:47 | #19 |
Сам.AX
|
Вобщем сделал. Но всё равно подругому получилось. Пришлось лукапы в форме переопределять. Вот как сдесь http://erpkb.com/Axapta/lookup
В итоге вот такой код. X++: str 5 usrId; sysCompanyUserInfo emplCompany;// Таблица пользователей emplTable emplTbl;// Сотрудники str 15 deportCode;// Подразделения rpayCalendDeport calendarDep; str strRange; SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(RPayCalendarTable), this); Query query = new Query(); QueryBuildDatasource queryBuildDatasource = query.addDataSource(tableNum(RPayCalendarTable)); ; //super(); sysTableLookup.addLookupfield(fieldNum(RPayCalendarTable, calendarId)); sysTableLookup.addLookupfield(fieldNum(RPayCalendarTable, name)); // Кусман кода из FormInit'a RPayCalendarTable usrId = curUserId(); while select emplCompany where emplCompany.UserId == curUserId() { select emplTbl where emplTbl.EmplId == emplCompany.EmplId; deportCode = emplTbl.PayHRMOrganizationId_RU; } while select calendarDep where calendarDep.PayHRMOrganizationId_RU == deportCode { strRange = strRange+','+calendarDep.RpayCalendatId; } queryBuildDatasource.addRange(fieldNum(RPayCalendarTable, calendarId)).value(strRange); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); |
|
10.08.2009, 16:39 | #20 |
Участник
|
Ваша идея ясна, но все таки вы вроде не учли варианта, когда какому-то пользователю доступны все календари (TableAll::All)
Запихните обязательно этот код в статический метод таблицы и сделайте чтоб он на сервере выполнялся. Я бы все таки попробывал сджойнить 2 таблицы Exists join, вместо перебора
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
Теги |
законченный пример, календарь, расчеты с персоналом |
|
|