二开案例.表达式函数.日期部分函数

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开案例.表达式函数.日期部分函数

【应用场景】表达式中如果获取日期的某个部分,比如年、月、日,周?

【演示案例】给采购订单添加保存校验器,当采购订单上的采购日期和核算日期不在同一周时,禁止保存单据。

【实现步骤】

<1>编写函数,代码如下。

using Kingdee.BOS;

using Kingdee.BOS.Core.Metadata.Expression.FuncDefine;

using System;

using System.Globalization;


namespace Jac.XkDemo.BOS.Core.Functions

{

    /// <summary>

    /// 【函数】日期部分函数

    /// 用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。

    /// </summary>

    [Serializable]

    public class DatePartFuncDefine : AbstractFuncDefine

    {

        public DatePartFuncDefine()

        {

        }


        public DatePartFuncDefine(Context ctx, dynamic obj)

        {

            m_ctx = ctx;

            m_obj = obj;

        }


        public override IFuncDefine GetFunctionDefine(Context ctx, dynamic obj)

        {

            return new DatePartFuncDefine(ctx, obj);

        }


        public override object GetFuncDefine()

        {

            return new Func<string, object, int>(GetDatePart);

        }


        /// <summary>

        /// 日期部分函数,用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。

        /// </summary>

        /// <param name="format">格式</param>

        /// <param name="dtObj">日期</param>

        /// <returns></returns>

        int GetDatePart(string format, object dtObj)

        {

            #region 传入参数校验


            DateTime dt;

            if (dtObj is DateTime)

            {

                dt = (DateTime)dtObj;

            }

            else if (dtObj is string)

            {

                dt = Convert.ToDateTime(dtObj);

            }

            else

            {

                return -1;

            }


            if (string.IsNullOrWhiteSpace(format))

            {

                return -1;

            }


            #endregion


            #region 计算日期部分


            switch (format)

            {

                case "year":

                case "yyyy":

                case "yy": // 年

                    return dt.Year;

                case "qq":

                case "q": // 季度

                    return (dt.Month - 1) / 3 + 1;

                case "month":

                case "mm":

                case "m": // 月

                    return dt.Month;

                case "day":

                case "dd":

                case "d": // 日

                    return dt.Day;

                case "hour":

                case "hh":

                case "h": // 时

                    return dt.Hour;

                case "minute":

                case "mi":

                case "n": // 分

                    return dt.Minute;

                case "second":

                case "ss":

                case "s": // 秒

                    return dt.Second;

                case "millisecond": // 毫秒

                case "ms": // 毫秒

                    return dt.Millisecond;

                case "week":

                case "dw":

                case "w": // 星期

                    return (int)dt.DayOfWeek; // 0周日1周一6周六

                case "dy":

                case "y": // 年中的日

                    return dt.DayOfYear;

                case "wk":

                case "ww": // 年中的周

                    return GetWeekOfYear(dt);

            }


            return -1;


            #endregion

        }


        /// <summary>

        /// 获取一年中包括指定 System.DateTime 对象中的日期的那个星期。

        /// </summary>

        /// <param name="dt"></param>

        /// <returns></returns>

        int GetWeekOfYear(DateTime dt)

        {

            var gc = new GregorianCalendar();

            var week = gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday);

            return week;

        }


    }

}


/*

年 yy, yyyy

季度 qq, q

月 mm, m

年中的日 dy, y

日 dd, d

周 wk, ww

星期 dw, w

小时 hh

分钟 mi, n

秒 ss, s

毫秒 ms

微秒 mcs

纳秒 ns

*/


/*

public enum DayOfWeek

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday,

}

*/


<2>注册函数(可参考:https://vip.kingdee.com/article/74091717745675520)。

-- 注册日期部分函数 

DELETE T_MDL_ELEMENTTYPE WHERE FID=888005;

INSERT INTO T_MDL_ELEMENTTYPE (FID,FIMGKEY,FTYPEID,FISVISIBLE,FELEMENTCLASS,FAPPEARANCECLASS)

VALUES (888005, '', 1, 0, 'Jac.XkDemo.BOS.Core.Functions.DatePartFuncDefine,Jac.XkDemo.BOS.Core', 'BOS_DATEPART');


DELETE T_MDL_DOMAINMODELELEMENTMAP WHERE FID=1200 and FELEMENTGROUPID=24 and FELEMENTTYPEID=888005;

INSERT INTO T_MDL_DOMAINMODELELEMENTMAP (FID, FENTRYID, FELEMENTTYPEID, FELEMENTGROUPID, FSEQ)

VALUES (1200, 888005, 888005, 24, 81);

 

DELETE T_MDL_ELEMENTTYPE_L WHERE FID=888005 AND FLOCALEID=2052;

INSERT INTO T_MDL_ELEMENTTYPE_L(FID,FNAME,FDESCRIPTION,FLOCALEID,FPKID) 

VALUES (888005,N'日期部分',N'返回日期/时间的单独部分,比如年、月、日、小时、分钟等。

使用示例:

获取日期的年:DATEPART(year,FDate);

获取日期所在年中的周:DATEPART(wk,FDate);

',2052,(SELECT ISNULL(MAX(FPKID), 0) + 1 FROM T_MDL_ELEMENTTYPE_L WHERE FPKID > 100000)); 


<3>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。


<4>BOSIDE扩展采购订单,新增日期字段【核算日期】,保存操作新增校验规则如下图所示。

表达式:DATEPART('wk', FDate ) <> DATEPART('wk',  F_Jac_Date)


<5>保存元数据,开发完毕。

现在可以登录业务站点,执行采购订单的保存操作,检验一下新增的表达式函数的运行效果啦。

















【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696

二开案例.表达式函数.日期部分函数

【应用场景】表达式中如果获取日期的某个部分,比如年、月、日,周?【演示案例】给采购订单添加保存校验器,当采购订单上的采购日期和核算...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息