Ситуация в следующем:
В администрировании создал Группы (Школы). Установил им определенные права, т.е. если Школа 1 добавила Студента 1, то Школа 2 не видит данного студента. Аналогично если Школа 2 добавила Студента 2, то Школа 1 не видит его. Примерно выглядит следующим образом:
Теперь на карточке дублей необходимо создать кнопку "Использовать найденного клиента". Описание:
Школа 1 добавила Студента 3 к себе. Теперь Студент 3 хочет учиться, помимо Школы 1, и в Школе 2. Школа 2 добавляет его к себе. Всплывает окно дублей о том что студент уже есть в базе. Суть кнопки в следующем: берется найденный студент и добавляется в Школу 2, но чтобы он был виден и Школе 1 и в Школе 2. Примерно отобразил следующем рисунке:
Как я понимаю необходимо в деталь "Доступ" (по найденному дублю записи) добавить запись с Группой (Школой). Встает встречный вопрос: как узнать Группу (Школу) в которой находится входящий в систему пользователь. Есть ли такая табличка с пользователем и соответствующей ему Группе (Школе)?
Нашел способ. Итак что я сделал:
В скрипте scr_SubjectDuplicates создал глобальную переменную
На OnPrepare окна дублей добавил следующее
var Sender = Self.Attributes('DuplicatesProperties').NotifyObject;
if (Sender.Name == 'wnd_ContactEdit') {
DublContact = 1
}
и на кнопку "Использовать найденного клиента"
function btnUseOnClick(Control) {
if (DublContact == 1) {
var ds_Contact = Services.GetNewItemByUSI('ds_Contact');
var Sender = Self.Attributes('DuplicatesProperties').NotifyObject;
var ID = Self.Attributes('DuplicatesProperties').SubjectDataset.Values('ID');
SetAttribute(Sender, 'IDRecord', ID);
SetAttribute(Sender, 'IsDuble', true);
btnUse.ModalResult = wmrCancel;
}
}
Далее на кнопк Ок
function btnOKOnClick(Control) {
var Dataset = dlData.Dataset;
if (!CheckContactData(Dataset)) {
return;
}
CheckName();
CheckEmail();
SetAttribute(Self, 'IDTo', dlData.Dataset.Values('ID'));
scr_BaseDBEdit.btnOKOnClick(Control);
// Если есть дубль но вызов функции
var IsDuble = Self.Attributes('IsDuble');
if (IsDuble == true) {
FillDublicatesValues();
Self.Close();
}
}
где в функции FillDublicatesValues()
взял Connector.CurrentUser.ContactID входящего.
Отфильтровал tbl_AdminUnit, поле UserContactID по Connector.CurrentUser.ContactID.
Взял ID
Отфильтровал tbl_UserInGroup, поле UserID по ID.
Взял все GroupID и вставил в tbl_ContactRight, т.е.
function FillDublicatesValues() {
var ID = Self.Attributes('IDRecord');
var ds_Contact = Services.GetNewItemByUSI('ds_Contact');
var DatasetTo = Services.GetNewItemByUSI('ds_Contact');
var IDTo = Self.Attributes('IDTo');
var ds_ContactRight = Services.GetNewItemByUSI('ds_ContactRight');
ApplyDatasetFilter(ds_ContactRight, 'RecordID', ID, true)
ds_ContactRight.Open();
var IncomingUser = Connector.CurrentUser.ContactID;
var ds_AdminUnit = Services.GetNewItemByUSI('ds_AdminUnit');
ApplyDatasetFilter(ds_AdminUnit, 'UserContactID', IncomingUser, true);
ds_AdminUnit.Open();
var AdminUnitID = ds_AdminUnit.Values('ID');
var ds_UserInGroup = Services.GetNewItemByUSI('ds_UserInGroup');
ApplyDatasetFilter(ds_UserInGroup, 'UserID', AdminUnitID, true);
ds_UserInGroup.Open();
while (!ds_UserInGroup.IsEOF) {
var GroupID = ds_UserInGroup.Values('GroupID');
while (!ds_ContactRight.IsEOF) {
if(ds_ContactRight.Values('AdminUnitID') != GroupID) {
var IQ = Services.GetNewItemByUSI('iq_ContactRight');
IQ.ColumnsValues.ItemsByName('ID').Value = Connector.GenGUID();
IQ.ColumnsValues.ItemsByName('RecordID').Value = ID;
IQ.ColumnsValues.ItemsByName('AdminUnitID').Value = GroupID;
IQ.ColumnsValues.ItemsByName('CanRead').Value = true;
IQ.ColumnsValues.ItemsByName('CanWrite').Value = true;
IQ.ColumnsValues.ItemsByName('CanDelete').Value = false;
IQ.ColumnsValues.ItemsByName('CanChangeAccess').Value = false;
IQ.Execute();
}
ds_ContactRight.GoToNext();
}
ds_UserInGroup.GoToNext();
}
}
Думаю кому то в будущем пригодится!