Изменение Caption закладки в зависимости от наличия в ней данных
И все же в продолжение идеи о подсветке закладок предлагаю альтернативный вариант решения этой задачи. Все равно решение этой задачи востребовано среди пользователей. Согласна, реализация этой задачи абсолютно для всех закладок приведет к большому количеству запросов, отправляемых на сервер.
Но, как показывает практика, для пользователя важны не все, а лишь часть. Поэтому реализация подобного функционала не приведет к большой нагрузке сервера.
Предлагаю рассмотреть пример изменения Caption закладки "Адрес" раздела "Контрагенты" при наличии в ней записей на "Адрес*" (здесь можно придумать какие угодно варианты).
Итак, необходимо выполнить следующие действия:
1. Открываем сервис wnd_AccountsWorkspace, выделяем элемент деталей и переходим в обработчик события OnChangeActivePage.
2. В обработчике прописываем следующий код:
if (pcDetails.ActivePage.Name == pgAddressesDetail.Name) { // вместо pgAddressesDetail нужно вставить название //Вашей закладки
if (!IsDatasetEmpty(wndAddressesDetail.Window.ComponentsByName('dlData').Dataset)) { // вместо wndAddressesDetail нужно вставить название окна //закладки
pgAddressesDetail.Caption = 'Адреса';
} else {
pgAddressesDetail.Caption = 'Адреса*'
}
}
Вышеприведенный код реализует смену Caption закладки при смене активной закладки в менеджере деталей.
3. Затем откройте закладку "Невизуальные", выделите датасет dlAccounts и перейдите в обработчик события OnDatasetAfterPositionChange.
4. Вставьте в обработчик события следующий код:
RefreshDetails();
}
Dataset.Attributes('IsNew') = false;
var AccountID = Dataset.Values('ID');
var AddressDataset = Services.GetNewItemByUSI('ds_AccountAddress'); // вместо //ds_AccountsAddress нужно указать датасет соответсвующей //закладки
ApplyDatasetFilter(AddressDataset, 'AccountID', AccountID, true);
AddressDataset.Open();
var AddressDatasetIsEmpty = IsDatasetEmpty(AddressDataset);
AddressDataset.Close();
if (!AddressDatasetIsEmpty) {
pgAddressesDetail.Caption = 'Адреса';
} else {
pgAddressesDetail.Caption = 'Адреса*'
}
Вышеприведенный код реализует смену Caption закладки при переходе по записям в основном реестре.
5. Сохраните все внесенные изменения. Перезапустите рабочее приложение Terrasoft CRM и протестируйте работоспособность системы.
По аналогии с этим примером у Вас будет возможность реализовать подобный функционал для необходимого Вам раздела и нужной детали.
Желаю удачи!
С уважением,
Мельникова Екатерина
Код в OnChangeActivePage реализует смену Caption закладки при смене активной закладки в менеджере деталей. Конкретный пример: у пользователя активна одна запись в реестре и какая-то закладка в менеджере деталей. В этот момент другой пользователь может добавить записи на закладку, которая сейчас у первого не активна. Таким образом, при переходе на эту закладку первым пользователем - Caption меняется.
Так основной смысл был знать наличие записей до перехода на закладку. После перехода и так понятно есть они там или нет.
"Underscore a.k.a. _" написал:Так основной смысл был знать наличие записей до перехода на закладку
До перехода и будем знать, если перейдем не в Адреса, а в любую другую. В любом случае необходимы события, не вешать же для этого таймер.
"Ключник Алексей" написал:До перехода и будем знать
Я так понимаю, OnChangeActivePage вызывается непосредственно в момент перехода.
В данном случае не важно когда. Если мы переходим с детали Средства Связи на деталь Группы, то все равно увидим актуальную информацию по детали Адреса относительно наличия данных в ней.
Алексей, посмотрите, пожалуйста, внимательно на код, который предлагается разместить в OnChangeActivePage.
Я бы убрал проверку на название активной закладки. Такой вариант представляется мне более логичным.
Я думаю логичнее убрать вообще этот усок. При переходе на запись раздела заголовок уже правильный.
Кроме того если просто убрать проверку, то датасет адресов не будет переоткрываться при переходе со Средств связи на Группы.
Вообще предложенный функционал не говорит нам однозначно есть ли на данный момент записи в детали или нет. Он говорит, что они там были когда-то (или их там не было). Получается такое полурешение.
Возможно Вы правы. В любом случае, предлагаю дать возможность выбора наиболее подходящего варианта тому, кто будет использовать эту функциональность.