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.
нет. не помогает.
в таком варианте
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);
"Шамуилов Александр" написал: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" - как в объекте ?
Здравствуйте.
В запросе типа 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);
Лариса, что-то я запутался :)
Если убрать
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);
работает?