07.09.2006, 12:53 | #11 |
Axapta
|
Цитата:
Сообщение от itfs
Хорошая идея, раздвигает возможности RLS на 1 шаг по связям.
Цитата:
1. фильрт можно руками снять, надо его лочить;
Цитата:
2. даже залоченный фильтр можно сбить (глюк аксапты), поэтому нужно, чтобы фильтр восстанавливался всякий раз на executeQuery().
Цитата:
3. забавный эффект, если забыть сами RContractTable ограничить ...
Следующая версия, исправлена возможность снятия фильтра руками. Спасибо, itfs. X++: public void new(anytype _p1) { // custom RLS, OIP, 05.09.06 --> int i,j,k; QueryBuildRange r; QueryBuilddatasource ds; QueryBuilddatasource childDS; QueryBuilddatasource intDS; QueryBuilddatasource restrictDS; Query q; SysRecordLevelSecurity RLSTable; Query restriction; userGroupId groupId; userGroupList groupList; // custom RLS, OIP, 05.09.06 <-- if (_p1) { super (_p1); if (this.args() && !this.args().caller() && typeOf(_p1) == Types::Class && !SysdictClass::isEqualOrSuperClass(classidget(_p1), classNum(Query))) { this.args().caller(_p1); } // custom RLS, OIP, 05.09.06 --> q = this.query(); for(i=1; i<= q.dataSourceCount(); i++) { ds = q.dataSourceNo(i); while select RLSTable where RLSTable.tabId == ds.table() join groupList where groupList.groupId == RLSTable.groupId && groupList.userId == curUserId() { if(RLSTable.restriction != conNull() && sysQuery::isPackedOk(RLSTable.restriction)) { restriction = new QueryRun(RLSTable.restriction).query(); if(restriction.dataSourceCount()>1) { for(j=2;j<= restriction.dataSourceCount();j++) { restrictDS = restriction.dataSourceNo(j); intDS = restrictDS.parentDataSource(); if (!SysQuery::tableOccurrence(q, restrictDS.table(), q.dataSourceCount())) { childDS = q.dataSourceTable(intDS.table()).addDataSource(restrictDS.table()); childDS.relations(true); childDS.joinMode(JoinMode::ExistsJoin); childDS.fetchMode(QueryFetchMode::One2One); } else { childDS = q.dataSourceTable(restrictDS.table()); } for(k=1;k<=restrictDS.rangeCount();k++) { r = SysQuery::findOrCreateRange(childDs, restrictDS.range(k).field()); r.value(restrictDS.range(k).value()); r.status(RangeStatus::Hidden); } } } } } } } // custom RLS, OIP, 05.09.06 <-- loadLastUsedQuery = true; saveQueryPrUser = true; allowSave = true; allowAddRange = QueryAllowAdd::AllFields; allowAddSorting = QueryAllowAdd::AllFields; showSorting = true; } Последний раз редактировалось oip; 07.09.2006 в 22:54. |
|
|
За это сообщение автора поблагодарили: mazzy (5), anykey (1). |
Теги |
faq, rls, законченный пример, полезное, права доступа на уровне записей (rls), связанная таблица, связанные сущности |
|
|