Вопрос

Добрый день!

 

Есть две таблицы:

1) ListObject с колонками ObjectName(строка), ObjectType(Lookup), ObjectRule(Lookup на RulesList )

2) RulesList с колонками NameRule(строка),  ObjectType(Lookup)

Нужно реализовать фильтр, для колонки ObjectRule, таблицы ListObject. 

Фильтр должен выводить доступными только те записи ObjectRule, ObjectType которых соответствует ObjectType таблицы ListObject.

 

rules: {
  "typeObjectFilter": {
	 lookupListConfig: {
	   filters: [
	     function() {
		   var ruleToObject = this.get("ObjectRule");
		   var filterGroup = Ext.create("Terrasoft.FilterGroup");
		   if (ruleToObject) {
			  var filterByTypeRule = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"[RulesList:ObjectType].value", ruleToObject.value);
			  filterGroup.add("filterByTypeRule", filterByTypeRule);
			  return filterGroup;
		   }
		 }
	   ]
    }
  }
}

В настоящий момент фильтр не работает, страница не загружается.

Нравится

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

engineer7,

По первому пункту рекомендую ознакомиться со статьей по построению путей к колонкам относительно корневой схемы на академии:

https://academy.terrasoft.ru/documents/technic-sdk/7-13/postroenie-putey-k-kolonkam-otnositelno-kornevoy-shemy

Изначально Вы писали о том, что хотите фильтровать поле ObjectRule, а в коде реализуете фильтрацию для поля ObjectType.

Дальше Вы реализуете её в блоке rules, но, если делать через  lookupListConfig, то реализовывать нужно через блок attributes.

На мой взгляд, в данном случае Вы сильно усложнили себе задачу.

Ваш запрос на sql выглядит таким образом:

select Id

from RuleList

where RuleList.ObjectTypeId = @ObjectTypeId

где @ObjectTypeId - это значение ObjectType из таблицы ListObject

Реализовать такую фильтрацию можно легко с помощью мастера бизнес-правил https://academy.terrasoft.ru/documents/administration/7-13/nastroyka-biznes-pravil либо внести изменения в страницу редактирования на уровне конфигурации https://academy.terrasoft.ru/documents/technic-sdk/7-13/primer-primeneniya-pravila-filtration

1. Почему в выражении "[RulesList:ObjectType].value" Вы указали "value"?

Вместо value нужно указать поле, по которому будет фильтрация.

Например: "[RulesList:ObjectType].ObjectRule"

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

Алла,  добрый день! Спасибо за ответ!

1. Не знал этот момент.

2. Sql запрос выглядит таким образом:

SELECT ObjectRule

  FROM ListObject INNER JOIN RulesList ON

  ListObject.ObjectTypeId =  ListObject.ObjectRule.ObjectTypeId

только мне не совсем понятно, в том плане, что запрос выполняется для данных, которые уже находятся в таблице, в моем случае, я сначала выбираю ObjectType в ListObject  для нового объекта, но выбранные данные в таблицу еще не добавляю, потому что хочу сначала выбрать правило из RulesList для нового объекта, но данное правило должно иметь точно такой же тип который я выбрал...

Возможно мне нужно идти по другому пути и для начала получить значение из поля "Тип объекта"(ObjectRule таблицы ListObject), которое я добавляю первым? 

engineer7,

По первому пункту рекомендую ознакомиться со статьей по построению путей к колонкам относительно корневой схемы на академии:

https://academy.terrasoft.ru/documents/technic-sdk/7-13/postroenie-putey-k-kolonkam-otnositelno-kornevoy-shemy

Изначально Вы писали о том, что хотите фильтровать поле ObjectRule, а в коде реализуете фильтрацию для поля ObjectType.

Дальше Вы реализуете её в блоке rules, но, если делать через  lookupListConfig, то реализовывать нужно через блок attributes.

На мой взгляд, в данном случае Вы сильно усложнили себе задачу.

Ваш запрос на sql выглядит таким образом:

select Id

from RuleList

where RuleList.ObjectTypeId = @ObjectTypeId

где @ObjectTypeId - это значение ObjectType из таблицы ListObject

Реализовать такую фильтрацию можно легко с помощью мастера бизнес-правил https://academy.terrasoft.ru/documents/administration/7-13/nastroyka-biznes-pravil либо внести изменения в страницу редактирования на уровне конфигурации https://academy.terrasoft.ru/documents/technic-sdk/7-13/primer-primeneniya-pravila-filtration

Алла, огромное спасибо!

Получилось реализовать, рабочий вариант: 

	// Набор правил для колонки [ObjectRule] модели представления.
			"ObjectRule": {
				// Правило фильтрации колонки [ObjectRule] по значению колонки [ObjectType].
				"FiltrationObjectRuleByObjectType": {
					// Тип правила FILTRATION.
					"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
					// Будет выполняться обратная фильтрация.
					"autocomplete": true,
					// Будет выполняться очистка значения при изменении значения колонки [ObjectType].
					"autoClean": true,
					// Путь к колонке для фильтрации в справочной схеме [ObjectRule],
					// на которую ссылается колонка [ObjectRule] модели представления
					// страницы редактирования.
					"baseAttributePatch": "ObjectType",
					// Тип операции сравнения в фильтре.
					"comparisonType": Terrasoft.ComparisonType.EQUAL,
					// В качестве значения при сравнении выступает колонка (атрибут)
					// модели представления.
					"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
					// Имя колонки модели представления страницы редактирования,
					// по значению которой будет выполняться фильтрация.
					"attribute": "ObjectType"
				}
			}

 

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

Проблема подключения к MS Exchange. При подключение используется домен, но настройки для введения домена нет. Пробовал через domen\ADLogin - не работает. Логин не имеет в себе "@mail.com" (в смысле не совпадает с адресом). При подключении пишет "Указан неправильный email или пароль." Проверил настройки на Outlook встроенный в Windows 10 - все работает нормально, просит завести: Сервер, домен, логин, пароль.

Настраивал по инструкции академии

Нравится

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

Насколько я понимаю в зависимости от настроек сервера в в имени пользователя может быть домен или его не быть е если у вас email VasaPupkin в домен ExtraCompany

попробуйте  установив вводить имя вручную указать установить логин как:

ExtraCompany\VasaPupkin

Или попросить установить для Exchange сервера формат аутентификации без логина

Как то так: https://www.techieshelp.com/exchange-2013-change-owa-log-on-options/

Вот видео по настройке. Насколько понимаю, если логин не совпадает с email, то нужно вводить логин и email в соответствующие поля, а домен отдельно никуда вводить не нужно.

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

по этом видео делал - не работает

Может, какие-то запреты на стороне сервера. Уточните параметры подключения у админа, вдруг реально нужно прописывать не тот email. Если есть логи на стороне exchange, там тоже при неуспешном подключении может быть более подробная информация о причине.

Зверев Александр,Админ говорит что логин это - domin\Login, и имя сервера. Больше нечего не дает, говорит это все

Пусть ещё email Вам скажет.

И смотрите логи.

Зверев Александр, email я взял. Смотреть логи Exchange'а? Админ говорит что там оооочень много данных и смотреть их отбивается

Сообщение «Указан неправильный email или пароль» намекает на одну из двух возможных причин. Также попробуйте включить настройку «Использовать email как логин».

Если дело не в этом, могут быть запреты на уровне сервера.

Зверев Александр, «Использовать email как логин» тоже ставил, не помогло. В общем нужны логи Exchange'а?

scr_cases_ms_exchange_card.png

Тут есть разные варианты настройки. Если ничего не поможет, анализируйте логи.

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

все их перепробовал.

Такое ещё может быть, если на сервере Exchange просрочены сертификаты. Если дело в этом, есть два решения:

1) Установить нормальные сертификаты на сервере Exchange (не самоподписанные и не просроченные, а выданные центром сертификации) .

2) Установить значение true системной настройке «Игнорировать некорректные сертификаты сервера Exchange»

Насколько я понимаю в зависимости от настроек сервера в в имени пользователя может быть домен или его не быть е если у вас email VasaPupkin в домен ExtraCompany

попробуйте  установив вводить имя вручную указать установить логин как:

ExtraCompany\VasaPupkin

Или попросить установить для Exchange сервера формат аутентификации без логина

Как то так: https://www.techieshelp.com/exchange-2013-change-owa-log-on-options/

Григорий Чех,пробовал прописывать domen\Name - тоже не работает. Вносить в настройки сервера админ не хочет, потому и думаю как это можно сделать без его участия. Админ считает "у нас все работает, это у вас не правильно настроено или не работает"

Третий вариант найти почтовый сервер который умеет собирать почту с других серверов, настроить в нем импорт почты с вашего Exchange и использовать его для забора почты с Exchange сервера и отправлять (хотя отправлять можно и через этот третий сервер) А в BPM настроить этот третий сервер. Такое вроде умеет mail.ru gmail.com Если это конечно разовая операция если таких пользователей много то нужно надавить на админа через руководство :)

Кстате а какая версия у вас Exchange сервера?

И еще обращатся в поддержку не пробовали?

 

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

Подскажите пожалуйста, как передать данные в модальное окно, а также как и где получить их в модальном окне?

Вызов модального окна 

 

var sandbox = this.sandbox;
var config = {
	heightPixels: 300,
	widthPixels: 700
};
var moduleName = "GrsModalModule";
var moduleId = sandbox.id + "_" + moduleName;
var renderTo = ModalBox.show(config, function() {
	sandbox.unloadModule(moduleId, renderTo);
});
sandbox.loadModule(moduleName, {
	id: moduleId,
	renderTo: renderTo,
});

 

Нравится

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

Пример из  TagUtilitiesV2 (заполнение parameters) и вызов модуля

openTagModule: function(config) {
	var scope = config.scope;
	var sandbox = config.sandbox || scope.sandbox;
	var tagModulePageId = this.getTagModulePageId(sandbox);
	this.prepareModalBox();
	var tagModuleConfig = {
		renderTo: this.getGridContainer(),
		id: tagModulePageId,
		parameters: {
			TagSchemaName: config.entityTagSchemaName,
			InTagSchemaName: config.entityInTagSchemaName,
			RecordId: config.entityRecordId
		}
	};
	sandbox.loadModule("TagModule", tagModuleConfig);
},

Пример чтения переданных параметров в модуле TagModule 

createViewModel: function() {
	var viewModel = this.callParent(arguments);
	var parameters = this.parameters;
	if (parameters) {
		viewModel.set("TagSchemaName", parameters.TagSchemaName);
		viewModel.set("InTagSchemaName", parameters.InTagSchemaName);
		viewModel.set("RecordId", parameters.RecordId);
	}
	return viewModel;
}

 

Пример из  TagUtilitiesV2 (заполнение parameters) и вызов модуля

openTagModule: function(config) {
	var scope = config.scope;
	var sandbox = config.sandbox || scope.sandbox;
	var tagModulePageId = this.getTagModulePageId(sandbox);
	this.prepareModalBox();
	var tagModuleConfig = {
		renderTo: this.getGridContainer(),
		id: tagModulePageId,
		parameters: {
			TagSchemaName: config.entityTagSchemaName,
			InTagSchemaName: config.entityInTagSchemaName,
			RecordId: config.entityRecordId
		}
	};
	sandbox.loadModule("TagModule", tagModuleConfig);
},

Пример чтения переданных параметров в модуле TagModule 

createViewModel: function() {
	var viewModel = this.callParent(arguments);
	var parameters = this.parameters;
	if (parameters) {
		viewModel.set("TagSchemaName", parameters.TagSchemaName);
		viewModel.set("InTagSchemaName", parameters.InTagSchemaName);
		viewModel.set("RecordId", parameters.RecordId);
	}
	return viewModel;
}

 

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

Выдает: При привязке SysSettingsValue выдает "Не привязаны данные для связанного объекта "SysSettings" по колонке "SysSettings". Значение "72ab6c8f-fbb6-42ae-ba5c-7288bab96e2d"

Однако запись в SysSettings c Id = 72ab6c8f-fbb6-42ae-ba5c-7288bab96e2d предварительно успешно привязана.

Манипуляции из этой темы проблемы не решили.

Остается только через SQL?

Нравится

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

Убедитесь, что вы привязываете правильный объект. Вы должны выбрать в данных "Системная настройка (объект)", если выбрать просто "Системная настройка", то это будет просто представление в бд

Убедитесь, что вы привязываете правильный объект. Вы должны выбрать в данных "Системная настройка (объект)", если выбрать просто "Системная настройка", то это будет просто представление в бд

Литвинко Павел,

так и было! Благодарю.

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

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

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

 

Нравится

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

Дело может быть в том, что объект детали «Продукт в продаже» (OpportunityProductInterest) сделан на основе базового объекта, а другие подобные детали «Продукт в заказе» (OrderProduct) и «Продукт в счете» (InvoiceProduct) — на основе виртуального объекта «Базовое вхождение продукта» (BaseProductEntry). Соответственно, у объектов OrderProduct и InvoiceProduct есть поле «Название» и оно является первичным для отображения.

Сравните между собой детали и попробуйте сделать аналогично.

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

Есть потребность сделать реестр который можно редактировать. У реестра нет таблица в БД. Он должен формироваться динамически с разных таблиц. Одна колонка должна быть редактируемая где пользователь будет писать значение. Этот реестр наверно должен быть в отдельном окне. После заполнения пользователь жмет кнопку Ок и БПМ обрабатывает реестр и проделывает работу в исходном коде.

Вопрос: Возможно ли сделать такое окно и если да то куда копать?

Нравится

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

На мой взгляд, Вашу задачу можно решить проще.

1. Создаете представление (view) с нужными Вам данными.

2. На основании представления создаете деталь с обыкновенным нередактируемым реестром. Возможность добавления, редактирования и удаления у детали убираете. Использование обычной детали имеет, как минимум одно преимущество, - возможность настройки колонок из связанных объектов.

3. Над реестром добавляете виртуальное поле и кнопку [OK]. В зависимости от перемещения по детали подтягиваете в виртуальное поле нужное значение соответствующее активной записи. На click кнопки реализуете сохранение введенного пользователем значения в нужную таблицу или таблицы.

Визуально это будет выглядеть приблизительно так.

Конечно, этот способ тоже сложно назвать тривиальным, но по реализации все-таки реальней и после обновлений проблем однозначно будет меньше.

На мой взгляд, Вашу задачу можно решить проще.

1. Создаете представление (view) с нужными Вам данными.

2. На основании представления создаете деталь с обыкновенным нередактируемым реестром. Возможность добавления, редактирования и удаления у детали убираете. Использование обычной детали имеет, как минимум одно преимущество, - возможность настройки колонок из связанных объектов.

3. Над реестром добавляете виртуальное поле и кнопку [OK]. В зависимости от перемещения по детали подтягиваете в виртуальное поле нужное значение соответствующее активной записи. На click кнопки реализуете сохранение введенного пользователем значения в нужную таблицу или таблицы.

Визуально это будет выглядеть приблизительно так.

Конечно, этот способ тоже сложно назвать тривиальным, но по реализации все-таки реальней и после обновлений проблем однозначно будет меньше.

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

одно поле не подойдет, нужно для каждой строчки реестра сделать возможность заполнить свое значение и потом нажать кнопку ОК. Что то на подобие добавление продуктов на деталь Продукты в счете

Радчук Виталий Владимирович,

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

В любой задаче всегда есть, как минимум, два варианта решения, а то и больше... кто ищет, тот найдет!

Если логика реализуемая на уровне БД, то ещё можно и представлением с II, IU, ID-триггерами сделать. А потом с ним работать как с обычной таблицей, привязав к ней схему, а затем делать деталь с редактируемым реестром.

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

Нужно запустить БП по событию изменеия: изменение, удаление добавление дня рождения, мобильного телефона, email.

При стандартном "Сигнал" не отслеживает, хотя в таблице изменения вносит

Нравится

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

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

Для решения данной бизнес цели Вам необходимо учитывать что в bpm'online средства связи и знаменательные события это отдельные таблицы, в которые добавляются записи. И в данных таблицах указывается связь с записью контакта.

Необходимо отслеживать изменения записей в отдельных объектах

http://prntscr.com/l62dpt

http://prntscr.com/l62dsn

 

 

 

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

Можно ли как-то прочитать название если в объекте в колонке указан справочник, так как там указан Guid?

Пример:

[#Читать данные контакта.Первый элемент результирующей коллекции.Страна#] узнать название страны при чтении из "Читать данные"

Нравится

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

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

Можно получить нужное вам значение 2 вариантами.

1. Первый способ - 2-мя элементами 'Чтение данных'. Одним вычитываете Id города из Вашего объекта, а вторым название города по его Id из предыдущего элемента.

2. Второй способ сразу вычитать данные в элементе скрипт таск с помощью EntitySchemaQuery.

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

Можно получить нужное вам значение 2 вариантами.

1. Первый способ - 2-мя элементами 'Чтение данных'. Одним вычитываете Id города из Вашего объекта, а вторым название города по его Id из предыдущего элемента.

2. Второй способ сразу вычитать данные в элементе скрипт таск с помощью EntitySchemaQuery.

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

Первый способ не подходит, там 18 справочником, выйдет многовато читать. Второй способ я использовал, но руководство не совсем приветствует использование C# скриптов

Придётся делать подряд 2 элемента чтения данных: в первом читать из контакта Id страны, во втором — из справочника стран, отфильтрованного по этому Id, получать название.

Зверев Александр у меня 6 таблиц которые нужно заполнить данными. Для каждой таблицы порядка 20 справочников читать. Выйдет адский труд

Если таких слишком много и писать скрипты не хотите, можно ещё сделать view с текстовыми колонками, потом создать по нему объект и работать с ним.

Prime Source,

Prime Source пишет:

руководство не совсем приветствует использование C# скриптов

Главное с этим не злоупотреблять, в данном случае это оптимальный вариант.

К сожалению, пока вычитать данные из связанных таблиц в элементе 'Чтение данных' невозможно.

Как вариант, можно реализовать представление, которое содержит все нужные данные и обращаться к нему из элемента 'Чтение данных', но это такой вариант костыля и потом, так как мне не до конца известна Ваша задача, то не факт, что представление будет лучше, чем C# код.

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

Спасибо, мне нужно было что бы люди тоже подтвердили мое мнение начальству. Скрипт я написал, он сам чиатет и сам пишет все в таблице трансферную которую мне нужно

Если хотите правильнее всего и много однотипных чтений, создайте своё действие в процессе (отдельную схему с этой всей логикой внутри) и далее используйте в БП без необходимости программирования.

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

Подскажите,можно ли виртуальное поле типа LOOKUP сделать выпадающим списком?

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

Нравится

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

Обычно хватает добавить в diff "contentType": Terrasoft.ContentType.ENUM

{
	"operation": "insert",
	"name": "AccountType",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"values": {
		"bindTo": "Type",
		"layout": {
			"column": 0,
			"row": 2,
			"colSpan": 24
		},
		"contentType": Terrasoft.ContentType.ENUM
	}
},

 

А если не менять данные есть?

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

Обычно хватает добавить в diff "contentType": Terrasoft.ContentType.ENUM

{
	"operation": "insert",
	"name": "AccountType",
	"parentName": "ProfileContainer",
	"propertyName": "items",
	"values": {
		"bindTo": "Type",
		"layout": {
			"column": 0,
			"row": 2,
			"colSpan": 24
		},
		"contentType": Terrasoft.ContentType.ENUM
	}
},

 

Спасибо. Все получилось.

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

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

Роли хранятся в таблице SysAdminUnit.

Привязка пользователя идет в таблице SysUserInRole где опять же мы получаем SysUserId которая ссылается на SysAdminUnit, где мы получаем ContactId.

Нравится

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

 Что-то наподобие этого в lookuplistconfig прописать

filter: function() {return Terrasoft.createColumnFilterWithParameter(3, "[SysAdminUnit:Contact].[SysUserInRole:SysUser].SysRole.Id", "id группы")}

 

Select * from "Contact" INNER JOIN "SysAdminUnit" ON "Contact"."Id" = "SysAdminUnit"."ContactId"
where "SysAdminUnit"."Id" IN (Select "SysUserId" from "SysUserInRole" where "SysRoleId" = 'Ваша функциональная роль')

 

 Что-то наподобие этого в lookuplistconfig прописать

filter: function() {return Terrasoft.createColumnFilterWithParameter(3, "[SysAdminUnit:Contact].[SysUserInRole:SysUser].SysRole.Id", "id группы")}

 

Варфоломеев Данила пишет:

function() {return Terrasoft.createColumnFilterWithParameter(3, "[SysAdminUnit:Contact].[SysUserInRole:SysUser].SysRole.Id", "id группы")}

Огромное спасибо. 

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