01.04.2003, 11:55 | #1 |
Участник
|
безопасность в attain
Столкнулся с проблемой настройки ввода бюджетов в соответствии с назначенными правами доступа.
1)Имеется бюджет."Бюджет Измерение 2 Код" данного бюджета = ЦФО. Значения данного измерения следующие: ЦФО1, ЦФО2, ЦФО3, ЦФО4. 2)В системе заведены 4 пользователя. Каждый должен иметь право просматривать и редактировать только те строки бюджета которые имеют в "Бюджет Измерение 2 Код" код соответствующего ЦФО. Т.е. пользователь1 должен иметь право просматривать и редактировать бюджетные операции по ЦФО1, пользователь2-ЦФО2, пользователь3-ЦФО3, пользователь4-ЦФО4. 3)для этого в системе были заведены 4 роли: -ЦФО1 1)права доступа аналогичные роли ALL(стандартной) добавлены: 2)права доступа на таблицу 95: Чтение - Да 3)права доступа на таблицу 96: Чтение-Да, Вставка-Да, Изменение-Да, Удаление-Да, Фильтр: G/L Budget Entry: "Бюджет Измерение 2 Код"=ЦФО1 4)права доступа на таблицу 361,367 и на остальные необходимые таблицы для простоты -все Да -ЦФО2: -//- G/L Budget Entry: "Бюджет Измерение 2 Код"=ЦФО2 -//- -ЦФО3: -//- G/L Budget Entry: "Бюджет Измерение 2 Код"=ЦФО3 -//- -ЦФО4: -//- G/L Budget Entry: "Бюджет Измерение 2 Код"=ЦФО4 -//- 4)Заведены 4 пользователя им присвоены соответсвующие роли: пользователь1-ЦФО1 пользователь2-ЦФО2 пользователь3-ЦФО3 пользователь4-ЦФО4 5)пользователь входит под своим логином. 6)Финансы->Бюджеты появляется ошибка нарушения доступа: "Вы не имее права чтения для таблицы Фин. Бюджет Операция. Обратитесь к вашему систкмному администратору для изменения ваших прав доступа".Бюджетные операции изначально имеют разные значения в поле "Бюджет Измерение 2 Код" причем если сделать к примеру, отдельную кнопку, которая открывает форму "G/L Budget Entries", то каждый пользователь видит только те записи которые ему назначены - что верно. Путь решения остается один - дописать приблуду на подобие "пользователи настройка права доступа" - по аналогии с безопасностью стандартной. и каждый раз при открытии формы бюджетов, бюджетных операций накладывать соответствующий фильтр.точно также отслеживать и все производимые изменения.В общем - дублирование стандартной функциональности(по правам доступа) но работающей так как надо. Никто не решал подобных задач без дописывания?Если есть какие нибудь соображения подскажите please. |
|
04.04.2003, 16:22 | #2 |
Участник
|
"Доступ фильтр" из "Прав доступа"
это примочка для SQL Option я посмотрел форму 113 Финансы\Бюджеты вероятнее всего дело в следующем Этот фильтр безопасности стоит скажем на таблице 96 (G/L Budget Entry). где-то в в форме мы делаем для таблицы 374 (G/L Acc. Budget Buffer) CALCFIELDS для поля "Budgeted Amount", которое соответственно построено по таблице 96. Перед вычислением поля тоже можно соответственно наложить фильтры, т.е. присвоить "G/L Acc. Budget Buffer"."Budget Dimension 2 Filter" какое-то значение или не присвоить. Если фильтры перед CALCFIELDS не накладывались, т.е. считаем-вычисляем поле как бы по всему диапазону, а таблица по которой считаем имеет фильтр безопасности ее ограничивающий, то получается что при CALCFIELDS пытаемся залесть в закрытую зону и идет сбой. Это очевидно баг. Единственное что можно сделать - так подправить код формы 113, что бы расхождения между фильтрами перед вычислением "G/L Acc. Budget Buffer".CALCFIELDS("Budget Dimension 2 Filter") и фильтром безопасности по "G/L Budget Entry" не возникало я сделал так: 1. в роли наложил фильтры безопасности на 2 таблицы - Table Data 96 Фин. Бюджет Операция G/L Budget Entry: Бюджет Измерение 2 Код = ЗИМА -Table Data 374 Фин. Счет Бюджет Буфер G/L Acc. Budget Buffer: Бюджет Измерение 2 Фильтр =ЗИМА 2. в форме 113 добавил некоторый код (исправления смотри между ALFI) ******* - на OpenForm() CurrForm.GlobalDim1Filter.ENABLED := (GLSetup."Global Dimension 1 Code" <> '') AND (GLAccBudgetBuf.GETFILTER("Global Dimension 1 Filter") = ''); CurrForm.GlobalDim2Filter.ENABLED := (GLSetup."Global Dimension 2 Code" <> '') AND (GLAccBudgetBuf.GETFILTER("Global Dimension 2 Filter") = ''); // ALFI > //до этого объявил 4 глобальные переменные BudgetDim1PremissionFilter (2,3,4) BudgetDim1PremissionFilter := FALSE; BudgetDim2PremissionFilter := FALSE; BudgetDim3PremissionFilter := FALSE; BudgetDim4PremissionFilter := FALSE; IF GLAccBudgetBuf.GETFILTER("Budget Dimension 1 Filter") <> '' THEN BEGIN BudgetDim1Filter := GLAccBudgetBuf.GETFILTER("Budget Dimension 1 Filter"); BudgetDim1PremissionFilter := TRUE; END; IF GLAccBudgetBuf.GETFILTER("Budget Dimension 2 Filter") <> '' THEN BEGIN BudgetDim2Filter := GLAccBudgetBuf.GETFILTER("Budget Dimension 2 Filter"); BudgetDim2PremissionFilter := TRUE; END; IF GLAccBudgetBuf.GETFILTER("Budget Dimension 3 Filter") <> '' THEN BEGIN BudgetDim3Filter := GLAccBudgetBuf.GETFILTER("Budget Dimension 3 Filter"); BudgetDim3PremissionFilter := TRUE; END; IF GLAccBudgetBuf.GETFILTER("Budget Dimension 4 Filter") <> '' THEN BEGIN BudgetDim4Filter := GLAccBudgetBuf.GETFILTER("Budget Dimension 4 Filter"); BudgetDim4PremissionFilter := TRUE; END; CurrForm.BudgetDim1Filter.ENABLED := (GLAccBudgetBuf.GETFILTER("Budget Dimension 1 Filter") = ''); CurrForm.BudgetDim2Filter.ENABLED := (GLAccBudgetBuf.GETFILTER("Budget Dimension 2 Filter") = ''); CurrForm.BudgetDim3Filter.ENABLED := (GLAccBudgetBuf.GETFILTER("Budget Dimension 3 Filter") = ''); CurrForm.BudgetDim4Filter.ENABLED := (GLAccBudgetBuf.GETFILTER("Budget Dimension 4 Filter") = ''); // ALFI < ValidateBudgetName; ******* - в BudgetDrillDown() WITH GLBudgetEntry DO IF (GETFILTER("Global Dimension 1 Code") <> '') OR (GETFILTER("Global Dimension 2 Code") <> '') OR (GETFILTER("Business Unit Code") <> '') THEN SETCURRENTKEY("Budget Name","G/L Account No.","Business Unit Code","Global Dimension 1 Code") ELSE SETCURRENTKEY("Budget Name","G/L Account No.",Date); // ALFI > GLBudgetEntry.FILTERGROUP(4); // это что бы провалившись в суммы не могли сделать Вид\Показать все // ALFI < FORM.RUN(0,GLBudgetEntry); ******* - в ValidateBudgetName() //закоментировал ALFI { IF PrevGLBudgetName.Name <> '' THEN BEGIN IF (GLBudgetName."Budget Dimension 1 Code" <> PrevGLBudgetName."Budget Dimension 1 Code") THEN BudgetDim1Filter := ''; IF (GLBudgetName."Budget Dimension 2 Code" <> PrevGLBudgetName."Budget Dimension 2 Code") THEN BudgetDim2Filter := ''; IF (GLBudgetName."Budget Dimension 3 Code" <> PrevGLBudgetName."Budget Dimension 3 Code") THEN BudgetDim3Filter := ''; IF (GLBudgetName."Budget Dimension 4 Code" <> PrevGLBudgetName."Budget Dimension 4 Code") THEN BudgetDim4Filter := ''; END; } // ALFI > IF PrevGLBudgetName.Name <> '' THEN BEGIN IF (GLBudgetName."Budget Dimension 1 Code" <> PrevGLBudgetName."Budget Dimension 1 Code") AND (NOT BudgetDim1PremissionFilter) THEN BudgetDim1Filter := ''; IF (GLBudgetName."Budget Dimension 2 Code" <> PrevGLBudgetName."Budget Dimension 2 Code") AND (NOT BudgetDim2PremissionFilter) THEN BudgetDim2Filter := ''; IF (GLBudgetName."Budget Dimension 3 Code" <> PrevGLBudgetName."Budget Dimension 3 Code") AND (NOT BudgetDim3PremissionFilter) THEN BudgetDim3Filter := ''; IF (GLBudgetName."Budget Dimension 4 Code" <> PrevGLBudgetName."Budget Dimension 4 Code") AND (NOT BudgetDim4PremissionFilter) THEN BudgetDim4Filter := ''; END; // ALFI < //закоментировал ALFI { GLAccBudgetBuf.SETFILTER("Budget Dimension 1 Filter",BudgetDim1Filter); GLAccBudgetBuf.SETFILTER("Budget Dimension 2 Filter",BudgetDim2Filter); GLAccBudgetBuf.SETFILTER("Budget Dimension 3 Filter",BudgetDim3Filter); GLAccBudgetBuf.SETFILTER("Budget Dimension 4 Filter",BudgetDim4Filter); } // ALFI > IF (NOT BudgetDim1PremissionFilter) THEN GLAccBudgetBuf.SETFILTER("Budget Dimension 1 Filter",BudgetDim1Filter); IF (NOT BudgetDim2PremissionFilter) THEN GLAccBudgetBuf.SETFILTER("Budget Dimension 2 Filter",BudgetDim2Filter); IF (NOT BudgetDim3PremissionFilter) THEN GLAccBudgetBuf.SETFILTER("Budget Dimension 3 Filter",BudgetDim3Filter); IF (NOT BudgetDim4PremissionFilter) THEN GLAccBudgetBuf.SETFILTER("Budget Dimension 4 Filter",BudgetDim4Filter); // ALFI < //закоментировал ALFI { CurrForm.BudgetDim1Filter.ENABLED := (GLBudgetName."Budget Dimension 1 Code" <> ''); CurrForm.BudgetDim2Filter.ENABLED := (GLBudgetName."Budget Dimension 2 Code" <> ''); CurrForm.BudgetDim3Filter.ENABLED := (GLBudgetName."Budget Dimension 3 Code" <> ''); CurrForm.BudgetDim4Filter.ENABLED := (GLBudgetName."Budget Dimension 4 Code" <> ''); } // ALFI > IF (NOT BudgetDim1PremissionFilter) THEN CurrForm.BudgetDim1Filter.ENABLED := (GLBudgetName."Budget Dimension 1 Code" <> ''); IF (NOT BudgetDim2PremissionFilter) THEN CurrForm.BudgetDim2Filter.ENABLED := (GLBudgetName."Budget Dimension 2 Code" <> ''); IF (NOT BudgetDim3PremissionFilter) THEN CurrForm.BudgetDim3Filter.ENABLED := (GLBudgetName."Budget Dimension 3 Code" <> ''); IF (NOT BudgetDim4PremissionFilter) THEN CurrForm.BudgetDim4Filter.ENABLED := (GLBudgetName."Budget Dimension 4 Code" <> ''); // ALFI < PrevGLBudgetName := GLBudgetName; ..... |
|
09.04.2003, 12:53 | #3 |
Участник
|
походу система безопасности в navision оставляет желать лучшего. Что касается фильтрации - то по большому счету надо дописывать причем объем дописок великоват.
|
|
10.04.2003, 14:22 | #4 |
Участник
|
решил сделать следующим образом:
разделил бюджеты по ЦФО - у каждого ЦФО свой бюджет. в этом случае права доступа выставляю на G/L Budget Name(только чтение ДА) и G/L Budget Entry(все ДА) - фильтр по имени бюджета. Пришлось добавить в форму 113 в ф-цию ValidateBudgetName строку GLBudgetName.SETPERMISSIONFILTER; НО теперь трабл в другом: при попытке добавить операцию в форме бюджетных операций(форма 120) опять вываливается ошибка - Вы не имеете права чтения таблицы Фин. Бюджет Оперция. Подскажите pls кто нить -в чем может быть проблема? PS: Вообще непонятно - как может финансовая система иметь подобную кривую систему разграничения доступа - каким образом тогда она позиционируется на рынке. |
|
10.04.2003, 15:27 | #5 |
Участник
|
проблема в триггере OnInsert таблицы 96 G/L Budget Entry есть вызов ф-ции GetNextEntryNo - для вычисления следующего номера. вот ее код:
GLBudgetEntry.SETCURRENTKEY("Entry No."); IF GLBudgetEntry.FIND('+') THEN EXIT(GLBudgetEntry."Entry No." + 1) ELSE EXIT(1); опять же - так как на G/L Budget Entry устнановлен фильтр безопасности по имени бюджета - то вызов уже FIND('+') - приводит к нарушению доступа. Если сделать что то типа GLBudgetEntry.SETPERMISSIONFILTER перед FIND - то будет пытаться вставить запись с возможно уже имеющимся "Entry No." - ошибка записи. выход - снять фильтр с G/L Budget Entry и устанавливать фильтрацию перед вызовом формы бюджетных операций с помощью FILTERGROUP - но тоже не все так гладко. в общем конечного решения пока не нашел. у кого есть какие соображения - поделитесь pls. |
|
11.04.2003, 18:07 | #6 |
Участник
|
для Alex_V
Alex_V а нужно ли тебе разделять бюджеты по ЦФО. (то есть каждому ЦФО свой бюджет).
Может тебе нужно разделить строки бюджета по ЦФО (Бюджет один, а у каждого ЦФО свои строки). Подумай..... |
|
11.04.2003, 18:22 | #7 |
Участник
|
так было в самом начале этой темы(один бюджет - но одно из измерений - ЦФО). Но процесс реализации системы разгр. дост. в этом случае более сложный и в конечном счете менее гибкий.
Во-первых помимо бюджетов мне далее надо было аналошично разграничивать доступ в фин. отчетах и аналитических отчетам. Во-вторых - порядок бюджетных измерений может быть любой. Стоит кому то с соотв. правами его поменять не изменив permission filter и данные будут отображаться неверные. А в принципе я уже почти реализовал разграничение прав. Но хотелось бы все таки знать побольше вариантов решения данной задачи. Но все равно спасибо за участие. |
|
11.04.2003, 19:05 | #8 |
Участник
|
Слушай а как ты решаешь (собираешься решать) тогда вопрос показа и работы со сводными данными бюджетов.
Ведь на разном уровне упр. иерархий необходимо показвать и работать с разными строками бюджета? Не уж то копированием? Вот, к стати не обязательно заводить ЦФО как измерение. Для реализации того метода с которого ты начинал. |
|
14.04.2003, 12:29 | #9 |
Участник
|
именно копированием(стандартная ф-ция "копирование бюджетов"). дело в том что работать со сводным бюджетом достаточно тяжело когда там море информации. поэтому то и сделали что у каждого ЦФО свой бюджет. там они видят всю интересующую их инфу в одном месте, а не вытаскивают из разных мест. К тому же при составлении бюджета на следующий период - ЦФО уже будут использовать готовые шаблоны. Сводный бюджет нужен по большей части только верхнему уровню управленческой иерархии.
|
|
|
Похожие темы | ||||
Тема | Ответов | |||
Navision Attain через Citrix | 2 | |||
Серьезно про RBO (Attain) | 8 | |||
Переход на Navision Attain | 3 | |||
attain - Переход на attain | 8 | |||
1С и Attain | 2 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|