Пытаюсь читать данные, как писали опытные люди

var entities1 = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask1.ResultCompositeObjectList");
var	entityLocation	= entities1.FirstOrDefault();
if (entityLocation == null)
	throw(new Exception("NULL!!!"));

ReadDataUserTask1 - чтение 1 записи.

entityLocation получается null, хотя я читаю элемент, по заранее заданному Id.

Если сделать просто entities1.First(), то ошибка System.InvalidOperationException: Последовательность не содержит элементов в System.Linq.Enumerable.First

Что я делаю не так?

Нравится

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

Попробуйте обращаться не к ResultCompositeObjectList, а к ResultEntity. И тип данных Entity

 

Попробуйте обращаться не к ResultCompositeObjectList, а к ResultEntity. И тип данных Entity

 

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

Добрый день! 

Пытаюсь создать уведомление: 

ISchemaManagerItem<Terrasoft.Core.Entities.EntitySchema> reportSchemaItem = UserConnection.EntitySchemaManager.GetItemByName("Contact");
Terrasoft.Core.Entities.EntitySchema remindingSchema = UserConnection.EntitySchemaManager.GetInstanceByName("Reminding");
Entity reminding = remindingSchema.CreateEntity(UserConnection);
reminding.SetDefColumnValues();
reminding.SetColumnValue("AuthorId", UserConnection.CurrentUser.ContactId);
reminding.SetColumnValue("ContactId", UserConnection.CurrentUser.ContactId);
reminding.SetColumnValue("SourceId", RemindingConsts.RemindingSourceAuthorId);
reminding.SetColumnValue("RemindTime", UserConnection.CurrentUser.GetCurrentDateTime());
reminding.SetColumnValue("SysEntitySchemaId", reportSchemaItem.UId);
reminding.SetColumnValue("LoaderId", reportSchemaItem.UId);
reminding.SetColumnValue("SubjectId", Guid.Empty);
reminding.SetColumnValue("SubjectCaption", "Caption");
reminding.Save();

на Save() возникает ошибка:

   at Ninject.KernelBase.Resolve(IRequest request, Boolean handleMissingBindings)
   at Ninject.KernelBase.Resolve(IRequest request)
   at Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique)
   at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters)
   at Terrasoft.Core.Factories.ClassFactory.<>c__DisplayClass15_0`1.<Get>b__0()
   at Terrasoft.Core.Factories.ClassFactory.GetInstance[T](Func`1 action)
   at Terrasoft.Core.Factories.ClassFactory.Get[T](ConstructorArgument[] constructorArguments)
   at Terrasoft.Configuration.RemindingEventsProcess`1.SendNotification() in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.NUI_Entity.cs:line 278
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.OnInsertedHandle() in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1229
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.RemindingInsertedScriptTaskExecute(ProcessExecutingContext context) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1158
   at Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessScriptTask.Execute(ProcessExecutingContext context, Func`2 internalExecute)
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.ProcessQueue(ProcessExecutingContext context) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1081
   at Terrasoft.Configuration.RemindingEventsProcess`1.ProcessQueue(ProcessExecutingContext context) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.NUI_Entity.cs:line 225
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1032
   at Terrasoft.Core.Process.ProcessFlowElement.OnExecuted(ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.ProcessQueue(ProcessExecutingContext context) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1086
   at Terrasoft.Configuration.RemindingEventsProcess`1.ProcessQueue(ProcessExecutingContext context) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.NUI_Entity.cs:line 225
   at Terrasoft.Configuration.BaseEntity_Base_Entity_TerrasoftEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\BaseEntity.Base_Entity.cs:line 1251
   at Terrasoft.Configuration.BaseEntityEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\BaseEntity.LocalMessage_Entity.cs:line 257
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1345
   at Terrasoft.Configuration.RemindingEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.NUI_Entity.cs:line 285
   at Terrasoft.Core.Entities.Entity.ThrowEvent(String message, EventArgs eventArgs)
   at Terrasoft.Configuration.Reminding_Base_Entity_Terrasoft.<InitializeThrowEvents>b__90_2(Object s, EntityAfterEventArgs e) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 741
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at Terrasoft.Core.Entities.Entity.OnInserted(EntityAfterEventArgs e)
   at Terrasoft.Core.Entities.Entity.InsertToDB(Boolean skipLookupColumnValues, Boolean validateRequired)
   at Terrasoft.Core.Entities.Entity.InternalSave(Boolean validateRequired, Boolean setColumnDefValue)
   at Terrasoft.Core.Entities.Entity.Save(Boolean validateRequired, Boolean setColumnDefValue)

что я делаю не так?

Нравится

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

А какой сам текст ошибки? Он где-то над стеком.

 

Error creating an instance of the "Terrasoft.Configuration.INotificationSender" class
 
Error activating INotificationSender
No matching bindings are available, and the type is not self-bindable.
Activation path:
  1) Request for INotificationSender
 
Suggestions:
  1) Ensure that you have defined a binding for INotificationSender.
  2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
  3) Ensure you have not accidentally created more than one kernel.
  4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
  5) If you are using automatic module loading, ensure the search path and filters are correct.

 

Руслан, на объекте Reminding во встроенном БП ничего не менялось? В частности, функция SendNotification у Вас стандартная?

На объекте Reminding ни чего не менялось. Хотя из приложения уведомления создаются, а из Visual Studio выбрасывается исключение. 

Видимо, часть логики ядра, которую вызывает строчка

 var notificationSender = ClassFactory.Get&lt;INotificationSender&gt;( 

в функции SendNotification() встроенного БП объекта Reminding, не совместима с запуском извне. По самому сообщению обсуждают здесь.

 

Если обойти не получится, создавать запись можно внутри системы, а если нужно извне — по OData, обращением к веб-сервису или запуском БП.

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

Добрый день! 

Подскажите, пожалуйста, есть ли способ преобразовать Select в ESQ?

Что то похожее на метод ESQ:

public Select GetSelectQuery(UserConnection userConnection);

только в обратную сторону.

Нравится

1 комментарий

Стандартно такого преобразования нет, ведь ESQ — более ограниченный и высокоуровневый механизм.

 

Доступные свойства и методы серверной EntitySchemaQuery описаны здесь.

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

Добрый день!

Подскажите, пожалуйста, как реализовать данный ESQ запрос:

select c.Id, c.Name, count(1) as AmountOfLeadHandled
from Lead l inner join Contact c on c.Id=l.OwnerId 
where exists (select 1 from Activity a
	where a.LeadId=l.id
	and not (a.TypeId='E2831DEC-CFC0-DF11-B00F-001D60E938C6' 
		and a.MessageTypeId='7F9D1F86-F36B-1410-068C-20CF30B39373')
	and a.StatusId in ('4BDBB88F-58E6-DF11-971B-001D60E938C6'))
	Group by c.Id, c.Name

Есть такой код:

var schema = _userConnection.EntitySchemaManager.GetInstanceByName("Lead");
EntitySchemaQuery esqTotal = new EntitySchemaQuery(schema);
esqTotal.AddColumn("=Owner.Id");
esqTotal.AddColumn("=Owner.Name");
esqTotal.AddColumn(esqTotal.CreateAggregationFunction(Terrasoft.Common.AggregationTypeStrict.Count, "Id"));
var activityTypeId = new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6");
var activitymessageTypeId = new Guid("7F9D1F86-F36B-1410-068C-20CF30B39373");
var activityStatusId = new Guid("4BDBB88F-58E6-DF11-971B-001D60E938C6");
var esqActivity = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Activity");
esqActivity.AddColumn("Lead");
var filtersByExisting = new EntitySchemaQueryFilterCollection(esqActivity);
filtersByExisting.IsNot = true;
filtersByExisting.Add(esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal, "Type", activityTypeId));
filtersByExisting.Add(esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal,                 "MessageType", activitymessageTypeId));
esqActivity.Filters.Add(filtersByExisting);
esqActivity.Filters.Add(esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal,                "Status", activityStatusId));
esqTotal.Filters.Add(esqTotal.CreateFilter(FilterComparisonType.Exists, "Id", esqActivity));

Но он выдает не совсем то что надо. Мне надо выполнить условие:  

where a.LeadId=l.id

Не могу ни как добиться результата. Может кто нибудь подсказать?

Нравится

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

Добрый день!

 

Возможно, для решения Вашей задачи подойдет вариант с созданием представления в базе данных, потом для него в конфигурации создать схему и использовать эту схему для построения запроса и получения нужной информации.

В любой непонятной ситуации советуй view.wink

Руслан, а с чем связано требование именно при помощи ESQ?

На сервере есть класс Select, покрывающий почти все возможности его синтаксиса.

И смотрю на Ваш запрос, его точно ли нельзя «вывернуть», чтобы выборка шла из Activity, с join остальных таблиц без всяких exists? Как тут.

Зверев Александр пишет:

В любой непонятной ситуации советуй view.

Точно) Дешево и сердито... 

 

Ну, а что можно, даже создать представление только для запроса с Activity, а потом уже в коде использовать его.

Если требование именно через ESQ нужно ради учёта прав доступа, то view как раз их все обойдёт.

Зверев Александр,

Ну, можно специальную view тогда написать)))

Алла Савельева,

Представление не подойдет.

1.Мне нужны агрегированные данные за определенный период, т.е. мне во вьюшку надо было бы передать диапазон дат и чтобы она вернула агрегированные данные за этот диапазон. Я не знаю как это сделать. 

2. Мне нужно встроиться в существующий механизм, который как раз использует ESQ.

3. Ну и права не помешают.

Зверев Александр,

Хорошо, я подумаю как вывернуть запрос. Может что то получится. Спасибо за совет.

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

Приветствую!

Подскажите каким образом можно перенести текст из из поля "Тема" в "Описание".

Хотим избавиться от строкового поля "тема" в карточке. В настоящий момент в системе много заполненных записей с названием темы.

Каким образом лучше перенести эти значения? Кто нибудь сталкивался с подобным вопросом?

Нравится

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

Легче всего написать SQL (названия объекта и полей примерные)  UPDATE UsrObject SET Description = Subject

 

Доступ к БД есть с помощью дополнения на Marketplace

Вижу 2 варианта:

1. Бизнес-процессом

2. Напрямую в БД.

Еще зависит от того стоит ли сохранять существующее значение поля Описание или просто заменять на значение поля тема.

Я бы выбрал второй вариант, если есть доступ к БД

Легче всего написать SQL (названия объекта и полей примерные)  UPDATE UsrObject SET Description = Subject

 

Доступ к БД есть с помощью дополнения на Marketplace

Владимир Соколов, Алексей Следь, - спасибо за ответ!

 

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