Вопрос

Добрый день,

 

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

есть Справочник улиц (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": []
	}
},
{
	"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 комментарий

Добрый день!

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

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

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

Добрый день, Коллеги!
На нескольких проектах столкнулись со следующей ситуацией.
Описания кейса:

1) Рассмотрим раздел обращения, Колонки "Контакт" и "Контрагент".
Пробуем добавить новый контакт через "Всплывающее действие" при вводе не существующего ФИО в системе.

https://yadi.sk/i/OQCOmeQw3TedkE

В результате при клике на "действие создания" далее откроется миникарточка контакта для заполнения.
Штатный функционал работает корректно.
 
Потребность:
Необходимо добавить сложный фильтр для lookup "Контакта".
Логика фильтра: Если "Контрагент" заполнен, то отображать к выбору только те контакты, у которых на детали "Карьера контакта" (деталь в разделе контакт) есть записи по связанному контрагенту, Который выбран в обращении.

Был выбран способ реализации путём задания фильтра через атрибуты.

"Contact": {
                lookupListConfig: {
                    filters: [
                        function() {
                            var accountId = this.get("Account");
                            var filterGroup = Ext.create("Terrasoft.FilterGroup");
                            if (accountId){
                                var filterById = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[ContactCareer:Contact].Account", accountId.value);
                                filterGroup.add("filterById", filterById);
                            return filterGroup;
                        }
                    ]
                }
            }

Фильтрация работает корректно.

2) Однако возникла следующая проблема, которой нет при создании фильтров через бизнес-правила:

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

https://yadi.sk/i/4baUZyPr3Tee7E

Есть только возможность выбора из отфильтрованных значений.

https://yadi.sk/i/a-qH6I0R3TefZq
https://www.screencast.com/t/6Mu2hFnkt

Если, согласно условию if, Контрагент не заполнен, то действие для создания появляется.

https://yadi.sk/i/HaQF5U1L3Teg7r

Коллеги, просим подсказать как можно обойти подобное поведение?
Возможно есть простой способ реализации подобного фильтра через бизнес-правила? У нас попросту не получилось организовать подобный фильтр другим способом.
Заранее спасибо!

У меня такой же вопрос

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

Чисто в теории в LookupQuickAddMixin отсекается возможность быстрого создания, если функция checkIsComplicatedFiltersExists вернёт true. Можно прям на странице переопределить эту функцию

checkIsComplicatedFiltersExists: function() {
	return false;
}

и система предложит создать контакта. Не факт, однако, что что-нибудь не накроется тазом в какой-то момент (не зря же есть функция по проверки сложных фильтров). Лично я быстро накидал, потестил на дефолтной странице договора - все отрабатывает.

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

Спасибо за подсказку! Закрыли задачу!

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

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

У меня такой же вопрос

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

Здравствуйте, Павел!

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

Выглядеть он будет так: http://prntscr.com/io67sn

Настройка: http://prntscr.com/io689w

"Количество" потом поменять на "Существует", и внутри указать, собственно, фильтр по текущему контакту.

Спасибо большое!

Войдите или зарегистрируйтесь, чтобы комментировать