Exception Message: Элемент коллекции с именем StatusId не найден при попытке добывать столбцы в EntitySchemaQuery
Ошибка возникает внезапно.
Код стандартный
var esqResult = new EntitySchemaQuery(esqManager, "Document");
esqResult.AddColumn ("StatusId");
Entity currentDoc = esqResult.GetEntity(UserConnection, currentDocId);
Работало пять минут назад.
Сейчас перестало.
С какого рожна?
Вылетает на esqResult.AddColumn.
Какой столбец значения не имеет.
Уже не в первый раз приходится все переписывать через Select.
Но это неудобно, когда надо просто запись достать по Id.
Нравится
Александр, как вариант - быть может дело в том, что Вы не добавили колонку с первичным ключом (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]
"Шамуилов Александр" написал: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" - как в объекте ?
Здравствуйте.
В запросе типа 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]
Лариса, что-то я запутался :)
Если убрать
[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]
работает?