Exception Message: Элемент коллекции с именем StatusId не найден при попытке добывать столбцы в EntitySchemaQuery

Ошибка возникает внезапно.

Код стандартный

EntitySchemaManager esqManager = UserConnection.EntitySchemaManager;
var esqResult = new EntitySchemaQuery(esqManager, "Document");
esqResult.AddColumn ("StatusId");

Entity currentDoc = esqResult.GetEntity(UserConnection, currentDocId);

Работало пять минут назад.
Сейчас перестало.
С какого рожна?
Вылетает на esqResult.AddColumn.

Какой столбец значения не имеет.

Уже не в первый раз приходится все переписывать через Select.
Но это неудобно, когда надо просто запись достать по Id.

Нравится

23 комментария

Александр, как вариант - быть может дело в том, что Вы не добавили колонку с первичным ключом (Id), а в момент, когда выполняется GetEntity(UserConnection, currentDocId); система не может по нему отфильтровать и не заполняется коллекция с колонкой StatusId, т.к. результат был null.

точно. спасибо, проверю.

нет. не помогает.

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

Guid parentDocId = new Guid(Page.DataSource.ActiveRow.GetColumnValue("DocumentId").ToString());
 
EntitySchemaManager esqManager = UserConnection.EntitySchemaManager;
var esqDocResult = new EntitySchemaQuery(esqManager, "Document");
esqDocResult.AddColumn("Id");
 
Entity parentDoc = esqDocResult.GetEntity(UserConnection, parentDocId);
Guid currentNodeId = parentDoc.GetTypedColumnValue<Guid>("CurrentApprovalNodeId");

даёт
Exception Message: Значение с именем "CurrentApprovalNodeId" не найдено

а в таком

Guid parentDocId = new Guid(Page.DataSource.ActiveRow.GetColumnValue("DocumentId").ToString());
 
EntitySchemaManager esqManager = UserConnection.EntitySchemaManager;
var esqDocResult = new EntitySchemaQuery(esqManager, "Document");
esqDocResult.AddColumn("Id");
esqDocResult.AddColumn("CurrentApprovalNodeId");
 
Entity parentDoc = esqDocResult.GetEntity(UserConnection, parentDocId);
Guid currentNodeId = parentDoc.GetTypedColumnValue<Guid>("CurrentApprovalNodeId");

вот так ругается
Exception Message: Элемент коллекции с именем CurrentApprovalNodeId не найден

В чем засада?!!

причем все это скопировано из документации один в один и не работает.

А понял, нужно писать так, т.к. имена колонок генерируются, и их названия не совпадают:

Guid parentDocId = new Guid(Page.DataSource.ActiveRow.GetColumnValue("DocumentId").ToString());
 
EntitySchemaManager esqManager = UserConnection.EntitySchemaManager;
var esqDocResult = new EntitySchemaQuery(esqManager, "Document");
var IdColumn = esqDocResult.AddColumn("Id");
var CurAppNodeIdColumn = esqDocResult.AddColumn("CurrentApprovalNodeId");
 
Entity parentDoc = esqDocResult.GetEntity(UserConnection, parentDocId);
Guid currentNodeId = parentDoc.GetTypedColumnValue<Guid>(CurAppNodeIdColumn);

Так то же самое
Exception Message: Элемент коллекции с именем CurrentApprovalNodeId не найден

то есть оно валится на вызове

esqDocResult.AddColumn("CurrentApprovalNodeId");

В общем ничего я не понял, опять через select переписал

Александр, попробуйте так (я опечатался, извините):

Guid parentDocId = new Guid(Page.DataSource.ActiveRow.GetColumnValue("DocumentId").ToString());
 
EntitySchemaManager esqManager = UserConnection.EntitySchemaManager;
var esqDocResult = new EntitySchemaQuery(esqManager, "Document");
var IdColumn = esqDocResult.AddColumn("Id");
var CurAppNodeIdColumn = esqDocResult.AddColumn("CurrentApprovalNodeId");
 
Entity parentDoc = esqDocResult.GetEntity(UserConnection, parentDocId);
Guid currentNodeId = parentDoc.GetTypedColumnValue<Guid>(CurAppNodeIdColumn.Name);

попробую, но уже не сегодня. :wink:

"Шамуилов Александр" написал:esqDocResult.AddColumn("CurrentApprovalNodeId");

Попробуйте так:

esqDocResult.AddColumn("CurrentApprovalNode.Id");

Помогло и то и другое :smile:
Данные достаются корректно, все работает, проверял.

if ( IsNew ) {
 
	Guid parentDocId = new Guid(Page.DataSource.ActiveRow.GetColumnValue("DocumentId").ToString());
 
	EntitySchemaManager esqManager = UserConnection.EntitySchemaManager;
	var esqDocResult = new EntitySchemaQuery(esqManager, "Document");
	var IdColumn = esqDocResult.AddColumn("Id");
	var CurAppNodeIdColumn = esqDocResult.AddColumn("CurrentApprovalNode.Id");
 
	Entity parentDoc = esqDocResult.GetEntity(UserConnection, parentDocId);
	Guid currentNodeId = parentDoc.GetTypedColumnValue<Guid>(CurAppNodeIdColumn.Name);
 
	var esqAppTypeResult = new EntitySchemaQuery(esqManager, "ApprovalNode");
	var appNodeIdColumn = esqAppTypeResult.AddColumn("Id");
	var appNodeTypeIdColumn = esqAppTypeResult.AddColumn("ApprovalType.Id");
	var appNodeNameColumn = esqAppTypeResult.AddColumn("Name");
 
	Entity appNode = esqAppTypeResult.GetEntity (UserConnection, currentNodeId);
	Guid appNodeTypeId = appNode.GetTypedColumnValue<Guid>(appNodeTypeIdColumn.Name);
	string appNodeTypeName = appNode.GetTypedColumnValue<string>(appNodeNameColumn.Name);
 
	Page.ApprovalTypeLookupEdit.Value = appNodeTypeId;
 
}
 
return true;

Но возникла другая проблема: как мне в скрипте выше (висит на PageLoadComplete карточки редактирования ПОСЛЕ генерации сообщения PageLoadComplete для родительского процесса) установить значение поля ApprovalTypeLookupEdit?

Как написано выше приводит с странным результатам. Страница причем неоперабельна, кнопки Ок Отмена нажимаются но не работают, ее можно только закрыть. И подписей к полям нет......

Если заменить

Page.ApprovalTypeLookupEdit.Value = appNodeTypeId;

на

Page.ApprovalTypeLookupEdit.SuspendAjaxEvents();
Page.ApprovalTypeLookupEdit.SetValueAndText(appNodeTypeId, appNodeTypeName);
Page.ApprovalTypeLookupEdit.ResumeAjaxEvents();

то просто открывается нормально карточка, но поле ApprovalTypeLookupEdit не заполняется.....

Идей, я так понимаю, нет?

Александр, так нельзя:

Page.ApprovalTypeLookupEdit.Value = appNodeTypeId;

Либо так:

Page.ApprovalTypeLookupEdit.SetValue(appNodeTypeId);

Но рекомендую все же так:

Page.DataSource.ActiveRow.SetColumnValue("ApprovalTypeId", appNodeTypeId);

А вот по фигу, извините, конечно :smile:
В смысле что все три варианта не работают :exclaim:

Япппонский городовой!!!:lol:

Надо проставлять значение и в датасорс и поле лукапа!!

Вот так работает:

Page.DataSource.ActiveRow.SetColumnValue ("ApprovalTypeId", appNodeTypeId);
Page.ApprovalTypeLookupEdit.SetValueAndText (appNodeTypeId, appNodeTypeName);	

BPMOnline Reality (Версия 5.4.1.256)

Аналогичный код у меня не работает:

    //select Tenants
    var esqTenant = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Tenant");
    esqTenant.AddColumn("Id");
    esqTenant.AddColumn("Account");
    esqTenant.AddColumn("Project");
    esqTenant.AddColumn("Facility");
    var ownerCol = esqTenant.AddColumn("Account.Owner");
    esqTenant.AddColumn("DueDate");
    //filters
    esqTenant.Filters.LogicalOperation = LogicalOperationStrict.Or;
    esqTenant.Filters.Add(esqTenant.CreateFilterWithParameters(
	    FilterComparisonType.Equal, "DueDate", dd1));
    esqTenant.Filters.Add(esqTenant.CreateFilterWithParameters(
	    FilterComparisonType.Equal, "DueDate", dd30));
    //result
    Guid accountId;
    string accountName;
 
    var tenantCollection = esqTenant.GetEntityCollection(UserConnection);
    foreach (var record in tenantCollection) {
	    Guid ownerId = record.GetTypedColumnValue<Guid>(ownerCol.Name); //1
	    accountId = record.GetTypedColumnValue<Guid>("AccountId"); //2
	    accountName = record.GetTypedColumnValue<String>(record.Schema.Columns.GetByName("Account").DisplayColumnValueName); //3
    }

говорит "Значение с именем "Account_Owner" не найдено" (строка "1")

а также объясните почему в строке "2" нужно писать название поля как в базе (с Id), а в строке "3" - как в объекте ?

Хороший вопрос.....ТП, вы гиде? :smile:

Здравствуйте.

В запросе типа EntitySchemaQuery необходимо название колонок писать так как в таблице объекта:

esqTenant.AddColumn("Id");
    esqTenant.AddColumn("AccountId");
    esqTenant.AddColumn("ProjectId");
    esqTenant.AddColumn("FacilityId");
    var ownerCol = esqTenant.AddColumn("Account.OwnerId");
    //или var ownerCol = esqTenant.AddColumn("Account.Owner.Id");

также при добавлении колонок необходимо создавать переменные, т.к. название колонок в финальном запросе будут сгенерированы системой, и они не будут совпадать с названием колонок в базе:

var AccountId = esqTenant.AddColumn("Account");
accountId = record.GetTypedColumnValue<Guid>(AccountId.Name);

Ошибку вызывает строка "1"

Guid ownerId = record.GetTypedColumnValue<Guid>(ownerCol.Name);

если ее убрать все работает

если писать

esqTenant.AddColumn("AccountId");

то "Элемент коллекции с именем AccountId не найден"

Лариса, что-то я запутался :)

Если убрать

Guid ownerId = record.GetTypedColumnValue<Guid>(ownerCol.Name);

то все работает даже с

esqTenant.AddColumn("AccountId");

или нет?

И колонка AccountId точно есть в таблице? Может она называется как-то CustomerId?
Только что у себя попробовал сделать запрос с контактов с полями OwnerId и AccountId - без ошибок.

Если убрать

Guid ownerId = record.GetTypedColumnValue<Guid>(ownerCol.Name);

то остальной код работает.

Если писать как Вы предлагали в #18, т.е.

esqTenant.AddColumn("AccountId");

то возникает ошибка "Элемент коллекции с именем AccountId не найден".

Поле в схеме объекта называется Account, в базе AccountId

А если написать:
var ownerCol = esqTenant.AddColumn("Account.Owner.Id");

То со строкой

Guid ownerId = record.GetTypedColumnValue<Guid>(ownerCol.Name);

работает?

Да, так работает.
Спасибо!

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