/* * (c) Copyright Ascensio System SIA 2010-2024 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ "use strict"; (/** * @param {Window} window * @param {undefined} undefined */ function (window, undefined) { var cBaseFunction = AscCommonExcel.cBaseFunction; var cFormulaFunctionGroup = AscCommonExcel.cFormulaFunctionGroup; var cElementType = AscCommonExcel.cElementType; var cErrorType = AscCommonExcel.cErrorType; var cNumber = AscCommonExcel.cNumber; var cError = AscCommonExcel.cError; var argType = Asc.c_oAscFormulaArgumentType; function StatisticOnlineAlgorithm(isCalculated) { this.isCalculated = !!isCalculated; this.reset(); } StatisticOnlineAlgorithm.prototype.reset = function () { this.count = 0; this.countNums = 0; this.min = Number.POSITIVE_INFINITY; this.max = Number.NEGATIVE_INFINITY; this.sum = 0; this.product = 1; this.mean = 0; this.M2 = 0; this.errorType = null; }; StatisticOnlineAlgorithm.prototype.union = function (val, isCalculated) { this.isCalculated = !!isCalculated; this.min = Math.min(this.min, val.min); this.max = Math.max(this.max, val.max); this.sum = this.sum + val.sum; this.product = this.product * val.product; //Parallel Welford's online algorithm var delta = val.mean - this.mean; if (this.countNums + val.countNums > 0) { this.mean = this.mean + delta * val.countNums / (this.countNums + val.countNums); this.M2 = this.M2 + val.M2 + delta * delta * this.countNums * val.countNums / (this.countNums + val.countNums); } this.count = this.count + val.count; this.countNums = this.countNums + val.countNums; this.errorType = this.errorType || val.errorType; }; StatisticOnlineAlgorithm.prototype.add = function (val) { this.count++; this.countNums++; this.min = Math.min(this.min, val); this.max = Math.max(this.max, val); this.sum += val; this.product *= val; //Welford's online algorithm var delta = val - this.mean; this.mean += delta / this.countNums; this.M2 += delta * (val - this.mean); }; StatisticOnlineAlgorithm.prototype.addCount = function () { this.count++; }; StatisticOnlineAlgorithm.prototype.addError = function (errorType) { this.errorType = errorType; }; StatisticOnlineAlgorithm.prototype.getCount = function () { return this.count; }; StatisticOnlineAlgorithm.prototype.getCountNums = function () { return this.countNums; }; StatisticOnlineAlgorithm.prototype.getMin = function () { return this.min; }; StatisticOnlineAlgorithm.prototype.getMax = function () { return this.max; }; StatisticOnlineAlgorithm.prototype.getSum = function () { return this.sum; }; StatisticOnlineAlgorithm.prototype.getMean = function () { return this.mean; }; StatisticOnlineAlgorithm.prototype.getProduct = function () { return this.countNums > 0 ? this.product : 0; }; StatisticOnlineAlgorithm.prototype.getVar = function () { return this.countNums > 1 ? (this.M2 / (this.countNums - 1)) : 0; }; StatisticOnlineAlgorithm.prototype.getVarP = function () { return this.countNums > 0 ? (this.M2 / this.countNums) : 0; }; StatisticOnlineAlgorithm.prototype.getStdDev = function () { return Math.sqrt(this.getVar()); }; StatisticOnlineAlgorithm.prototype.getStdDevP = function () { return Math.sqrt(this.getVarP()); }; StatisticOnlineAlgorithm.prototype.isEmpty = function () { return 0 === this.count && 0 === this.countNums; }; StatisticOnlineAlgorithm.prototype.getCellValue = function (dataType, fieldType, rowType, colType) { var oCellValue; if (this.isEmpty() && !this.isCalculated) { return oCellValue; } oCellValue = new AscCommonExcel.CCellValue(); oCellValue.type = AscCommon.CellValueType.Number; if (null !== this.errorType && dataType !== Asc.c_oAscItemType.Count && dataType !== Asc.c_oAscItemType.CountA) { oCellValue.type = AscCommon.CellValueType.Error; oCellValue.text = AscCommonExcel.cError.prototype.getStringFromErrorType(this.errorType); return oCellValue; } var type = dataType; if (Asc.c_oAscItemType.Default !== fieldType && Asc.c_oAscItemType.Data !== fieldType && Asc.c_oAscItemType.Blank !== fieldType && Asc.c_oAscItemType.Grand !== fieldType) { type = fieldType; } if (Asc.c_oAscItemType.Default !== rowType && Asc.c_oAscItemType.Data !== rowType && Asc.c_oAscItemType.Blank !== rowType && Asc.c_oAscItemType.Grand !== rowType) { type = rowType; if (Asc.c_oAscItemType.Default !== colType && Asc.c_oAscItemType.Data !== colType && Asc.c_oAscItemType.Blank !== colType && Asc.c_oAscItemType.Grand !== colType) { if (rowType !== colType) { type = Asc.c_oAscItemType.Blank; } } } switch (type) { case Asc.c_oAscItemType.Count: oCellValue.number = this.getCountNums(); break; case Asc.c_oAscItemType.CountA: oCellValue.number = this.getCount(); break; case Asc.c_oAscItemType.Max: if (this.isCalculated) { oCellValue.number = this.getMax(); } else { oCellValue.number = this.countNums > 0 ? this.getMax() : 0; } break; case Asc.c_oAscItemType.Min: if (this.isCalculated) { oCellValue.number = this.getMin(); } else { oCellValue.number = this.countNums > 0 ? this.getMin() : 0; } break; case Asc.c_oAscItemType.Product: oCellValue.number = this.getProduct(); break; case Asc.c_oAscItemType.Avg: if (this.countNums > 0) { oCellValue.number = this.getMean(); } else { oCellValue.type = AscCommon.CellValueType.Error; oCellValue.text = AscCommonExcel.cError.prototype.getStringFromErrorType(cErrorType.division_by_zero); } break; case Asc.c_oAscItemType.StdDev: if (this.countNums > 1) { oCellValue.number = this.getStdDev(); } else { oCellValue.type = AscCommon.CellValueType.Error; oCellValue.text = AscCommonExcel.cError.prototype.getStringFromErrorType(cErrorType.division_by_zero); } break; case Asc.c_oAscItemType.StdDevP: if (this.countNums > 0) { oCellValue.number = this.getStdDevP(); } else { oCellValue.type = AscCommon.CellValueType.Error; oCellValue.text = AscCommonExcel.cError.prototype.getStringFromErrorType(cErrorType.division_by_zero); } break; case Asc.c_oAscItemType.Var: if (this.countNums > 1) { oCellValue.number = this.getVar(); } else { oCellValue.type = AscCommon.CellValueType.Error; oCellValue.text = AscCommonExcel.cError.prototype.getStringFromErrorType(cErrorType.division_by_zero); } break; case Asc.c_oAscItemType.VarP: if (this.countNums > 0) { oCellValue.number = this.getVarP(); } else { oCellValue.type = AscCommon.CellValueType.Error; oCellValue.text = AscCommonExcel.cError.prototype.getStringFromErrorType(cErrorType.division_by_zero); } break; case Asc.c_oAscItemType.Blank: oCellValue = undefined; break; default: oCellValue.number = this.getSum(); } return oCellValue; }; function checkValueByCondition(condition, val) { var res = false; condition = condition.tocString(); if (cElementType.error === condition.type) { return false; } //condition = condition.getValue(); if ("" === condition.value) { res = true; } else { var conditionObj = AscCommonExcel.matchingValue(condition); //если строка, без операторов, добавляем * для поиска совпадений начинающихся с данной строки //так делает MS. lo ищет строгие совпадения if (null === conditionObj.op && cElementType.string === conditionObj.val.type) { conditionObj.val.value += "*"; } res = AscCommonExcel.matching(val, conditionObj); } return res; } function convertDatabase(dataBase, bIsCondition) { var arr = []; var map = {}; for (var i = 0; i < dataBase.length; i++) { for (var j = 0; j < dataBase[0].length; j++) { var header = dataBase[0][j].getValue(); if (bIsCondition) { if (0 === i) { arr[j] = header; if (map.hasOwnProperty(header)) {//если находим такой же заголовок, пропускаем continue; } else { map[header] = []; } } else { map[header].push(dataBase[i][j]); } } else { if (0 === i) { if (map.hasOwnProperty(header)) {//если находим такой же заголовок, пропускаем continue; } else { map[header] = []; arr[j] = header; } } else { if (!map[header][i - 1]) { map[header][i - 1] = dataBase[i][j]; } } } } } return {arr: arr, map: map}; } function getNeedValuesFromDataBase(dataBase, field, conditionData, bIsGetObjArray, doNotCheckEmptyField) { //заполняем map название столбца-> его содержимое(из базы данных) var databaseObj = convertDatabase(dataBase); var headersArr = databaseObj.arr, headersDataMap = databaseObj.map; //заполняем map название столбца-> его содержимое(из условий) databaseObj = convertDatabase(conditionData, true); var headersConditionArr = databaseObj.arr, headersConditionMap = databaseObj.map; //преобразуем аргумент поле if (cElementType.cell === field.type || cElementType.cell3D === field.type) { field = field.getValue(); } if (!doNotCheckEmptyField && cElementType.empty === field.type) { return new cError(cErrorType.wrong_value_type); } var isNumberField = field.tocNumber(); var isEmptyField = cElementType.empty === field.type; if (cElementType.error === isNumberField.type) { field = field.getValue(); } else { //если поле задано числом, то выбираем заголовок столбца с данным именем var number = isNumberField.getValue(); if (headersArr[number - 1]) { field = headersArr[number - 1]; } else { field = null; } } if (!isEmptyField && null === field) { return new cError(cErrorType.wrong_value_type); } var previousWinArray; var winElems = []; let isContainsHeader = false; for (var i = 1; i < conditionData.length; i++) { previousWinArray = null; for (var j = 0; j < conditionData[0].length; j++) { var condition = conditionData[i][j]; var header = headersConditionArr[j]; //проходимся по всем строкам данного столбца из базы и смотрим что нам подходит по условию var databaseData = headersDataMap[header]; if (!databaseData) { continue; } isContainsHeader = true; var winColumnArray = []; for (var n = 0; n < databaseData.length; n++) { if (previousWinArray && previousWinArray[n]) { if (checkValueByCondition(condition, databaseData[n])) { winColumnArray[n] = true; } } else if (!previousWinArray && checkValueByCondition(condition, databaseData[n])) { winColumnArray[n] = true; } } previousWinArray = winColumnArray; } winElems[i - 1] = previousWinArray; } if ((!winElems.length || (winElems.length && winElems[0] && !winElems[0].length)) && isContainsHeader) { return null; } var resArr = []; var usuallyAddElems = []; var needDataColumn; if (isEmptyField && headersConditionArr && headersConditionArr[0]) { needDataColumn = headersDataMap[headersConditionArr[0]]; } else { needDataColumn = headersDataMap[field]; } if (!needDataColumn) { return new cError(cErrorType.wrong_value_type); } if (!isContainsHeader) { //ms wins all for (let i = 0; i < needDataColumn.length; i++) { if (bIsGetObjArray) { resArr.push(needDataColumn[i]); } else { resArr.push(needDataColumn[i].getValue()); } } } else { for (let i = 0; i < winElems.length; i++) { for (let j in winElems[i]) { if (winElems[i].hasOwnProperty(j)) { if (true === usuallyAddElems[j] || cElementType.empty === needDataColumn[j].type) { continue; } if (bIsGetObjArray) { resArr.push(needDataColumn[j]); } else { resArr.push(needDataColumn[j].getValue()); } usuallyAddElems[j] = true; } } } } return resArr.length ? resArr : new cError(cErrorType.division_by_zero); } cFormulaFunctionGroup['Database'] = cFormulaFunctionGroup['Database'] || []; cFormulaFunctionGroup['Database'].push(cDAVERAGE, cDCOUNT, cDCOUNTA, cDGET, cDMAX, cDMIN, cDPRODUCT, cDSTDEV, cDSTDEVP, cDSUM, cDVAR, cDVARP); /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDAVERAGE() { } //***array-formula*** cDAVERAGE.prototype = Object.create(cBaseFunction.prototype); cDAVERAGE.prototype.constructor = cDAVERAGE; cDAVERAGE.prototype.name = "DAVERAGE"; cDAVERAGE.prototype.argumentsMin = 3; cDAVERAGE.prototype.argumentsMax = 3; cDAVERAGE.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDAVERAGE.prototype.arrayIndexes = {0: 1, 2: 1}; cDAVERAGE.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDAVERAGE.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDAVERAGE.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2]); if (resArr === null) { return new cError(cErrorType.division_by_zero); } if (cElementType.error === resArr.type) { return resArr; } var summ = 0; var count = 0; for (var i = 0; i < resArr.length; i++) { var val = parseFloat(resArr[i]); if (!isNaN(val)) { summ += val; count++; } } if (0 === count) { return new cError(cErrorType.division_by_zero); } var res = new cNumber(summ / count); return cElementType.error === res.type ? new cNumber(0) : res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDCOUNT() { } //***array-formula*** cDCOUNT.prototype = Object.create(cBaseFunction.prototype); cDCOUNT.prototype.constructor = cDCOUNT; cDCOUNT.prototype.name = "DCOUNT"; cDCOUNT.prototype.argumentsMin = 3; cDCOUNT.prototype.argumentsMax = 3; cDCOUNT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDCOUNT.prototype.arrayIndexes = {0: 1, 2: 1}; cDCOUNT.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDCOUNT.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDCOUNT.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2], null, true); if (resArr === null) { return new cNumber(0); } if (cElementType.error === resArr.type) { return resArr; } var isEmptyField = cElementType.empty === argClone[1].type; var count = 0; for (var i = 0; i < resArr.length; i++) { //если Поле пустое, то ms игнорирует числовой формат полученных данных if (isEmptyField) { count++; } else { var val = parseFloat(resArr[i]); if (!isNaN(val)) { count++; } } } return new cNumber(count); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDCOUNTA() { } //***array-formula*** cDCOUNTA.prototype = Object.create(cBaseFunction.prototype); cDCOUNTA.prototype.constructor = cDCOUNTA; cDCOUNTA.prototype.name = "DCOUNTA"; cDCOUNTA.prototype.argumentsMin = 3; cDCOUNTA.prototype.argumentsMax = 3; cDCOUNTA.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDCOUNTA.prototype.arrayIndexes = {0: 1, 2: 1}; cDCOUNTA.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDCOUNTA.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDCOUNTA.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2], true, true); if (resArr === null) { return new cNumber(0); } if (cElementType.error === resArr.type) { return resArr; } var count = 0; for (var i = 0; i < resArr.length; i++) { if (cElementType.empty !== resArr[i].type) { count++; } } return new cNumber(count); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDGET() { } //***array-formula*** cDGET.prototype = Object.create(cBaseFunction.prototype); cDGET.prototype.constructor = cDGET; cDGET.prototype.name = "DGET"; cDGET.prototype.argumentsMin = 3; cDGET.prototype.argumentsMax = 3; cDGET.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDGET.prototype.arrayIndexes = {0: 1, 2: 1}; cDGET.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDGET.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDGET.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2]); if (resArr === null) { return new cError(cErrorType.wrong_value_type); } if (cElementType.error === resArr.type) { return resArr; } if (1 !== resArr.length) { return new cError(cErrorType.not_numeric); } var res = new cNumber(resArr[0]); return cElementType.error === res.type ? new cNumber(0) : res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDMAX() { } //***array-formula*** cDMAX.prototype = Object.create(cBaseFunction.prototype); cDMAX.prototype.constructor = cDMAX; cDMAX.prototype.name = "DMAX"; cDMAX.prototype.argumentsMin = 3; cDMAX.prototype.argumentsMax = 3; cDMAX.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDMAX.prototype.arrayIndexes = {0: 1, 2: 1}; cDMAX.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDMAX.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDMAX.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2]); if (resArr === null) { return new cNumber(0); } if (cElementType.error === resArr.type) { return resArr; } resArr.sort(function (a, b) { return b - a; }); var res = new cNumber(resArr[0]); return cElementType.error === res.type ? new cNumber(0) : res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDMIN() { } //***array-formula*** cDMIN.prototype = Object.create(cBaseFunction.prototype); cDMIN.prototype.constructor = cDMIN; cDMIN.prototype.name = "DMIN"; cDMIN.prototype.argumentsMin = 3; cDMIN.prototype.argumentsMax = 3; cDMIN.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDMIN.prototype.arrayIndexes = {0: 1, 2: 1}; cDMIN.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDMIN.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDMIN.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2]); if (resArr === null) { return new cNumber(0); } if (cElementType.error === resArr.type) { return resArr; } resArr.sort(function (a, b) { return a - b; }); var res = new cNumber(resArr[0]); return cElementType.error === res.type ? new cNumber(0) : res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDPRODUCT() { } //***array-formula*** cDPRODUCT.prototype = Object.create(cBaseFunction.prototype); cDPRODUCT.prototype.constructor = cDPRODUCT; cDPRODUCT.prototype.name = "DPRODUCT"; cDPRODUCT.prototype.argumentsMin = 3; cDPRODUCT.prototype.argumentsMax = 3; cDPRODUCT.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDPRODUCT.prototype.arrayIndexes = {0: 1, 2: 1}; cDPRODUCT.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDPRODUCT.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDPRODUCT.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2]); if (resArr === null) { return new cNumber(0); } if (cElementType.error === resArr.type) { return resArr; } var res = 0; for (var i = 0; i < resArr.length; i++) { var val = parseFloat(resArr[i]); if (!isNaN(val)) { if (0 === res) { res = val; } else { res *= val; } } } res = new cNumber(res); return cElementType.error === res.type ? new cNumber(0) : res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDSTDEV() { } //***array-formula*** cDSTDEV.prototype = Object.create(cBaseFunction.prototype); cDSTDEV.prototype.constructor = cDSTDEV; cDSTDEV.prototype.name = "DSTDEV"; cDSTDEV.prototype.argumentsMin = 3; cDSTDEV.prototype.argumentsMax = 3; cDSTDEV.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDSTDEV.prototype.arrayIndexes = {0: 1, 2: 1}; cDSTDEV.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDSTDEV.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDSTDEV.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2]); if (resArr === null) { return new cError(cErrorType.division_by_zero); } if (cElementType.error === resArr.type) { return resArr; } var sum = 0; var count = 0; var member = []; for (var i = 0; i < resArr.length; i++) { var val = parseFloat(resArr[i]); if (!isNaN(val)) { member[count] = val; sum += val; count++; } } if (0 === count) { return new cError(cErrorType.division_by_zero); } var average = sum / count, res = 0, av; for (i = 0; i < member.length; i++) { av = member[i] - average; res += av * av; } return new cNumber(Math.sqrt(res / (count - 1))); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDSTDEVP() { } //***array-formula*** cDSTDEVP.prototype = Object.create(cBaseFunction.prototype); cDSTDEVP.prototype.constructor = cDSTDEVP; cDSTDEVP.prototype.name = "DSTDEVP"; cDSTDEVP.prototype.argumentsMin = 3; cDSTDEVP.prototype.argumentsMax = 3; cDSTDEVP.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDSTDEVP.prototype.arrayIndexes = {0: 1, 2: 1}; cDSTDEVP.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDSTDEVP.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDSTDEVP.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2], true); if (resArr === null) { return new cError(cErrorType.division_by_zero); } if (cElementType.error === resArr.type) { return resArr; } function _var(x) { var i, tA = [], sumSQRDeltaX = 0, _x = 0, xLength = 0; for (i = 0; i < x.length; i++) { if (cElementType.number === x[i].type) { _x += x[i].getValue(); tA.push(x[i].getValue()); xLength++; } else if (cElementType.error === x[i].type) { return x[i]; } } _x /= xLength; for (i = 0; i < tA.length; i++) { sumSQRDeltaX += (tA[i] - _x) * (tA[i] - _x) } return new cNumber(isNaN(_x) ? new cError(cErrorType.division_by_zero) : Math.sqrt(sumSQRDeltaX / xLength)); } return _var(resArr); }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDSUM() { } //***array-formula*** cDSUM.prototype = Object.create(cBaseFunction.prototype); cDSUM.prototype.constructor = cDSUM; cDSUM.prototype.name = "DSUM"; cDSUM.prototype.argumentsMin = 3; cDSUM.prototype.argumentsMax = 3; cDSUM.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDSUM.prototype.arrayIndexes = {0: 1, 2: 1}; cDSUM.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDSUM.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDSUM.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array], null, cErrorType.wrong_value_type); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2]); if (resArr === null) { return new cNumber(0); } if (cElementType.error === resArr.type) { return resArr; } var summ = 0; for (var i = 0; i < resArr.length; i++) { var val = parseFloat(resArr[i]); if (!isNaN(val)) { summ += val; } } var res = new cNumber(summ); return cElementType.error === res.type ? new cNumber(0) : res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDVAR() { } //***array-formula*** cDVAR.prototype = Object.create(cBaseFunction.prototype); cDVAR.prototype.constructor = cDVAR; cDVAR.prototype.name = "DVAR"; cDVAR.prototype.argumentsMin = 3; cDVAR.prototype.argumentsMax = 3; cDVAR.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDVAR.prototype.arrayIndexes = {0: 1, 2: 1}; cDVAR.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDVAR.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDVAR.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2], true); if (resArr === null) { return new cError(cErrorType.division_by_zero); } if (cElementType.error === resArr.type) { return resArr; } function _var(x) { if (x.length < 1) { return new cError(cErrorType.division_by_zero); } var i, tA = [], sumSQRDeltaX = 0, _x = 0, xLength = 0; for (i = 0; i < x.length; i++) { if (cElementType.number === x[i].type) { _x += x[i].getValue(); tA.push(x[i].getValue()); xLength++; } else if (cElementType.error === x[i].type) { return x[i]; } } _x /= xLength; for (i = 0; i < x.length; i++) { sumSQRDeltaX += (tA[i] - _x) * (tA[i] - _x) } return new cNumber(sumSQRDeltaX / (xLength - 1)); } var res = _var(resArr); return /*cElementType.error === res.type ? new cNumber(0) :*/ res; }; /** * @constructor * @extends {AscCommonExcel.cBaseFunction} */ function cDVARP() { } //***array-formula*** cDVARP.prototype = Object.create(cBaseFunction.prototype); cDVARP.prototype.constructor = cDVARP; cDVARP.prototype.name = "DVARP"; cDVARP.prototype.argumentsMin = 3; cDVARP.prototype.argumentsMax = 3; cDVARP.prototype.numFormat = AscCommonExcel.cNumFormatNone; cDVARP.prototype.arrayIndexes = {0: 1, 2: 1}; cDVARP.prototype.returnValueType = AscCommonExcel.cReturnFormulaType.value_replace_area; cDVARP.prototype.argumentsType = [argType.reference, argType.number, argType.text]; cDVARP.prototype.Calculate = function (arg) { var oArguments = this._prepareArguments(arg, arguments[1], true, [cElementType.array, null, cElementType.array]); var argClone = oArguments.args; var argError; if (argError = this._checkErrorArg(argClone)) { return argError; } var resArr = getNeedValuesFromDataBase(argClone[0], argClone[1], argClone[2], true); if (resArr === null) { return new cError(cErrorType.division_by_zero); } if (cElementType.error === resArr.type) { return resArr; } function _var(x) { if (x.length < 1) { return new cError(cErrorType.division_by_zero); } var tA = [], sumSQRDeltaX = 0, _x = 0, xLength = 0, i; for (i = 0; i < x.length; i++) { if (cElementType.number === x[i].type) { _x += x[i].getValue(); tA.push(x[i].getValue()); xLength++; } else if (cElementType.error === x[i].type) { return x[i]; } } _x /= xLength; for (i = 0; i < x.length; i++) { sumSQRDeltaX += (tA[i] - _x) * (tA[i] - _x); } return new cNumber(sumSQRDeltaX / xLength); } var res = _var(resArr); return /*cElementType.error === res.type ? new cNumber(0) :*/ res; }; window['AscCommonExcel'] = window['AscCommonExcel'] || {}; window["AscCommonExcel"].StatisticOnlineAlgorithm = StatisticOnlineAlgorithm; })(window);