none
Сумма по вычисляемым столбцам

    Вопрос

  • Добрый день!

    Пытаюсь сделать подведение итогов по расходам и остаткам.

    Измевестно, что "Итоги" не работают с вычисляемыми столбцами, поэтому получилось вот так:

    Тип полей расходов - числовой

    Остаток - вычисляемый с выводом числа в конечном результате.

    Немного погуглив на эту тему нашёл вот какую статью: https://social.technet.microsoft.com/wiki/contents/articles/30317.sharepoint-2013-displaying-sum-for-calculated-column-in-a-list-view-using-jslink.aspx

    Судя по описанию скрипта мне лишь оставалось поменять в нём параметры _totalColumn, _columnIndex, ListName и ViewGuid.

    Окрыл список в Designer'е, нашёл ListName и ViewGuid, вбил кол-во _totalColumn, _columnIndex, сохранил скрипт в SiteAssests (имхо, зачем это делать в MasterPages, ведь не важно же откуда грузить скрипт?) и добавил адрес в JSLink.

    Но сумма не выводится...

    Подскажите, пожалуйста, может не так что?


    MCSA: Security; MCTP: Microsoft ISA 2006

    13 апреля 2017 г. 8:43

Ответы

Все ответы

  • Добрый день.

     сам решение это не пробовал но предлагаю:

    1. для работы с CSR могу посоветовать Cisar , иногда бывает полезен.

    2. поменять id поля по которому считается сумма

    3. поменять id веб части


    мой блог не много о SharePoint


    13 апреля 2017 г. 9:12
  • Вот же я невнимательный :((

    Вычисляемое поле переименовал в "Остаток суммы", в коде сделал так:

    calculatedFieldCtx.Templates.Fields = {
            "Остаток_x0020_суммы": {
                "View": CalculatedFieldViewTemplate
            }
        };

    Честно, не понимаю, зачем нужна вставка "_x0020_" у автора в его примере.

    А ID web-части откуда брать?

    Есть вот такая часть кода списка:

    <WebPartPages:WebPartZone runat="server" FrameType="None" ID="Main" Title="loc:Main">

    Далее по тексту: WebId="00000000-0000-0000-0000-000000000000"

    Подскажите, пожалуйста.


    MCSA: Security; MCTP: Microsoft ISA 2006

    13 апреля 2017 г. 14:44
  • еще раз пересмотрел код, все же это не id веб части, оставить как есть.

    у вас не верное обращение к полю.

    надеюсь вы в начале называли поля в начале на английском, потом переименовывали на русский.

    нужно перейти в параметры списка, кликнуть на требуемое поле и в адресной строке можно найти его id


    мой блог не много о SharePoint

    14 апреля 2017 г. 12:23
  • если поле было изначально названо по русский, то вы увидите что то не читаемое.

    вот это и нужно вставить в код


    мой блог не много о SharePoint


    14 апреля 2017 г. 13:20
  • Владимир, большое спасибо за помощь!

    Название столбца действительно создавалось на кириллице. Да бы не мучиться, удалил его, создал заново на английском, а потом переименовал в удобочитаемый.

    Что сделал дальше: на странице подключил веб-часть с редактором скриптов и там прописал пусть к js-файлу, и juery-на всякий случай

    <script src="/SiteAssets/jQuery/jquery-3.2.0.min.js" type="text/javascript"></script>
    <script src="/SiteAssets/JavaScript/sumJSLink.js" type="text/javascript"></script>

    а JS-cсылку на файл в свойствах удалил.

    Ура! оно заработало, правда пришлось потом заново пересохранить с поддержкой UTF-8 для кириллицы.

    Непонятным осталось распложение "Остатка" и то, как он его посчитал.

    Со столбцами оказалось несложно:

    var _totalValue = 0.0;
    var _totalColumn = 6;  // Specify total number of columns in list view.
    var _columnIndex = 6;  // Specify the index of the column where you want to display sum values. (i.e. index for first column = 1)

    хотя не пойму, ведь у меня 4 отображаемых столбца и остаток считается по 4-му..

    А вот над подсчётом надо подумать


    MCSA: Security; MCTP: Microsoft ISA 2006

    17 апреля 2017 г. 10:15
  • С подсчётом тоже оказалось всё просто.
    У числовых столбцов расходов установлено два знака после запятой, вычислямые столбец делает вывод в числовом формате тоже с двумя знаками после запятой.
    "Поигравшись" с их настройками в итоге у стобцов расходов поставил кол-во знаков после запятой на "авто".

    Теперь задуманное выглядит вот так:

    Есть ли возможность чтобы обе суммы расходов и остаток были на одной линии?


    MCSA: Security; MCTP: Microsoft ISA 2006

    17 апреля 2017 г. 10:33
  • попробуйте так 

    function CalculatedFieldViewTemplate(ctx) {
    	var currSum = (ctx.CurrentItem.Total_x0020_billing).replace(",",".") * 1
    	if(!isNaN(currSum)){
          		_totalValue += currSum;
    	};    
        return ctx.CurrentItem.Total_x0020_billing;
    }


    мой блог не много о SharePoint

    17 апреля 2017 г. 10:48
  • К сожалению, отображение осталось без изменений.

    В принципе, основная цель достигнута, украшашки - это уже опционально, может потом найду как это добработать.

    Владимир, спасибо вам за помощь.


    MCSA: Security; MCTP: Microsoft ISA 2006

    17 апреля 2017 г. 11:17
  • Есть ли возможность чтобы обе суммы расходов и остаток были на одной линии?


    в DOM посмотреть id стандартной панели 

    и воспользоваться jQuery

    jQuery("#aggrWPQ2").find("tr").children().eq(_columnIndex).html("<b>Сумма= " + numberFormat(_totalValue) + "</b>")


    мой блог не много о SharePoint


    17 апреля 2017 г. 12:06
  • Через консоль разработчика нашёл параметр tbody id

    Заменил в коде

    tdElement.innerHTML = "<b>Остаток= " + numberFormat(_totalValue) + "</b>";

    и

    document.getElementById("tdElement" + _columnIndex).innerHTML = "<b>Остаток= " + numberFormat(_totalValue) + "</b>";

    на

    jQuery("#aggrWPQ2").find("tr").children().eq(_columnIndex).html("<b>Остаток= " + numberFormat(_totalValue) + "</b>");

    Но когда в коде меняю customAggrWPQ на aggrWPQ2, то остаток не отображается.

    Правильно ли я вставил ваш код jQuery?

    Ко всему прочему, обнаружил, что подсчёт неверный делает :(

    По невнимательности пропустил это в предыдущих ответах


    MCSA: Security; MCTP: Microsoft ISA 2006


    • Изменено Andrey Kucherovsky 17 апреля 2017 г. 14:44 Найдена опечатка
    17 апреля 2017 г. 13:27
  • не хотел разбираться в чужом коде так что решил написать свое решение.

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


    мой блог не много о SharePoint

    • Помечено в качестве ответа Andrey Kucherovsky 19 апреля 2017 г. 12:46
    18 апреля 2017 г. 9:22
  • Чего-то я явно не знаю и не понимаю..

    Создал js-файл, туда вставил код, положил в /SiteAssets/JavaScript

    Подключил на странице через веб-часть

    <script src="/SiteAssets/jQuery/jquery-3.2.0.min.js" type="text/javascript"></script>
    <script src="/SiteAssets/JavaScript/sumJS.js" type="text/javascript"></script>

    В ctx.Templates.Fields добавил ID нужного стобца

        ctx.Templates.Fields = {
            "Ostatok": { 'View':  summation  }
        }; 

    Название на латиннице и с правильным регистром.

    Т.к. у меня подключаемые скрипты лежат в другом месте, то в RegisterModuleInit изменил путь

      RegisterModuleInit(SPClientTemplates.Utility.ReplaceUrlTokens("/SiteAssets/JavaScript/sumJS.js"), init);

    Однако, то, что дожно быть в <b>Остаток= " + fieldSum + "</b>, на странице не отображается

    Не могу понять, где я накосячил...


    MCSA: Security; MCTP: Microsoft ISA 2006




    19 апреля 2017 г. 9:00
  • 1. предлагаю использовать jQuery 1 ver.

    2. добавить вывод в консоль

    function postRenderer(ctx){
    console.log(totalSum) // посмотреть в консоли
    .........
    
    var fieldValue = ctx.CurrentItem[ctx.CurrentFieldSchema.FieldTitle];
    console.log(fieldValue)// посмотреть в консоли
    
    ......
    


    мой блог не много о SharePoint


    19 апреля 2017 г. 9:18
  • Скачал jQery 1.12.4, подключил

    Добавил доп.строки

        function postRenderer(ctx){
          console.log(totalSum)

    и       var fieldValue = ctx.CurrentItem[ctx.CurrentFieldSchema.FieldTitle];
          console.log(fieldValue)

    В консоли разработчка получил вот такую ошибку:

    Самую малость подправил строки кода вот до такого вида

          return '<div align="right" class="ms-number">'+ fieldValue + '</div>';

    Ошибок после этого не выдаётся, но результат теперь вот какой


    MCSA: Security; MCTP: Microsoft ISA 2006

    19 апреля 2017 г. 9:39
  • где то синтаксическая ошибка

    если клинуть по данному сообщению?

    если ошибку посмотреть в Chrome?


    мой блог не много о SharePoint


    19 апреля 2017 г. 9:47
  • Если кликнуть по ошибке то ничего такого не происходит - всего лишь ссылка на сайт MSDN с объяснением:

    To correct this error

    • Add the closing quotation mark to the end of the string.

    и покажет кусок кода с ошибой

    Консоль в браузере Chrome тоже ссылается на эти же строки.

    Когда я строки 50-52 подправил в одну строку до такого вида:

     return '<div align="right" class="ms-number">'+ fieldValue + '</div>';

    то ошибку это исправило.

    Но теперь результат как я написал в предыдущем сообщении -  встре строки undefined


    MCSA: Security; MCTP: Microsoft ISA 2006

    19 апреля 2017 г. 10:07
  • так...

    function summation(ctx){            
          var fieldValue = ctx.CurrentItem[ctx.CurrentFieldSchema.FieldTitle];
          console.log(fieldValue);
          console.log(ctx.CurrentFieldSchema.FieldTitle);
          if(fieldValue){
            var currSum = fieldValue.replace(",",".").replace(/\s/g,"")*1;
            if(!isNaN(currSum)){
                var sum =  totalSum[ctx.CurrentFieldSchema.FieldTitle];
                if(sum){
                  totalSum[ctx.CurrentFieldSchema.FieldTitle] = sum + currSum;
                }else{
                  totalSum[ctx.CurrentFieldSchema.FieldTitle] = currSum;
                };
            };
          }
          return '<div align="right" class="ms-number">'+ fieldValue + '</div>';
        };
    что в консоли?


    мой блог не много о SharePoint

    19 апреля 2017 г. 10:47
  • Владимир, в консоли следующее:

    Соответственно, строка 17 - это:

          console.log(totalSum)

    Строки 38-39 - это:

          console.log(fieldValue);
          console.log(ctx.CurrentFieldSchema.FieldTitle);

    Каких-либо ошибок нет


    MCSA: Security; MCTP: Microsoft ISA 2006

    19 апреля 2017 г. 11:20
  • нашел ошибку 

    все дело было в полях у которых Id поля отличалось от Отображаемого названия

    замените функцию

    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>';
        };
      };


    мой блог не много о SharePoint

    • Помечено в качестве ответа Andrey Kucherovsky 19 апреля 2017 г. 12:45
    19 апреля 2017 г. 11:32
  • Ура!!

    Оно работает!

    Владимир, а можете подрапить немного точность вычисления?

    По примеру ниже должно получиться ровно 10762,29

    У вычисляемого столбца установлено выводить два знака после запятой; я так понимаю, что это не учитывается при вычислении?


    MCSA: Security; MCTP: Microsoft ISA 2006

    19 апреля 2017 г. 11:49
  • замените на 

    var fieldSum = Math.round(totalSum[f] * 100) / 100;


    мой блог не много о SharePoint

    • Помечено в качестве ответа Andrey Kucherovsky 19 апреля 2017 г. 12:43
    19 апреля 2017 г. 12:35
  • Владимир, большое вам спасибо за помощь!

    Наверное, осталось лишь немного код в статье в вашем блоге немного подправить; уверен, это пригодится очень многим кто столкнётся с такой же задачей.


    MCSA: Security; MCTP: Microsoft ISA 2006

    19 апреля 2017 г. 12:49
  • Владимир, большое вам спасибо за помощь!

    Наверное, осталось лишь немного код в статье в вашем блоге немного подправить; уверен, это пригодится очень многим кто столкнётся с такой же задачей.


    MCSA: Security; MCTP: Microsoft ISA 2006

    правки вносил параллельно с написанием на форум.

    мой блог не много о SharePoint

    19 апреля 2017 г. 12:55