Вопрос

Работа с коллекциями в БП

Добрый день!



Не получается работать с коллекциями. При этом возникает вопрос: если у меня в элементе "Читать данные" коллекция записывается в ResultCompositeObjectList  мне ее и читать? Или все равно вытягивать ResultEntityCollection (по примеру)? 



И как потом "пройтись" по всем этим номерам в элементе "Задание-сценарий" (хочу склеить их в одну строку).



Если использовать код 

var entities = Get<EntityCollection>("ReadDataUserTask4.ResultEntityCollection");
 
var result = "";
 
foreach(var entity in entities) {
 
    	var Name = entity.GetTypedColumnValue<string>("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)

Нравится

10 комментариев
Лучший ответ

Сергей, данные из коллекции нужно считывать так:

var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask1.ResultCompositeObjectList");

Т.е. в вашем случае код будет таким:

 

var entities = Get&lt;ICompositeObjectList&lt;ICompositeObject&gt;&gt;("ReadDataUserTask4.ResultCompositeObjectList");
 
var result = "";
 
foreach(var entity in entities) 
{
    	var Name = "";
    	if (entity.TryGetValue&lt;string&gt;("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&lt;ICompositeObjectList&lt;ICompositeObject&gt;&gt;("ReadDataUserTask4.ResultCompositeObjectList");
 
var result = "";
 
foreach(var entity in entities) 
{
    	var Name = "";
    	if (entity.TryGetValue&lt;string&gt;("Number", out Name))
    	{
    		result = result + Name + ", ";  
    	}
}
 
Set("CaseAbo", result);
return true;

 

Сидоров Александр В.,

Спасибо, все получилось. Финальный вариант:

var entities = Get&lt;ICompositeObjectList&lt;ICompositeObject&gt;&gt;("ReadDataUserTask3.ResultCompositeObjectList");
var result = "";
List&lt;string&gt; r = new List&lt;string&gt;();
foreach(var entity in entities) 
{
    	var Name = "";
 
    	if (entity.TryGetValue&lt;string&gt;("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&lt;string&gt;();
//...

 

Добрый день!

Аналогичным образом 

var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask3.ResultCompositeObjectList");

попробовал обратиться к коллекции на выходе из WS. Моя строка ниже:

var entities = Get<ICompositeObjectList<ICompositeObject>>("WebService1.UsrTestResult_Out");

Но отладка в студии показала, что в entities никакие данные не попадают.

При работе с WS в БП есть какие-то дополнительные подводные камни?

При необходимости готов прислать настройки блоков своего БП с WS и с кодом C#.

Александр Кулиш,

А что возвращает (тип) метод UsrTestResult_Out вашего WS

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