Работа с коллекциями в БП
Добрый день!
Не получается работать с коллекциями. При этом возникает вопрос: если у меня в элементе "Читать данные" коллекция записывается в ResultCompositeObjectList мне ее и читать? Или все равно вытягивать ResultEntityCollection (по примеру)?
И как потом "пройтись" по всем этим номерам в элементе "Задание-сценарий" (хочу склеить их в одну строку).
Если использовать код
var entities = Get("ReadDataUserTask4.ResultEntityCollection");
var result = "";
foreach(var entity in entities) {
var Name = entity.GetTypedColumnValue("Number");
result = result + Name + ", ";
}
Set("CaseAbo", result);
return true;Выдается ошибка:
System.NullReferenceException: Object reference not set to an instance of an object.
at Terrasoft.Core.Process.UsrAbonentUpdateMethodsWrapper.ScriptTask2Execute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
Нравится
Сергей, данные из коллекции нужно считывать так:
var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask1.ResultCompositeObjectList");
Т.е. в вашем случае код будет таким:
var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask4.ResultCompositeObjectList");
var result = "";
foreach(var entity in entities)
{
var Name = "";
if (entity.TryGetValue<string>("Number", out Name))
{
result = result + Name + ", ";
}
}
Set("CaseAbo", result);
return true;
Скорее всего имеет смысл получать коллекцию через Get<EntityCollection>("ResultCompositeObjectList").
Я пытался еще в 7.10 получать коллекцию из ReadDataUserTask - всегда null выдавало. Видимо до сих пор не поправили.
Варфоломеев Данила,
Если я делаю так, то выдает ошибку:
System.InvalidCastException: Unable to cast object of type 'Terrasoft.Common.CompositeObjectList`1[Terrasoft.Common.CompositeObject]' to type 'Terrasoft.Core.Entities.EntityCollection'.
at Terrasoft.Core.Process.ProcessModel.GetParameterValue[T](FoundParameterData result)
at Terrasoft.Core.Process.UsrAbonentUpdateMethodsWrapper.ScriptTask2Execute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
поменяйте тип у переменной ResultCompositeObjectList на "Коллекция объектов (EntityCollection)"
Варфоломеев Данила,
К сожалению, там стоит замочек и изменить его нельзя...
Сергей, данные из коллекции нужно считывать так:
var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask1.ResultCompositeObjectList");
Т.е. в вашем случае код будет таким:
var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask4.ResultCompositeObjectList");
var result = "";
foreach(var entity in entities)
{
var Name = "";
if (entity.TryGetValue<string>("Number", out Name))
{
result = result + Name + ", ";
}
}
Set("CaseAbo", result);
return true;
Сидоров Александр В.,
Спасибо, все получилось. Финальный вариант:
var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask3.ResultCompositeObjectList");
var result = "";
List<string> r = new List<string>();
foreach(var entity in entities)
{
var Name = "";
if (entity.TryGetValue<string>("Number", out Name))
{
r.Add(Name);
}
}
result = String.Join(", ", r.ToArray());
Set("CaseAbo", result);
return true;
Добрый день!
А изначальная задача в чем состоит? Если просто получить через запятую результаты определенной выборки, то может имеет смысл вынести эту задачу вообще в sql? Например, каким-нибудь вот таким способом
//...
var result = new CustomQuery(UserConnection, @"select stuff((
select ', ' + [Number]
from [Table_with_Number_field]
for xml path('')), 1, 2, null)").ExecuteScalar<string>();
//...
Добрый день!
Аналогичным образом
var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask3.ResultCompositeObjectList");
попробовал обратиться к коллекции на выходе из WS. Моя строка ниже:
var entities = Get<ICompositeObjectList<ICompositeObject>>("WebService1.UsrTestResult_Out");
Но отладка в студии показала, что в entities никакие данные не попадают.
При работе с WS в БП есть какие-то дополнительные подводные камни?
При необходимости готов прислать настройки блоков своего БП с WS и с кодом C#.
Александр Кулиш,
А что возвращает (тип) метод UsrTestResult_Out вашего WS