Files
Yajbir Singh f1b860b25c
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

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