Добрый день!
В разделе "Контрагенты" создала деталь "Период обзвона" со следующими полями: ответственный (OwnerID), дата начала (StartDate), дата завершения (DueDate), контрагент (AccountID).
Для данной детали необходимо реализовать действие перехода к задачам с включенным фильтром по контрагенту, ответственному и по периоду. Подскажите как это можно сделать.
Спасибо.
Нравится
Александра, ознакомьтесь с темой http://www.community.terrasoft.ua/forum/topic/2567, в ней рассматривался похожий вопрос.
Посмотрела этот материал, сделала фильтрацию по контрагенту и ответственному, но не поняла как фильтровать по периоду. Должны отображаться те задачи, которые входят в данный период. Т.е. если есть дата начала StartDate и дата завершения DueDate, то должны быть выведены те задачи, для которых: tbl_Task.StartDate =< DueDate, tbl_Task.DueDate >= StartDate.
Для фильтрации по периоду создайте в sq_Task набор фильтров с логическим оператором AND, состоящий из двух фильтров сравнения:
1-й) tbl_Task.StartDate <= Parameter: DueDate
2-й) tbl_Task.DueDate >= Parameter: StartDate
Включить фильтр можно таким образом EnableDatasetFilters(Dataset, true, 'FilterName');
Заполнить параметры значениями:
var Parameters = Dataset.SelectQuery.Parameters;
SetParameterValue(Parameters, 'StartDate', StartDate);
SetParameterValue(Parameters, 'DueDate', DueDate);
В какой момент надо включать фильтр?
Сейчас есть ActionMenuItem с методом OnExecute, в котором подключаю метод для фильтрации по контрагенту и ответственному:
var MainWindow = Connector.Attributes('MainWindow');
MainWindow.ScriptControl.Run('ShowGroupWorkspace', '', 'wnd_TasksWorkspace',
null, true,'', new Array('OwnerID', 'AccountID'),
new Array(OwnerID, AccountID));
В метод ShowGroupWorkspace(GroupCode, WorkspaceUSI, IDDataFieldValue, AddHistory,DetailWindowUSI, FilterParamNames, FilterParamValues) добавлен следующий код:
if (IDDataFieldValue != null) {
System.BeginProcessing();
try {
ShowInformationDialog(IDDataFieldValue);
FilterWorkspace(WorkspaceWindow, IDDataFieldValue)
}
finally {
System.EndProcessing();
}
} else
if (Assigned(FilterParamNames)&&Assigned(FilterParamValues)) {
FilterWorkspaceByParamSet(WorkspaceWindow, FilterParamNames, FilterParamValues);
}
Также добавлен метод FilterWorkspaceByParamSet(WorkspaceWindow, ParamNames, ParamValues), описанный в теме http://www.community.terrasoft.ua/forum/topic/2567
Так в какой момент надо добавить фильтр по периоду?
Александра, попробуйте сделать немного по другому:
1. Создать в sq_Task набор фильтров, посредством которого фильтровать задачи по контрагенту, ответственному и по периоду.
2. В функции обработки события OnExecute элемента ActionMenuItem включать фильтр и сохранять полученные идентификаторы задач в массив, например, под названием SelectedIDsArray.
3. Выполнять переход в рабочее пространство задач с использованием функции function GotoWorkspaceByReferenceInfo(Dataset, DataFieldName, WorkspaceWindowUSI, SelectedIDsArray) сервиса scr_WindowUtils:
var DataFieldName = 'ID'; var WorkspaceWindowUSI = 'wnd_TasksWorkspace'; GotoWorkspaceByReferenceInfo(Dataset, DataFieldName, WorkspaceWindowUSI, SelectedIDsArray);
Где Dataset - 'ds_Task'.
Реализуя функционал таким образом Вам не нужно изменять базовые функции.
Добрый день!
Написала по вашей рекомендации следующий код на событие OnExecute:
function GotoTaskOnExecute(ActionMenuItem, Sender) {
var OwnerID = dlData.Dataset.Values('OwnerID');
var StartDate = dlData.Dataset.Values('StartDate');
var DueDate = dlData.Dataset.Values('DueDate');
var AccountID = Self.Attributes('ParentItemID');
var DatasetTask = Services.GetSingleItemByUSI('ds_Task');
var Parameters = DatasetTask.SelectQuery.Parameters;
SetParameterValue(Parameters, 'StartDate', StartDate);
SetParameterValue(Parameters, 'DueDate', DueDate);
SetParameterValue(Parameters, 'AccountID', AccountID);
SetParameterValue(Parameters, 'OwnerID', OwnerID);
DatasetTask.Close();
EnableDatasetFilters(DatasetTask, true, 'Filters1');
DatasetTask.Open();
var Count = DatasetTask.RecordsCount;
var SelectedIDsArray = new Array(Count);
DatasetTask.GotoFirst();
for (i = 0; i < Count; i++) {
SelectedIDsArray[i] = DatasetTask.Values('ID');
DatasetTask.GotoNext();
}
var DataFieldName = 'ID';
var WorkspaceWindowUSI = 'wnd_TasksWorkspace';
GotoWorkspaceByReferenceInfo(DatasetTask, DataFieldName, WorkspaceWindowUSI, SelectedIDsArray);
}
Теперь при переходе в раздел задач отображает все задачи, выделяя одну из записей с ID из массива SelectedIDsArray. А надо, чтобы отображались только те задачи, ID которых входит в массив
SelectedIDsArray.
Выполнила все действия по аналогии, результат отображен на рисунке во вложении. Версия 3.3.2
Проверьте, соответствует код функций GotoWorkspaceByReferenceInfo и GotoWorkspace в Вашей конфигурации базовому варианту (в текстовом документе).
У меня версия 3.4
Код функций проверила, он такой же. А вот картинка совсем не такая... У меня нет фильтров слева внизу.
В версии 3.4 и последних версиях 3.3.2 изменилась логика функции function FilterWorkspace(WorkspaceWindow, IDDataFieldValue) сервиса scr_Main, поэтому наблюдается описанный Вами результат. Для того, чтобы при переходе к разделу в реестре записей отображались только отфильтрованные записи, необходимо изменить функцию FilterWorkspace:
function FilterWorkspace(WorkspaceWindow, IDDataFieldValue) { wndWorkspace.Window.ScriptControl.CodeObject.BeforeFilterWorkspace(); FilterByID(WorkspaceWindow, IDDataFieldValue); }
Большое спасибо!! Всё работает как надо =)
А изменение этой функции не повлечет за собой какие-либо сбои в работе базовых элементов системы?