javascript - 数据表上的行分组和小计

标签 javascript jquery model-view-controller datatables

我在数据表上使用 RowGrouping。对于每个组,我需要对某些列(Encum、Paid、Balance)进行小计,并对每个列(Encum、Paid、Balance)的所有行进行总计。我对这个数据表很陌生,无法达到我需要的结果。这是我正在使用的代码。我需要显示其中 3 列的 $value 以及标题处的小计。 请在这里帮助我,jsfiddle 中的代码:jsfiddle.net/6r2pjbg8

var table = S$('#EncumbranceSummaryTable').DataTable({
        "columnDefs": [
            { "visible": false, "targets":0 }
        ],   
        "stateSave": false,
        "stateDuration": 60*60*24*365,
        "data" : POnbrsDetails,           
        "columns":[
             {"sTitle": "PO #", "data": "PO_Nbr" },
             {"sTitle": "FY", "data": "FY" },
             {"sTitle": "LN", "data": "LN" },
             {"sTitle": "F/O/A","data":"FOA"},
             {"sTitle": "Project ID", "data": "Proj_ID" },
             {"sTitle": "Srce Type", "data": "Srce_Type" },
             {"sTitle": "Encumbrance","data":"Encum_Amt"},
              {"sTitle": "Paid","data":"Paid"},
             {"sTitle": "Balance", "data": "Balance" }      
             
        ],
        "drawCallback": function ( settings ) {                
            var api = this.api();
            var rows = api.rows( {page:'current'} ).nodes();
            var last=null;

            var colonne = api.row(0).data().length;
            var totale = new Array();
            totale['Totale']= new Array();
            var groupid = -1;
            var subtotale = new Array();


            api.column(0, {page:'current'} ).data().each( function ( group, i ) {  
                debugger;
                if ( last !== group ) {
                    S$(rows).eq( i ).before(
                        '<tr class="group"><td colspan="5">'+group+'</td></tr>'
                    );

                    last = group;
                }                
                //sub total
                val = api.row(api.row($(rows).eq( i )).index()).data();      //current order index
                $.each(val,function(index2,val2){
                    debugger;
                    if (typeof subtotale[groupid] =='undefined'){                           
                        subtotale[groupid] = new Array();
                    }
                    if (typeof subtotale[groupid][index2] =='undefined'){                           
                        subtotale[groupid][index2] = 0;
                    }
                    if (typeof totale['Totale'][index2] =='undefined'){                           
                        totale['Totale'][index2] = 0;
                    }
                    
                  //  valore = Number(val2.replace('€',"").replace('.',"").replace(',',"."));
                    subtotale[groupid][index2] += 1;
                    totale['Totale'][index2] += 2;
                });
            } );

            $('tbody').find('.group').each(function (i,v) {
             
                var rowCount = $(this).nextUntil('.group').length;
                //$(this).find('td:first').append($('<span />', { 'class': 'rowCount-grid' }).append($('<b />', { 'text': ' ('+rowCount+')' })));
                var subtd = '';
                for (var a=0;a<3;a++)
                { 
                    subtd += '<td>'+ subtotale[i][a] +'</td>';
                }
              
                $(this).append(subtd);
            });

        }
    });

最佳答案

这对你有用吗?

var POdata = [{
    "PO_Nbr": "3000202173",
    "FY": 2015,
    "LN": "1.1",
    "FOA": "2500/T7935002/T790225",
    "Proj_ID": "TLRR922B",
    "Srce_Type": "6251",
    "Encum_Amt": 66033.62,
    "Paid": 36508.35,
    "Balance": 29525.27
}, {
    "PO_Nbr": "3000202173",
    "FY": 2015,
    "LN": "1.2",
    "FOA": "2600/T7935002/T790226",
    "Proj_ID": "TLRR922B",
    "Srce_Type": "6251",
    "Encum_Amt": 212824.56,
    "Paid": 117665.45,
    "Balance": 95159.11
}, {
    "PO_Nbr": "3000143638",
    "FY": 2014,
    "LN": "1.1",
    "FOA": "2500/T7935002/T790225",
    "Proj_ID": "TLRR922B",
    "Srce_Type": "6251",
    "Encum_Amt": 32350.84,
    "Paid": 32350.84,
    "Balance": 0
}, {
    "PO_Nbr": "3000143638",
    "FY": 2014,
    "LN": "1.2",
    "FOA": "2600/T7935002/T790226",
    "Proj_ID": "TLRR922B",
    "Srce_Type": "6251",
    "Encum_Amt": 104265.84,
    "Paid": 104265.84,
    "Balance": 0
}, {
    "PO_Nbr": "3000079267",
    "FY": 2013,
    "LN": "1.1",
    "FOA": "2500/T7935002/T790225",
    "Proj_ID": "TLRR922B",
    "Srce_Type": "9025",
    "Encum_Amt": 21339.91,
    "Paid": 21339.91,
    "Balance": 0
}, {
    "PO_Nbr": "3000079267",
    "FY": 2013,
    "LN": "1.2",
    "FOA": "2600/T7935002/T790226",
    "Proj_ID": "TLRR922B",
    "Srce_Type": "9025",
    "Encum_Amt": 68778.06,
    "Paid": 68778.06,
    "Balance": 0
}, {
    "PO_Nbr": "3000038524",
    "FY": 2012,
    "LN": "1.1",
    "FOA": "2500/T7935002/T790225",
    "Proj_ID": "TLRR922B",
    "Srce_Type": "9025",
    "Encum_Amt": 12752.54,
    "Paid": 12752.54,
    "Balance": 0
}, {
    "PO_Nbr": "3000038524",
    "FY": 2012,
    "LN": "1.2",
    "FOA": "2600/T7935002/T790226",
    "Proj_ID": "TLRR922B",
    "Srce_Type": "9025",
    "Encum_Amt": 41101.1,
    "Paid": 41101.1,
    "Balance": 0
}];

var table = $('#EncumbranceSummaryTable').DataTable({
    "data": POdata,
    "columns": [
        {
            "title": "PO #",
            "data": "PO_Nbr",
            "visible": false
        }, {
            "title": "FY",
            "data": "FY"
        }, {
            "title": "LN",
            "data": "LN",
            "sortable": false
        }, {
            "title": "F/O/A",
            "data": "FOA",
            "sortable": false
        }, {
            "title": "Project ID",
            "data": "Proj_ID",
            "sortable": false
        }, {
            "title": "Srce Type",
            "data": "Srce_Type",
            "sortable": false
        }, {
            "title": "Encumbrance",
            "data": "Encum_Amt",
            "sortable": false
        }, {
            "title": "Paid",
            "data": "Paid",
            "sortable": false
        }, {
            "title": "Balance",
            "data": "Balance",
            "sortable": false
        }
    ],
    "drawCallback": function (settings) {
        var api = this.api();
        var rows = api.rows({
            page: 'current'
        }).nodes();
        var last = null;
        api.column(0, {
            page: 'current'
        }).data().each(function (group, i) {
            if (last !== group) {
                $(rows).eq(i).before(
                $("<tr></tr>", {
                    "class": "group",
                    "data-id": group
                }).append($("<td></td>", {
                    "colspan": 5,
                    "class": "pocell",
                    "text": "PO # " + group
                })).append($("<td></td>", {
                    "id": "e" + group,
                    "class": "noCount",
                    "text": "0.00"
                })).append($("<td></td>", {
                    "id": "p" + group,
                    "class": "noCount",
                    "text": "0.00"
                })).append($("<td></td>", {
                    "id": "b" + group,
                    "class": "noCount",
                    "text": "0.00"
                })).prop('outerHTML'));
                last = group;
            }
            val = api.row(api.row($(rows).eq(i)).index()).data();
            $("#e" + val.PO_Nbr).text(parseFloat($("#e" + val.PO_Nbr).text()) + parseFloat(val.Encum_Amt));
            $("#p" + val.PO_Nbr).text(parseFloat($("#p" + val.PO_Nbr).text()) + parseFloat(val.Paid));
            $("#b" + val.PO_Nbr).text(parseFloat($("#b" + val.PO_Nbr).text()) + parseFloat(val.Balance));
        });
    },
    "footerCallback": function (row, data, start, end, display) {
        var api = this.api();
        $(api.column(6).footer()).html(
            api.column(6).data().reduce(function (a, b) {
                return parseFloat(a) + parseFloat(b);
            })
        );
        $(api.column(7).footer()).html(
            api.column(7).data().reduce(function (a, b) {
                return parseFloat(a) + parseFloat(b);
            })
        );
        $(api.column(8).footer()).html(
            api.column(8).data().reduce(function (a, b) {
                return parseFloat(a) + parseFloat(b);
            })
        );
    }
});

工作 JSFiddle .

关于javascript - 数据表上的行分组和小计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31657724/

相关文章:

javascript - Jquery this.height 无法正常工作

asp.net - 在 .js 中包含 .js 的方法?

javascript - 相互调用两个javascript函数

javascript - jQuery 选择元素的父级并为其使用 prependTo()

java - 为什么这被认为是不安全的?

java - java中的MVC模式,观察者中不止一种更新方法

ruby-on-rails - Rails MVC-数据库搜索逻辑应该放在模型还是 Controller 中

javascript - 如何在 JavaScript 中设置 textBox.Text=radCombo.Text

javascript - 删除 fetch() 中当前 URL 自动填充

javascript - 将 .aspx 页面 html 渲染/调用到另一个 .aspx 页面