Доброго дня!
Подскажите пожалуйста, необходимо сделать выборку по групповым задачам.
Начал делать по аналогии с выборкой по "Ответственному"
Добавил Lookup Control, сделал линк на датасет "Группа контактов". Вот только теперь при выборе группы контактов никакие задачи не отображаются. Что я сделал не так? Или может я что то не доделал?
Заранее спасибо

Нравится

18 комментариев

Добрый день Дмитрий!!!

вы внимательно проанализируйте как происходит Инициализация и фильтрация раздела По контакту и вам все станет ясно. Одним добавлением DatasetLink-om там не обойдешься. Плюс прошу описать какая у вас платформа и конфигурация. Чтобы вам подсказать. Если уже будет сложно разобраться как происходит стандартная фильтрация. Я готов вам по полочкам разложить рассказать как это все работает.

Буду Вам очень благодарен если расскажете

Дмитрий, в скрипте той страницы, куда добавляли лукапное поле, посмотрите, как сделано наложение фильтра по ответственному (из уже существующего поля). Вероятно, Вам надо будет сделать аналогично, написав похожий код для группы. Если уже написали код и при фильтрации исчезли все записи, значит нужно проверять, что не так в наложенном фильтре.

Александр, вот я пытался сделать по аналогии, однако при выборе в поле "Группу ответственных" ничего не происходило.
Буду дальше пытаться :)

Lookup поле работает. Я могу выбрать группу контактов.
Видимо дело в чек боксе. Поскольку после нажатия задачи не фильтруются.

Вот обработчик чек-бокса для фильтрации по "Ответственному"

function chbShowForContactOnClick(Control) {
	if ((!IsEmptyValue(edtTaskOwner.Value) || !Control.IsChecked) && 
		BaseWorkspace.WasShowed && (!TasksWorkspace.NoRefresh)) {
		TasksWorkspace.TaskOwnerIsChanged = true;
		RefreshTasks();
	}
}

Подскажите пожалуйста как мне адаптировать этот код для моего чекбокса (

function chbShowForContactGroupOnClick(Control) {
 
}

Судя по строке:

TasksWorkspace.TaskOwnerIsChanged = true;

часть логики находится в другом месте. Поищите в этом и во всех скриптах, где происходит считывание этого значения. Возможно, для группы надо будет аналогично.

Как я понял все происходит именно здесь

function ApplyContactFilter() {
	var Dataset = BaseWorkspace.GridDataset;
	var Grid = BaseWorkspace.Grid;
	var IsGridPageActive = pcData.ActivePage.Name == pgGridData.Name;
	var MyTasksIsActive = IsGridPageActive &&
		(Grid.ActiveView.Name == TasksWorkspace.MyTaskView.Name);	
    var ForControlIsActive = IsGridPageActive &&
		(Grid.ActiveView.Name == TasksWorkspace.ForControlView.Name);
	chbShowForContact.IsEnabled = (!MyTasksIsActive);
	edtTaskOwner.IsEnabled = chbShowForContact.IsEnabled;
	fgShowTasksBody.IsEnabled = chbShowForContact.IsEnabled;
	var TaskOwnerID = edtTaskOwner.Value;
	var EmptyContact = IsEmptyGUID(TaskOwnerID) || (!chbShowForContact.IsChecked);
	var IDs = GetContactsFilterArray();
	if ((!IsGridPageActive) && (IDs.length == 0)) {
		if (ShowConfirmationDialog(
			"Действие может занять некоторое время. Продолжить?") != mrYes) {
			TasksWorkspace.NoRefresh = true;
			chbShowForContact.IsChecked = true;
			TasksWorkspace.NoRefresh = false;
			IDs.push(edtTaskOwner.Value);
		}
	}
	var ShowForContact = ((IDs.length > 0) || (!EmptyContact));
	if (EmptyContact) {
		TaskOwnerID = Connector.CurrentUser.ContactID;
	}
	if (IsGridPageActive) {
		SetAttribute(BaseWorkspace.GridWindow, 'OwnerID', TaskOwnerID);
		if (MyTasksIsActive) {
			EnableDatasetFilters(Dataset, true, 'MyTasks');
			return;
		}
		if (ForControlIsActive) {
			EnableDatasetFilters(Dataset, true, 'ForControl');
			if (IDs.length > 1) {
				EnableDatasetFilters(Dataset, false, 'CreatedByID');
				ApplyDatasetIncludeFilter(Dataset, 'CreatedByIDs', IDs, true);
			} else {
				EnableDatasetFilters(Dataset, false, 'CreatedByIDs');
				ApplyDatasetFilter(Dataset, 'CreatedByID', TaskOwnerID,
					ShowForContact);
			}
			SetAttribute(Self, 'ContactsFilterArray', IDs);
			return;
		}
	} else {
		var ScheduleControl = 
			wndSchedulerArea.Window.ComponentsByName('ScheduleControl');
		SetAttribute(TasksWorkspace.SchedulerWindow, 'OwnerID', TaskOwnerID);
		ApplyDatasetFilter(Dataset, 'ShowInScheduler', true, true);   			
	}
	if (ShowForContact) {
		if (IDs.length == 1) {
			SetContactWhite(IDs[0]);
		}
		SetAttribute(Self, 'ContactsFilterArray', IDs);
		BaseFilters = Dataset.SelectQuery.Items(0).Filters.Items(0);
		var Filter = BaseFilters.ItemsByCode('ContactIDs');
		if (!Assigned(Filter)) {
			Filter = BaseFilters.Items(0).ItemsByCode('ContactIDs');
		}
		var Parameters = Dataset.SelectQuery.Parameters;
		var TeamFilter = Filter.ItemsByCode('tcTeam');
		var SubSelectFilter = TeamFilter.TestExpression
			.ExpressionSelectQuery.Items(0).Filters;
		var OwnerIDsFilter = Filter.ItemsByCode('tcOwnerIDs');
		var ContactIDsFilter = Filter.ItemsByCode('tcContactIDs');
		var SubContactIDsFilter = SubSelectFilter.ItemsByCode('tcContactIDs');
		ApplyIncludeFilter(OwnerIDsFilter, IDs, true, null, Parameters);
        ApplyIncludeFilter(ContactIDsFilter, IDs, true, null, Parameters);
        ApplyIncludeFilter(SubContactIDsFilter, IDs, true, null, Parameters);
		TeamFilter.IsEnabled = true;
		Filter.IsEnabled = true;
	}            	
	var IsSchedulerPageActive = (pcData.ActivePage.Name == pgScheduler.Name);
	if (IsSchedulerPageActive) {
		if (TasksWorkspace.TaskOwnerIsChanged) {
			if (ShowForContact) {
				if (TaskOwnerID == Connector.CurrentUser.ContactID) {
					SetTimeZone(ScheduleControl, TaskOwnerID, true);
					ScheduleControl.ShowAdditionalTimeZone = false;
				} else {
					SetTimeZone(ScheduleControl, TaskOwnerID, false);
				}
			} else { 
				ScheduleControl.ShowAdditionalTimeZone = false;
			}
			TasksWorkspace.TaskOwnerIsChanged = false;
		}
	}
}

Осталось понять, что нужно поправлять для моей задачи

Здравствуйте.

Вам необходимо включить дополнительный фильтр в Вашей функции для Dataset, после чего пер открыть.

А не подскажете как это сделать? А то я что то не понимать :exclaim:

Создаете свою функцию, в которой будет включаться/отключаться фильтр. Затем вызываете созданную Вами функцию, из функции ApplyTasksWorkspaceFilter.
Пример:

function MyTaskFilter() {
	var Dataset = BaseWorkspace.GridDataset;
	var MyFilterName = 'MyFilter';
	var Value = edtMyLookup.Value;
	if (!IsEmptyValue(Value)) {
		ApplyDatasetFilter(Dataset, MyFilterName, Value, true);
	} else {
		EnableDatasetFilters(Dataset, false, MyFilterName);
	}
}
 
function ApplyTasksWorkspaceFilter() {
	var Dataset = BaseWorkspace.GridDataset;
	ApplyStandardWorkspaceFilter(); 
	var Grid = BaseWorkspace.Grid;
	var IsCycleView = (Grid.ActiveView.Name == 'dgvCycleTasks') && 
			!(pcData.ActivePage.Name == pgScheduler.Name)
	EnableDatasetFilters(Dataset, IsCycleView, 'IsCycle');
	if ((chbShowForPeriod.IsChecked) ||
		(pcData.ActivePage.Name == pgScheduler.Name)) {
		var FromDate = 
			TasksWorkspace.DatePeriodMemoryDataset.ValAsDateTime('From');
		var ToDate = TasksWorkspace.DatePeriodMemoryDataset.ValAsDateTime('To');
		ApplyTaskDateFilter(Dataset, FromDate, ToDate);
		if (TasksWorkspace.SchedulerWindow == null) {
			TasksWorkspace.SchedulerWindow = wndSchedulerArea.Window;
		}
		SetScheduleAreaTimePeriod(FromDate, ToDate);
	}
	ApplyDatasetGroupIDFilter(BaseWorkspace.GroupsDataset,	Dataset);
	ApplyContactFilter();
 
	MyTaskFilter();
} 
 
......
 
 
function edtMyLookupOnChange(LookupControl) {
	RefreshTasks();
}

Cпасибо огромное!

Сделал фильтр по примеру, теперь при выборе группы ответственных в поле выдает ошибку "Исключение брошено и не поймано"
В чем может быть причина? подскажите пожалуйста

Вам необходимо выполнить пошаговую отладку кода, с помощью Microsoft Script Debugger или Microsoft Visual Studio.

Пример отладки кода приведен в статье.

Если честно, я так и не понял в чем причина ;(
после отладки перенаправляет на эту функцию:

У Вас исключение происходит скорее всего в функции ApplyContactGroupFilter.
Необходимо установить debugger в ApplyContactGroupFilter.

Пример кода:

function MyTaskFilter() {
        debugger;
        var Dataset = BaseWorkspace.GridDataset;
        var MyFilterName = 'MyFilter';
        var Value = edtMyLookup.Value;
        if (!IsEmptyValue(Value)) {
                ApplyDatasetFilter(Dataset, MyFilterName, Value, true);
        } else {
                EnableDatasetFilters(Dataset, false, MyFilterName);
        }
}

После чего отладит код, проверяя каждый объект на содержание значения с провалом в функции (горячая клавиша F11)

Одна задача выполнена, но появилась новая проблема...
После фильтрации, при нажатии на "Группу ответственных" в колонке, выдает ошибку: "Не удается найти карточку редактирования для выбранного элемента". А поскольку помимо фильтрации по групповым задачам необходима фильтрация по каждому ответственному, который входит в эту группу, хочу спросить как можно ли реализовать открытие карточки "Группа ответственных"?
(По такому принципу: отфильтровал по группе, посмотрел кто входит в группу, отфильтровал по ответственному №1, №2...)

Если пройдетесь по коду конфигурации, то сможете найти как это реализовано для других колонок.
Советую обратить внимание на источник данных (Dataset) раздела, а также использовать Microsoft Visual Studio для изучения алгоритма работы приложения.

А не подскажете какие изменения нужно добавить в фильтре, если мне необходимо отобразить задачи не только пользователя, но также задачи всех групп, в которые входит этот пользователь?
Или это вообще не в фильтре нужно делать?

Показать все комментарии

Доброго времени суток, уважаемые пользователи интернет сообщества Terrasoft!

Допустим, у Вас в разделе «Контакты» существует некая статическая группа, которая включает в себя определенное количество контактов. Если Вам необходимо отправлять уведомления по шаблону всем контактам, которые входят в эту группу, то этот топик для Вас! ;)
Главной задачей при реализации, есть получить список контактов входящих в выбранную группу, далее получить список их email адресов, и отправить сообщение по нужному шаблону.
Пример функции, реализующей отправку писем по шаблону всем контактам определенной группы:

function SendMailToGroup()
{
var AddressList = [];
var Dataset = Services.GetNewItemByUSI('ds_ContactInGroup');
var GroupID = '{83696FAF-128C-4A45-B41D-56A03B50BB7C}';
ApplyDatasetFilter(Dataset, 'GroupID', GroupID, true);
Dataset.Open();
while(!Dataset.IsEOF)
{
         var ContactID = Dataset.Values('ContactID');
         GetMailAddressesByContactID(ContactID, AddressList, true);
         Dataset.GotoNext();
}
var TemplateID = '{ ABCFB655-A0AD-4BAB-BF83-417DE9357C34}';
var ID = Dataset.Values('ID');
Dataset.Close();
SendEmailByTemplate(TemplateID, {RecordID: ID, Address: AddressList,
                   AutoSend: true, Silent: true});
}

Вместо GroupID = '{83696FAF-128C-4A45-B41D-56A03B50BB7C}'; подставьте ID нужной Вам группы. Для того чтобы узнать ID, выполните запрос к БД:
1
Вместо var TemplateID = '{ABCFB655-A0AD-4BAB-BF83-417DE9357C34}' подставьте ID нужного Вам шаблона рассылки. Для того чтобы узнать ID нужного Вам шаблона рассылки выполните запрос к БД и скопируйте поле ID:
2

Далее, Вам просто необходимо вызвать созданную функцию в нужном Вам месте кода:

SendMailToGroup();

К примеру, её можно вызвать при нажатии на кнопку «Ок» карточки редактирования задачи. Также удостоверьтесь, что созданная функция находится в том же скрипте, с которого Вы её вызываете, а также что в этом скрипте подключен скрипт scr_MailUtils.

Приятной работы с Террасофт!

Нравится

Поделиться

0 комментариев
Показать все комментарии