summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWinfried Donkers <winfrieddonkers@libreoffice.org>2014-05-12 12:02:11 +0200
committerEike Rathke <erack@redhat.com>2015-05-05 19:15:15 +0000
commit111952dccc1bf9e28e61c0233816248c848cbf53 (patch)
tree5b5a65e36d00abc292e7ec7d5dc38f72cf3023a2
parentc4dacea24f8ca83e6c178e2846aeb40b3a100dcb (diff)
fdo#77985 make calc function NETWORKDAYS comply with ODFF1.2
Change-Id: I523b0c71bc0fed501a4d5fffd75c5a4704f6dd13 Reviewed-on: https://gerrit.libreoffice.org/9827 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com>
-rw-r--r--formula/source/core/resource/core_resource.src7
-rw-r--r--include/formula/compiler.hrc3
-rw-r--r--include/formula/opcode.hxx1
-rw-r--r--sc/inc/helpids.h1
-rw-r--r--sc/qa/unit/ucalc.cxx1
-rw-r--r--sc/source/core/inc/interpre.hxx6
-rw-r--r--sc/source/core/tool/interpr2.cxx77
-rw-r--r--sc/source/core/tool/interpr4.cxx3
-rw-r--r--sc/source/core/tool/odffmap.cxx2
-rw-r--r--sc/source/core/tool/parclass.cxx1
-rw-r--r--sc/source/filter/excel/xlformula.cxx7
-rw-r--r--sc/source/filter/oox/formulabase.cxx2
-rw-r--r--sc/source/ui/src/scfuncs.src48
-rw-r--r--scaddins/source/analysis/analysishelper.cxx2
14 files changed, 136 insertions, 25 deletions
diff --git a/formula/source/core/resource/core_resource.src b/formula/source/core/resource/core_resource.src
index 4462ee9b2b91..298560c81623 100644
--- a/formula/source/core/resource/core_resource.src
+++ b/formula/source/core/resource/core_resource.src
@@ -390,6 +390,7 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH_ODFF
String SC_OPCODE_WEEK { Text = "ISOWEEKNUM" ; };
String SC_OPCODE_EASTERSUNDAY { Text = "ORG.OPENOFFICE.EASTERSUNDAY" ; };
String SC_OPCODE_GET_DAY_OF_WEEK { Text = "WEEKDAY" ; };
+ String SC_OPCODE_NETWORKDAYS { Text = "NETWORKDAYS" ; };
String SC_OPCODE_NETWORKDAYS_MS { Text = "COM.MICROSOFT.NETWORKDAYS.INTL" ; };
String SC_OPCODE_WORKDAY_MS { Text = "COM.MICROSOFT.WORKDAY.INTL" ; };
String SC_OPCODE_NO_NAME { Text = "#NAME!" ; };
@@ -808,6 +809,7 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH_OOXML
String SC_OPCODE_WEEK { Text = "WEEKNUM" ; };
String SC_OPCODE_EASTERSUNDAY { Text = "EASTERSUNDAY" ; };
String SC_OPCODE_GET_DAY_OF_WEEK { Text = "WEEKDAY" ; };
+ String SC_OPCODE_NETWORKDAYS { Text = "NETWORKDAYS" ; };
String SC_OPCODE_NETWORKDAYS_MS { Text = "NETWORKDAYS.INTL" ; };
String SC_OPCODE_WORKDAY_MS { Text = "WORKDAY.INTL" ; };
String SC_OPCODE_NO_NAME { Text = "#NAME!" ; };
@@ -1228,6 +1230,7 @@ Resource RID_STRLIST_FUNCTION_NAMES_ENGLISH
String SC_OPCODE_WEEK { Text = "WEEKNUM" ; };
String SC_OPCODE_EASTERSUNDAY { Text = "EASTERSUNDAY" ; };
String SC_OPCODE_GET_DAY_OF_WEEK { Text = "WEEKDAY" ; };
+ String SC_OPCODE_NETWORKDAYS { Text = "NETWORKDAYS" ; };
String SC_OPCODE_NETWORKDAYS_MS { Text = "NETWORKDAYS.INTL" ; };
String SC_OPCODE_WORKDAY_MS { Text = "WORKDAY.INTL" ; };
String SC_OPCODE_NO_NAME { Text = "#NAME!" ; };
@@ -2689,6 +2692,10 @@ Resource RID_STRLIST_FUNCTION_NAMES
{
Text [ en-US ] = "WEEKDAY" ;
};
+ String SC_OPCODE_NETWORKDAYS
+ {
+ Text [ en-US ] = "NETWORKDAYS" ;
+ };
String SC_OPCODE_NETWORKDAYS_MS
{
Text [ en-US ] = "NETWORKDAYS.INTL" ;
diff --git a/include/formula/compiler.hrc b/include/formula/compiler.hrc
index f5bd316ba999..4798c190c57c 100644
--- a/include/formula/compiler.hrc
+++ b/include/formula/compiler.hrc
@@ -481,7 +481,8 @@
#define SC_OPCODE_COLOR 471
#define SC_OPCODE_CEIL 472
#define SC_OPCODE_CEIL_PRECISE 473
-#define SC_OPCODE_STOP_2_PAR 474 /* last function with two or more parameters' OpCode + 1 */
+#define SC_OPCODE_NETWORKDAYS 474
+#define SC_OPCODE_STOP_2_PAR 475 /* 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 73b911aedd2f..9d4d67611f79 100644
--- a/include/formula/opcode.hxx
+++ b/include/formula/opcode.hxx
@@ -448,6 +448,7 @@ enum OpCode : sal_uInt16
// miscellaneous
ocWeek = SC_OPCODE_WEEK,
ocGetDayOfWeek = SC_OPCODE_GET_DAY_OF_WEEK,
+ ocNetWorkdays = SC_OPCODE_NETWORKDAYS,
ocNetWorkdays_MS = SC_OPCODE_NETWORKDAYS_MS,
ocWorkday_MS = SC_OPCODE_WORKDAY_MS,
ocNoName = SC_OPCODE_NO_NAME,
diff --git a/sc/inc/helpids.h b/sc/inc/helpids.h
index 0425fe597b71..367bb0d33800 100644
--- a/sc/inc/helpids.h
+++ b/sc/inc/helpids.h
@@ -621,6 +621,7 @@
#define HID_FUNC_CEIL_PRECISE "SC_HID_FUNC_CEIL_PRECISE"
#define HID_FUNC_CEIL_ISO "SC_HID_FUNC_CEIL_ISO"
#define HID_FUNC_FLOOR_MS "SC_HID_FUNC_FLOOR_MS"
+#define HID_FUNC_NETWORKDAYS "SC_HID_FUNC_NETWORKDAYS"
#define HID_FUNC_NETWORKDAYS_MS "SC_HID_FUNC_NETWORKDAYS_MS"
#define HID_FUNC_WORKDAY_MS "SC_HID_FUNC_WORKDAY_MS"
#define HID_FUNC_ERF_MS "SC_HID_FUNC_ERF_MS"
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 83431ee1d18e..c5d7a982e917 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -2354,6 +2354,7 @@ void Test::testFunctionLists()
"MINUTE",
"MONTH",
"MONTHS",
+ "NETWORKDAYS",
"NETWORKDAYS.INTL",
"NOW",
"SECOND",
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index ee5d9410420e..d3eab0119fc1 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -612,9 +612,11 @@ void ScGetDayOfWeek();
void ScGetWeekOfYear();
void ScEasterSunday();
sal_uInt16 GetWeekendAndHolidayMasks( const sal_uInt8 nParamCount, const sal_uInt32 nNullDate,
- ::std::vector<double>& rSortArray, OUString& rWeekendDays, bool bWeekendMask[ 7 ] );
+ ::std::vector<double>& rSortArray, bool bWeekendMask[ 7 ] );
+sal_uInt16 GetWeekendAndHolidayMasks_MS( const sal_uInt8 nParamCount, const sal_uInt32 nNullDate,
+ ::std::vector<double>& rSortArray, bool bWeekendMask[ 7 ] );
static inline sal_Int16 GetDayOfWeek( sal_Int32 n );
-void ScNetWorkdays_MS();
+void ScNetWorkdays( bool bOOXML_Version );
void ScWorkday_MS();
void ScGetHour();
void ScGetMin();
diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index 4b2420d4bda7..dc85efdf0be5 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -249,9 +249,49 @@ void ScInterpreter::ScEasterSunday()
sal_uInt16 ScInterpreter::GetWeekendAndHolidayMasks(
const sal_uInt8 nParamCount, const sal_uInt32 nNullDate, vector< double >& rSortArray,
- OUString& rWeekendDays, bool bWeekendMask[ 7 ] )
+ bool bWeekendMask[ 7 ] )
+{
+ if ( nParamCount == 4 )
+ {
+ vector< double > nWeekendDays;
+ GetNumberSequenceArray( 1, nWeekendDays, false );
+ if ( nGlobalError )
+ return nGlobalError;
+ else
+ {
+ if ( nWeekendDays.size() != 7 )
+ return errIllegalArgument;
+
+ for ( int i = 0; i < 7; i++ )
+ bWeekendMask[ i ] = ( bool ) nWeekendDays[ i ];
+ }
+ }
+ else
+ {
+ for ( int i = 0; i < 7; i++ )
+ bWeekendMask[ i] = false;
+
+ bWeekendMask[ SATURDAY ] = true;
+ bWeekendMask[ SUNDAY ] = true;
+ }
+
+ if ( nParamCount >= 3 )
+ {
+ GetSortArray( 1, rSortArray, NULL, false );
+ size_t nMax = rSortArray.size();
+ for ( size_t i = 0; i < nMax; i++ )
+ rSortArray.at( i ) = ::rtl::math::approxFloor( rSortArray.at( i ) ) + nNullDate;
+ }
+
+ return nGlobalError;
+}
+
+sal_uInt16 ScInterpreter::GetWeekendAndHolidayMasks_MS(
+ const sal_uInt8 nParamCount, const sal_uInt32 nNullDate, vector< double >& rSortArray,
+ bool bWeekendMask[ 7 ] )
{
sal_uInt16 nErr = 0;
+ OUString aWeekendDays;
if ( nParamCount == 4 )
{
GetSortArray( 1, rSortArray, NULL, true );
@@ -261,23 +301,23 @@ sal_uInt16 ScInterpreter::GetWeekendAndHolidayMasks(
}
if ( nParamCount >= 3 )
- rWeekendDays = GetString().getString();
+ aWeekendDays = GetString().getString();
for ( int i = 0; i < 7; i++ )
bWeekendMask[ i] = false;
- if ( rWeekendDays.isEmpty() )
+ if ( aWeekendDays.isEmpty() )
{
bWeekendMask[ SATURDAY ] = true;
bWeekendMask[ SUNDAY ] = true;
}
else
{
- switch ( rWeekendDays.getLength() )
+ switch ( aWeekendDays.getLength() )
{
case 1 :
// Weekend days defined by code
- switch ( rWeekendDays[ 0 ] )
+ switch ( aWeekendDays[ 0 ] )
{
case '1' : bWeekendMask[ SATURDAY ] = true; bWeekendMask[ SUNDAY ] = true; break;
case '2' : bWeekendMask[ SUNDAY ] = true; bWeekendMask[ MONDAY ] = true; break;
@@ -291,9 +331,9 @@ sal_uInt16 ScInterpreter::GetWeekendAndHolidayMasks(
break;
case 2 :
// Weekend day defined by code
- if ( rWeekendDays[ 0 ] == '1' )
+ if ( aWeekendDays[ 0 ] == '1' )
{
- switch ( rWeekendDays[ 1 ] )
+ switch ( aWeekendDays[ 1 ] )
{
case '1' : bWeekendMask[ SUNDAY ] = true; break;
case '2' : bWeekendMask[ MONDAY ] = true; break;
@@ -312,7 +352,7 @@ sal_uInt16 ScInterpreter::GetWeekendAndHolidayMasks(
// Weekend days defined by string
for ( int i = 0; i < 7 && !nErr; i++ )
{
- switch ( rWeekendDays[ i ] )
+ switch ( aWeekendDays[ i ] )
{
case '0' : bWeekendMask[ i ] = false; break;
case '1' : bWeekendMask[ i ] = true; break;
@@ -328,18 +368,26 @@ sal_uInt16 ScInterpreter::GetWeekendAndHolidayMasks(
return nErr;
}
-void ScInterpreter::ScNetWorkdays_MS()
+void ScInterpreter::ScNetWorkdays( bool bOOXML_Version )
{
sal_uInt8 nParamCount = GetByte();
if ( MustHaveParamCount( nParamCount, 2, 4 ) )
{
vector<double> nSortArray;
bool bWeekendMask[ 7 ];
- OUString aWeekendDays;
Date aNullDate = *( pFormatter->GetNullDate() );
sal_uInt32 nNullDate = Date::DateToDays( aNullDate.GetDay(), aNullDate.GetMonth(), aNullDate.GetYear() );
- sal_uInt16 nErr = GetWeekendAndHolidayMasks( nParamCount, nNullDate,
- nSortArray , aWeekendDays, bWeekendMask );
+ sal_uInt16 nErr;
+ if ( bOOXML_Version )
+ {
+ nErr = GetWeekendAndHolidayMasks_MS( nParamCount, nNullDate,
+ nSortArray, bWeekendMask );
+ }
+ else
+ {
+ nErr = GetWeekendAndHolidayMasks( nParamCount, nNullDate,
+ nSortArray, bWeekendMask );
+ }
if ( nErr )
PushError( nErr );
else
@@ -381,11 +429,10 @@ void ScInterpreter::ScWorkday_MS()
nFuncFmtType = css::util::NumberFormat::DATE;
vector<double> nSortArray;
bool bWeekendMask[ 7 ];
- OUString aWeekendDays;
Date aNullDate = *( pFormatter->GetNullDate() );
sal_uInt32 nNullDate = Date::DateToDays( aNullDate.GetDay(), aNullDate.GetMonth(), aNullDate.GetYear() );
- sal_uInt16 nErr = GetWeekendAndHolidayMasks( nParamCount, nNullDate,
- nSortArray , aWeekendDays, bWeekendMask );
+ sal_uInt16 nErr = GetWeekendAndHolidayMasks_MS( nParamCount, nNullDate,
+ nSortArray, bWeekendMask );
if ( nErr )
PushError( nErr );
else
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index fb1dc3996834..f3ee9ea35fb3 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -3941,7 +3941,8 @@ StackVar ScInterpreter::Interpret()
case ocGetDayOfWeek : ScGetDayOfWeek(); break;
case ocWeek : ScGetWeekOfYear(); break;
case ocEasterSunday : ScEasterSunday(); break;
- case ocNetWorkdays_MS : ScNetWorkdays_MS(); break;
+ case ocNetWorkdays : ScNetWorkdays( false); break;
+ case ocNetWorkdays_MS : ScNetWorkdays( true ); break;
case ocWorkday_MS : ScWorkday_MS(); break;
case ocGetHour : ScGetHour(); break;
case ocGetMin : ScGetMin(); break;
diff --git a/sc/source/core/tool/odffmap.cxx b/sc/source/core/tool/odffmap.cxx
index fef82c3a5f59..494ab81c330d 100644
--- a/sc/source/core/tool/odffmap.cxx
+++ b/sc/source/core/tool/odffmap.cxx
@@ -36,7 +36,7 @@ ScCompiler::AddInMap ScCompiler::maAddInMap[] =
{ "EDATE", "EDATE", false, "com.sun.star.sheet.addin.Analysis.getEdate", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETEDATE" },
{ "WEEKNUM", "WEEKNUM_ADD", false, "com.sun.star.sheet.addin.Analysis.getWeeknum", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETWEEKNUM" },
{ "EOMONTH", "EOMONTH", false, "com.sun.star.sheet.addin.Analysis.getEomonth", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETEOMONTH" },
- { "NETWORKDAYS", "NETWORKDAYS", false, "com.sun.star.sheet.addin.Analysis.getNetworkdays", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETNETWORKDAYS" },
+ { "NETWORKDAYS", "NETWORKDAYS_XCL", true, "com.sun.star.sheet.addin.Analysis.getNetworkdays", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETNETWORKDAYS" },
{ "ISEVEN", "ISEVEN_ADD", true, "com.sun.star.sheet.addin.Analysis.getIseven", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETISEVEN" },
{ "ISODD", "ISODD_ADD", true, "com.sun.star.sheet.addin.Analysis.getIsodd", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETISODD" },
{ "MULTINOMIAL", "MULTINOMIAL", false, "com.sun.star.sheet.addin.Analysis.getMultinomial", "COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETMULTINOMIAL" },
diff --git a/sc/source/core/tool/parclass.cxx b/sc/source/core/tool/parclass.cxx
index a0d99dd9549e..8afc2b0c7c14 100644
--- a/sc/source/core/tool/parclass.cxx
+++ b/sc/source/core/tool/parclass.cxx
@@ -208,6 +208,7 @@ const ScParameterClassification::RawData ScParameterClassification::pRawData[] =
{ ocXor, {{ Reference }, 1 }},
{ ocZTest, {{ Reference, Value, Value }, 0 }},
{ ocZTest_MS, {{ Reference, Value, Value }, 0 }},
+ { ocNetWorkdays, {{ Value, Value, Reference, Reference }, 0 }},
{ ocNetWorkdays_MS, {{ Value, Value, Value, Reference }, 0 }},
{ ocWorkday_MS, {{ Value, Value, Value, Reference }, 0 }},
{ ocAggregate, {{ Value, Value, Reference }, 1 }},
diff --git a/sc/source/filter/excel/xlformula.cxx b/sc/source/filter/excel/xlformula.cxx
index c3ad1b140177..173b7b161ae4 100644
--- a/sc/source/filter/excel/xlformula.cxx
+++ b/sc/source/filter/excel/xlformula.cxx
@@ -336,7 +336,8 @@ static const XclFunctionInfo saFuncTable_4[] =
{ ocEffective, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getEffect" ) },
{ ocCumPrinc, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getCumprinc" ) },
{ ocCumIpmt, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getCumipmt" ) },
- { ocNominal, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getNominal" ) }
+ { ocNominal, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getNominal" ) },
+ { ocNetWorkdays, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getNetworkdays" ) }
};
/** Functions new in BIFF5/BIFF7. Unsupported functions: DATESTRING, NUMBERSTRING. */
@@ -398,8 +399,8 @@ static const XclFunctionInfo saFuncTable_Oox[] =
{ ocAverageIfs, 255, 4, MX, V, { RO_E, RO, RO, VR }, EXC_FUNCFLAG_EXPORTONLY|EXC_FUNCFLAG_PARAMPAIRS, EXC_FUNCNAME( "AVERAGEIFS" ) },
{ ocIfError, NOID, 2, 2, V, { VO, RO }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME( "IFERROR" ) },
{ ocIfError, 255, 3, 3, V, { RO_E, VO, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( "IFERROR" ) },
- { ocNetWorkdays_MS, NOID, 2, 4, V, { VR, VR, VR, RO }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME( "NETWORKDAYS.INTL" ) },
- { ocNetWorkdays_MS, 255, 3, 5, V, { RO_E, VR, VR, VR, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( "NETWORKDAYS.INTL" ) },
+ { ocNetWorkdays_MS, NOID, 2, 4, V, { VR, VR, RO, RO }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME( "NETWORKDAYS.INTL" ) },
+ { ocNetWorkdays_MS, 255, 3, 5, V, { RO_E, VR, VR, RO, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( "NETWORKDAYS.INTL" ) },
{ ocWorkday_MS, NOID, 2, 4, V, { VR, VR, VR, RO }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME( "WORKDAY.INTL" ) },
{ ocWorkday_MS, 255, 3, 5, V, { RO_E, VR, VR, VR, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( "WORKDAY.INTL" ) },
EXC_FUNCENTRY_V_VR( ocCeil_ISO, 2, 2, 0, "ISO.CEILING" )
diff --git a/sc/source/filter/oox/formulabase.cxx b/sc/source/filter/oox/formulabase.cxx
index a590a3c29f05..4294786232a3 100644
--- a/sc/source/filter/oox/formulabase.cxx
+++ b/sc/source/filter/oox/formulabase.cxx
@@ -643,7 +643,7 @@ static const FunctionData saFuncTableBiff4[] =
{ "ACCRINT", "ACCRINT", 469, NOID, 6, 7, V, { RR }, FUNCFLAG_EXTERNAL },
{ "ACCRINTM", "ACCRINTM", 470, NOID, 4, 5, V, { RR }, FUNCFLAG_EXTERNAL },
{ "WORKDAY", "WORKDAY", 471, NOID, 2, 3, V, { RR, RR, RX, C }, FUNCFLAG_EXTERNAL },
- { "NETWORKDAYS", "NETWORKDAYS", 472, NOID, 2, 3, V, { RR, RR, RX, C }, FUNCFLAG_EXTERNAL },
+ { "NETWORKDAYS", "NETWORKDAYS", 472, NOID, 2, 3, V, { RR, RR, RX, C }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in
{ "GCD", "GCD", 473, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in
{ "MULTINOMIAL", "MULTINOMIAL", 474, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL },
{ "LCM", "LCM", 475, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in
diff --git a/sc/source/ui/src/scfuncs.src b/sc/source/ui/src/scfuncs.src
index abeba90be42a..de9894afc863 100644
--- a/sc/source/ui/src/scfuncs.src
+++ b/sc/source/ui/src/scfuncs.src
@@ -686,6 +686,54 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS1
Text [ en-US ] = "Method used to form differences: Type = 0 denotes US method (NASD), Type = 1 denotes the European method." ;
};
};
+ // -=*# Resource for function NETWORKDAYS #*=-
+ Resource SC_OPCODE_NETWORKDAYS
+ {
+ String 1 // Description
+ {
+ Text [ en-US ] = "Returns the number of workdays between two dates using arguments to indicate weekenddays and holidays." ;
+ };
+ ExtraData =
+ {
+ 0;
+ ID_FUNCTION_GRP_DATETIME;
+ U2S( HID_FUNC_NETWORKDAYS );
+ 4; 0; 0; 1; 1;
+ 0;
+ };
+ String 2 // Name of Parameter 1
+ {
+ Text [ en-US ] = "Start Date" ;
+ };
+ String 3 // Description of Parameter 1
+ {
+ Text [ en-US ] = "Start date for calculation." ;
+ };
+ String 4 // Name of Parameter 2
+ {
+ Text [ en-US ] = "End Date" ;
+ };
+ String 5 // Description of Parameter 2
+ {
+ Text [ en-US ] = "End date for calculation." ;
+ };
+ String 6 // Name of Parameter 3
+ {
+ Text [ en-US ] = "array" ;
+ };
+ String 7 // Description of Parameter 3
+ {
+ Text [ en-US ] = "Optional set of one or more dates to be considered as holiday." ;
+ };
+ String 8 // Name of Parameter 4
+ {
+ Text [ en-US ] = "list of numbers" ;
+ };
+ String 9 // Description of Parameter 4
+ {
+ Text [ en-US ] = "Optional list of numbers to indicate working (0) and weekend (non-zero) days. When omitted, weekend is Saturday and Sunday." ;
+ };
+ };
// -=*# Resource for function NETWORKDAYS.INTL #*=-
Resource SC_OPCODE_NETWORKDAYS_MS
{
diff --git a/scaddins/source/analysis/analysishelper.cxx b/scaddins/source/analysis/analysishelper.cxx
index 9c26c7ee8403..5f19fba45fb6 100644
--- a/scaddins/source/analysis/analysishelper.cxx
+++ b/scaddins/source/analysis/analysishelper.cxx
@@ -50,7 +50,7 @@ const FuncDataBase pFuncDatas[] =
FUNCDATA( Edate, UNIQUE, INTPAR, 2, FDCat_DateTime ),
FUNCDATA( Weeknum, DOUBLE, INTPAR, 2, FDCat_DateTime ),
FUNCDATA( Eomonth, UNIQUE, INTPAR, 2, FDCat_DateTime ),
- FUNCDATA( Networkdays, UNIQUE, INTPAR, 3, FDCat_DateTime ),
+ FUNCDATA( Networkdays, DOUBLE, INTPAR, 3, FDCat_DateTime ),
FUNCDATA( Iseven, DOUBLE, STDPAR, 1, FDCat_Inf ),
FUNCDATA( Isodd, DOUBLE, STDPAR, 1, FDCat_Inf ),
FUNCDATA( Multinomial, UNIQUE, STDPAR, 1, FDCat_Math ),