Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

1052 lines
31 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (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);