Вопрос

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

Добрый день!

Не получается работать с коллекциями. При этом возникает вопрос: если у меня в элементе "Читать данные" коллекция записывается в 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)

Нравится

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

Сергей, данные из коллекции нужно считывать так:
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

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