设置
我正在向现场 CRM 2011 中的自定义实体添加约会。
- 我单击功能区上的“新活动”按钮,选择约会,然后确定。
- 在打开的新窗口中,我按 F12 打开 IE 调试器,然后选择脚本选项卡,在我的 onLoad 函数和 FormScript.js.aspx 文件的 crmForm_window_onload_handler 中设置断点,然后单击开始调试按钮.
- 然后我重新加载约会窗口。
问题
crmForm_window_onload_handler 中的断点命中,但是当我进入我的自定义 js Web 资源文件 (appointment.js) 的 onLoad 函数时,而不是进入我的约会.js 文件的 onLoad 函数,它进入了 onLoad我的文件的精确副本,只有它的名称是脚本块(0-99 的一些随机数),即script block(23)
. 为什么要创建这些脚本块?在保存中,我也在运行此代码:
Xrm.Page.getAttribute('new_issyncreqd').setValue(true);
Xrm.Page.getAttribute('new_issyncreqd').setSubmitMode("always");
但它实际上并没有保存,我猜它与脚本块有关......
更新
我确实弄清楚了为什么更新 IsSyncReqrdField 的代码不起作用。这适用于现场 CRM 2011 版本 V 5.0.9690.1992(汇总 6)。它显然对 Appointment 实体有一个错误,它首先保存实体,然后实际运行自定义 onSave 代码。这是它目前的样子:
function crmForm_onsave_handler(eventObj,eventArgs)
{
try
{
var eContext=Mscrm.FormUtility.constructExecutionObject(eventObj,0,eventArgs,null);
eContext = Mscrm.FormUtility.constructExecutionObject(eventObj,0,eventArgs,eContext)
Mscrm.Form_onsave();
eContext=Mscrm.FormUtility.constructExecutionObject(eventObj,1,eventArgs,eContext)
NEW.Appointment.onSave(eContext); // <-- My custom OnSave Handler
}
catch(e)
{
displayError('crmForm', 'onsave', e.description);
}
}
错误在于该Mscrm.Form_onsave();
行实际上是将记录保存到数据库中,因此当自定义事件处理程序运行时,它已经被保存,并且在自定义事件处理程序中进行的任何更新都不会更新记录。
这个bug的修复是bSaveInProgress = true;
在表单的onLoad中设置,然后bSaveInProgress = !isValid; event.returnValue = isValid; 在 onSave 中。将bSaveInProgress = true;
阻止Mscrm.Form_onsave();
实际保存记录,并且 event.returnValue 实际上会导致它被创建。它有效并且是一个黑客,但这是我想出解决这个错误的唯一方法......
问题依然存在
为什么要创建和执行脚本块而不是使用已经存在的文件?