Saturday, May 7, 2016

Using FetchXML in a CRM form without having to use string concatenation

I am a solution architect using Microsoft Dynamics CRM, and I must be the laziest programmer I know. I HATE to write FetchXML code embedded in Javascript. But I am getting over it. I started using FetchXML Builder add-on to XRM Toolbox and that was very helpful for working with CRM Online. But last week I needed to query the Product table in a custom form to pull back a list price of a product, and I was dreading the thought of having to add all the little quotes and doing string concatenation because I knew I would be tweeking it and repeatedly making changes in FetchXML builder, them moving the query code back to Javascript and making it a bunch of concatenated strings (wash, rinse, repeat).

If I were putting the FetchXML into a C# program, no problem because that language supports having multi-line strings. And I could use Format.string() to insert my parameters into the code so I don't have to concatenate that either.

Not so much in Javascript. So I did some research and found some articles on how it could be done. I can put the FetchXML between comments and then use a regular expression to make it into a legit string. As long as nobody turns on 'compression' on the web server, it should continue to work. The code looks like this:

function fetchGetProduct() {
try {
// Get the price of the product requested
var sFetch = (function () {/*
<fetch count="1" >
<entity name="product" >
<attribute name="price" />
<filter type="and">
<condition attribute="productid" operator="eq" value="{0}" />
</filter>
</entity>
</fetch>
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
// use this trick to insert the GUID into the fetch query at position {0}
var v1 = Xrm.Page.getAttribute("new_quickaddproductid").getValue()[0].id;
sFetch = sFetch.format(v1);
// alert(sFetch);
_oService = new FetchUtil(_sOrgName, _sServerUrl);
// get the price from CRM, and use updatePrice() as the callback
_oService.Fetch(sFetch, updatePrice);
}
catch (e) {
}
}
function updatePrice(results) {
// given the results of the FetchXML
// get the list price from the product it returned
if (results.length > 0) {
var listprice = results[0].attributes["price"].value;
// update the price field on the custom form
Xrm.Page.getAttribute("new_quickaddamount").setValue(parseFloat(listprice));
}
}
// this function lets me replace a positional parameter in
// First, checks if it isn't implemented yet.
if (!String.prototype.format) {
String.prototype.format = function () {
var args = arguments;
return this.replace(/{(\d+)}/g, function (match, number) {
return typeof args[number] != 'undefined'
? args[number]
: match
;
});
};
}
view raw fetchGetProduct hosted with ❤ by GitHub
The last function in this takes care of replacing the {0} in my FetchXML with the GUID I need in the query. Line 15 of my code gets the GUID from a lookup field, and Line 16 calls the Format function to replace the {0} parameter with the GUID.

No comments: