вторник, 18 апреля 2017 г.

Итоги (суммирование) для вычисляемого поля в представлении.

В этой статье я расскажу как можно вывести итоги для вычисляемого поля.
по умолчанию SharePoint не предоставляет возможности вывести сумму по Calculated field, но мы можем это исправить и изменить шаблон рендера представления CSR и самостоятельно посчитать сумму.

и так начнем.
хочу рассказать что решение получилось достаточно универсальным и не зависит:
1. сколько полей вычисляемых полей мы можем вывести.

2. положение поля вычисляется в коде (есть проблемы если вычисляемое поле первое с лева).

3. отображается ли стандартная панель итогов или нет.


как использовать:
необходимо в шаблоне указать id вычисляемого поля

файл можно скачать по ссылке sumJs.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
SP.SOD.executeFunc("clienttemplates.js", "SPClientTemplates", function() {
 
  function getBaseHtml(ctx) {
    return SPClientTemplates["_defaultTemplates"].Fields.default.all.all[ctx.CurrentFieldSchema.FieldType][ctx.BaseViewID](ctx);
  };
 
  function init() {
    var totalSum = {};
    var ctx = {};
    ctx.Templates = {};
    ctx.OnPostRender = postRenderer;
    ctx.Templates.Fields = {
        "calc": { 'View':  summation  }, // указать ID  поля
        "Sum": { 'View':  summation  }, // указать ID  поля
    };   
    SPClientTemplates.TemplateManager.RegisterTemplateOverrides(ctx);   
    function postRenderer(ctx){
      console.log(totalSum);
      for(var f in totalSum){
        var fieldId = f;
        var fieldSum = Math.round(totalSum[f] * 100) / 100;
        var fiedPOsition = getCellField(ctx,fieldId);
        if(! jQuery("#aggr"+ ctx.wpq).length > 0){        
          var tableId = ctx.listName + "-" + ctx.view;
          var tr = "";
          for (var i = 0; i < ctx.ListSchema.Field.length+2; i++) {
              tr+="";
          };
          tr+="";
          var tbody = ''+tr+'';
          jQuery("[id='"+tableId+"'] tbody").before(tbody);
           
        }
        jQuery("#aggr"+ ctx.wpq).find("tr").children().eq(fiedPOsition -1).html("<b>Sum= " + fieldSum + "</b>");
      };
    };
    function summation(ctx){           
      var fieldValue = ctx.CurrentItem[ctx.CurrentFieldSchema.RealFieldName];
      if(fieldValue){
        var currSum = fieldValue.replace(",",".").replace(/\s/g,"")*1;
        if(!isNaN(currSum)){
            var sum =  totalSum[ctx.CurrentFieldSchema.RealFieldName];
            if(sum){
              totalSum[ctx.CurrentFieldSchema.RealFieldName] = sum + currSum;
            }else{
              totalSum[ctx.CurrentFieldSchema.RealFieldName] = currSum;
            };
        };
      }
      return '<div align="right" class="ms-number">'+ fieldValue + '</div>';
    };
  };
  function getCellField(Ctx, NameField) {
      for (var f = 0; f < Ctx.ListSchema.Field.length; ++f) {
          var listField = Ctx.ListSchema.Field[f];
          if (listField.Name == NameField) {
              return f + 3;
          };
      };
      return null;
  };
 
  //RegisterModuleInit(SPClientTemplates.Utility.ReplaceUrlTokens("~siteCollection/Style Library/sumJs.js"), init);
  init();
});

Комментариев нет:

Отправить комментарий