自定义组摘要(总值,项目值)

时间:2015-11-06 14:01:26

标签: .net devexpress xtragrid group-summaries

我有一个gridview摘要自定义计算器包含总计和每个项目一个。我需要根据您创建的组动态重新计算值,保持总量,这已经是正确的。

在DevExpress Docs中,我发现:https://www.devexpress.com/Support/Center/Question/Details/Q273195

在SO中,我发现:How to add a weighted average summary to a DevExpress XtraGrid?

我的方法:

private void gdvResultados_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e)
    {
        #region Obtendo chave/valor para o cálculo

        // Get the summary ID. 
        int summaryID = Convert.ToInt32((e.Item as GridSummaryItem).Tag);
        GridView grid = sender as GridView;            

        // Chave para o agrupamento
        var chaveDoAgrupamento = grid.GetGroupRowValue(e.RowHandle);

        decimal vendas = 0M;
        decimal meta = 0M;
        decimal vlTotalVendido = 0M;
        decimal vlTotalMeta = 0M;

        // Initialization 
        if (e.SummaryProcess == CustomSummaryProcess.Start)
        {
            vendas = 0M;
            meta = 0M;
            vlTotalVendido = 0M;
            vlTotalMeta = 0M;
        }

        #endregion

        #region Calculando

        // Calculation 
        if (e.SummaryProcess == CustomSummaryProcess.Calculate)
        {

        }

        #endregion

        #region Finalizando

        if (!e.IsGroupSummary) return;

        // Finalization 
        if (e.SummaryProcess == CustomSummaryProcess.Finalize)
        {
            if (Equals(((GridGroupSummaryItem)e.Item).Tag, 1))
            {
                e.TotalValue = grid.GetGroupRowValue(e.RowHandle, grid.GroupedColumns[e.GroupLevel]);
            }
            else
                switch (summaryID)
                {
                    case 0: // Total atingido da meta                        
                        foreach (var linha in lsBI)
                        {
                            vlTotalVendido += Convert.ToDecimal(linha.VlBrutoItem);
                            vlTotalMeta += Convert.ToDecimal(linha.ValorMGP);
                        }

                        e.TotalValue = vlTotalVendido / vlTotalMeta * 100;
                        break;

                    case 4: // meta do item                             

                        if (lsBI.Any(j => j.NmCaracteristicaPessoa == chaveDoAgrupamento.ToString()))
                        {
                            vendas = lsBI.Where(k => k.NmCaracteristicaPessoa == territorio.ToString()).Sum(v => Convert.ToDecimal(v.VlBrutoItem));
                            meta   = lsBI.Where(t => t.NmCaracteristicaPessoa == territorio.ToString()).Sum(m => Convert.ToDecimal(m.ValorMGP));

                            if (vendas > 0 && meta > 0)
                            {
                                e.TotalValue = 0;
                                e.TotalValue = vendas / meta * 100;
                            }
                        }
                        else
                            if (lsBI.Any(j => j.NmGrupoProdutoMeta == chaveDoAgrupamento.ToString()))
                            {
                                vendas = lsBI.Where(k => k.NmGrupoProdutoMeta == chaveDoAgrupamento.ToString()).Sum(v => Convert.ToDecimal(v.VlBrutoItem));
                                meta   = lsBI.Where(t => t.NmGrupoProdutoMeta == chaveDoAgrupamento.ToString()).Sum(m => Convert.ToDecimal(m.ValorMGP));

                                e.TotalValue = 0;

                                if (vendas > 0 && meta > 0)
                                {                                        
                                    e.TotalValue = vendas / meta * 100;
                                }
                            }
                            else
                                if (lsBI.Any(j => j.NmFamiliaProduto == chaveDoAgrupamento.ToString()))
                                {
                                    vendas = lsBI.Where(k => k.NmFamiliaProduto == chaveDoAgrupamento.ToString()).Sum(v => Convert.ToDecimal(v.VlBrutoItem));
                                    meta   = lsBI.Where(t => t.NmFamiliaProduto == chaveDoAgrupamento.ToString()).Sum(m => Convert.ToDecimal(m.ValorMGP));

                                    e.TotalValue = 0;

                                    if (vendas > 0 && meta > 0)
                                    {                                            
                                        e.TotalValue = vendas / meta * 100;
                                    }
                                }
                        break;
                }
        }

        #endregion            
    }

0 个答案:

没有答案