CRM系统中同时使用公历和回历的解决方案

在全球化的商业环境中,许多企业需要适应不同文化和宗教背景的客户。在这种情况下,CRM系统需要提供灵活性,允许用户输入他们熟悉的日期格式。例如,许多用户可能更熟悉回历(Hijri),而CRM系统通常使用公历(Gregorian)。为了满足这些需求,本文将介绍如何在Microsoft Dynamics CRM中实现同时使用公历和回历的解决方案。

遗憾的是,Microsoft Dynamics CRM并没有直接支持两种日历系统的功能。因此,需要采用一种变通方法来实现这一需求。本文将介绍一种纯JavaScript解决方案,它可以与所有版本的Dynamic CRM(从4.0到365)兼容,无论是云版本还是本地部署版本,以及任何Dynamic CRM表单,如主表单和快速添加表单。

在开始之前,需要对Microsoft Dynamics CRM表单自定义和JavaScript有一定的了解。请注意,这不是一个外观华丽的回历日历小部件,它只是一个文本框。脚本根据给定的公历日期计算大致的回历日期。这种计算基于算术计算以匹配日期,基于月球周期,其中月球月份的长度定义为29天或30天。每两到三年,在年末增加一天,以跟上月亮的相位。这个公式与"Umm Al-Qura"回历日历相匹配。

使用代码

让通过一个场景来允许CRM用户以他们喜欢的公历或回历日期输入客户的出生日期,然后相应地更新两个日期。

创建一个新的非托管解决方案,选择"设置",然后"解决方案"。将"客户"实体添加到解决方案中:将客户表单添加到解决方案并打开它。为客户的出生日期创建一个新的公历日期字段,类型为"仅日期"。为客户的出生日期创建一个新的回历日期字段,类型为"单行文本"。将新字段添加到客户表单下的"客户名称"。下载附加的JavaScript文件,并将其作为JavaScript Web资源添加到表单属性库中。为公历出生日期字段添加一个onchange事件处理程序。并将两个参数传递给JavaScript函数。第一个参数是公历日期字段的名称,第二个参数是相关的回历日期字段。

function onGregorianDateFieldChange(gregorianDateFieldName, HijriDateFieldName) { if (Xrm.Page.getAttribute(gregorianDateFieldName).getValue() != null) { var dateGregValue = Xrm.Page.getAttribute(gregorianDateFieldName).getValue(); var year = dateGregValue.getFullYear(); var month = dateGregValue.getMonth(); var day = dateGregValue.getDate(); Xrm.Page.getAttribute(HijriDateFieldName).setValue(convertToHijri(day, month, year)); } }

为回历出生日期字段添加一个onchange事件处理程序。并将两个参数传递给JavaScript函数。第一个参数是回历日期字段的名称,第二个参数是相关的公历日期字段。

function onHijriDateFieldChange(HijriDateFieldName, gregorianDateFieldName) { if (Xrm.Page.getAttribute(HijriDateFieldName).getValue() != null) { if (isValidHijriDate(Xrm.Page.getAttribute(HijriDateFieldName).getValue())) { var dateHijriValue = Xrm.Page.getAttribute(HijriDateFieldName).getValue(); var parts = dateHijriValue.split("/"); var day = parseInt(parts[0], 10); var month = parseInt(parts[1], 10); var year = parseInt(parts[2], 10); var strGregDate = convertToGreg(day, month, year); var gregDate = new Date(strGregDate); Xrm.Page.getAttribute(gregorianDateFieldName).setValue(gregDate); } } }

保存并发布。由于将回历字段定义为文本,因为没有将其定义为日期的方法,已经应用了多个检查,以确保用户输入正确的日期格式和有效数字,如下所示:

function isValidHijriDate(dateString) { var parts = dateString.split("/"); if (parts.length != 3) { OpenAlert("OK", "Enter date in dd/MM/yyyy format ONLY", "Date Format Notification"); return false; } var day = parts[0]; var month = parts[1]; var year = parts[2]; if (!isPositiveInteger(day) || day <= 0 || day > 30) { OpenAlert("OK", "Hijri Days should be between 1 and 30", "Date Format Notification"); return false; } if (!isPositiveInteger(month) || month <= 0 || month > 12) { OpenAlert("OK", "Hijri months should be between 1 and 12", "Date Format Notification"); return false; } if (!isPositiveInteger(year) || year < 1000 || year > 3000) { OpenAlert("OK", "Allowed Hijri years between 1000 and 3000"); return false; } return true; }

感兴趣的要点

正如在上面的场景中看到的,没有必要触摸或更新JavaScript Web资源,因为如果将字段的名称作为参数传递,它将像即插即用一样工作。此外,如果存在多个日期字段,不需要创建新的JavaScript函数。可以使用此代码与任何HTML页面;只需要将日期字段作为参数传递。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485