2

我正在从功能区按钮执行一些 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);
}
4

3 回答 3

9

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

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

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

你不应该对系统工作,你应该使用它,你有一个产品可以定制和扩展——而不是改变。

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

于 2012-08-20T17:14:42.967 回答
4

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

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

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

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

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

于 2012-08-20T15:30:13.750 回答
2

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

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

这也是为什么当您重新加载页面时它会起作用的原因。

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

例如

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
    }
}
于 2012-08-20T17:16:24.583 回答