Технические вопросы
5.x

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.

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

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

в таком варианте
[csharp]
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("CurrentApprovalNodeId");
[/csharp]
даёт
Exception Message: Значение с именем "CurrentApprovalNodeId" не найдено

а в таком
[csharp]
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("CurrentApprovalNodeId");
[/csharp]

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

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

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

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

[csharp]
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(CurAppNodeIdColumn);
[/csharp]

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

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

esqDocResult.AddColumn("CurrentApprovalNodeId");

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

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

[csharp]
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(CurAppNodeIdColumn.Name);
[/csharp]

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

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

Попробуйте так:
[csharp]
esqDocResult.AddColumn("CurrentApprovalNode.Id");
[/csharp]

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

[csharp]
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(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(appNodeTypeIdColumn.Name);
string appNodeTypeName = appNode.GetTypedColumnValue(appNodeNameColumn.Name);

Page.ApprovalTypeLookupEdit.Value = appNodeTypeId;

}

return true;
[/csharp]

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

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

Если заменить
[csharp]
Page.ApprovalTypeLookupEdit.Value = appNodeTypeId;
[/csharp]

на

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

[/csharp]

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

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

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

[csharp]
Page.ApprovalTypeLookupEdit.Value = appNodeTypeId;
[/csharp]

Либо так:

[csharp]
Page.ApprovalTypeLookupEdit.SetValue(appNodeTypeId);
[/csharp]

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

[csharp]
Page.DataSource.ActiveRow.SetColumnValue("ApprovalTypeId", appNodeTypeId);
[/csharp]

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

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

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

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

[csharp]
Page.DataSource.ActiveRow.SetColumnValue ("ApprovalTypeId", appNodeTypeId);
Page.ApprovalTypeLookupEdit.SetValueAndText (appNodeTypeId, appNodeTypeName);
[/csharp]

BPMOnline Reality (Версия 5.4.1.256)

Аналогичный код у меня не работает:
[csharp]
//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(ownerCol.Name); //1
accountId = record.GetTypedColumnValue("AccountId"); //2
accountName = record.GetTypedColumnValue(record.Schema.Columns.GetByName("Account").DisplayColumnValueName); //3
}
[/csharp]

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

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

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

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

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

[csharp]
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");
[/csharp]

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

[csharp]
var AccountId = esqTenant.AddColumn("Account");
accountId = record.GetTypedColumnValue(AccountId.Name);
[/csharp]

Ошибку вызывает строка "1"
[csharp]
Guid ownerId = record.GetTypedColumnValue(ownerCol.Name);
[/csharp]

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

если писать
[csharp]
esqTenant.AddColumn("AccountId");
[/csharp]
то "Элемент коллекции с именем AccountId не найден"

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

Если убрать

[csharp]
Guid ownerId = record.GetTypedColumnValue(ownerCol.Name);
[/csharp]

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

[csharp]
esqTenant.AddColumn("AccountId");
[/csharp]

или нет?

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

Если убрать
[csharp]
Guid ownerId = record.GetTypedColumnValue(ownerCol.Name);
[/csharp]
то остальной код работает.

Если писать как Вы предлагали в #18, т.е.
[csharp]
esqTenant.AddColumn("AccountId");
[/csharp]
то возникает ошибка "Элемент коллекции с именем AccountId не найден".

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

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

То со строкой
[csharp]
Guid ownerId = record.GetTypedColumnValue(ownerCol.Name);
[/csharp]
работает?

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

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