Всем доброго времени суток!

Столкнулся с такой проблемой. Есть орг. роли в которых есть поле Область/Штат, заполнено неким значением, в эту роль входит пользователь Иванов. При работе с моб. приложения под этим пользователем необходимо отображать только те контакты у которых на детали есть адрес с полем Область/Штат соответсвующий полю Область/Штат орг. роли.

Реализовал функцию которая считывает роли данного пользователя и заносит в глобальную переменную.

Далее добавил фильтр в реестре:

Terrasoft.sdk.Module.addFilter("Contact", Ext.create("Terrasoft.Filter", {
	type: Terrasoft.FilterTypes.Group,
	logicalOperation: Terrasoft.FilterLogicalOperations.Or,
	subfilters: Terrasoft.WaContactFiltersByRegionInCurrentUserRole()
}));
 
 
Terrasoft.WaContactFiltersByRegionInCurrentUserRole = function () {
	var subfilters = [];
	for (var i = 0; i < Terrasoft.WaRoleRegions.length; i++) {
		subfilters.push({property:"[ContactAddress:Contact:Id].Region", value:Terrasoft.WaRoleRegions[i]});
	}
	return subfilters;
};



В оффлайн режиме фильтрует, в онлайн нет, иногда выдает ошибки.

Так вот собственно вопрос, с чем это может быть связанно и как с этим бороться?

Заранее благодарен!

Нравится

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

Мне кажется, такое вообще лучше делать не программным скрытием, а раздачей прав доступа на чтение на записи в разделе контактов. Логику реализовать на стороне БП на событиях добавления и изменения объектов адреса и  роли. В итоге в мобильную версию, хоть онлайн, хоть оффлайн, будет подтягивать только те, что ему положено видеть.

Зверев Александр,

 Здравствуйте! Согласен, изначально так и было, но в стандартном реестре записи не отображаются пользователи видят следующее -

http://prntscr.com/o6ypsp. Пользователям не нравится такой вид, поэтому задавал фильтр по ответсвенному - фильтровало, но потом как оказалось не подходит по бизнес логике фильтрации, пришлось придумать такой костыль, вот и выплыло следующее в оффе фильрует в онлайн нет - http://prntscr.com/o6yr3i

Как с таким бороться?

Вообще, это стандартное поведение с 14 версии, отображает сначала пустой список, а потом — последние посещённые 10 записей:

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

Зверев Александр,

это понятно. Однако помимо реестра нужно ещё накладывать фильтр в справочных полях Контакт что бы фильтровало какие описано выше))

Разобрался чего не фильтровало, я в фильтр передавал объект - https://prnt.sc/o7a23e

перестроил фильтрацию по Id и все заработало как в оффлайн так и в онлайн режиме

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

Добрый день!

Внутри CRM есть большое число позиций изделий из сплавов металлов. В сплав может входить от двух до четырех металлов.  

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

Есть ли способ найти только те позиции, где требуемый металл находится на первом месте?

(Например: АРбуз, АРка, АРгон. Но не: бАРжа, кАРтон, сАРай) 

Нравится

5 комментариев
Лучший ответ

Вариантов много я бы посмотрел в сторону

1) Искать начинающиеся на #Арб

2) или изменить структуру хранения данных о составе металла

3) а лучше всего, создать свой фильтр в котором вы обработаете вашу строку с указанием сплава. (Например разобьете в массив со списком металлов и его отфильтруете)

В расширенных фильтрах

 

Варфоломеев Данила,

Спасибо за совет, но строка с указанием сплава имеет вид - #Наименование сплава# (#Металл1##Металл2##Металл3##Металл4#) Например: Мельхиор (CuNi)

Вариантов много я бы посмотрел в сторону

1) Искать начинающиеся на #Арб

2) или изменить структуру хранения данных о составе металла

3) а лучше всего, создать свой фильтр в котором вы обработаете вашу строку с указанием сплава. (Например разобьете в массив со списком металлов и его отфильтруете)

А что мешает искать по «(Cu»?

Зверев Александр,

Спасибо за совет, хорошая идея!

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

Добрый день,

 

Столкнулся с проблемой фильтрации справочных полей при помощи бизнес правил,

есть Справочник улиц (Street) у которого соответственно есть принадлежность к выше стоящим элементам(Городам, Районам, Регионам и др.) 

Выглядит примерно следующим образом

╔══════════════╤═════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╗
║ Name         │ TerritorialObjectId │ LocalityId                           │ DistrictId                           │ RegionId                             │ CountryId                            ║
╠══════════════╪═════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╣
║ ул. Королёва │ NULL                │ NULL                                 │ NULL                                 │ B0FDED10-AEE0-4F1B-9C8D-198F7C154257 │ 5A1FEFDA-56A4-48A2-BC77-E40C71EEC73B ║
╟──────────────┼─────────────────────┼──────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ ул. Ф.Торо   │ NULL                │ 967FC3D7-EBBA-4B76-AEDD-FE1CA5B48157 │ 7B11D4CE-D3E2-487F-BE03-A620015FB4FA │ EED82307-32D6-47EF-BDD8-FA64FE399614 │ 5A1FEFDA-56A4-48A2-BC77-E40C71EEC73B ║
╚══════════════╧═════════════════════╧══════════════════════════════════════╧══════════════════════════════════════╧══════════════════════════════════════╧══════════════════════════════════════╝

То есть в некоторых местах возможны пропуски иерархии, и улица напрямую принадлежит региону.

Бизнес правило по улице заполнено следующим образом

"Street": {
	"FiltrationStreetByTerritorialObject": {
		ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
		autocomplete: true,
		autoClean: true,
		baseAttributePatch: "TerritorialObject",
		comparisonType: Terrasoft.ComparisonType.EQUAL,
		type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		attribute: "TerritorialObject"
	},
	"FiltrationStreetByLocality": {
		ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
		autocomplete: true,
		autoClean: true,
		baseAttributePatch: "Locality",
		comparisonType: Terrasoft.ComparisonType.EQUAL,
		type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		attribute: "Locality"
	},
	"FiltrationStreetByDistrict": {
		ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
		autocomplete: true,
		autoClean: true,
		baseAttributePatch: "District",
		comparisonType: Terrasoft.ComparisonType.EQUAL,
		type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		attribute: "District"
	},
	"FiltrationStreetByRegion": {
		ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
		autocomplete: true,
		autoClean: true,
		baseAttributePatch: "Region",
		comparisonType: Terrasoft.ComparisonType.EQUAL,
		type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		attribute: "Region"
	},
	"FiltrationStreetByCountry": {
		ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
		autocomplete: true,
		autoClean: true,
		baseAttributePatch: "Country",
		comparisonType: Terrasoft.ComparisonType.EQUAL,
		type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
		attribute: "Country"
	}
}

Проблема в том, что при выборе улицы из справочника не подтягиваются автоматически ее выше стоящие элементы, как например город, район и т.д.

Я что то упускаю?

Нравится

4 комментария
Лучший ответ

Сериков Асхат Кайратович,

проблема в подтягивании автоматически ее "родителей", то есть при выборе улицы при незаполненных городах, районах не подтягиваются автоматически город и район к которым относится улица

Это решается также через другое свойство атрибута - dependencies.

Подробнее можно почитать здесь и посмотреть пример вот здесь.

Насколько мне известно, такой код работать не будет.

Реализация Вашей задачи, когда нужна фильтрация по нескольким условиям, выполняется через настройку lookupListConfig. Подробнее об этом можно почитать в статье на Академии.

Алла Савельева,

Спасибо, фильтрация как таковая работает исправно, проблема в подтягивании автоматически ее "родителей", то есть при выборе улицы при незаполненных городах, районах не подтягиваются автоматически город и район к которым относится улица. Я так думаю это 

autocomplete: true,

должен был выполнять

Сериков Асхат Кайратович,

проблема в подтягивании автоматически ее "родителей", то есть при выборе улицы при незаполненных городах, районах не подтягиваются автоматически город и район к которым относится улица

Это решается также через другое свойство атрибута - dependencies.

Подробнее можно почитать здесь и посмотреть пример вот здесь.

Алла Савельева,

Спасибо, так и делаю на данный момент, думал может я что то упустил поэтому не работает автоматическое заполнение

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

Добрый вечер!

Вопрос такой, нужно в разделе "Контрагенты" сформировать список клиентов, у которых в "фактическом" адресе указан город Москва (с чем я разобрался) и присутствует также "юридический" адрес. Не могу понять, как включить в выборку условие с "юридическим" адресом?



Изображение удалено.

 

Нравится

3 комментария

Вот пример Как я его понял исходя из условий Задачи

Михаил, не уверен, что получится именно то, что хочет автор. У Вас найдёт где есть или тот, или тот тип адреса.

Лучше так:

 

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

Идея состоит в том, что бы отбирать конкретный список контактов для рассылки, подгружая к примеру наименования контрагентов в поле фильтра ( Контакт.Контрагент.Наименование ). В фильтре по наименованию реализовать функционал операции "in" ANSI SQL. Имеющийся функционал создаёт новые позиции, а нужно именно организовывать поиск по имеющимся, к примеру просчитанный список нужных контрагентов из другой учётной или аналитической системы из которой загружались контрагенты.

1 комментарий

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

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

Всем привет!

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

Нравится

1 комментарий

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

По функциональной части: рекомендую переопределить в Section метод getFilters и там в зависимости от выбранного фильтра в разделе добавлять или удалять фильтры.

По части отображения: добавить свой контейнер в фильтры.

Вот пример для добавления галочки в раздел фильтров:

{
	"operation": "insert",
	"name": "CustomContainer",
	"parentName": "LeftGridUtilsContainer",
	"propertyName": "items",
	"index": 0,
	"values": {
		"id": "CustomContainer",
		"itemType": this.Terrasoft.ViewItemType.CONTAINER,
		"items": [],
                "wrapClass": ["filters-container-wrapClass"]
	}
},
{
	"operation": "insert",
	"name": "CustomFlag",
	"parentName": "CustomContainer",
	"propertyName": "items",
	"values": {
		"caption": {
			"bindTo": "Resources.Strings.CustomFlagCaption"
		},
		"bindTo": "CustomAttribute",
		"controlConfig": {
			"className": "Terrasoft.CheckBoxEdit",
			"checkedchanged": {
				"bindTo": "onCustomFlagChanged"
			}
		}
	}
}

UPD: Точно, ещё для того, чтобы фильтр применялся после изменения фильтра в разделе необходимо в приведённом выше примере в методе onCustomFlagChanged инициировать обновление реестра (this.reloadGridData();).

Так же на момент вызова метода getFilters аттрибут CustomAttribute не изменял своего значения, поэтому был введён новый аттрибут, значение которого менялось так же в методе onCustomFlagChanged.

И, есть вероятность, что придётся помучиться со стилями для того, чтобы фильтр отображался адекватно, при необходимости могу поделиться кодом опять-таки для примера выше.

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

Можно ли каким-то образом построить такой запрос на клиенте:

update KitTrackingInformation

set

    TrackingNumber = @TrackingNumber

from KitTrackingInformation

        join BTSample on BTSample.BTKitIDLookupId = KitTrackingInformation.KitId

            join BTSampInShipment on BTSampInShipment.BTSampleIDId = BTSample.Id

where SampInShipment.BTShipmentId = @ShipmentId

Понятно, что это будет выглядеть приблизительно так:

                    var updateTrackingInfo = Ext.create("Terrasoft.UpdateQuery", {

                        rootSchemaName: "KitTrackingInformation"

                    });

                    updateTrackingInfo.setParameterValue("TrackingNumber", trackingNumber,

                        Terrasoft.DataValueType.SHORT_TEXT);

                                       updateTrackingInfo.filters.addItem(updateTrackingInfo.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL,

                        "<путь по связям для фильтрации>", shipmentId));

                    updateTrackingInfo.execute(function(response) {

                        if (response.success) {

                            debugger;

                        }

                    }, this);

Из всего вышеописанного следует 2 вопроса:

1) каким образом построить путь для фильтрации

2) можно ли вообще реализовать UpdateQuery с фильтрацией по полю связанной таблицы

Нравится

3 комментария

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

Вот пример даже тройного join-а:

[SysAdminUnit:Contact:Owner].[SysUserInRole:SysUser:Id].[SysAdminUnit:Id:SysRole].Id

Ещё один:

[SysAdminUnit:Contact].[SysUserInRole:SysUser].SysRole

Сработает ли для update, нужно тестировать, глядя на получающиеся запросы в SQL-профайлере.

Зверев Александр,

Спасибо за ответ.

А какие sql-запросы получаются в итоге по этим примерам?

К сожалению, нет возможности посмотреть в профайлере код запросов.

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

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

Доброго времени! 



У меня интересная задача)

Необходимо сменить ответственного у нескольких записей продаж.



Задача:

1. Поставить фильтр (допустим выдало 100 записей)

2. Нажать "Выбрать все" (показано что выбрано 100)

3. Снять 1 галочку (показано что выбрано 99)

4. Нажать "Изменить ответственного"



Методы:

var selectedRows = this.getSelectedItems();

var selectedRows = this.get("SelectedRows");



Возвращают Id только отображенных записей (29)!



Как получить ожидаемые 99 Id записей?

Нравится

3 комментария

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

Когда загружается реестр посылается один запрос (который оптимизирован и загружает не все записи, а 30 – если у вас 100000 записей то не будет накладки по производительности). Когда вы нажимаете «Выбирать все», то не произойдет загрузки всех записей(оптимизация описанная выше), а отправится отдельный запрос который просто вернет количество и обновит название кнопки (при дебаге в network это видно). Чтобы добиться требуемого результата нужно самостоятельно посылать запрос.

Тоже столкнулся с такой проблемой. Самое простое решение, которое я нашел - это использовать функцию, возвращающую запрос на получение записей для экспорта:

                    var esq = this.getExportToExcelEsq();

                    esq.rowCount = -1;

                    esq.getEntityCollection(function (response) {...}, this);

Можно посмотреть, как она работает и заменить её своей. Результатом запроса будут все выделенные записи (99 в Вашем случае).

 

Поправка: в 7.12.2 функция, возвращающая запрос, переехала, теперь так:

var esq = this.getGridDataInitializedEsq(true);

esq.rowCount = -1;

...

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

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

Соответственно, если сотрудник написал исходящий емейл - он тоже должен отображаться в его календаре. 

Нравится

1 комментарий

Попробуйте использовать встроенные бизнес-процессы объекта "Активности" (подробнее про встроенные бизнес-процессы тут: https://academy.terrasoft.ua/documents/technic-sdk/7-12/primer-ispolzovaniya-vstroennogo-processa-obekta-dobavlenie-avtonumeracii-k-polyu-stranicy, раздел "Алгоритм реализации кейса на стороне сервера").

При создании новой активности с типом E-mail вы можете проверить все нужные поля (есть ли E-mail отправителя у вас в системе, кому письмо предназначено и т.д.), а далее, нужные E-mail с нужными полями отобразить в календаре.

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

Коллеги, добрый день!

Проблема в следующем:

При создании стандартного фильтра (по группе ответственных) в разделе Обращения, на страницу выводится список обращений не только данной группы, но и других групп.

Оказалось, что при создании такого фильтра, по умолчанию выставляется  условие сравнения "СОДЕРЖИТ", а не  "=" (равно).  

Соответственно, при таком фильтре, в список обращений "по группе" могут попасть обращения других групп, имена которых частично совпадают.

Можно ли как-то изменить "условие сравнения по умолчанию" для стандартного фильтра?

Спасибо!

Нравится

1 комментарий

Добрый день!

Стандартный фильтр действительно работает по принципу "СОДЕРЖИТ". Внести изменения в его условия сравнения возможности нет. 

Рекомендуем использовать расширенный фильтр, где есть возможность выбрать "=".

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