Настройка правил синхронизации данных в Манифесте мобильного приложения
В описании (которого почему-то не нашел в оглавлении) http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/MobileAppli...
для секции ModelDataImportConfig есть пример с макросом. А возможно ли сделать зависимость от какого-то поля контакта пользователя?
Например у Активности есть поле Участок (справочник) и у Контакта есть такое поле Участок. Нужно чтобы Активность загружалась если её участок совпадает с участком указанным в Активности
Нравится
Здравствуйте.
Вы пишите "Нужно чтобы Активность загружалась если её участок совпадает с участком указанным в Активности" - это как понимать?
Опишите пожалуйста детальней - что ожидается увидеть на выходе. какой бизнес-кейс решается?
Есть Пользователь П1 (торговый представитель), с ним связан Контакт К1, у которого есть кастомное поле Участок (типа справочник) со значением У1. Есть задачки (простите Активности!) З1, З2, ...., З99999, у которых кроме всего прочего так же есть кастомное поле Участок из того же справочника. Так вот если нет надобности грузить 99999 задачек, а только те у которых поля Участок совпадают с одноименным полем Контакта, то как построить данный фильтр типа Пользователь.Контакт.Участок = Задачка.Участок.
В етом случае Вас тоит вносить код в секцию ModelDataImportConfig Манифеста мобильного приложения.
Пример фильтрации данных для загрузки описан в документе, приведенном Вами выше:
Активность. Загружаются все колонки. Выполняется фильтрация модели - загружаются только те активности, у которых участником является текущий пользователь.
ModelDataImportConfig: [
// Конфигурирование модели Activity.
{
Name: 'Activity',
SyncFilter: {
type: 'Terrasoft.FilterTypes.Group',
logicalOperation: 'Terrasoft.FilterLogicalOperations.Or',
subfilters: [
{
property: 'Participant',
modelName: 'ActivityParticipant',
assocProperty: 'Activity',
operation: 'Terrasoft.FilterOperations.Any',
valueIsMacros: true,
value: 'Terrasoft.ValueMacros.CurrentUserContact'
}
]
},
SyncColumns: ['Title', 'StartDate', 'DueDate', 'Status', 'Result', 'DetailedResult', 'ActivityCategory', 'Priority', 'Owner', 'Account', 'Contact',
'Lead', 'Opportunity', 'ShowInScheduler', 'Author', 'Type'
]
},
Предоставленый код является примером реализации.
По аналогии, Вы можете настроить свою фильтрацию.
"Клименко Николай" написал:Предоставленый код является примером реализации.
По аналогии, Вы можете настроить свою фильтрацию.
Николай, спасибо за Ваши ответы, но к сожалению нужной информации в них нет, возможно потому, что я плохо изложил задачу.
Нужно понимание как сделать фильтры по полям и в левой и в правой части выражения сравнения, что-то типа (ActivityAccount - деталь Контрагенты в Активностях):
ModelDataImportConfig: [ // Конфигурирование модели Activity. { Name: 'ActivityAccount', SyncFilter: { type: 'Terrasoft.FilterTypes.Group', logicalOperation: 'Terrasoft.FilterLogicalOperations.Or', subfilters: [ { property: 'PartOf', valueIsMacros: true, value: 'Terrasoft.ValueMacros.CurrentUserContact.PartOf' } ] },
В Вашем случае необходимо применить вариант решения с использоваием view
1. Создать View (например VwActivityAreaByContactArea) с колонками Активности и Контакта
2. Добавить в конфигурацию скрипт (Подразумевается колонка Участок = Area) и установить
------------------------------------------------------------------------
IF EXISTS (SELECT 1 FROM sys.views WHERE name = 'VwActivityAreaByContactArea')
DROP VIEW dbo.VwActivityAreaByContactArea
go
------------------------------------------------------------------------
CREATE VIEW dbo.VwActivityAreaByContactArea AS
SELECT
a.Id,
a.CreatedOn,
a.CreatedById,
a.ModifiedOn,
a.ModifiedById,
a.ProcessListeners,
a.Id as ActivityId,
c.Id as ContactId
FROM Activity a
JOIN Contact c ON c.Area = a.Area
Where c.Area <> ''
3. В манифесте добавить фильтрацию
"ModelDataImportConfig": [
{
"Name": "Activity",
"SyncFilter": {
"type": 'Terrasoft.FilterTypes.Group',
"logicalOperation": 'Terrasoft.FilterLogicalOperations.And',
"subfilters": [
{
"property": 'Participant',
"modelName": 'ActivityParticipant',
"assocProperty": 'Activity',
"operation": 'Terrasoft.FilterOperations.Any',
"valueIsMacros": true,
"value": 'Terrasoft.ValueMacros.CurrentUserContact'
},
{
"property": "Contact",
"modelName": "VwActivityAreaByContactArea",
"assocProperty": "Activity",
"operation": 'Terrasoft.FilterOperations.Any',
"valueIsMacros": true,
"value": "Terrasoft.ValueMacros.CurrentUserContact"
}
]
}
},
{
"Name": "VwActivityAreaByContactArea",
"SyncFilter": {
"property": "Contact",
"valueIsMacros": true,
"value": "Terrasoft.ValueMacros.CurrentUserContact"
}
}
]
И указать модель View
"Models": {
"Activity": {
"Grid": "MobileActivityGridPage",
"Preview": "MobileActivityPreviewPage",
"Edit": "MobileActivityEditPage",
"RequireLookupColumnsModels": true,
"RequiredModels": [
"VwActivityAreaByContactArea"
]
}
Извините за некропостинг, но может найдется кто, чтобы немного мне объяснить.
Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".
Добавляю в манифест фильтр:
"SyncFilter": { "property": "Status", // Название модели, для которой выполняется фильтрация. //"modelName": "Case", // Колонка связанной модели, по которой осуществляется связь с основной моделью. //"assocProperty": "Id", //"operation": "Terrasoft.FilterOperations.Any", "compareType": "Terrasoft.ComparisonType.NotEqual", //"value": { //"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38", //"displayValue": "Закрыт"} "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38" },
Пробовал и так и сяк, при синхронизации в мобиле выдает ошибку.
Пробовал еще такой фильтр:
"SyncFilter": { "type:" "Terrasoft.FilterTypes.Simple", "property": "SolutionOverdue", "compareType": "Terrasoft.ComparisonType.Equal", "value": true },
В данном случае ошибок при синхронизации не выдает, но и он тупо не работает.
Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.
"Михайловский Илья Викторович" написал:Извините за некропостинг, но может найдется кто, чтобы немного мне объяснить.
Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".
Добавляю в манифест фильтр:
"SyncFilter": {
"property": "Status",
// Название модели, для которой выполняется фильтрация.
//"modelName": "Case",
// Колонка связанной модели, по которой осуществляется связь с основной моделью.
//"assocProperty": "Id",
//"operation": "Terrasoft.FilterOperations.Any",
"compareType": "Terrasoft.ComparisonType.NotEqual",
//"value": {
//"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",
//"displayValue": "Закрыт"}
"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
},
Пробовал и так и сяк, при синхронизации в мобиле выдает ошибку.
Пробовал еще такой фильтр:
"SyncFilter": {
"type:" "Terrasoft.FilterTypes.Simple",
"property": "SolutionOverdue",
"compareType": "Terrasoft.ComparisonType.Equal",
"value": true
},
В данном случае ошибок при синхронизации не выдает, но и он тупо не работает.Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.
Добрый день, Илья!
Примеры описаны для версии 7.6.
Уточните, пожалуйста, версию системы и мобильного приложения.
"Вильшанский Дмитрий" написал:
Михайловский Илья Викторович пишет:
Извините за некропостинг, но может найдется кто, чтобы немного мне объяснить.
Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".
Добавляю в манифест фильтр:"SyncFilter": {
"property": "Status",
// Название модели, для которой выполняется фильтрация.
//"modelName": "Case",
// Колонка связанной модели, по которой осуществляется связь с основной моделью.
//"assocProperty": "Id",
//"operation": "Terrasoft.FilterOperations.Any",
"compareType": "Terrasoft.ComparisonType.NotEqual",
//"value": {
//"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",
//"displayValue": "Закрыт"}
"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
},
Пробовал и так и сяк, при синхронизации в мобиле выдает ошибку.
Пробовал еще такой фильтр:
"SyncFilter": {
"type:" "Terrasoft.FilterTypes.Simple",
"property": "SolutionOverdue",
"compareType": "Terrasoft.ComparisonType.Equal",
"value": true
},
В данном случае ошибок при синхронизации не выдает, но и он тупо не работает.Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.
Добрый день, Илья!
Примеры описаны для версии 7.6.
Уточните, пожалуйста, версию системы и мобильного приложения.
7.8
Я уже сделал, но через модуль, создал с именем UsrMobileCaseModelConfig со след кодом:
Terrasoft.sdk.Module.addFilter("Case", Ext.create("Terrasoft.Filter", { name: "CaseCustomFilter", type: "Terrasoft.FilterTypes.Group", subfilters: [ //Не закрытый статус Ext.create("Terrasoft.Filter", { name: "CaseStatusFilterValue", property: "Status", compareType: Terrasoft.ComparisonTypes.NotEqual, value: "3e7f420c-f46b-1410-fc9a-0050ba5d6c38" }), //Ответственный - текущий пользователь Ext.create("Terrasoft.Filter", { name: "CaseOwnerFilterValue", property: "Status", compareType: Terrasoft.ComparisonTypes.Equal, valueIsMacros: true, value: "Terrasoft.ValueMacros.CurrentUserContact" }), //Не отменен статус Ext.create("Terrasoft.Filter", { name: "CaseStatusFilterValue", property: "Status", compareType: Terrasoft.ComparisonTypes.NotEqual, value: "6e5f4218-f46b-1410-fe9a-0050ba5d6c38" }) ] }));
И затем в манифесте в PageExists подключил этот модуль, и все заработало.