Расширенная функциональность
15
Янв
1

Тотал

Сегодня нас ждет маленький скриптик для подсчета, который подсчитывает сумму значений какого-либо поля какого-либо представления и заносит ее в заголовок этого самого стобца. Приступим:

  • Эксперементировать мы будем на дефолтном представлении Бизнес-партнеров, поэтому первым делом вынесим поле «Годовой доход» вторым столбцом в это представление;
  • Далее в файл <сайт CRM>\_static\_grid\AppGrid_DefaultData.htc, внутрь тега script добавьте следующий код:
    // Если в массиве grid_onGridLoadDelegates существует переменная соответствующая имени объекта текущего представления, то...
    if (grid_onGridLoadDelegates != null && grid_onGridLoadDelegates[this.element.oname] != null) {
        // ... вызываем сопоставленную ей функцию и передаем ей объект родительского окна и объект представления
        grid_onGridLoadDelegates[this.element.oname].call(this, window, this.element);
    }
    

    А в файл <сайт CRM>\_static\_common\scripts\Global.js добавьте такие строки:

    // Объявляем новый ассоциативный  массив, который будет содержать функции, вызываемые перед отображением какого-либо представления
    var grid_onGridLoadDelegates = new Array();
    // В массив в соответствие имени объекта (Account) ставим вызов функции (account_onBeforeGridLoad)
    grid_onGridLoadDelegates[Account] = account_onBeforeGridLoad;
    
    // Функция подсчитывает сумму значений второй колонки представления
    // В качестве параметров принимает объекта родительского окна и представления
    function account_onBeforeGridLoad(parentWindow, grid) {
        var total = 0;
        for (i = 0; i < grid.childNodes[1].childNodes.length; i++) {
            // Заносим в переменные ссылку на ячейку второго столбца
            var cell = grid.childNodes[1].childNodes[i].childNodes[3];
            // ... и получаем ее текстовое содержимое
            var cellText = cell.innerText.replace('р.', '').replace(' ', '').replace(',', '.'); // очищаем число от лишних симвоолв
            var numText = escape(cellText).replace('%u202D', '').replace('%u202C', ''); // очищаем текст от служебных симвоолв
            var num = parseFloat(numText); // парсим текст в число
            total += num; // суммируем значение
        }
        // Заменяем содержимое заголовка второго столбца представления
        var gridBar = document.getElementById('gridBar').childNodes[1].childNodes[0].childNodes[4];
        gridBar.innerText = "ГД (" + total + ")";
    }
    

    Их основное назначение описано статье Кастомизация представлений. Нас же сейчас инетересует код внутри функции account_onBeforeGridLoad. А делает он следующие:

    • Просматривает все строки представления и берет из каждой значение второго столбца;
    • Очищает число от лишних строковых и служебных символов;
    • Преобразует строку в число и суммирует ее в общей переменной;
    • Заменяет содержимое второго столбца текстом с подсчитанной суммой.
  • Ну и отрываем наше представление и смотрим… 🙂



Комментарии (1)
  • Паша 15.01.2011

    Спасибо за интересное решение… Но есть в нём изъяны…

    Проблемы связаны именно с получением тотала, а именно — с получением значений из столбца… Запятая может быть разделителем как и тысяч так и дробной части. При валюте отличной от рубля — она не вычистится из строки, так что для вычищения этого участка лучше использовать регулярные выражения.

*

code