Вопрос

Агрегация существующих записей

Добрый день. У меня есть такое задание. Есть деталь продукт в накладной, где содержится продукт и его количество. Но там может быть дубляж продукта от разного контрагента. И есть деталь балы, где нужно просуммировать все количество по каждому из продуктов(то есть или вставить новую запись или проапдейтить существующую). Для этого я написал на объекте первой детали такой код на событие после сохранения:





var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "CHProductInTaxInvoice");

EntitySchemaQueryColumn product = esq.AddColumn("CHProduct");

EntitySchemaQueryColumn amount = esq.AddColumn("CHAmount");

amount.SummaryType = AggregationType.Sum;

//product.SummaryType = AggregationType.Sum;

Entity summaryEntity = esq.GetSummaryEntity(UserConnection);

//set params

var manager = UserConnection.EntitySchemaManager.GetInstanceByName("CHPoints");

var app = manager.CreateEntity(UserConnection);

app.SetDefColumnValues();

 

app.SetColumnValue("CHProduct", summaryEntity.GetTypedColumnValue(product.Name));

app.SetColumnValue("CHAmount", summaryEntity.GetTypedColumnValue(amount.Name));

app.Save(false);



У меня выдает ошибку, что колонка "CHProduct" не найдена. Хотя она точно есть на нужных объектах. Подскажите, пожалуйста, как решить данную проблему. Заранее благодарен

Нравится

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

Вадим, а где именно выдаёт, что не найдена? При работе с первой схемой или со второй?

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

Со второй

Может, действительно в CHPoints нет таких числовых колонок?

А чтобы убедиться, что дело точно не в первой схеме, можно не читать прямо из summaryEntity, а записать результат в две числовые переменные и затем брать из них.

Можно поинтересоваться как вы хотите сложить колонки Lookup типа? (я так понимаю CHProduct - это справочник, ссылка на продукты)

Плюс, колонки CHProduct нет на уровне esq. Есть CHProductId и CHProductName (ну или свои аналогичные, смотря какие поля указаны в объекте)

Подозреваю, что во второй схеме они обе числовые. А как он считает в первой — неясно. Может, там надо не сумму, а количество?

Варфоломеев Данила,

Хочу написать через esq что типа агрегатной функции в sql. Пока не понимаю, как правильно вызвать нужную агрегирующую колонку, особенно если она типа справочник. 

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

Продукт это просто название, которое выбирается из справочника. в первой детали может быть несколько продуктов. Мне фактически нужно взять все продукты из этой детали из одинаковым именем и подбить сумму по каждому продукту, а потом записать во вторую деталь

 

Можно прямо написать нужный Select с колонками количества и суммы без всяких ESQ. А затем вычитать из него значения и писать через ESQ во второй объект.

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

Спасибо, попробую)

Вот пример работы с классом Select. Как делать колонки с Count и Sum, есть тут.

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