Commit 97d5c7ab authored by Dmitry.Shahtanov's avatar Dmitry.Shahtanov Committed by Alexander.Trofimov

fixed: Bug 19651 - Ошибка при вычислении формулы AVERAGEIF критерий в которой...

fixed: Bug 19651 - Ошибка при вычислении формулы AVERAGEIF критерий в которой задан знаком равенства с маской

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@49035 954022d7-b5bf-4e40-9824-e11837661b57
parent adda55ea
...@@ -41,18 +41,18 @@ ...@@ -41,18 +41,18 @@
<script type="text/javascript" src="../model/CollaborativeEditing.js"></script> <script type="text/javascript" src="../model/CollaborativeEditing.js"></script>
<script type="text/javascript" src="../model/ConditionalFormatting.js"></script> <script type="text/javascript" src="../model/ConditionalFormatting.js"></script>
<script type="text/javascript" src="../model/parserFormula.js"></script> <script type="text/javascript" src="../model/FormulaObjects/parserFormula.js"></script>
<script type="text/javascript" src="../model/dateandtimeFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/dateandtimeFunctions.js"></script>
<script type="text/javascript" src="../model/engineeringFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/engineeringFunctions.js"></script>
<script type="text/javascript" src="../model/cubeFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/cubeFunctions.js"></script>
<script type="text/javascript" src="../model/databaseFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/databaseFunctions.js"></script>
<script type="text/javascript" src="../model/textanddataFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/textanddataFunctions.js"></script>
<script type="text/javascript" src="../model/statisticalFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/statisticalFunctions.js"></script>
<script type="text/javascript" src="../model/financialFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/financialFunctions.js"></script>
<script type="text/javascript" src="../model/mathematicFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/mathematicFunctions.js"></script>
<script type="text/javascript" src="../model/lookupandreferenceFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/lookupandreferenceFunctions.js"></script>
<script type="text/javascript" src="../model/informationFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/informationFunctions.js"></script>
<script type="text/javascript" src="../model/logicalFunctions.js"></script> <script type="text/javascript" src="../model/FormulaObjects/logicalFunctions.js"></script>
<script type="text/javascript" src="../model/CellComment.js"></script> <script type="text/javascript" src="../model/CellComment.js"></script>
<script type="text/javascript" src="../../Common/NumFormat.js"></script> <script type="text/javascript" src="../../Common/NumFormat.js"></script>
<script type="text/javascript" src="../model/Serialize.js"></script> <script type="text/javascript" src="../model/Serialize.js"></script>
......
...@@ -242,15 +242,16 @@ cFormulaFunction.LookupAndReference = { ...@@ -242,15 +242,16 @@ cFormulaFunction.LookupAndReference = {
if ( arg0 instanceof cString ) { if ( arg0 instanceof cString ) {
valueForSearching = arg0.getValue(); valueForSearching = arg0.getValue();
valueForSearching = valueForSearching /*valueForSearching = valueForSearching
.replace( /(~)?\*/g, function ( $0, $1 ) { .replace( /(~)?\*//*g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]*'; return $1 ? $0 : '[\\w\\W]*';
} ) } )
.replace( /(~)?\?/g, function ( $0, $1 ) { .replace( /(~)?\?/g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]{1,1}'; return $1 ? $0 : '[\\w\\W]{1,1}';
} ) } )
.replace( /\~/g, "\\" ); .replace( /\~/g, "\\" );
regexp = new XRegExp( valueForSearching + "$", "i" ); regexp = new XRegExp( valueForSearching + "$", "i" );*/
regexp = searchRegExp(valueForSearching);
} }
else if ( arg0 instanceof cError ) else if ( arg0 instanceof cError )
return this.value = arg0; return this.value = arg0;
...@@ -672,15 +673,16 @@ cFormulaFunction.LookupAndReference = { ...@@ -672,15 +673,16 @@ cFormulaFunction.LookupAndReference = {
if ( arg0 instanceof cString ) { if ( arg0 instanceof cString ) {
valueForSearching = arg0.getValue(); valueForSearching = arg0.getValue();
valueForSearching = valueForSearching /*valueForSearching = valueForSearching
.replace( /(~)?\*/g, function ( $0, $1 ) { .replace( /(~)?\*//*g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]*'; return $1 ? $0 : '[\\w\\W]*';
} ) } )
.replace( /(~)?\?/g, function ( $0, $1 ) { .replace( /(~)?\?/g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]{1,1}'; return $1 ? $0 : '[\\w\\W]{1,1}';
} ) } )
.replace( /\~/g, "\\" ); .replace( /\~/g, "\\" );
regexp = new XRegExp( valueForSearching + "$", "i" ); regexp = new XRegExp( valueForSearching + "$", "i" );*/
regexp = searchRegExp(valueForSearching);
} }
else if ( arg0 instanceof cError ) else if ( arg0 instanceof cError )
return this.value = arg0; return this.value = arg0;
......
...@@ -3048,9 +3048,21 @@ cFormulaFunction.Mathematic = { ...@@ -3048,9 +3048,21 @@ cFormulaFunction.Mathematic = {
return this.value = new cError( cErrorType.wrong_value_type ); return this.value = new cError( cErrorType.wrong_value_type );
} }
function matching( x, y, oper, startCell, pos ) { function matching( x, y, oper ) {
var res = false; var res = false, rS;
if ( typeof x === typeof y ) { if ( y instanceof cString ) {
rS = searchRegExp(y.toString())
switch ( oper ) {
case "<>":
res = !rS.test( x.value );
break;
case "=":
default:
res = rS.test( x.value );
break;
}
}
else if ( typeof x === typeof y ) {
switch ( oper ) { switch ( oper ) {
case "<>": case "<>":
res = (x.value != y.value); res = (x.value != y.value);
...@@ -3077,11 +3089,8 @@ cFormulaFunction.Mathematic = { ...@@ -3077,11 +3089,8 @@ cFormulaFunction.Mathematic = {
} }
arg1 = arg1.toString(); arg1 = arg1.toString();
var operators = new RegExp( "^ *[<=> ]+ *" ); var operators = new RegExp( "^ *[<=> ]+ *" ), match = arg1.match( operators ),
var match = arg1.match( operators ); search, oper, val;
if ( match || parseNum( arg1 ) ) {
var search, oper, val;
if ( match ) { if ( match ) {
search = arg1.substr( match[0].length ); search = arg1.substr( match[0].length );
oper = match[0].replace( /\s/g, "" ); oper = match[0].replace( /\s/g, "" );
...@@ -3114,42 +3123,6 @@ cFormulaFunction.Mathematic = { ...@@ -3114,42 +3123,6 @@ cFormulaFunction.Mathematic = {
} }
} }
} }
}
else {
valueForSearching = arg1
.replace( /(~)?\*/g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]*';
} )
.replace( /(~)?\?/g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]{1,1}';
} )
.replace( /(~\*)/g, "\\*" ).replace( /(~\?)/g, "\\?" );
regexpSearch = new RegExp( valueForSearching + "$", "i" );
if ( arg0 instanceof cArea ) {
val = arg0.getValue();
for ( var i = 0; i < val.length; i++ ) {
if ( regexpSearch.test( val[i].value ) ) {
var r = arg0.getRange(), ws = arg0.getWS(),
r1 = r.first.getRow0() + i, c1 = arg2.getRange().first.getCol0();
r = new cRef( ws.getRange3( r1, c1, r1, c1 ).getName(), ws );
if ( r.getValue() instanceof cNumber ) {
_sum += r.getValue().getValue();
}
}
}
}
else {
val = arg0.getValue();
if ( regexpSearch.test( val.value ) ) {
var r = arg0.getRange(), ws = arg0.getWS(),
r1 = r.first.getRow0() + 0, c1 = arg2.getRange().first.getCol0();
r = new cRef( ws.getRange3( r1, c1, r1, c1 ).getName(), ws );
if ( r.getValue() instanceof cNumber ) {
_sum += r.getValue().getValue();
}
}
}
}
return this.value = new cNumber( _sum ); return this.value = new cNumber( _sum );
} }
......
...@@ -219,9 +219,21 @@ cFormulaFunction.Statistical = { ...@@ -219,9 +219,21 @@ cFormulaFunction.Statistical = {
return this.value = new cError( cErrorType.wrong_value_type ); return this.value = new cError( cErrorType.wrong_value_type );
} }
function matching( x, y, oper, startCell, pos ) { function matching( x, y, oper ) {
var res = false; var res = false, rS;
if ( typeof x === typeof y ) { if ( y instanceof cString ) {
rS = searchRegExp(y.toString())
switch ( oper ) {
case "<>":
res = !rS.test( x.value );
break;
case "=":
default:
res = rS.test( x.value );
break;
}
}
else if ( typeof x === typeof y ) {
switch ( oper ) { switch ( oper ) {
case "<>": case "<>":
res = (x.value != y.value); res = (x.value != y.value);
...@@ -248,11 +260,8 @@ cFormulaFunction.Statistical = { ...@@ -248,11 +260,8 @@ cFormulaFunction.Statistical = {
} }
arg1 = arg1.toString(); arg1 = arg1.toString();
var operators = new RegExp( "^ *[<=> ]+ *" ); var operators = new RegExp( "^ *[<=> ]+ *" ), match = arg1.match( operators ),
var match = arg1.match( operators ); search, oper, val;
if ( match || parseNum( arg1 ) ) {
var search, oper, val;
if ( match ) { if ( match ) {
search = arg1.substr( match[0].length ); search = arg1.substr( match[0].length );
oper = match[0].replace( /\s/g, "" ); oper = match[0].replace( /\s/g, "" );
...@@ -287,47 +296,14 @@ cFormulaFunction.Statistical = { ...@@ -287,47 +296,14 @@ cFormulaFunction.Statistical = {
} }
} }
} }
}
else {
valueForSearching = arg1
.replace( /(~)?\*/g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]*';
} )
.replace( /(~)?\?/g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]{1,1}';
} )
.replace( /(~\*)/g, "\\*" ).replace( /(~\?)/g, "\\?" );
regexpSearch = new RegExp( valueForSearching + "$", "i" );
if ( arg0 instanceof cArea ) {
val = arg0.getValue();
for ( var i = 0; i < val.length; i++ ) {
if ( regexpSearch.test( val[i].value ) ) {
var r = arg0.getRange(), ws = arg0.getWS(),
r1 = r.first.getRow0() + i, c1 = arg2.getRange().first.getCol0();
r = new cRef( ws.getRange3( r1, c1, r1, c1 ).getName(), ws );
if ( r.getValue() instanceof cNumber ) {
_sum += r.getValue().getValue();
_count++;
}
}
}
}
else {
val = arg0.getValue();
if ( regexpSearch.test( val.value ) ) {
var r = arg0.getRange(), ws = arg0.getWS(),
r1 = r.first.getRow0() + 0, c1 = arg2.getRange().first.getCol0();
r = new cRef( ws.getRange3( r1, c1, r1, c1 ).getName(), ws );
if ( r.getValue() instanceof cNumber ) {
_sum += r.getValue().getValue();
_count++;
}
}
}
}
if( _count == 0 ){
return new cError( cErrorType.division_by_zero );
}
else{
return this.value = new cNumber( _sum / _count ); return this.value = new cNumber( _sum / _count );
} }
}
r.getInfo = function () { r.getInfo = function () {
return { return {
name:this.name, name:this.name,
...@@ -701,8 +677,20 @@ cFormulaFunction.Statistical = { ...@@ -701,8 +677,20 @@ cFormulaFunction.Statistical = {
} }
function matching( x, y, oper ) { function matching( x, y, oper ) {
var res = 0; var res = false, rS;
if ( typeof x === typeof y ) { if ( y instanceof cString ) {
rS = searchRegExp(y.toString())
switch ( oper ) {
case "<>":
res = !rS.test( x.value );
break;
case "=":
default:
res = rS.test( x.value );
break;
}
}
else if ( typeof x === typeof y ) {
switch ( oper ) { switch ( oper ) {
case "<>": case "<>":
res = (x.value != y.value); res = (x.value != y.value);
...@@ -723,18 +711,15 @@ cFormulaFunction.Statistical = { ...@@ -723,18 +711,15 @@ cFormulaFunction.Statistical = {
default: default:
res = (x.value == y.value); res = (x.value == y.value);
break; break;
} }
} }
_count += res; return res;
} }
arg1 = arg1.toString(); arg1 = arg1.toString();
var operators = new RegExp( "^ *[<=> ]+ *" ), searchOperators = new RegExp( "^ *[*?]" ) var operators = new RegExp( "^ *[<=> ]+ *" ), searchOperators = new RegExp( "^ *[*?]" ), search, oper, val,
var match = arg1.match( operators ); match = arg1.match( operators );
if ( match || parseNum( arg1 ) ) {
var search, oper, val;
if ( match ) { if ( match ) {
search = arg1.substr( match[0].length ); search = arg1.substr( match[0].length );
oper = match[0].replace( /\s/g, "" ); oper = match[0].replace( /\s/g, "" );
...@@ -746,51 +731,18 @@ cFormulaFunction.Statistical = { ...@@ -746,51 +731,18 @@ cFormulaFunction.Statistical = {
if ( arg0 instanceof cArea ) { if ( arg0 instanceof cArea ) {
val = arg0.getValue(); val = arg0.getValue();
for ( var i = 0; i < val.length; i++ ) { for ( var i = 0; i < val.length; i++ ) {
matching( val[i], valueForSearching, oper ); _count += matching( val[i], valueForSearching, oper );
} }
} }
else if ( arg0 instanceof cArea3D ) { else if ( arg0 instanceof cArea3D ) {
val = arg0.getValue(); val = arg0.getValue();
for ( var i = 0; i < val.length; i++ ) { for ( var i = 0; i < val.length; i++ ) {
matching( val[i], valueForSearching, oper ); _count += matching( val[i], valueForSearching, oper );
}
}
else {
val = arg0.getValue();
matching( val, valueForSearching, oper );
}
}
else {
match = arg1.match( searchOperators )
if ( match ) {
valueForSearching = arg1
.replace( /(~)?\*/g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]*';
} )
.replace( /(~)?\?/g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]{1,1}';
} )
.replace( /(~\*)/g, "\\*" ).replace( /(~\?)/g, "\\?" )
regexpSearch = new RegExp( valueForSearching + "$", "i" );
if ( arg0 instanceof cArea ) {
val = arg0.getValue();
for ( var i = 0; i < val.length; i++ ) {
_count += regexpSearch.test( val[i].value );
}
}
else if ( arg0 instanceof cArea3D ) {
val = arg0.getValue();
for ( var i in val ) {
for ( var j in val[i] ) {
_count += regexpSearch.test( val[i][j].value );
}
} }
} }
else { else {
val = arg0.getValue(); val = arg0.getValue();
_count += regexpSearch.test( val.value ); _count += matching( val, valueForSearching, oper );
}
}
} }
return this.value = new cNumber( _count ); return this.value = new cNumber( _count );
......
...@@ -953,15 +953,24 @@ cFormulaFunction.TextAndData = { ...@@ -953,15 +953,24 @@ cFormulaFunction.TextAndData = {
var string1 = arg0.getValue(), string2 = arg1.getValue(), var string1 = arg0.getValue(), string2 = arg1.getValue(),
valueForSearching = string1 valueForSearching = string1
.replace( /(\\)/g, "\\" )
.replace( /(\^)/g, "\\^" )
.replace( /(\()/g, "\\(" )
.replace( /(\))/g, "\\)" )
.replace( /(\+)/g, "\\+" )
.replace( /(\[)/g, "\\[" )
.replace( /(\])/g, "\\]" )
.replace( /(\{)/g, "\\{" )
.replace( /(\})/g, "\\}" )
.replace( /(\$)/g, "\\$" )
.replace( /(~)?\*/g, function ( $0, $1 ) { .replace( /(~)?\*/g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]*'; return $1 ? $0 : '(.*)';
} ) } )
.replace( /(~)?\?/g, function ( $0, $1 ) { .replace( /(~)?\?/g, function ( $0, $1 ) {
return $1 ? $0 : '[\\w\\W]{1,1}'; return $1 ? $0 : '.';
} ) } )
.replace( /(~\*)/g, "\\*" ).replace( /(~\?)/g, "\\?" ); .replace( /(~\*)/g, "\\*" ).replace( /(~\?)/g, "\\?" );
valueForSearching = new RegExp( valueForSearching, "ig" );
valueForSearching = new RegExp( valueForSearching, "ig" )
if ( string1 == "" ) if ( string1 == "" )
return this.value = arg2; return this.value = arg2;
......
...@@ -8701,15 +8701,19 @@ ...@@ -8701,15 +8701,19 @@
findFlags += "i"; // Не чувствителен к регистру findFlags += "i"; // Не чувствителен к регистру
var valueForSearching = options.findWhat var valueForSearching = options.findWhat
.replace(/(~)?\*/g, function($0, $1){ .replace( /(\\)/g, "\\" ).replace( /(\^)/g, "\\^" )
return $1 ? $0 : '[\\w\\W]*'; .replace( /(\()/g, "\\(" ).replace( /(\))/g, "\\)" )
}) .replace( /(\+)/g, "\\+" ).replace( /(\[)/g, "\\[" )
.replace(/(~)?\?/g, function($0, $1){ .replace( /(\])/g, "\\]" ).replace( /(\{)/g, "\\{" )
return $1 ? $0 : '[\\w\\W]{1,1}'; .replace( /(\})/g, "\\}" ).replace( /(\$)/g, "\\$" )
}) .replace( /(~)?\*/g, function ( $0, $1 ) {
.replace(/(~\*)/g,"\\*").replace(/(~\?)/g, "\\?"); return $1 ? $0 : '(.*)';
} )
.replace( /(~)?\?/g, function ( $0, $1 ) {
return $1 ? $0 : '.';
} )
.replace( /(~\*)/g, "\\*" ).replace( /(~\?)/g, "\\?" );
valueForSearching = new RegExp(valueForSearching, findFlags); valueForSearching = new RegExp(valueForSearching, findFlags);
var t = this; var t = this;
var ar = this.activeRange.clone(); var ar = this.activeRange.clone();
ar.startCol = this.activeRange.startCol; ar.startCol = this.activeRange.startCol;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment