Привет.
Есть POST сервис на C#, который принимает и возвращает json.
Появилась идея, чтоб не регистрировать этот сервис в bpmonline запускать его через бизнес процесс.
Все нормально работает, но вот как передать в БП json тело и получить некий json обратно?
Пока удалось только передать параметры в Url.

Нравится

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

Добрый день,
На данный момент в сервисе ProcessEngineService нет такого метода, который бы позволял передавать параметры из тела POST запроса. Есть похожий метод ExecuteProcessWithResultPost но он устанавливает параметры процесса только из URL.

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

Коллеги, приветствую.

В бизнес- процессе эмулируется некоторая активность, "отправка СМС".

Я хочу в заголовок записать ряд параметров, например, ФИО, сумму задолженности и пр.

Что- то вроде этого:

"Уважаемый ФИО, у Вас имеется долг в размере ДОЛГ"

Как передать параметры бизнес- процесса в заголовок активности?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

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

У элемента "Задача" есть параметр Recommendation. Вам необходимо передать значение в него.
Для передачи есть две базовые возможности (+элемент "Задание-сценарий", но это сложный способ):
1) Найти в структуре процесса элемент "Задача" и в элементе "Задача" в параметр Recommendation установить значение по умолчанию
2) Использовать элемент "Формула"

В двух вариантах параметр необходимо заполнить следующим значением:
"Уважаемый "+[#ФИО#]+", у Вас имеется долг в размере "+[#ДОЛГ#]

(отдельный параметры необходимо разделять знаком "+", текст необходимо писать в двойных кавычках, перенос на новую строку осуществляется последовательностью символов \\n

Алексей, спасибо большое! Сейчас попробую.

Супер, работает. Спасибо!

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

Коллеги, приветствую.

Есть несколько бизнес- процессов, каждый из которых использует общие ресурсы (таблицы). Например, бизнес- процесс A инициируется событием- добавлением записи в таблицу "Задолженности", выполняет чтение задолженностей по всем договорам должника и меняет в добавленной записи значение в колонке "Общая сумма задолженности". Бизнес- процесс Б инициируется тем же событием и реализует логику погашения задолженности, оперируя теми же таблицами, что и бизнес- процесс А. Как будут выполняться процессы? Какой из них начнется первым, если начальное событие одно и то же?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

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

Плохая реализация - могут быть падения одного из процессов, т.к. таблица будет заблокирована другим процессом. Лучше делать все внутри одного процесса. Вы можете изменить в одном из процессов стартовый сигнал на обычный начальный элемент и добавить параметр с типом "Уникальный идентификатор", а во втором процессе вызывать этот процесс элементом "Подпроцесс", передавая в параметр подпроцесса Id записи.

Здравствуйте, Алексей! Спасибо большое за ответ!

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

Коллеги, приветствую.

Есть некоторый код C# в действии "Задание- сценарий", читающий из базы данных определенную информацию и, если таковая есть - устанавливает параметр процесса, скажем, isNewPayments.

Далее по процессу у меня есть "исключающее или" и два варианта потоков соответственно.

var userConnection = Get("UserConnection");
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 я могу указать тип,

var isNewPayments = Get("isNewPayments");

- то как указать тип для метода Set, если аргумент- коллекция объектов?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

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

Уточните, пожалуйста, Вашу задачу.

Вы хотите в параметр процесса записывать коллекцию объектов, или параметр процесса хранит коллекцию и Вы хотите ее получить в элементе "Задание-сценарий"?

Алексей, спасибо за ответ! Вообще же, было бы интересно узнать, как быть и в том, и в другом случае.
Если я оперирую объектами, например, то могу читать параметры бизнес- процесса и устанавливать таким образом:

// Чтение параметра бизнес- процесса
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;

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

Коллеги, приветствую.

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

SELECT
        TOP 1  
        ContactId as id,
        AC.CreatedOn as activityDate,
        UP.CreatedOn as paymentDate

FROM
        Activity as AC INNER JOIN UsrPayments as UP
                ON AC.ContactId = UP.UsrDebtorId
WHERE
        UP.CreatedOn  > AC.CreatedOn

ORDER BY AC.id ASC;

И есть некоторый код на C#, где с помощью класса Select проделывается то же, но считываются записи по всем активностям:

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") as Select;

Как прочитать только первую запись?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

Нашел, собственно -

var selectNewPayments = (Select)new Select(userConnection)
   .Top(1)
   .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;

Такой запрос возможен???

select count(ID)

   from [dbo].[Case] AS TI

WHERE DATEPART(HOUR, DATEADD(hh, 6, TI.[UsrDueDate])) >=9  and DATEPART(HOUR, DATEADD(hh, 6, TI.[UsrDueDate])) <12

and FORMAT(DATEADD(hh, 6, TI.[UsrDueDate]), N'yyyy.MM.dd') = FORMAT(cast(GETDATE() +1 as date), N'yyyy.MM.dd')

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

Коллеги, приветствую.

Есть некоторый некоторый простой бизнес- процесс, агрегирующий задолженности по связанным
договорам. Процесс работает и обновляет требуемые данные.

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

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

С помощью какого элемента это можно реализовать и каким образом вынести это в системные настройки?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

Коллеги, приветствую.

В дизайнере бизнес- процессов есть действие "Звонок". Как запланировать его на определенную дату?
Посмотрел в настройках, ничего похожего не нашел:

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

Добрый день,

Можно с помощью планировщика запланировать время выполнения самого процесса.
http://www.community.terrasoft.ru/forum/topic/12917
Можно запланировать время выполнения элемента с помощью Таймера.
Нужно понимать, что в этих случаях необходимо отталкиваться от какого-то времени или события.

Можно добавить активность с типом звонок с помощью элемента Добавление данных – указать дату начала активности.

Здравствуйте, Олег! Отлично, спасибо большое, буду пробовать.

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

Коллеги, приветствую.

Есть некоторый элемент- действие "Чтение данных", который считывает записи из таблицы и помещает в некоторую результирующую коллекцию ResultEntityCollection.

Как обратиться к этой коллекции из кода C# в действии "Задание- сценарий"?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

Алексей,

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

Олег, спасибо большое за ответ! Посмотрю сегодня.

Олег, не могли бы Вы выложить пример в UTF-8? Был бы весьма признателен.

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

Согласно этому сайту, мой коллега хотел написать следующее:
1. Создать параметр процесса типа Строка - TestParam.
2. В значение параметра указать [#Read data 1.First item of resulting collection#].GetTypedColumnValue("Name")
3. В элементе Задание-сценарий работать с параметром.
var contactFullName = Get("TestParam");

Отлично, спасибо большое за ответ!

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

Коллеги, приветствую.

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

F6F4725A-C7C6-4AA2-BE50-E4878ACB7D4B

Я выполняю простой запрос из MS SQL Server Management Studio -

SELECT
        UsrInDebtId
FROM
        UsrDebt
WHERE
        Id='F6F4725A-C7C6-4AA2-BE50-E4878ACB7D4B';

Получаю какой- то результат.

Аналогично из кода C#

...
myConnection.Open();
SqlCommand myCommand = new SqlCommand("...", myConnection);
SqlDataReader myReader = myCommand.ExecuteReader();
while (myReader.Read()) {
   ...
}
...    

Уникальный идентификатор я сохраняю в параметре addedRecordId -

Guid addedRecordId = Get("addedRecordId");

Далее я хочу использовать класс Select из пространства имен Terrasoft.Core.DB -

var userConnection = Get("UserConnection");
Select select = (Select)new Select(userConnection)
            .Column("UserInDebtId")
            .From("UsrDebt").As("UD")
            .Where("UD", "Id")
            .IsEqual(addedRecordId); // строка 42

Получаю ошибки компиляции -

Как я могу использовать Guid в условии IsEqual?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

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

Например:

string str = "F6F4725A-C7C6-4AA2-BE50-E4878ACB7D4B";
Guid guid = new Guid(str);

А затем уже:

...
.IsEqual(guid);

Хотя и не совсем ясно, что бы это могло дать...

Алексей,

В этом случае можно решить задачу двумя способами:

Вариант 1.
.IsEqual(addedRecordId.ToString());
Вариант 2.
.IsEqual(Column.Parameter(addedRecordId));

Второй вариант более корректный.

Здравствуйте, Олег! Большое спасибо за ответ, попробую сегодня.

В обоих случаях получаю такую ошибку компиляции:

Cannot implicity convert type 'Terrasoft.Core.DB.Query' to 'Terrasoft.Core.DB.Select'. An explicit
conversion exists (are you missing a cast?)

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

Олег, спасибо.

Помогло использование переменной с неявным типом:

var selectQuery = 
	new Select(userConnection) ...
Показать все комментарии

Коллеги, приветствую.

Есть некоторый простой бизнес- процесс, инициируемый событием- сигналом "Добавление записи в таблицу".

Например:

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

Как это сделать? Насколько я понимаю, нужно добавить параметр, но как записать в него Guid той записи, которая добавляется?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

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

У стартового сигнала есть параметр "Идентификатор записи" (RecordId). Создайте параметр процесса NewID с типом "Уникальный идентификатор". Используйте элемент "Формула" для передачи параметра StartSignal.RecordId в созданный Вами параметр NewID.
Используйте в задании-сценарии следующий код, чтобы получить значение, которое хранится в параметре NewID:

Id = Get<Guid>("NewID")

В итоге в параметре элемента "Задание-сценарий" будет установлено Id стартового сигнала.

Здравствуйте, Алексей! Спасибо большое за ответ, сейчас попробую сделать это.

Алексей, спасибо еще раз, все верно.

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