Установить параметр бизнес- процесса из действия "Задание- сценарий".
Коллеги, приветствую.
Есть некоторый код C# в действии "Задание- сценарий", читающий из базы данных определенную информацию и, если таковая есть - устанавливает параметр процесса, скажем, isNewPayments.
Далее по процессу у меня есть "исключающее или" и два варианта потоков соответственно.
Set("isNewPayments", -1);
var selectNewPayments = (Select)new Select(userConnection)
.Column("t1", "ContactId")
.Column("t1", "CreatedOn")
.Column("t2", "CreatedOn")
.From("Activity").As("t1")
.Join(JoinType.Inner, "UsrPayments").As("t2")
.On("t1", "ContactId").IsEqual("t2", "UsrDebtorId")
.Where("t1", "CreatedOn").IsLess("t2", "CreatedOn")
.OrderByAsc("t1", "id") as Select;
using (DBExecutor dbExecutor = userConnection.EnsureDBConnection())
{
using (IDataReader reader = selectNewPayments.ExecuteReader(dbExecutor))
{
if(reader.Read()) {
Set("isNewPayments", 1);
} else {
Set("isNewPayments", -1);
}
}
}
return true;
Это работает.
Но, скажем, если в действии "Задание- сценарий" я прочитал некоторую выборку и хочу установить ее также как параметр бизнес- процесса, то как бы я смог сделать это?..
Если для метода Get я могу указать тип,
- то как указать тип для метода Set, если аргумент- коллекция объектов?
Был бы весьма признателен за информацию.
Спасибо.
--
С уважением, Алексей Быков.
Нравится
Здравствуйте, Алексей!
Уточните, пожалуйста, Вашу задачу.
Вы хотите в параметр процесса записывать коллекцию объектов, или параметр процесса хранит коллекцию и Вы хотите ее получить в элементе "Задание-сценарий"?
Алексей, спасибо за ответ! Вообще же, было бы интересно узнать, как быть и в том, и в другом случае.
Если я оперирую объектами, например, то могу читать параметры бизнес- процесса и устанавливать таким образом:
// Чтение параметра бизнес- процесса var paramOne = Get<Decimal>("paramOne"); // Тип данных в дизайнере "Дробное число (0,01)" ... paramOne = decimal.Parse(reader["UsrColumnWithData"].ToString()); ... // Запись в параметр бизнес- процесса, тип данных не указываю - работает Set("paramOne", paramOne);
В случае с коллекцией объектов, как использовать Get и Set?
Добрый день!
В новом движке процессов работать можно только с параметрами процесса, либо напрямую с параметрами элементов, на которые настроен маппинг.
Т.е. если есть результат коллекции, с которым необходимо работать в Задание-сценарий подойдет такой пример:
1. Создать параметр процесса типа Строка - TestParam.
2. В значение параметра указать [#Read data 1.First item of resulting collection#].GetTypedColumnValue("Name")
3. В элементе Задание-сценарий работать с параметром.
var contactFullName = Get("TestParam");
Или в свойствах элемента Задание-сценарий убрать птичку "Для интерпретируемого процесса" и писать код как для старого движка.
Здравствуйте, Олег! Спасибо большое за ответ!
Олег, а как быть если ситуация обратная? Сценарий сформировал коллекцию обьектов и её нужно передать в параметр БП?
"Горовецкий Вячеслав Илларионович" написал:Олег, а как быть если ситуация обратная? Сценарий сформировал коллекцию обьектов и её нужно передать в параметр БП?
Приведите, пожалуйста, пример, где элемент "Задание-сценарий" формирует коллекцию, которая дальше используется по процессу.
Например, я пишу вебсервис, как у вас описано на академии (кстати тот пример не рабочий в 7.7). Этот сервис вызывает бизнес процесс, состоящий из одного элемента типа скрипт, который по заданным параметрам работает с ESQ и формирует, допустим некий список контрагентов (это коллекция неких объектов). Этот список нужно передать в исходящий параметр для выгрузки в качестве результата работы вебсервиса.
А теперь вопрос. Какой должен быть тип исходящего параметра у процесса (Entity или массив Entity) и как в него передать список объектов, полученных в скрипте?
Пример для интерпретируемого процесса:
Важно! В процессе в Usings необходимо подключить:
Terrasoft.Common.Json
var myUserConnection = context.UserConnection;
var esq = new EntitySchemaQuery(myUserConnection.EntitySchemaManager, "Account");
var nameColumn = esq.AddColumn("Name");
var primaryContactColumn = esq.AddColumn("PrimaryContact.Name");
var gorovetskiyContactId = new Guid("CEDA7503-8EAC-4581-B88F-DB537A27EB2C");
var filter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "PrimaryContact", gorovetskiyContactId);
esq.Filters.Add(filter);
var entityCollection = esq.GetEntityCollection(myUserConnection);
if (entityCollection.Count == 0) {
Set("AccountList", string.Empty);
return true;
}
var accounts = new List ();
foreach(var entity in entityCollection) {
var account = new {
Name = entity.GetTypedColumnValue(nameColumn.Name),
PrimaryContact = entity.GetTypedColumnValue(primaryContactColumn.Name)
};
accounts.Add(account);
}
string serialized = Json.Serialize(accounts);
Set("AccountList", serialized);
// пример для компилируемого процесса: AccountList = serialized
// параметр процесса AccountList - тип неограниченная строка – параметр процесса
//Json.Deserialize>(source) – пример, как выполнить обратное действие
return true;