Вопрос

Изменение записи после добавления

Добрый день!

Возник вопрос при правке данных сразу после создания записи. Система пишет ошибку и не отрабатывает как ожидалось. БП создает запись и далее сразу же ее пытаюсь изменить в разделе "После добавления записи".

Entity.SetColumnValue("Name","txt1");

Entity.Save();

return true;

Можете подсказать, что не так? GetColumnValue отрабатывает, а вот с изменением и дальнейшим сохранением операция не проходит.

Нравится

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

Сразу же у меня возникли вопросы, какая именно ошибка у вас возникает?

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

Григорий Чех,

Изначально требуется вызывать 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");

не получает никаких данных.

В чем может быть проблема?

Параметры на выходе блока WS такие

Код сейчас такой использую:

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;

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