Kaydet (Commit) 9d73ad60 authored tarafından Eike Rathke [er]'s avatar Eike Rathke [er] Kaydeden (comit) Eike Rathke

calcishmakkica: #i90269# #i95144# #i101466#

* For SUMIFS, AVERAGEIFS and COUNTIFS:
  * All ranges must be of same dimension and size.
  * Bail out if error encountered for any parameter, without calculating
    remaining parameters.
* Adapted ScParameterClassification to cope with paired repeated parameters.
* In function resource have a trailing blank for repeated parameters so the
  number is appended with a blank between.

Merged from Apache OO with adaptions.
http://svn.apache.org/viewvc?rev=1381448&view=rev
Original Apache OO committer: Andrew Rist <arist@apache.org>

Original Author: Eike Rathke [er] <eike.rathke@oracle.com>
Original Committer: Eike Rathke [er] <eike.rathke@oracle.com>

 # HG changeset patch
 # User Eike Rathke [er] <eike.rathke@oracle.com>
 # Date 1288820521 -3600
 # Node ID 79da8a1033b663c919f0dc48799f70256bffa497
 # Parent  02cf226fcde498f6fd926d45df497e9fb412fe0f

Change-Id: Ica4faa4e7a46cd5f480cb898785daa51a50ec23b
üst f2cb8736
...@@ -98,7 +98,7 @@ private: ...@@ -98,7 +98,7 @@ private:
const static sal_Int32 nMaxParams = 7; const static sal_Int32 nMaxParams = 7;
Type nParam[nMaxParams]; Type nParam[nMaxParams];
bool bRepeatLast; sal_uInt8 nRepeatLast;
}; };
// SUNWS7 needs a forward declared friend, otherwise members of the outer // SUNWS7 needs a forward declared friend, otherwise members of the outer
...@@ -159,11 +159,11 @@ private: ...@@ -159,11 +159,11 @@ private:
return 0; return 0;
} }
/** Whether last parameter type is repeated. */ /** Whether last parameter types are repeated. */
static inline bool HasRepeatParameters( OpCode eOp) static inline bool HasRepeatParameters( OpCode eOp)
{ {
return eOp <= SC_OPCODE_LAST_OPCODE_ID return eOp <= SC_OPCODE_LAST_OPCODE_ID
&& pData[eOp].aData.bRepeatLast; && pData[eOp].aData.nRepeatLast > 0;
} }
#endif // OSL_DEBUG_LEVEL #endif // OSL_DEBUG_LEVEL
}; };
......
...@@ -5753,6 +5753,8 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) ...@@ -5753,6 +5753,8 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
double fCount = 0.0; double fCount = 0.0;
short nParam = 1; short nParam = 1;
size_t nRefInList = 0; size_t nRefInList = 0;
SCCOL nDimensionCols = 0;
SCROW nDimensionRows = 0;
while (nParamCount > 1 && !nGlobalError) while (nParamCount > 1 && !nGlobalError)
{ {
...@@ -5811,6 +5813,9 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) ...@@ -5811,6 +5813,9 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
} }
} }
if (nGlobalError)
continue; // and bail out, no need to evaluate other arguments
// take range // take range
nParam = 1; nParam = 1;
nRefInList = 0; nRefInList = 0;
...@@ -5860,28 +5865,32 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) ...@@ -5860,28 +5865,32 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
SetError( errIllegalParameter); SetError( errIllegalParameter);
} }
if ( nTab1 != nTab2 ) if ( nTab1 != nTab2 )
SetError( errIllegalArgument);
// All reference ranges must be of same dimension and size.
if (!nDimensionCols)
nDimensionCols = nCol2 - nCol1 + 1;
if (!nDimensionRows)
nDimensionRows = nRow2 - nRow1 + 1;
if ((nDimensionCols != (nCol2 - nCol1 + 1)) || (nDimensionRows != (nRow2 - nRow1 + 1)))
SetError ( errIllegalArgument);
// recalculate matrix values
if (nGlobalError == 0)
{ {
SetError( errIllegalParameter); // initialize temporary result matrix
}
// initialize temporary result matrix
if (!pResMat)
{
SCSIZE nResC, nResR;
nResC = nCol2 - nCol1 + 1;
nResR = nRow2 - nRow1 + 1;
pResMat = GetNewMat(nResC, nResR);
if (!pResMat) if (!pResMat)
{ {
SetError( errIllegalParameter); SCSIZE nResC, nResR;
} nResC = nCol2 - nCol1 + 1;
else nResR = nRow2 - nRow1 + 1;
{ pResMat = GetNewMat(nResC, nResR);
pResMat->FillDouble( 0.0, 0, 0, nResC-1, nResR-1); if (!pResMat)
SetError( errIllegalParameter);
else
pResMat->FillDouble( 0.0, 0, 0, nResC-1, nResR-1);
} }
}
// recalculate matrix values
if (nGlobalError == 0)
{
ScQueryParam rParam; ScQueryParam rParam;
rParam.nRow1 = nRow1; rParam.nRow1 = nRow1;
rParam.nRow2 = nRow2; rParam.nRow2 = nRow2;
...@@ -5952,13 +5961,12 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) ...@@ -5952,13 +5961,12 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
} }
} }
} }
else
{
SetError( errIllegalParameter);
}
nParamCount -= 2; nParamCount -= 2;
} }
if (nGlobalError)
return 0; // bail out
// main range - only for AVERAGEIFS and SUMIFS // main range - only for AVERAGEIFS and SUMIFS
if (nParamCount == 1) if (nParamCount == 1)
{ {
...@@ -6011,9 +6019,15 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) ...@@ -6011,9 +6019,15 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
SetError( errIllegalParameter); SetError( errIllegalParameter);
} }
if ( nMainTab1 != nMainTab2 ) if ( nMainTab1 != nMainTab2 )
{ SetError( errIllegalArgument);
SetError( errIllegalParameter);
} // All reference ranges must be of same dimension and size.
if ((nDimensionCols != (nMainCol2 - nMainCol1 + 1)) || (nDimensionRows != (nMainRow2 - nMainRow1 + 1)))
SetError ( errIllegalArgument);
if (nGlobalError)
return 0; // bail out
// end-result calculation // end-result calculation
ScAddress aAdr; ScAddress aAdr;
aAdr.SetTab( nMainTab1 ); aAdr.SetTab( nMainTab1 );
...@@ -6084,7 +6098,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) ...@@ -6084,7 +6098,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
++fCount; ++fCount;
} }
} }
//
switch( eFunc ) switch( eFunc )
{ {
case ifSUMIFS: fRes = ::rtl::math::approxAdd( fSum, fMem ); break; case ifSUMIFS: fRes = ::rtl::math::approxAdd( fSum, fMem ); break;
......
...@@ -42,7 +42,9 @@ ...@@ -42,7 +42,9 @@
* *
* Number of parameters. VAR_ARGS if variable number, or * Number of parameters. VAR_ARGS if variable number, or
* VAR_ARGS+number if number of fixed parameters and variable * VAR_ARGS+number if number of fixed parameters and variable
* arguments following. * arguments following. Or PAIRED_VAR_ARGS if variable number of
* paired parameters, or PAIRED_VAR_ARGS+number if number of fixed
* parameters and variable paired arguments following.
* *
* For every parameter: * For every parameter:
* *
...@@ -2995,7 +2997,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1 ...@@ -2995,7 +2997,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1
}; };
String 4 // Name of Parameter 2 String 4 // Name of Parameter 2
{ {
Text [ en-US ] = "range" ; Text [ en-US ] = "range " ;
}; };
String 5 // Description of Parameter 2 String 5 // Description of Parameter 2
{ {
...@@ -3003,7 +3005,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1 ...@@ -3003,7 +3005,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1
}; };
String 6 // Name of Parameter 3 String 6 // Name of Parameter 3
{ {
Text [ en-US ] = "criteria" ; Text [ en-US ] = "criteria " ;
}; };
String 7 // Description of Parameter 3 String 7 // Description of Parameter 3
{ {
...@@ -3036,7 +3038,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1 ...@@ -3036,7 +3038,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1
}; };
String 4 // Name of Parameter 2 String 4 // Name of Parameter 2
{ {
Text [ en-US ] = "range" ; Text [ en-US ] = "range " ;
}; };
String 5 // Description of Parameter 2 String 5 // Description of Parameter 2
{ {
...@@ -3044,7 +3046,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1 ...@@ -3044,7 +3046,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1
}; };
String 6 // Name of Parameter 3 String 6 // Name of Parameter 3
{ {
Text [ en-US ] = "criteria" ; Text [ en-US ] = "criteria " ;
}; };
String 7 // Description of Parameter 3 String 7 // Description of Parameter 3
{ {
...@@ -3069,7 +3071,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1 ...@@ -3069,7 +3071,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1
}; };
String 2 // Name of Parameter 1 String 2 // Name of Parameter 1
{ {
Text [ en-US ] = "range" ; Text [ en-US ] = "range " ;
}; };
String 3 // Description of Parameter 1 String 3 // Description of Parameter 1
{ {
...@@ -3077,7 +3079,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1 ...@@ -3077,7 +3079,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1
}; };
String 4 // Name of Parameter 2 String 4 // Name of Parameter 2
{ {
Text [ en-US ] = "criteria" ; Text [ en-US ] = "criteria " ;
}; };
String 5 // Description of Parameter 2 String 5 // Description of Parameter 2
{ {
......
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