Dynamics crm 如何保存记录并立即使用其GUID

Dynamics crm 如何保存记录并立即使用其GUID,dynamics-crm,dynamics-crm-2011,Dynamics Crm,Dynamics Crm 2011,我正在从一个功能区按钮执行一些javascript,我想做的是保存我正在创建的记录,然后立即使用它的GUID进一步编写一些代码。每次我尝试它时,GUID都返回null,即使我在保存记录后请求它。如果我在保存按钮后再次尝试该按钮,则它会工作,但不会在保存时工作 有办法做到这一点吗 函数RibbonButton\u AddProduct() { //保存记录 Xrm.Page.data.entity.save(); LoadProductCreate(); } 函数LoadProductCreate

我正在从一个功能区按钮执行一些javascript,我想做的是保存我正在创建的记录,然后立即使用它的GUID进一步编写一些代码。每次我尝试它时,GUID都返回null,即使我在保存记录后请求它。如果我在保存按钮后再次尝试该按钮,则它会工作,但不会在保存时工作

有办法做到这一点吗

函数RibbonButton\u AddProduct()
{
//保存记录
Xrm.Page.data.entity.save();
LoadProductCreate();
}
函数LoadProductCreate()
{
var-serverUrl;
var errorMessage=“检索服务器URL的上下文不可用。”;
if(GetGlobalContext的类型!=“未定义”){
serverUrl=GetGlobalContext().getServerUrl();
}否则{
if(Xrm的类型!=“未定义”){
serverUrl=Xrm.Page.context.getServerUrl();
}否则{
警报(错误消息);
返回;
}
}
if(serverUrl.match(/\/$/)){
serverUrl=serverUrl.substring(0,serverUrl.length-1);
}     
var recordId=Xrm.Page.data.entity.getId();
警报(记录ID);
var url=serverUrl+“/main.aspx?etc=10030&extrqs=%3f_CreateFromId%3d%”和recordId
+%257d%26\u CreateFromType%3d10029%26etc%3d10030%26
+“页面模式%3diframe%26preload缓存%3d1345465354543&pagetype=entityrecord”;
窗口打开(url);
}

您可以尝试以下两种方法之一:

  • 在表单中添加一个隐藏的布尔属性(例如“new_launchProductCreate”),在保存之前在代码中设置它,然后在加载时读取它

    • 不必在创建之前设置值(因此可能会将其提交到数据库),您可以创建一个根据记录的“创建”步骤注册的插件,在记录返回给用户时将布尔值注入
      Entity.Attributes
      集合。这将防止值持久化到数据库中,并在每次加载表单时运行

    • 您可以在启动onLoad代码时使用AJAX重置该值,这样它就不会在每次表单加载时触发

  • 手动分配记录guid,使用AJAX保存记录,使用新guid弹出新窗口,然后重新加载原始表单(以便表单不再处于“未保存”状态)


  • 这里有一个不同的方法来解决这个问题

    你试图做的是“与系统对抗”——你实际上是在做两个保存按钮。在Crm的其余部分中,当功能区按钮需要Id时,必须首先保存记录。例如,您不能在未保存的记录上使用对话框或工作流按钮,也不能在未保存的记录上“添加新的/现有的”

    因此,我的解决方案是禁用未保存表单上的按钮,强制用户手动保存记录,然后允许他们使用您的按钮-这就是Crm的使用方式,也是Crm其余部分的工作方式

    你不应该反对这个系统,你应该使用它,你有一个产品需要定制和扩展,而不是改变


    如果这不符合您的要求,我建议您使用Greg的建议(1)设置标志,尽管听起来有点混乱-但这是一个本质上是这样的要求。

    冒着被证明是错误的风险,因为我无法立即验证这一点。。。您需要保存然后重新加载页面

    Xrm.Page.data.entity.getId()
    中存储的值是在加载/初始化页面时设置的,因此在调用
    Save()
    后访问页面时不会更新该值

    这也是为什么在重新加载页面时它会工作的原因

    也许您可以调用save,然后重新加载窗口,添加您自己的querystring变量,以指示此事件刚刚发生

    e、 g

    函数DoSomething(){
    //做你的事
    Xrm.Page.data.entity.save();
    //比如-肯定有人能做得更好!
    window.location=window.location.href+'&foo=bar';
    }
    
    然后在FormLoad上注册类似的内容

    函数OnLoad(){
    var queryStringParms=Xrm.Page.context.getQueryStringParameters();
    //测试以查看此处是否存在查询字符串param
    for(queryStringParams中的变量i){
    //如果找到查询字符串,请在此处进行额外处理
    }
    }
    
    你能分享你的代码吗?我已将其添加到原始帖子中,似乎出于某种原因而放弃了格式设置,而你的代码无法工作的原因是
    Id
    只有在保存记录并重新加载表单后才可用。您的代码在这两个事件之间运行,因此没有可用的
    Id
    。我明白了,这是有意义的。是否可以附加事件以在表单重新加载后运行?选项2听起来是我认为最好的选项,但我不知道我会怎么做,因为我更喜欢詹姆斯的方法:-)+1我找到了一种方法来修改我想做的事情,以便在我需要做其他事情之前先保存它,所以现在一切都正常了。谢谢大家的帮助:)