CRM 2011 javascript错误-对象在明确定义时未定义
在我们的云托管CRM 2011中,我在opportunity表单上有3个字段CRM 2011 javascript错误-对象在明确定义时未定义,javascript,dynamics-crm-2011,Javascript,Dynamics Crm 2011,在我们的云托管CRM 2011中,我在opportunity表单上有3个字段 合同期限(查阅) 服务开始日期(日期和时间) 服务结束日期(日期和时间) 合同条款是对称为合同条款的自定义实体的查找。项目如下: 我想根据其他两个字段中的条目计算并填充Service Close Date字段。我的合同条款和服务开始日期的OnChange事件javascript代码如下: function UpdateAgreementCloseDate() { //debugger; if (
- 合同期限(查阅)
- 服务开始日期(日期和时间)
- 服务结束日期(日期和时间)
function UpdateAgreementCloseDate() {
//debugger;
if (Xrm.Page.getAttribute("po_contractterm").getValue() != null && Xrm.Page.getAttribute("po_agreementstartdate").getValue() != null)
{
//Get Months from agreement term
var ContractTermMonths = 0;
ContractTermMonths = Xrm.Page.getAttribute("po_contractterm").getValue()[0].keyValues.po_months.value;
//Get Start Date
var currentAgreementStartDate;
currentAgreementStartDate = Xrm.Page.getAttribute("po_agreementstartdate").getValue();
//Add contract term monthsto start date
var AgreementCloseDate = getExpirationDate(currentAgreementStartDate, parseFloat(ContractTermMonths));
Xrm.Page.data.entity.attributes.get("po_agreementclosedate").setValue(AgreementCloseDate);
Xrm.Page.data.entity.attributes.get("po_agreementclosedate").setSubmitMode("always"); // Save the Disabled Field
}
}
function getExpirationDate(tempdate, numberofmonths) {
var next_month = tempdate.getMonth() + numberofmonths;
var next_year = tempdate.getFullYear();
if (next_month > 11) {
if (numberofmonths > 11) {
var extrayears = parseInt(next_month / 12);
var remainingmonths = next_month % 12;
next_month = remainingmonths;
next_year = next_year + extrayears;
}
else {
next_month = 0;
next_year++;
}
}
tempdate.setMonth(next_month);
tempdate.setYear(next_year);
return tempdate;
}
当用户填充计算所需的两个值时,代码按预期运行。但是,如果其中一个字段(在本例中为合同条款)在创建新记录时具有javascript中指定的默认值,则当用户向服务开始日期提供值时,不会进行计算:
在我的函数中加入调试器可以让我调试javascript,我看到了问题所在。但是,我不明白为什么这是个问题
为什么当用户手动填充这两个字段时,而当其中一个字段自动填充时,这段代码会起作用?错误告诉我对象为null,但很明显,无论哪种情况,它都不是null。为什么当用户手动输入一个值时,而当javascript代码在forms OnLoad方法中预先填充该值时,这种方法不起作用
更新
引发上述异常的行的一部分是访问po_months属性-调试器告诉我该属性为null:
ContractTermMonths = Xrm.Page.getAttribute("po_contractterm").getValue()[0].keyValues.po_months
我认为错误很简单:要么
Xrm.Page.getAttribute(“po\u contracterm”).getValue()[0]。keyValues
没有属性po\u months
,要么Xrm.Page.getAttribute(“po\u contracterm”).getValue()[0]。keyValues.po\u months==null
您的代码在一行中浏览许多属性。如果你不能保证这些属性中的每一个都存在某种东西,那你就是在自找麻烦
由于我认为您仍然有点困惑,请在错误行之前设置一个断点,然后查看以下所有可能的表达式中,哪些表达式失败
Xrm.Page.getAttribute("po_contractterm").getValue() //this shouldn't be null
Xrm.Page.getAttribute("po_contractterm").getValue()[0]
Xrm.Page.getAttribute("po_contractterm").getValue()[0].keyValues
Xrm.Page.getAttribute("po_contractterm").getValue()[0].keyValues.po_months //this probably doesn't exist or is null.
Xrm.Page.getAttribute("po_contractterm").getValue()[0].keyValues.po_months.value
我们可以消除表达式Xrm.Page.getAttribute(“po_contractterm”).getValue()
的检查部分,因为该部分是在if
中测试的。不过,检查它以保持您的理智并没有什么坏处,而且使用VisualStudio调试器,我认为您应该能够单击浏览其中的每一个对象,除非对象太大。了解调试器是否对您撒谎也很有用,因为您的一些评论似乎表明您相信调试器。调试器偶尔会撒谎,或者(更常见的是)非常迟钝地提供信息
这是你不能偷懒的。好吧,如果你使用这样的工具,你可能会有点懒惰,但如果你不打算使用这样的工具,请确保路径在需要时存在,或者在部分路径可能不存在的情况下进行适当的测试。我想我现在理解了这个问题 简而言之:您假设一个查阅字段将允许您访问查阅记录的字段。这是不正确的 为了扩展这一点,让我们从Crm在查找字段中实际提供的内容开始 如果你看了MSDN。我们可以看到,当对查找属性执行getValue()时,返回一个具有三个字符串属性的数组 实体类型 字符串:在查找中显示的实体的名称 身份证 字符串:查找中显示的记录的GUID值的字符串表示形式 名字 字符串:表示要在查找中显示的记录的文本 注意事项: 没有
keyValues
属性(我不确定您是从哪里获得此信息的-如果我在这里遗漏了什么,请告诉我)
除了名称字段外,我们没有任何其他记录数据。例如:如果这是一个联系人的查找,我们可以告诉它的全名(从name属性),但不能告诉它的地址或电话号码
因此,总结一下Crm设置查找失败的原因是因为它只提供上面的信息,它不会填充keyValues
或查找记录中的任何字段,例如po\u months
我猜当您设置查找时,它工作的原因是因为您正在代码中的其他地方创建keyValues
属性
如果您希望从与查找相关的记录中获取信息,则必须执行webservice调用以获取该信息-使用查找中的id。您使用什么代码设置该值?是否尝试拆分突出显示的行?因此,您必须确定哪个特定对象为null或未定义,这可能有助于调试问题。@PaulWay-我使用的代码是UpdateAgreementCloseDate()的最后第二行:Xrm.Page.data.entity.attributes.get(“po_agreementclosedate”).setValue(agreementclosedate)@詹姆斯伍德-我确实这么做了,但不知怎么的,我忽略了公布结果(可能是因为当时是凌晨2点)。我已经更新了帖子。它在访问po_months属性时中断。调试器告诉我它是null@splatto最后一行的第二行设置“po_agreementclosedate”。您的代码在“po_contractterm”字段中被破坏。您使用什么JavaScript代码来设置“po_contractterm”字段?谢谢您的回答。你说得对,我很困惑。我不明白的是,当通过javascript填充查找时,为什么
Xrm.Page.getAttribute(“po_contractterm”).getValue()[0]。keyValues.po_months
为空,而当用户填充时则不为空。每一个合同条款类型的记录都有一个po_月的值(这是一个必填字段,只有少数可能的记录)。唯一不同的是工作环境和