jimminybob
jimminybob

Reputation: 1442

How to save a record and immediately use its GUID

I'm executing some javascript from a ribbon button and what I want to do is save the record that I am creating and then immediately use its GUID for some code a bit further on. Each time I try it the GUID is coming back null even though I'm requesting it after the record has been saved. If I try the button again after I've saved it then it works, but not as I'm saving it.

Is there a way to do this?

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);
}

Upvotes: 2

Views: 6500

Answers (3)

glosrob
glosrob

Reputation: 6715

At the risk of being proven wrong as I cannot verify this right away... you will need to save and then reload the page.

The value stored in Xrm.Page.data.entity.getId() is set when the page is loaded/initialised and hence won't be updated when you access it after you have called Save().

It is also why it does work when you reload the page.

Perhaps you could call save and then reload the window adding a querystring variable of your own, to indicate that this event has just occurred?

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';
}

and then register something like this 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
    }
}

Upvotes: 2

James Wood
James Wood

Reputation: 17562

Here’s a different approach to solving this problem.

What you are trying to do is ‘working against the system’ - you are effectively making two save buttons. In the rest of Crm when the Id is required for a ribbon button the record must first be saved. E.g. you can’t use the dialog or workflow buttons on an unsaved record, you also can’t 'add new/existing' to an unsaved record.

So my solution would be to disable the button on unsaved forms, force the user to save the record manually and then allow them to use your button - this is the way Crm is meant to be used, and is the way the rest of Crm will work.

You should not work against the system, you should work with it, you have a product to customise and extend – not change.

If this doesn’t meet your requirement I would suggest uses Greg’s suggestion (1) of having flags, though it sounds a bit messy - but then this is a requirement that inherently is.

Upvotes: 9

Greg Owens
Greg Owens

Reputation: 3878

You could try one of two things:

  1. Add a hidden boolean attribute to your form(e.g. "new_launchProductCreate"), set it in code prior to save and then read it onLoad.

    • Instead of setting the value prior to create (and therefore potentially commiting it to the database), you could create a plugin registered against the "Create" step of your record that injects a boolean value into the Entity.Attributes collection as the record is returned to the user. This would prevent the value persisting into the database and running every time your form loads.

    • You can instead use AJAX to reset the value as you launch your onLoad code so that it doesn't trigger on every form load

  2. Assign the record guid manually, use AJAX to save your record, pop your new window using th enew guid and then reload your original form (so that the form is no longer in an "unsaved" state).

Upvotes: 4

Related Questions