Настройка правил синхронизации данных в Манифесте мобильного приложения
В описании (которого почему-то не нашел в оглавлении) 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 - деталь Контрагенты в Активностях):
[javascript]
ModelDataImportConfig: [
// Конфигурирование модели Activity.
{
Name: 'ActivityAccount',
SyncFilter: {
type: 'Terrasoft.FilterTypes.Group',
logicalOperation: 'Terrasoft.FilterLogicalOperations.Or',
subfilters: [
{
property: 'PartOf',
valueIsMacros: true,
value: 'Terrasoft.ValueMacros.CurrentUserContact.PartOf'
}
]
},
[/javascript]
В Вашем случае необходимо применить вариант решения с использоваием 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, который означает "закрытие".
Добавляю в манифест фильтр:
[javascript]
"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"
},
[/javascript]
Пробовал и так и сяк, при синхронизации в мобиле выдает ошибку.
Пробовал еще такой фильтр:
[javascript]
"SyncFilter": {
"type:" "Terrasoft.FilterTypes.Simple",
"property": "SolutionOverdue",
"compareType": "Terrasoft.ComparisonType.Equal",
"value": true
},
[/javascript]
В данном случае ошибок при синхронизации не выдает, но и он тупо не работает.
Подскажите что не так делаю, и вообще объясните моменты с 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 со след кодом:
[javascript]
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"
})
]
}));
[/javascript]
И затем в манифесте в PageExists подключил этот модуль, и все заработало.