[Libreoffice-commits] core.git: formula/source include/formula sc/inc sc/qa sc/source

Winfried Donkers winfrieddonkers at libreoffice.org
Wed May 4 21:54:25 UTC 2016


 formula/source/core/resource/core_resource.src |   14 ++++
 include/formula/compiler.hrc                   |    4 -
 include/formula/opcode.hxx                     |    2 
 sc/inc/helpids.h                               |    2 
 sc/qa/unit/ucalc.cxx                           |    2 
 sc/source/core/inc/interpre.hxx                |    6 +
 sc/source/core/tool/interpr1.cxx               |   14 ++++
 sc/source/core/tool/interpr4.cxx               |    2 
 sc/source/core/tool/interpr8.cxx               |   12 +++
 sc/source/filter/excel/xlformula.cxx           |    4 -
 sc/source/filter/oox/formulabase.cxx           |    4 -
 sc/source/ui/src/scfuncs.src                   |   78 +++++++++++++++++++++++++
 12 files changed, 139 insertions(+), 5 deletions(-)

New commits:
commit c57dc741a6f221f53f3c8da2f521c6ece63246c2
Author: Winfried Donkers <winfrieddonkers at libreoffice.org>
Date:   Tue May 3 21:19:19 2016 +0200

    tdf#97831 [part] Add Excel 2016 functions to Calc
    
    Functions MINIFS and MAXIFS
    
    Change-Id: I4bd2e8b82f8377af81f4373d0c33ac286588b8df
    Reviewed-on: https://gerrit.libreoffice.org/24619
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/formula/source/core/resource/core_resource.src b/formula/source/core/resource/core_resource.src
index acc6ba8..551de2f 100644
--- a/formula/source/core/resource/core_resource.src
+++ b/formula/source/core/resource/core_resource.src
@@ -291,6 +291,8 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH_ODFF
     String SC_OPCODE_TEXTJOIN_MS { Text = "COM.MICROSOFT.TEXTJOIN" ; };
     String SC_OPCODE_IFS_MS { Text = "COM.MICROSOFT.IFS" ; };
     String SC_OPCODE_SWITCH_MS { Text = "COM.MICROSOFT.SWITCH" ; };
+    String SC_OPCODE_MINIFS_MS { Text = "COM.MICROSOFT.MINIFS" ; };
+    String SC_OPCODE_MAXIFS_MS { Text = "COM.MICROSOFT.MAXIFS" ; };
     String SC_OPCODE_MAT_VALUE { Text = "MVALUE" ; };
     String SC_OPCODE_MAT_DET { Text = "MDETERM" ; };
     String SC_OPCODE_MAT_INV { Text = "MINVERSE" ; };
@@ -729,6 +731,8 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH_OOXML
     String SC_OPCODE_TEXTJOIN_MS { Text = "_xlfn.TEXTJOIN" ; };
     String SC_OPCODE_IFS_MS { Text = "_xlfn.IFS" ; };
     String SC_OPCODE_SWITCH_MS { Text = "_xlfn.SWITCH" ; };
+    String SC_OPCODE_MINIFS_MS { Text = "_xlfn.MINIFS" ; };
+    String SC_OPCODE_MAXIFS_MS { Text = "_xlfn.MAXIFS" ; };
     String SC_OPCODE_MAT_VALUE { Text = "MVALUE" ; };
     String SC_OPCODE_MAT_DET { Text = "MDETERM" ; };
     String SC_OPCODE_MAT_INV { Text = "MINVERSE" ; };
@@ -1167,6 +1171,8 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH
     String SC_OPCODE_TEXTJOIN_MS { Text = "TEXTJOIN" ; };
     String SC_OPCODE_IFS_MS { Text = "IFS" ; };
     String SC_OPCODE_SWITCH_MS { Text = "SWITCH" ; };
+    String SC_OPCODE_MINIFS_MS { Text = "MINIFS" ; };
+    String SC_OPCODE_MAXIFS_MS { Text = "MAXIFS" ; };
     String SC_OPCODE_MAT_VALUE { Text = "MVALUE" ; };
     String SC_OPCODE_MAT_DET { Text = "MDETERM" ; };
     String SC_OPCODE_MAT_INV { Text = "MINVERSE" ; };
@@ -2349,6 +2355,14 @@ Resource RID_STRLIST_FUNCTION_NAMES
     {
         Text [ en-US ] = "SWITCH" ;
     };
+    String SC_OPCODE_MINIFS_MS
+    {
+        Text [ en-US ] = "MINIFS" ;
+    };
+    String SC_OPCODE_MAXIFS_MS
+    {
+        Text [ en-US ] = "MAXIFS" ;
+    };
     String SC_OPCODE_MAT_VALUE
     {
         Text [ en-US ] = "MVALUE" ;
diff --git a/include/formula/compiler.hrc b/include/formula/compiler.hrc
index 0bb8360..7a7bfe7 100644
--- a/include/formula/compiler.hrc
+++ b/include/formula/compiler.hrc
@@ -499,7 +499,9 @@
 #define SC_OPCODE_TEXTJOIN_MS       488
 #define SC_OPCODE_IFS_MS            489
 #define SC_OPCODE_SWITCH_MS         490
-#define SC_OPCODE_STOP_2_PAR        491     /* last function with two or more parameters' OpCode + 1 */
+#define SC_OPCODE_MINIFS_MS         491
+#define SC_OPCODE_MAXIFS_MS         492
+#define SC_OPCODE_STOP_2_PAR        493     /* last function with two or more parameters' OpCode + 1 */
 
 #define SC_OPCODE_STOP_FUNCTION     SC_OPCODE_STOP_2_PAR            /* last function's OpCode + 1 */
 #define SC_OPCODE_LAST_OPCODE_ID    (SC_OPCODE_STOP_FUNCTION - 1)   /* last OpCode */
diff --git a/include/formula/opcode.hxx b/include/formula/opcode.hxx
index facaaab..30dc94f 100644
--- a/include/formula/opcode.hxx
+++ b/include/formula/opcode.hxx
@@ -284,6 +284,8 @@ enum OpCode : sal_uInt16
         ocRawSubtract       = SC_OPCODE_RAWSUBTRACT,
         ocIfs_MS            = SC_OPCODE_IFS_MS,
         ocSwitch_MS         = SC_OPCODE_SWITCH_MS,
+        ocMinIfs_MS         = SC_OPCODE_MINIFS_MS,
+        ocMaxIfs_MS         = SC_OPCODE_MAXIFS_MS,
     // Database functions
         ocDBSum             = SC_OPCODE_DB_SUM,
         ocDBCount           = SC_OPCODE_DB_COUNT,
diff --git a/sc/inc/helpids.h b/sc/inc/helpids.h
index db24bed..9c15904 100644
--- a/sc/inc/helpids.h
+++ b/sc/inc/helpids.h
@@ -640,5 +640,7 @@
 #define HID_FUNC_TEXTJOIN_MS                                    "SC_HID_FUNC_TEXTJOIN_MS"
 #define HID_FUNC_IFS_MS                                         "SC_HID_FUNC_IFS_MS"
 #define HID_FUNC_SWITCH_MS                                      "SC_HID_FUNC_SWITCH_MS"
+#define HID_FUNC_MINIFS_MS                                      "SC_HID_FUNC_MINIFS_MS"
+#define HID_FUNC_MAXIFS_MS                                      "SC_HID_FUNC_MAXIFS_MS"
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index d3e7567..228fafa 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -2688,9 +2688,11 @@ void Test::testFunctionLists()
         "LOGNORMDIST",
         "MAX",
         "MAXA",
+        "MAXIFS",
         "MEDIAN",
         "MIN",
         "MINA",
+        "MINIFS",
         "MODE",
         "MODE.MULT",
         "MODE.SNGL",
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 8321e3b..a01b60b 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -100,7 +100,9 @@ enum ScIterFuncIfs
 {
     ifSUMIFS,     // Multi-Conditional sum
     ifAVERAGEIFS, // Multi-Conditional average
-    ifCOUNTIFS    // Multi-Conditional count
+    ifCOUNTIFS,   // Multi-Conditional count
+    ifMINIFS,     // Multi-Conditional minimum
+    ifMAXIFS      // Multi-Conditional maximum
 };
 
 enum ScETSType
@@ -608,6 +610,8 @@ void ScConcat_MS();
 void ScTextJoin_MS();
 void ScIfs_MS();
 void ScSwitch_MS();
+void ScMinIfs_MS();
+void ScMaxIfs_MS();
 void ScExternal();
 void ScMissing();
 void ScMacro();
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 0a5ed78..dcaf374 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -5249,6 +5249,8 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
         double fMem = 0.0;
         double fRes = 0.0;
         double fCount = 0.0;
+        double fMin = std::numeric_limits<double>::max();
+        double fMax = std::numeric_limits<double>::min();
         short nParam = 1;
         size_t nRefInList = 0;
         SCCOL nDimensionCols = 0;
@@ -5484,7 +5486,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
         if (nGlobalError)
             return 0;   // bail out
 
-        // main range - only for AVERAGEIFS and SUMIFS
+        // main range - only for AVERAGEIFS, SUMIFS, MINIFS and MAXIFS
         if (nParamCount == 1)
         {
             nParam = 1;
@@ -5587,6 +5589,10 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
                     }
                     else
                         fSum += fVal;
+                    if ( fMin > fVal )
+                        fMin = fVal;
+                    if ( fMax < fVal )
+                        fMax = fVal;
                 }
             }
             else
@@ -5612,6 +5618,10 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
                                 }
                                 else
                                     fSum += fVal;
+                                if ( fMin > fVal )
+                                    fMin = fVal;
+                                if ( fMax < fVal )
+                                    fMax = fVal;
                             }
                         }
                     }
@@ -5631,6 +5641,8 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
             case ifSUMIFS:     fRes = ::rtl::math::approxAdd( fSum, fMem ); break;
             case ifAVERAGEIFS: fRes = div( ::rtl::math::approxAdd( fSum, fMem ), fCount); break;
             case ifCOUNTIFS:   fRes = fCount; break;
+            case ifMINIFS:     fRes = ( fMin < std::numeric_limits<double>::max() ? fMin : 0 ); break;
+            case ifMAXIFS:     fRes = ( fMax > std::numeric_limits<double>::min() ? fMax : 0 ); break;
             default: ; // nothing
         }
         return fRes;
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 684913b..e6985dc 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -3944,6 +3944,8 @@ StackVar ScInterpreter::Interpret()
                 case ocTextJoin_MS      : ScTextJoin_MS();              break;
                 case ocIfs_MS           : ScIfs_MS();                   break;
                 case ocSwitch_MS        : ScSwitch_MS();                break;
+                case ocMinIfs_MS        : ScMinIfs_MS();                break;
+                case ocMaxIfs_MS        : ScMaxIfs_MS();                break;
                 case ocMatValue         : ScMatValue();                 break;
                 case ocMatrixUnit       : ScEMat();                     break;
                 case ocMatDet           : ScMatDet();                   break;
diff --git a/sc/source/core/tool/interpr8.cxx b/sc/source/core/tool/interpr8.cxx
index 5cb33f0..aa70886 100644
--- a/sc/source/core/tool/interpr8.cxx
+++ b/sc/source/core/tool/interpr8.cxx
@@ -2019,4 +2019,16 @@ void ScInterpreter::ScSwitch_MS()
         PushError( errUnknownStackVariable );
 }
 
+
+void ScInterpreter::ScMinIfs_MS()
+{
+    PushDouble( IterateParametersIfs( ifMINIFS ) );
+}
+
+
+void ScInterpreter::ScMaxIfs_MS()
+{
+    PushDouble( IterateParametersIfs( ifMAXIFS ) );
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/filter/excel/xlformula.cxx b/sc/source/filter/excel/xlformula.cxx
index dadb2e7..c79a432 100644
--- a/sc/source/filter/excel/xlformula.cxx
+++ b/sc/source/filter/excel/xlformula.cxx
@@ -583,7 +583,9 @@ static const XclFunctionInfo saFuncTable_2016[] =
     EXC_FUNCENTRY_V_VR(  ocConcat_MS,           1,  MX, 0,  "CONCAT" ),
     EXC_FUNCENTRY_V_VR(  ocTextJoin_MS,         3,  MX, 0,  "TEXTJOIN" ),
     EXC_FUNCENTRY_V_VR(  ocIfs_MS,              2,  MX, 0,  "IFS" ),
-    EXC_FUNCENTRY_V_VR(  ocSwitch_MS,           3,  MX, 0,  "SWITCH" )
+    EXC_FUNCENTRY_V_VR(  ocSwitch_MS,           3,  MX, 0,  "SWITCH" ),
+    EXC_FUNCENTRY_V_VR(  ocMinIfs_MS,           3,  MX, 0,  "MINIFS" ),
+    EXC_FUNCENTRY_V_VR(  ocMaxIfs_MS,           3,  MX, 0,  "MAXIFS" )
 };
 
 #define EXC_FUNCENTRY_ODF( opcode, minparam, maxparam, flags, asciiname ) \
diff --git a/sc/source/filter/oox/formulabase.cxx b/sc/source/filter/oox/formulabase.cxx
index c463630..3778f2c 100644
--- a/sc/source/filter/oox/formulabase.cxx
+++ b/sc/source/filter/oox/formulabase.cxx
@@ -913,7 +913,9 @@ static const FunctionData saFuncTable2016[] =
     { "COM.MICROSOFT.CONCAT",                   "CONCAT",                   NOID,   NOID,   1,  MX, V, { VR }, FUNCFLAG_MACROCALL_NEW },
     { "COM.MICROSOFT.TEXTJOIN",                 "TEXTJOIN",                 NOID,   NOID,   3,  MX, V, { VR }, FUNCFLAG_MACROCALL_NEW },
     { "COM.MICROSOFT.IFS",                      "IFS",                      NOID,   NOID,   2,  MX, R, { VO, RO }, FUNCFLAG_MACROCALL_NEW },
-    { "COM.MICROSOFT.SWITCH",                   "SWITCH",                   NOID,   NOID,   3,  MX, R, { VO, RO }, FUNCFLAG_MACROCALL_NEW }
+    { "COM.MICROSOFT.SWITCH",                   "SWITCH",                   NOID,   NOID,   3,  MX, R, { VO, RO }, FUNCFLAG_MACROCALL_NEW },
+    { "COM.MICROSOFT.MINIFS",                   "MINIFS",                   NOID,   NOID,   3,  MX, R, { VO, RO }, FUNCFLAG_MACROCALL_NEW },
+    { "COM.MICROSOFT.MAXIFS",                   "MAXIFS",                   NOID,   NOID,   3,  MX, R, { VO, RO }, FUNCFLAG_MACROCALL_NEW }
 };
 
 
diff --git a/sc/source/ui/src/scfuncs.src b/sc/source/ui/src/scfuncs.src
index 04c9388..4ce4a75 100644
--- a/sc/source/ui/src/scfuncs.src
+++ b/sc/source/ui/src/scfuncs.src
@@ -11663,6 +11663,84 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS2
             Text [ en-US ] = "Value to return when corresponding value argument matches expression." ;
         };
     };
+    Resource SC_OPCODE_MINIFS_MS
+    {
+        String 1 // Description
+        {
+            Text [ en-US ] = "Returns the minimum value in a range that meet multiple criteria in multiple ranges." ;
+        };
+        ExtraData =
+        {
+            0;
+            ID_FUNCTION_GRP_STATISTIC;
+            HID_FUNC_MINIFS_MS;
+            PAIRED_VAR_ARGS + 1;  0; 0; 0;
+            0;
+        };
+        String 2 // Name of Parameter 1
+        {
+            Text [ en-US ] = "min_range" ;
+        };
+        String 3 // Description of Parameter 1
+        {
+            Text [ en-US ] = "The range from which the minimum will be determined." ;
+        };
+        String 4 // Name of Parameter 2
+        {
+            Text [ en-US ] = "range" ;
+        };
+        String 5 // Description of Parameter 2
+        {
+            Text [ en-US ] = "The range from which the minimum value is to be taken." ;
+        };
+        String 6 // Name of Parameter 3
+        {
+            Text [ en-US ] = "criteria" ;
+        };
+        String 7 // Description of Parameter 3
+        {
+            Text [ en-US ] = "Criteria 1, criteria 2,... are the criteria to be applied to the ranges given." ;
+        };
+    };
+    Resource SC_OPCODE_MAXIFS_MS
+    {
+        String 1 // Description
+        {
+            Text [ en-US ] = "Returns the maximum value in a range that meet multiple criteria in multiple ranges." ;
+        };
+        ExtraData =
+        {
+            0;
+            ID_FUNCTION_GRP_STATISTIC;
+            HID_FUNC_MAXIFS_MS;
+            PAIRED_VAR_ARGS + 1;  0; 0; 0;
+            0;
+        };
+        String 2 // Name of Parameter 1
+        {
+            Text [ en-US ] = "max_range" ;
+        };
+        String 3 // Description of Parameter 1
+        {
+            Text [ en-US ] = "The range from which the maximum will be determined." ;
+        };
+        String 4 // Name of Parameter 2
+        {
+            Text [ en-US ] = "range" ;
+        };
+        String 5 // Description of Parameter 2
+        {
+            Text [ en-US ] = "The range from which the minimum value is to be taken." ;
+        };
+        String 6 // Name of Parameter 3
+        {
+            Text [ en-US ] = "criteria" ;
+        };
+        String 7 // Description of Parameter 3
+        {
+            Text [ en-US ] = "Criteria 1, criteria 2,... are the criteria to be applied to the ranges given." ;
+        };
+    };
      // -=*# Resource for function EXACT #*=-
     Resource SC_OPCODE_EXACT
     {


More information about the Libreoffice-commits mailing list