在全球化的商业环境中,许多企业需要适应不同文化和宗教背景的客户。在这种情况下,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页面;只需要将日期字段作为参数传递。