Добрый день!
Возник вопрос при правке данных сразу после создания записи. Система пишет ошибку и не отрабатывает как ожидалось. БП создает запись и далее сразу же ее пытаюсь изменить в разделе "После добавления записи".
Entity.SetColumnValue("Name","txt1");
Entity.Save();
return true;
Можете подсказать, что не так? GetColumnValue отрабатывает, а вот с изменением и дальнейшим сохранением операция не проходит.
Нравится
Сразу же у меня возникли вопросы, какая именно ошибка у вас возникает?
Почему все правки нельзя сразу внести и выполнить с одним сохранением? БП на какой сигнал настроен, те возможно у вас зацикливание между после добавления и перед добавлением записи?
Григорий Чех,
Изначально требуется вызывать WS, записи на выходе парсить и создавать/обновлять записи в отдельном справочнике.
На выходе из WS получаем:
{"results":[{"id":"1", "login":"qwe1", "name":"qwe1"},{"id":"2", "login":"qwe2", "name":"qwe2"},{"id":"3", "login":"qwe3", "name":"qwe3"}]}
Если не ошибаюсь, блок по работе с WS в БП не умеет корректно обрабатывать такие ответы.
Во всяком случае видел в Сообществе такого рода комментарии.
Так что сейчас пробую весь ответ внести в промежуточную служебную форму, удалить лишнее, оставив только JSON, и описать парсинг JSON с логикой по созданию/обновлению записей.
На всякий случай сразу уточню. Можно ли без c# только блоками БП настроить парсинг этого дела?
Вариант с зацикливанием проверю дополнительно.
Спасибо!
Александр Кулиш пишет:
На всякий случай сразу уточню. Можно ли без c# только блоками БП настроить парсинг этого дела?
Для работы с данными служит элемент БП «Формула», но там функций работы с текстом минимум, по сути, только слияние строк.
Проще будет записать результат вызова сервиса в строковой параметр, а потом блоком-скриптом его разобрать, записав в другие параметры или сразу создав кодом записи в таблице базы.
В последних версиях в БП для элемента вызова веб-сервиса добавили поддержку коллекций в том числе и для ответа от сервиса, нужно смотреть, можно ли там настроить такое.
Александр Кулиш,
Обсуждалось тут так же обратите внимание на парсинг Json в c# через Newtonsoft.Json
Григорий Чех,
В первой Вашей ссылке рассмотрен пример.
Попробовал его воспроизвести.
Делаю все по нему и в результате система выдает:
System.NullReferenceException: Object reference not set to an instance of an object.
at Terrasoft.Common.ReflectionUtilities.GetPropertyValueByPath(Object source, String propertyPath)
at Terrasoft.Core.Process.ProcessModel.Get[T](String propertyPath)
at Terrasoft.Core.Process.UsrJira2NvgIntegration3MethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
Я так понимаю, то причина может быть в задании-сценарии.
На всякий случай его текст привожу ниже:
var collection = Get<ICompositeObjectList<ICompositeObject>>("WebService1.UsrResult_Out");
var result = new List<string>();
foreach (var row in collection){
row.TryGetValue("UsrResultsId_Out", out string id);
row.TryGetValue("UsrResultsLogin_Out", out string login);
row.TryGetValue("UsrResultsName_Out", out string name);
result.Add($"{name}:{login}:{id}");
}
Set("Name1", string.Join(" | ", result.ToArray()));
return true;
Можете подсказать, в каком направлении при этом стоит копать?
Григорий Чех,
Код успешно компилируется.
В режиме отладки вижу, что первая строка кода:
var collection = Get<ICompositeObjectList<ICompositeObject>>("WebService1.UsrTestResult_Out");
не получает никаких данных.
В чем может быть проблема?
Код сейчас такой использую:
var collection = Get<ICompositeObjectList<ICompositeObject>>("WebService1.UsrTestResult_Out");
var result = new List<string>();
foreach (var row in collection){
row.TryGetValue("UsrTestResultName_Out", out string name);
row.TryGetValue("UsrTestResultComment_Out", out string comment);
result.Add($"{name}:{comment}");
}
Set("Name1", string.Join(" | ", result.ToArray()));
Set("Name2", "qwe");
return true;