Добрый день!

Создаю процесс, который в деталь добавляет Результат выборки по объекту. 

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

Можно ли как-то ограничить количество добавляемых записей при добавлении результата выборки (например, свойство, где указывается количество добавляемых записей - 10, 20 и т.д.)?

Нравится

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

В элементе БП 'Добавить данные' такая возможность отсутствует.

Выбрать точное количество записей запроса можно в элементе БП 'Читать данные'. Для этого нужно перейти в расширенный режим параметров элемента бизнес-процесса и найти параметр 'Количество записей для чтения':

Вы можете решить Вашу задачу таким образом.

1. С помощью элемента 'Читать данные' вычитать нужное количество записей.

2. В параметры бизнес-процесса добавить параметр с типом "Коллекция объектов'  и там же указать, что в него должен поместиться результат выборки из элемента 'Читать данные'.

3. После элемента 'Читать данные' добавить элемент 'Задание-сценарий' и уже в нём скриптом вставить нужные данные коллекции из параметра бизнес-процесса.

Или же просто реализовать всю логику в элементе 'Задание-сценарий'.

В элементе БП 'Добавить данные' такая возможность отсутствует.

Выбрать точное количество записей запроса можно в элементе БП 'Читать данные'. Для этого нужно перейти в расширенный режим параметров элемента бизнес-процесса и найти параметр 'Количество записей для чтения':

Вы можете решить Вашу задачу таким образом.

1. С помощью элемента 'Читать данные' вычитать нужное количество записей.

2. В параметры бизнес-процесса добавить параметр с типом "Коллекция объектов'  и там же указать, что в него должен поместиться результат выборки из элемента 'Читать данные'.

3. После элемента 'Читать данные' добавить элемент 'Задание-сценарий' и уже в нём скриптом вставить нужные данные коллекции из параметра бизнес-процесса.

Или же просто реализовать всю логику в элементе 'Задание-сценарий'.

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

Здравствуйте. Столкнулся с проблемой получения дополнительных данных.

Например, создал активность в мобильном приложении, указав контрагента. На карточке просмотра активности есть необходимость скрывать некоторые поля, в зависимости от типа контрагента. Но на карточку просмотра активности о контрагенте загрузилась минимальная информация в виде Id и Name, а мне необходимо ещё значение Type.

Пробовал решить двумя способами.

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

var modelName = "Account";
var model = Ext.ClassManager.get(modelName);
 
var queryConfig = Ext.create("Terrasoft.QueryConfig", {
    modelName: modelName,
    columns: ["Id", "Name", "Type"]
});
 
model.load(account.get("Id"), {
    queryConfig: queryConfig,
    success: function(record) {
     // ???
    },
    failure: function(record, operation) {
        // ???
    },
    scope: this
});

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

Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);

Вторым способом заместил View и Controller и в Controller-классе в методе onLoadRecord попытался вызвать безрезультатно Account.Store.getById.

Хотя, при прочих равных в файле PharmaMobileActionScheduleVisit пакета PharmaMobile аналогичная строка с "волшебным" Store работает.

var type = ActivityType.Store.getById(Terrasoft.Configuration.ActivityTypes.Visit);

Может код из первого варинта поместить в замещенный onLoadRecord? Или есть другие варианты? Прошу помощи в решении задачи.

Нравится

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

Отвечу сам на вопрос решением. Оно оказалось простым.

При добавлении custom-правила вызовом 

Terrasoft.sdk.Model.addBusinessRule

(функция executeFn), в месте возврата данных model.load (success) необходимо вставить Ext.callback. Полным решение выглядит примерно следующим образом:

var modelName = "Account";
var model = Ext.ClassManager.get(modelName);
 
var queryConfig = Ext.create("Terrasoft.QueryConfig", {
	modelName: modelName,
	columns: ["Id", "Name", "Type"]
});
 
var failureFn = function(exception) {
	Ext.callback(callbackConfig.failure, callbackConfig.scope, [exception]);
};
 
model.load(account.get("Id"), {
	queryConfig: queryConfig,
	success: function(rec) {
 
		var type = rec.get("Type");
 
		record.changeProperty("FIELD-NAME", {
			hidden: type === "TYPE-VALUE"
		});
 
		Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
	},
	failure: failureFn,
	scope: this
});

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

Terrasoft.DataUtils.loadRecords

 

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

Использую действие Добавление данных (AddDataUserTask1)
Мне нужно создать активность по клиенту типа SMS (в допустимых действиях только Задача, Звонок и E-mail)

var Body = (string)SysSettings.GetValue(UserConnection, "RKO_OpeningAccount");
Guid SchemaId = new Guid("C449D832-A4CC-4B01-B9D5-8A12C42A9F89");
var DefValues= new Dictionary
        string, object>();
DefValues.Add("Recepient", Phone);
DefValues.Add("MsgSubject", "Информирование об открытии счета");
DefValues.Add("Body", Body);
DefValues.Add("StartDate", DateTime.Now);
DefValues.Add("DueDate", DateTime.Now);
DefValues.Add("OwnerId", "410006E1-CA4E-4502-A9EC-E54D922D2C00");//Петр Петрович Петров
DefValues.Add("AuthorId", "410006E1-CA4E-4502-A9EC-E54D922D2C00");//Петр Петрович Петров
DefValues.Add("StatusId", "4BDBB88F-58E6-DF11-971B-001D60E938C6");//Завершена
DefValues.Add("DetailedResult", "Cмс отправлено");
DefValues.Add("ContactId", Contact);
DefValues.Add("AccountId", Account);
DefValues.Add("EmployeeFolder", Otdelenie);
DefValues.Add("LeadId", LeadId);

AddDataUserTask1.EntitySchemaId = SchemaId;
AddDataUserTask1.RecordDefValues = DefValues;

return true;

Выходит ошибка : Неявное преобразование типа "System.Collections.Generic.Dictionary" в "Terrasoft.Core.Process.EntityColumnMappingValues" невозможно

Нравится

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

Если Вы хотите просто создать в скрипте новую активность с нужными значениями полей, а потом сохранить в базу с отработкой всей логики на объекте, то можно воспользоваться методами Entity. См., например, как это сделано:

var communication = new Activity(userConnection);
				communication.SetDefColumnValues();
				if (isEmail) {
					communication.Title = (string)Terrasoft.Core.Configuration.SysSettings.GetValue(userConnection, "EmailTypeCommunicationPrintingFormText");
				} else if (isImmidiateProcessing) {
					communication.StatusId = ActivityConsts.CompletedStatusUId;
					communication.Title = "Коммуникация по обработке на месте" ;
				} else {
					communication.Title = "Коммуникация с письменным ответом";
				}
				communication.Commentary = serviceRequestEntity.GetTypedColumnValue<string>(shortDescColumn.Name);
				if(isEmail) {
					var contactEmail = serviceRequestEntity.GetTypedColumnValue<string>(emailColumnName.Name);
					if (!string.IsNullOrEmpty(contactEmail)) {
						communication.Recepient = string.Format("{0} <{1}>; ", serviceRequestEntity.GetTypedColumnValue<string>(contactNameColumn.Name), contactEmail);
					}
					communication.HtmlBody = communication.Title; 
				} else if(isSms) {
					communication.Recepient = serviceRequestEntity.GetTypedColumnValue<string>(contactPhoneColumn.Name);
				}
				communication.ContactId = serviceRequestEntity.GetTypedColumnValue<Guid>(contactIdColumn.Name);
				communication.TypeId = activityTypeId;
				communication.ActivityCategoryId = ActivityConsts.ToDoCategoryUId;
				communication.MessageTypeId = ActivityConsts.OutgoingEmailtypeUId;
				communication.ServiceCallId = recordUId;
				communication.Save();

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

При добавление в событийный подпроцесс процесса по добавлению данных получена ошибка: Элемент "CreatedSMS" не может быть сериализован в БД, т.к. не сериализуется процесс.
Методом перебора вариантов получилось сохранить страницу только после того, как в процессе по добавлению данных убрала галочку «сериализовать в БД», все сохранилось и работает.
НО! Мне нужно в основной событийный подпроцесс после создания объекта добавить еще один процесс (старый, написан не мной) и опять такая же проблема: Элемент "SendSmsProcess" не может быть сериализован в БД, т.к. не сериализуется процесс.

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

Могу ли я убрать из старого процесса галочку сериализации? Или как мне лучше всего поступить?

Анастасия, это зависит от конкретного процесса.
Уточните у того, кто его делал.

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

В БП есть элемент "Добавление данных", но создает он не одну запись, а несколько, на основании выборки.
Каким образом можно получить Id всех созданных в этом элементе записей?

Нравится

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

Здравствуйте, Наталья!

Элемент "Добавить данные" содержит параметр "Id созданной записи", но данный параметр хранит Id записи при условии, что была добавлена одна запись. В режиме добавления выборки записей, элемент "Добавить данные" не хранит добавленные записи.

Для того, чтобы получить Id записей Вы можете создать другой процесс, который будет запускаться по событию создания записи. Стартовый элемент такого процесса будет содержать Id созданной записи. В результате добавления нескольких записей, будет запущено несколько экземпляров процесса.

Алексей,
спасибо за информацию. Так и сделаю.

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

Добрый день,
Необходимо добавлять лида после появления активности. Добавил событийный подпроцесс "после добавления записи" в объект "Активность", добавил подпроцесс и стартовое сообщение
1
Собственно вопросы:
- Как в коде обратиться к значениям колонок добавленной записи? что то вроде this.Entity.GetTypedColumnValue("Title"); ?
- Как используя EntitySchemaQuery добавить запись в таблицу лидов? На sdk примеры использования только на выборку, а на форуме находится только добавление через insert или же примеры использования выборки

Нравится

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

1.

Entity.GetTypedColumnValue<string>("Title");  

2. Добавление ESQ

EntitySchema schema = UserConnection.EntitySchemaManager.GetInstanceByName("Lead");
Entity entity = schema.CreateEntity(UserConnection);
entity.SetDefColumnValues();
entity.SetColumnValue("LeadName", "Новый лид");
entity.Save();

Большое спасибо :smile:

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