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

时间:2012-08-20 13:13:32

标签: dynamics-crm dynamics-crm-2011

我正在从功能区按钮执行一些javascript,我想要做的是保存我正在创建的记录,然后立即将其GUID用于某些代码。每次我尝试它时,即使我在保存记录后请求它,GUID也会返回null。如果我在保存之后再次尝试按钮,那么它可以工作,但不是因为我正在保存它。

有办法做到这一点吗?

function RibbonButton_AddProduct()
{
  //Save the Record
  Xrm.Page.data.entity.save();

  LoadProductCreate();
}

function LoadProductCreate()
{
  var serverUrl;
  var errorMessage = "Context to retrieve the Server URL is not available.";
  if (typeof GetGlobalContext != "undefined"){
     serverUrl = GetGlobalContext().getServerUrl();
  } else {
  if (typeof Xrm != "undefined"){
    serverUrl = Xrm.Page.context.getServerUrl();
  } else {
    alert(errorMessage);
    return;
  }
}
if (serverUrl.match(/\/$/)){
   serverUrl = serverUrl.substring(0, serverUrl.length - 1);
}     

var recordId = Xrm.Page.data.entity.getId();

alert(recordId);
var url = serverUrl + "/main.aspx?etc=10030&extraqs=%3f_CreateFromId%3d%"+recordId
  +"%257d%26_CreateFromType%3d10029%26etc%3d10030%26"
  +"pagemode%3diframe%26preloadcache%3d1345465354543&pagetype=entityrecord";
window.open(url);
}

3 个答案:

答案 0 :(得分:9)

这是解决此问题的另一种方法。

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

所以我的解决方案是禁用未保存表单上的按钮,强制用户手动保存记录然后允许他们使用你的按钮 - 这就是Crm的使用方式,其余部分就是这样Crm会起作用。

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

如果这不符合您的要求,我会建议使用Greg的建议(1)有标志,虽然听起来有点乱 - 但是这是一个固有的要求。

答案 1 :(得分:4)

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

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

    • 您可以创建一个针对记录的“创建”步骤注册的插件,而不是在创建之前设置值(因此可能会将其提交到数据库),该插件会将一个布尔值注入{{1将记录返回给用户时收集。这样可以防止值持久存储到数据库中并在每次加载表单时运行。

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

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

答案 2 :(得分:2)

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

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

这也是您重新加载页面时的效果。

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

e.g。

function DoSomething() {
    //do your stuff 
    Xrm.Page.data.entity.save();

    //something like - sure someone can do better!
    window.location = window.location.href + '&foo=bar';
}

然后在onFormLoad

上注册这样的内容
function OnLoad() {
    var queryStringParms = Xrm.Page.context.getQueryStringParameters();
    //test to see if your query string param exists here
    for (var i in queryStringParams) {
        //if you find query string, do extra processing here
    }
}