Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CRM 2011 javascript错误-对象在明确定义时未定义_Javascript_Dynamics Crm 2011 - Fatal编程技术网

CRM 2011 javascript错误-对象在明确定义时未定义

CRM 2011 javascript错误-对象在明确定义时未定义,javascript,dynamics-crm-2011,Javascript,Dynamics Crm 2011,在我们的云托管CRM 2011中,我在opportunity表单上有3个字段 合同期限(查阅) 服务开始日期(日期和时间) 服务结束日期(日期和时间) 合同条款是对称为合同条款的自定义实体的查找。项目如下: 我想根据其他两个字段中的条目计算并填充Service Close Date字段。我的合同条款和服务开始日期的OnChange事件javascript代码如下: function UpdateAgreementCloseDate() { //debugger; if (

在我们的云托管CRM 2011中,我在opportunity表单上有3个字段

  • 合同期限(查阅)
  • 服务开始日期(日期和时间)
  • 服务结束日期(日期和时间)

合同条款是对称为合同条款的自定义实体的查找。项目如下:

我想根据其他两个字段中的条目计算并填充Service Close Date字段。我的合同条款和服务开始日期的OnChange事件javascript代码如下:

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_月的值(这是一个必填字段,只有少数可能的记录)。唯一不同的是工作环境和