二开案例.表达式函数.日期部分函数
【应用场景】表达式中如果获取日期的某个部分,比如年、月、日,周?
【演示案例】给采购订单添加保存校验器,当采购订单上的采购日期和核算日期不在同一周时,禁止保存单据。
【实现步骤】
<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
二开案例.表达式函数.日期部分函数
本文2024-09-23 04:21:05发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164742.html
- 鼎捷EAI整合規範文件V3.1.07 (集團).pdf
- 鼎捷OpenAPI應用場景說明_基礎資料.pdf
- 鼎捷OpenAPI應用場景說明_財務管理.pdf
- 鼎捷T100 API設計器使用手冊T100 APIDesigner(V1.0).docx
- 鼎新e-GoB2雲端ERP B2 線上課程E6-2應付票據整批郵寄 領取.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A4使用者建立權限設定.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程C3會計開帳與會計傳票.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程E6-1應付票據.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A5-1進銷存參數設定(初階篇).pdf
- 鼎新e-GoB2雲端ERP B2 線上課程D2帳款開帳與票據開帳.pdf