////////// // // Function: WEEK() // Returns a number representing the week of the year from a Date or DateTime expression. // ////// // Version 0.58 // Last update: // May.01.2015 ////// // Change log: // May.01.2015 - Initial creation by Stefano D'Amico ////// // Parameters: // p1 -- Date or DateTime // p2 -- Numeric [nMinDaysOfWeek] Minimum number of days in first week of year (1..7) // p3 -- Numeric [nFirstDayOfWeek] // ////// // Returns: // WEEK() returns a number representing the week of the year. ////// // Example: // dt = datetime() && May.01.2015 // ? WEEK(dt) && Displays 18 ////// void function_week(SReturnsParams* rpar) { SVariable* varParam = rpar->ip[0]; SVariable* varFirstWeek = rpar->ip[1]; SVariable* varFirstDayOfWeek = rpar->ip[2]; u32 lnYear, lnMonth, lnDay; s32 lnWeek, lnMinDaysInWeek, lnFirstDayOfWeek; SYSTEMTIME lst; bool error; u32 errorNum; SVariable* result; ////////// // If provided, parameter 1 must be date or datetime ////// rpar->rp[0] = NULL; if (varParam) { if (!iVariable_isValid(varParam) || !(iVariable_isTypeDate(varParam) || iVariable_isTypeDatetime(varParam) || iVariable_isTypeDatetimeX(varParam))) { iError_report_byNumber(_ERROR_INVALID_ARGUMENT_TYPE_COUNT, iVariable_get_relatedComp(varParam), false); return; } ////////// // Grab year, month, day from datetime or date ////// if (iVariable_isTypeDatetime(varParam)) iiDateMath_get_YyyyMmDd_from_julian (varParam->value.data_dt->julian, &lnYear, &lnMonth, &lnDay); else if (iVariable_isTypeDatetimeX(varParam)) iiDateMath_get_YyyyMmDdHhMmSsMssNss_from_jseconds (varParam->value.data_dtx->jseconds, NULL, &lnYear, &lnMonth, &lnDay, NULL, NULL, NULL, NULL, NULL); else /* date */ iiDateMath_get_YyyyMmDd_from_YYYYMMDD (varParam->value.data_u8, &lnYear, &lnMonth, &lnDay); } else { // Use the current date if (_settings) iTime_getLocalOrSystem(&lst, propGet_settings_TimeLocal(_settings)); else GetLocalTime(&lst); lnYear = lst.wYear; lnMonth = lst.wMonth; lnDay = lst.wDay; } ////////// // Parameter 2 must be numeric ////// if (varFirstWeek) { if (!iVariable_isValid(varFirstWeek) || !iVariable_isTypeNumeric(varFirstWeek)) { iError_report_byNumber(_ERROR_P2_IS_INCORRECT, iVariable_get_relatedComp(varFirstWeek), false); return; } // Grab the minimum number of days in week lnMinDaysInWeek = iiVariable_getAs_s32(varFirstWeek, false, &error, &errorNum); if (error) { // An error extracting the value (should never happen) iError_report_byNumber(errorNum, iVariable_get_relatedComp(varFirstWeek), false); return; } if (lnMinDaysInWeek < 1 || 7 < lnMinDaysInWeek) { iError_report_byNumber(_ERROR_OUT_OF_RANGE, iVariable_get_relatedComp(varFirstWeek), false); return; } } else { // First week contains January 1st. lnMinDaysInWeek = 1; } ////////// // Parameter 3 must be numeric ////// if (varFirstDayOfWeek) { if (!iVariable_isValid(varFirstDayOfWeek) || !iVariable_isTypeNumeric(varFirstDayOfWeek)) { iError_report_byNumber(_ERROR_P3_IS_INCORRECT, iVariable_get_relatedComp(varFirstDayOfWeek), false); return; } // Grab the first day of week lnFirstDayOfWeek = iiVariable_getAs_s32(varFirstDayOfWeek, false, &error, &errorNum); if (error) { // An error extracting the value (should never happen) iError_report_byNumber(errorNum, iVariable_get_relatedComp(varFirstDayOfWeek), false); return; } if (lnFirstDayOfWeek < 0 || 6 < lnFirstDayOfWeek) { iError_report_byNumber(_ERROR_OUT_OF_RANGE, iVariable_get_relatedComp(varFirstWeek), false); return; } } else { // Sunday lnFirstDayOfWeek = 0; } ///////// // Grab week ////// lnWeek = ifunction_week_common(rpar, lnYear, lnMonth, lnDay, lnMinDaysInWeek, lnFirstDayOfWeek); ////////// // Create and populate our output variable ////// result = iVariable_createAndPopulate_byText(_VAR_TYPE_S32, (cs8*)&lnWeek, 4, false); if (!result) iError_report_byNumber(_ERROR_INTERNAL_ERROR, iVariable_get_relatedComp(varParam), false); ////////// // Indicate our result ////// rpar->rp[0] = result; }
void ifunction_hhmmss_common(SReturnsParams* rpar, SVariable* varParam, u32 tnFunctionType) { s32 lnMillisecond, lnMicrosecond; u32 lnResult, lnHour, lnMinute, lnSecond; SYSTEMTIME lst; SVariable* result; ////////// // If Parameter 1 is provided, it must be datetime or datetimex ////// rpar->rp[0] = NULL; if (varParam) { if (!iVariable_isValid(varParam)) { iError_report_byNumber(_ERROR_INVALID_ARGUMENT_TYPE_COUNT, iVariable_get_relatedComp(varParam), false); return; } else if (!iVariable_isTypeDatetime(varParam)) { // Grab hour, minute, second, millisecond from datetime iiDateMath_get_HhMmSsMss_from_seconds(varParam->value.data_dt->seconds, &lnHour, &lnMinute, &lnSecond, &lnMillisecond); lnMicrosecond = lnMillisecond * 1000; } else if (!iVariable_isTypeDatetimeX(varParam)) { // Grab hour, minute, second, millisecond from datetime iiDateMath_get_julian_and_YyyyMmDdHhMmSsMssNss_from_jseconds(varParam->value.data_dtx->jseconds, NULL, NULL, NULL, NULL, NULL, &lnHour, &lnMinute, &lnSecond, &lnMillisecond, &lnMicrosecond); } else { iError_report_byNumber(_ERROR_INVALID_ARGUMENT_TYPE_COUNT, iVariable_get_relatedComp(varParam), false); return; } } else { // Use the current datetimex if (_settings) iTime_getLocalOrSystem(&lst, propGet_settings_TimeLocal(_settings)); else GetLocalTime(&lst); lnHour = lst.wHour; lnMinute = lst.wMinute; lnSecond = lst.wSecond; lnMillisecond = lst.wMilliseconds; lnMicrosecond = iiDateMath_get_currentMicrosecond(); } ////////// // Create output variable ////// switch (tnFunctionType) { case _HMS_COMMON_HOUR: lnResult = lnHour; break; case _HMS_COMMON_MINUTE: lnResult = lnMinute; break; case _HMS_COMMON_SECOND: lnResult = lnSecond; break; case _HMS_COMMON_MILLISECOND: lnResult = lnMillisecond; break; case _HMS_COMMON_MICROSECOND: lnResult = lnMicrosecond; break; // Should never happen default: iError_report_byNumber(_ERROR_INTERNAL_ERROR, iVariable_get_relatedComp(varParam), false); return; } ////////// // Create the value ////// result = iVariable_createAndPopulate_byText(_VAR_TYPE_U32, (cs8*)&lnResult, sizeof(lnResult), false); if (!result) iError_report_byNumber(_ERROR_INTERNAL_ERROR, iVariable_get_relatedComp(varParam), false); ////////// // Return the result ////// rpar->rp[0] = result; }