// This method is called when the grid requests data public JsonResult ProductSearchGridDataRequested() { // Get both the grid Model and the data Model // The data model in our case is an autogenerated linq2sql database based on Northwind. var gridModel = new SkladJqGridModel(); var datacontextModel = new SkladDataContext(); // customize the default grid model with our custom settings ProductSetupGrid(gridModel.ProductGrid); string contractorIdStr = Request.QueryString["ContractorId"]; if (!String.IsNullOrEmpty(contractorIdStr)) { var contractor = datacontextModel.Contractors.Where(x => x.Code.ToLower() == contractorIdStr.ToLower()).FirstOrDefault(); if (contractor != null) { return(gridModel.ProductGrid.DataBind(datacontextModel .Products.Where(x => x.ContractorId == contractor.ContractorId).Include(x => x.Supplier))); } } // return the result of the DataBind method, passing the datasource as a parameter // jqGrid for ASP.NET MVC automatically takes care of paging, sorting, filtering/searching, etc return(gridModel.ProductGrid.DataBind(datacontextModel.Products.Include(x => x.Supplier))); }
public ActionResult ProductEditRows(Product editedItem) { // Get the grid and database models var gridModel = new SkladJqGridModel(); var datacontextModel = new SkladDataContext(); // If we are in "Edit" mode if (gridModel.WarehouseGrid.AjaxCallBackMode == AjaxCallBackMode.EditRow) { // Get the data from and find the item corresponding to the edited row Product item = (from x in datacontextModel.Products where x.ProductId == editedItem.ProductId select x).First <Product>(); // update the item information UpdateProduct(item, editedItem); datacontextModel.SaveChanges(); } if (gridModel.WarehouseGrid.AjaxCallBackMode == AjaxCallBackMode.DeleteRow) { Product item = (from x in datacontextModel.Products where x.ProductId == editedItem.ProductId select x) .First <Product>(); // delete the record datacontextModel.Products.Remove(item); datacontextModel.SaveChanges(); } return(RedirectToAction("Product", "Reference")); }
public int GetDocumentNumber(SkladDataContext context, int year, int documentTypeId) { int documentNumber = 1; // lock to all rows var transactionOptions = new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead, Timeout = TimeSpan.MaxValue }; using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) { var item = context.DocumentCounters.Where(x => x.DocumentTypeId == documentTypeId && x.Year == year).FirstOrDefault(); if (item == null) { context.DocumentCounters.Add(new DocumentCounter { Counter = documentNumber, Year = year, DocumentTypeId = documentTypeId }); } else { item.Counter = item.Counter + 1; documentNumber = item.Counter; } context.SaveChanges(); scope.Complete(); } return(documentNumber); }
public JsonResult RefundsProductSearchGridDataRequested(DateTime?refundsReportDate) { if (!refundsReportDate.HasValue) { refundsReportDate = DateTime.Now; } // Get both the grid Model and the data Model // The data model in our case is an autogenerated linq2sql database based on Northwind. var gridModel = new SkladJqGridModel(); var datacontextModel = new SkladDataContext(); SetUpRefundsProductLineColumns(gridModel.ProductLineGrid); SetUpRefundsProductLineGroupingGrandTotal(gridModel.ProductLineGrid); // customize the default grid model with our custom settings //JQGridState gridState = gridModel.ProductLineGrid.GetState(); // Need this to enable ExportToExcelRefundsByDay // Session["refundsProductLinesGridState"] = gridState; int contractorId = 0; if (Request.Params["contractorId"] != null) { Int32.TryParse(Request.Params["contractorId"].ToString(), out contractorId); } int managerId = 0; if (Request.Params["managerId"] != null) { Int32.TryParse(Request.Params["managerId"].ToString(), out managerId); } return(gridModel.ProductLineGrid.DataBind(GetRefundsProductLines(datacontextModel, refundsReportDate.Value, contractorId, managerId))); }
// This method is called when the grid requests data public JsonResult CustomerOrdersSearchGridDataRequested() { //// Get both the grid Model and the data Model var gridModel = new SkladJqGridModel(); var datacontextModel = new SkladDataContext(); // customize the default grid model with our custom settings CustomerOrdersSetupGrid(gridModel.DocumentGrid); return(GetDocumentList(gridModel, datacontextModel, EntityEnum.DocumentTypeEnum.CustomerOrders)); }
public JsonResult GetClientByCode(string term) { var datacontextModel = new SkladDataContext(); var result = (from u in datacontextModel.Contractors where u.Code.ToLower().Contains(term.ToLower()) && u.ContractorTypeId == (int)EntityEnum.ContractorTypeEnum.Client select new { u.Code, u.ContractorId, u.Name }).ToList(); return(Json(result, JsonRequestBehavior.AllowGet)); }
private void SetUpContractorEditDropDown(JQGrid itemGrid) { // setup the grid search criteria for the columns JQGridColumn responsibleIdColumn = itemGrid.Columns.Find(c => c.DataField == "ResponsibleId"); //JQGridColumn responsibleNameColumn = itemGrid.Columns.Find(c => c.DataField == "ResponsibleName"); //JQGridColumn regionIdColumn = itemGrid.Columns.Find(c => c.DataField == "RegionId"); JQGridColumn contractorTypeIdColumn = itemGrid.Columns.Find(c => c.DataField == "ContractorTypeId"); // Populate the search dropdown only on initial request, in order to optimize performance if (itemGrid.AjaxCallBackMode == AjaxCallBackMode.RequestData) { var skladModel = new SkladDataContext(); // Выбрать только Сотрудников и менеджеров var usersList = (from m in skladModel.UserProfiles where m.ContactTypeId < 3 select m).AsEnumerable() .Select(x => new SelectListItem { Text = x.DisplayName, Value = x.UserId.ToString() }); //var regionsList = (from m in skladModel.Regions select m).AsEnumerable() // .Select(x => new SelectListItem // { // Text = x.Name, // Value = x.RegionId.ToString() // }); var contractorTypesList = (from m in skladModel.ContractorTypes select m).AsEnumerable() .Select(x => new SelectListItem { Text = x.Name, Value = x.ContractorTypeId.ToString() }); responsibleIdColumn.EditList.AddRange(usersList.ToList <SelectListItem>()); responsibleIdColumn.SearchList = usersList.ToList <SelectListItem>(); responsibleIdColumn.SearchList.Insert(0, new SelectListItem { Text = "Все", Value = "" }); //regionIdColumn.SearchList = regionsList.ToList<SelectListItem>(); //regionIdColumn.SearchList.Insert(0, new SelectListItem { Text = "Все", Value = "" }); //regionIdColumn.EditList.AddRange(regionsList.ToList<SelectListItem>()); contractorTypeIdColumn.SearchList = contractorTypesList.ToList <SelectListItem>(); contractorTypeIdColumn.SearchList.Insert(0, new SelectListItem { Text = "Все", Value = "" }); contractorTypeIdColumn.EditList.AddRange(contractorTypesList.ToList <SelectListItem>()); } }
// This method is called when the grid requests data public JsonResult RefundsSearchGridDataRequested() { // Get both the grid Model and the data Model // The data model in our case is an autogenerated linq2sql database based on Northwind. var gridModel = new SkladJqGridModel(); var datacontextModel = new SkladDataContext(); // customize the default grid model with our custom settings RefundsSetupGrid(gridModel.DocumentGrid); return(GetDocumentList(gridModel, datacontextModel, EntityEnum.DocumentTypeEnum.Refunds)); }
// This method is called when the grid requests data public JsonResult CancellationSearchGridDataRequested() { // Get both the grid Model and the data Model // The data model in our case is an autogenerated linq2sql database based on Northwind. var gridModel = new SkladJqGridModel(); var datacontextModel = new SkladDataContext(); // customize the default grid model with our custom settings CancellationSetupGrid(gridModel.DocumentGrid); return(gridModel.DocumentGrid.DataBind(datacontextModel.Documents.Where(x => x.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.Cancellation))); }
// This method is called when the grid requests data public JsonResult ContractorSearchGridDataRequested() { // Get both the grid Model and the data Model // The data model in our case is an autogenerated linq2sql database based on Northwind. var gridModel = new SkladJqGridModel(); var datacontextModel = new SkladDataContext(); // customize the default grid model with our custom settings ContractorSetupGrid(gridModel.ContractorGrid); // return the result of the DataBind method, passing the datasource as a parameter // jqGrid for ASP.NET MVC automatically takes care of paging, sorting, filtering/searching, etc return(gridModel.ContractorGrid.DataBind(datacontextModel.Contractors)); }
private IQueryable <ProductLine> GetRefundsProductLines(SkladDataContext context, DateTime day, int?contractorId, int?managerId) { List <Document> docs = null; if (contractorId.HasValue && contractorId.Value > 0) { docs = context.Documents .Where(x => x.CreatedOf == day && x.IsCommitted == true && x.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.Refunds && x.ContractorId == contractorId.Value).ToList(); } else { docs = context.Documents .Where(x => x.CreatedOf == day && x.IsCommitted == true && x.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.Refunds).ToList(); } if (docs != null) { if (docs.Count > 0) { var docIds = docs.Select(x => x.DocumentId).ToArray(); var products = context.ProductLines.Where(x => docIds.Contains(x.DocumentId)); if (managerId.HasValue && managerId.Value > 0) { products = FilterProductLinesByManager(context, managerId.Value, products.ToList()).AsQueryable(); } if (contractorId.HasValue && contractorId.Value > 0) { return(products); } else { // в комментариях указать клиента foreach (var product in products) { var docsP = context.Documents.Where(x => x.DocumentId == product.DocumentId).FirstOrDefault(); if (docsP != null) { product.Comment = "Возврат от: " + docsP.Contractor.Code + ". " + product.Comment; } } return(products.AsQueryable()); } } } return(new List <ProductLine>().AsQueryable()); }
public void AddNewProduct(int contractorId, string article, decimal purchaseprice, decimal saleprice, decimal vat) { if (contractorId <= 0 || String.IsNullOrEmpty(article)) { return; } Product item = new Product() { Article = article, PurchasePrice = purchaseprice, SalePrice = saleprice, VAT = vat, ContractorId = contractorId }; var datacontextModel = new SkladDataContext(); PrepareProductData(item); item.Supplier = (from x in datacontextModel.Contractors where x.ContractorId == item.ContractorId && x.ContractorTypeId == (int)EntityEnum.ContractorTypeEnum.Factory select x).First <Contractor>(); if (item.Supplier == null) { logger.ErrorFormat("для товара {0} не найден поставщик с id={1}", item.Article, item.ContractorId); return; } string validationMessage = ValidateProductData(datacontextModel.Products, item, true); if (!String.IsNullOrEmpty(validationMessage)) { logger.Error(validationMessage); return; } datacontextModel.Products.Add(item); datacontextModel.SaveChanges(); logger.InfoFormat("Создан товар {0} от поставщика {1}", item.Article, item.Supplier.Code); }
public JsonResult GetSupplierByCodeAutoComplete(string term) { var datacontextModel = new SkladDataContext(); var result = (from u in datacontextModel.Contractors where u.Code.ToLower().Contains(term.ToLower()) && u.ContractorTypeId == (int)EntityEnum.ContractorTypeEnum.Factory select u.Code).ToList(); // "name":"ContractorId","index":"ContractorId" // return new JsonResult { JsonRequestBehavior = JsonRequestBehavior.AllowGet, Data = dataSource.ToListOfString(this) }; // List<string> //22 - Бьюти return(new JsonResult { JsonRequestBehavior = JsonRequestBehavior.AllowGet, Data = result }); }
public ActionResult Index() { ViewBag.Message = "Графики на Highcharts."; var gridModel = new LogJqGridModel(); var grid = gridModel.LogGrid; // NOTE: you need to call this method in the action that fetches the data as well, // so that the models match LogSetupGrid(grid); IndicatorsModel model = new IndicatorsModel() { LogGrid = gridModel }; SkladDataContext context = new SkladDataContext(); // Check permissions int currentUserId = WebSecurity.CurrentUserId; string[] roles = Roles.GetRolesForUser(WebSecurity.CurrentUserName); if (roles.Contains("limitedemployee")) { IQueryable <UserProfile> userProfiles = context.UserProfiles.Where(x => x.UserId == currentUserId); model.Employees = userProfiles; model.Managers = userProfiles; } else { model.Employees = context.UserProfiles.Where(x => x.ContactTypeId == (int)EntityEnum.ContactTypeEnum.Employee); model.Managers = context.UserProfiles .Where(x => x.ContactTypeId == (int)EntityEnum.ContactTypeEnum.Manager || x.ContactTypeId == (int)EntityEnum.ContactTypeEnum.Employee); } /*employee * * var result = (from u in datacontextModel.UserProfiles * where u.DisplayName.ToLower().Contains(term.ToLower()) && (u.ContactTypeId == * (int)EntityEnum.ContactTypeEnum.Manager || u.ContactTypeId == (int)EntityEnum.ContactTypeEnum.Employee) * select new { u.DisplayName, u.UserId }).ToList(); */ return(View(model)); }
private void SetUpContractorEmployeeEditDropDown(JQGrid itemGrid) { JQGridColumn employeeNameColumn = itemGrid.Columns.Find(c => c.DataField == "EmployeeName"); employeeNameColumn.Visible = true; JQGridColumn contractorNameColumn = itemGrid.Columns.Find(c => c.DataField == "ContractorName"); contractorNameColumn.Visible = true; JQGridColumn contractorIdColumn = itemGrid.Columns.Find(c => c.DataField == "ContractorId"); contractorIdColumn.Visible = true; JQGridColumn saleSumColumn = itemGrid.Columns.Find(c => c.DataField == "SaleSum"); saleSumColumn.Visible = true; // setup the grid search criteria for the columns JQGridColumn employeeIdColumn = itemGrid.Columns.Find(c => c.DataField == "EmployeeId"); employeeIdColumn.Visible = true; // Populate the search dropdown only on initial request, in order to optimize performance if (itemGrid.AjaxCallBackMode == AjaxCallBackMode.RequestData) { var skladModel = new SkladDataContext(); // Выбрать только Сотрудников и менеджеров var usersList = (from m in skladModel.UserProfiles where m.ContactTypeId == (int)EntityEnum.ContactTypeEnum.Employee select m).AsEnumerable() .Select(x => new SelectListItem { Text = x.DisplayName, Value = x.UserId.ToString() }); employeeIdColumn.EditList.AddRange(usersList.ToList <SelectListItem>()); employeeIdColumn.SearchList = usersList.ToList <SelectListItem>(); employeeIdColumn.SearchList.Insert(0, new SelectListItem { Text = "Все", Value = "" }); } }
private List <ProductLine> FilterProductLinesByManager(SkladDataContext context, int managerId, List <ProductLine> prods) { var filteredProducts = new List <ProductLine>(); foreach (var product in prods) { var factory = context.Contractors.Where(x => x.Code.ToLower() == product.SupplierCode.ToLower()).FirstOrDefault(); // failed to find factory. In this case - dont miss product if (factory == null) { filteredProducts.Add(product); } else if (factory.ResponsibleId == managerId) { filteredProducts.Add(product); } } return(filteredProducts); }
public void DeleteDocument(SkladDataContext context, Document document) { // При удалении возврата - обновить поле Shipment в родителе if (document.DocumentTypeId == (int)SidBy.Sklad.Domain.Enums.EntityEnum.DocumentTypeEnum.Refunds) { foreach (var product in document.Products) { var productLineToUpdate = context.ProductLines.Where(x => x.ProductId == product.ProductId).FirstOrDefault(); if (productLineToUpdate != null) { productLineToUpdate.Shipped = productLineToUpdate.Shipped - product.Quantity; if (productLineToUpdate.Shipped < 0) { productLineToUpdate.Shipped = 0; } } } context.SaveChanges(); } }
private JsonResult GetDocumentList(SkladJqGridModel gridModel, SkladDataContext datacontextModel, EntityEnum.DocumentTypeEnum docType) { string contractorIdStr = Request.QueryString["ContractorId"]; if (!String.IsNullOrEmpty(contractorIdStr)) { var contractor = datacontextModel.Contractors.Where(x => x.Code.ToLower() == contractorIdStr.ToLower()).FirstOrDefault(); if (contractor != null) { // ContractorName return(gridModel.DocumentGrid.DataBind(datacontextModel .Documents.Include("Contractor").Where(x => x.ContractorId == contractor.ContractorId && x.DocumentTypeId == (int)docType))); } } return(gridModel.DocumentGrid.DataBind(datacontextModel.Documents.Include("Contractor").Where(x => x.DocumentTypeId == (int)docType))); }
public ActionResult ExportToExcelRefundsByDay(DateTime?refundsReportDate) { if (!refundsReportDate.HasValue) { refundsReportDate = DateTime.Now; } var gridModel = new SkladJqGridModel(); var skladModel = new SkladDataContext(); var grid = gridModel.ProductLineGrid; // Get the last grid state the we saved before in Session in the DataRequested action JQGridState gridState = Session["refundsProductLinesGridState"] as JQGridState; // Need to set grid options again SetUpRefundsProductLineColumns(grid); SetUpRefundsProductLineGroupingGrandTotal(grid); //if (String.IsNullOrEmpty(exportType)) // exportType = "1"; // refundsReportDate //switch (exportType) //{ // case "1": // grid.ExportToExcel(GetRefundsProductLines(skladModel, refundsReportDate.Value), "refundsByDateGrid.xls", gridState); //break; // case "2": // grid.ExportSettings.ExportDataRange = ExportDataRange.Filtered; // grid.ExportToExcel(northWindModel.Orders, "grid.xls", gridState); // break; // case "3": // grid.ExportSettings.ExportDataRange = ExportDataRange.FilteredAndPaged; // grid.ExportToExcel(northWindModel.Orders, "grid.xls", gridState); // break; //} return(View()); }
public void UpdateDocument(SkladDataContext context, int documentId, bool isDeleting = false) { }
public ActionResult ContractorEditRows(Contractor editedItem) { // Get the grid and database models var gridModel = new SkladJqGridModel(); var datacontextModel = new SkladDataContext(); // If we are in "Edit" mode if (gridModel.ContractorGrid.AjaxCallBackMode == AjaxCallBackMode.EditRow) { PrepareContractorData(editedItem); string validationMessage = ValidateContractorData(datacontextModel.Contractors, editedItem, false); if (!String.IsNullOrEmpty(validationMessage)) { return(gridModel.ContractorGrid.ShowEditValidationMessage(validationMessage)); } // Get the data from and find the item corresponding to the edited row Contractor item = (from x in datacontextModel.Contractors where x.ContractorId == editedItem.ContractorId select x).First <Contractor>(); // update the item information UpdateContractor(item, editedItem); datacontextModel.SaveChanges(); logger.InfoFormat("контрагент изменён {0}", item.Code); } if (gridModel.ContractorGrid.AjaxCallBackMode == AjaxCallBackMode.AddRow) { PrepareContractorData(editedItem); string validationMessage = ValidateContractorData(datacontextModel.Contractors, editedItem, true); if (!String.IsNullOrEmpty(validationMessage)) { return(gridModel.ContractorGrid.ShowEditValidationMessage(validationMessage)); } // since we are adding a new item, create a new istance Contractor item = new Contractor() { IsArchived = false, CreatedAt = DateTime.Now }; // set the new item information UpdateContractor(item, editedItem); datacontextModel.Contractors.Add(item); datacontextModel.SaveChanges(); logger.InfoFormat("контрагент добавлен {0}", item.Code); } if (gridModel.ContractorGrid.AjaxCallBackMode == AjaxCallBackMode.DeleteRow) { Contractor item = (from x in datacontextModel.Contractors where x.ContractorId == editedItem.ContractorId select x) .First <Contractor>(); // delete the record datacontextModel.Contractors.Remove(item); datacontextModel.SaveChanges(); logger.InfoFormat("контрагент удалён {0}", item.Code); } return(RedirectToAction("Contractor", "Reference")); }
public string GetRefundsReportFileLink(DateTime refundsReportDate, int contractorId, int managerId) { string relativePath = "../" + Constants.RefundsReportPath; string rootPath = Server.MapPath(relativePath); string reportFile = String.Empty; // Check if file already exists. // Than check Modified date of the file in file name string docPath = Path.Combine(rootPath, contractorId.ToString(), refundsReportDate.ToString("yyyy-MM-dd")); if (!Directory.Exists(docPath)) { Directory.CreateDirectory(docPath); } string dateSeparator = "-"; string extension = ".xls"; string mask = String.Format("{0}*{1}", Constants.RefundsReportPrefix, extension); var directory = new DirectoryInfo(docPath); // get last created file in directory var existingFile = directory.GetFiles(mask).OrderByDescending(f => f.LastWriteTime).FirstOrDefault(); // check if file is actual upon document modified date if (existingFile != null) { // Cache 1 minute if (existingFile.CreationTime.AddSeconds(10) > DateTime.Now) { // return cached file return(String.Format("{0}/{1}/{2}/{3}", relativePath, contractorId.ToString(), refundsReportDate.ToString("yyyy-MM-dd"), existingFile.Name)); } else { // delete outdate file existingFile.Delete(); } } var context = new SkladDataContext(); // Get refunds products by day var products = GetRefundsProductLines(context, refundsReportDate, contractorId, managerId); if (products.Count() > 0) { string fileName = String.Format("{0}{1}{4}{2}{4}{3}{5}", Constants.RefundsReportPrefix, refundsReportDate.Year, refundsReportDate.ToString("MM"), refundsReportDate.ToString("dd"), dateSeparator, extension); string clientName = String.Empty; if (contractorId > 0) { var contractor = context.Contractors.Where(x => x.ContractorId == contractorId).FirstOrDefault(); if (contractor != null) { clientName = contractor.Code; } } else { clientName = "По всем клиентам"; } string titleRight = "Возврат от " + refundsReportDate.ToString("dd.MM.yyyy"); if (managerId > 0) { var user = context.UserProfiles.Where(x => x.UserId == managerId).FirstOrDefault(); if (user != null) { titleRight += ". Менеджер: " + user.DisplayName; } } // create report ExcelReportInfo reportInfo = new ExcelReportInfo { CreatedOf = refundsReportDate, FileName = fileName, FilePath = docPath, DocumentSubject = "Возврат от " + refundsReportDate.ToString("dd.MM.yyyy"), SheetName = Constants.RefundsReportPrefix + refundsReportDate.ToString("dd.MM.yyyy"), TitleLeft = clientName, TitleCenter = refundsReportDate.ToString("dd.MM.yyyy"), TitleRight = titleRight }; ReportHelper.GenerateProductLinesReport(products.ToList(), reportInfo); // ../Reports/Document/1093/e4fmt/Report-2014-10-09.xls // /Reports/Refunds/RefundsReport-2014-10-09.xls reportFile = String.Format("{0}/{1}/{2}/{3}", relativePath, contractorId.ToString(), refundsReportDate.ToString("yyyy-MM-dd"), fileName); } return(reportFile); }
void RefundsProductLineGroupingGrandTotal_DataResolved(object sender, JQGridDataResolvedEventArgs e) { if (Request.Params["refundsReportDate"] != null) { DateTime reportDate = DateTime.Now; int contractorId = 0; DateTime.TryParse(Request.Params["refundsReportDate"].ToString(), out reportDate); Int32.TryParse(Request.Params["contractorId"].ToString(), out contractorId); if (reportDate != DateTime.Now) { try { JQGridColumn saleSumColumn = e.GridModel.Columns.Find(c => c.DataField == "SaleSum"); JQGridColumn sumColumn = e.GridModel.Columns.Find(c => c.DataField == "Sum"); JQGridColumn quantityColumn = e.GridModel.Columns.Find(c => c.DataField == "Quantity"); // Записывать клиентов от которых были возвраты JQGridColumn commentColumn = e.GridModel.Columns.Find(c => c.DataField == "Comment"); var datacontextModel = new SkladDataContext(); // TODO: Найти все документы возврата за указанный день и выбрать по ним сумму string saleSum = "0", sum = "0", quantity = "0"; List <Document> docs = null; if (contractorId > 0) { docs = datacontextModel.Documents.Where(x => x.CreatedOf == reportDate && x.IsCommitted == true && x.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.Refunds && x.ContractorId == contractorId).ToList(); } else { docs = datacontextModel.Documents.Where(x => x.CreatedOf == reportDate && x.IsCommitted == true && x.DocumentTypeId == (int)EntityEnum.DocumentTypeEnum.Refunds).ToList(); } if (docs != null) { if (docs.Count > 0) { var docIds = docs.Select(x => x.DocumentId).ToArray(); commentColumn.FooterValue = "Возвраты от: " + String.Join(", ", docs.Select(x => x.Contractor.Code).Distinct().ToArray()); // ids.Contains(e.SuchID) saleSum = (from o in datacontextModel.ProductLines where docIds.Contains(o.DocumentId) select o.SaleSum) .Sum().ToString(); sum = (from o in datacontextModel.ProductLines where docIds.Contains(o.DocumentId) select o.Sum) .Sum().ToString(); quantity = (from o in datacontextModel.ProductLines where docIds.Contains(o.DocumentId) select o.Quantity) .Sum().ToString(); } } saleSumColumn.FooterValue = "Итого: " + saleSum; sumColumn.FooterValue = "Итого: " + sum; quantityColumn.FooterValue = "Итого: " + quantity; } catch (Exception ex) { logger.Error("Ошибка при подсчёте итоговых сумм: " + ex.Message); } } } }