11 December 2008

CRM 4.0 Get attribute value from entity's GUID using JScript

Recently I have been asked many times about how to get attribute value from entity's GUID using JScript?
The following code demonstrate how to get a user's internalemailaddress by giving user's GUID.
*It has been modified to support multi-tenent deployment.


alert(GetAttributeValueFromID("systemuser", "09DF2AB7-E16D-DD11-88F3-0003FF884968", "internalemailaddress", "systemuserid"));

function GetAttributeValueFromID(sEntityName, sGUID, sAttributeName, sID)
{
var xml = "" +
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
GenerateAuthenticationHeader() +
" <soap:Body>" +
" <RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
" <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +
" <q1:EntityName>"+sEntityName+"</q1:EntityName>" +
" <q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +
" <q1:Attributes>" +
" <q1:Attribute>"+sAttributeName+"</q1:Attribute>" +
" </q1:Attributes>" +
" </q1:ColumnSet>" +
" <q1:Distinct>false</q1:Distinct>" +
" <q1:PageInfo>" +
" <q1:PageNumber>1</q1:PageNumber>" +
" <q1:Count>1</q1:Count>" +
" </q1:PageInfo>" +
" <q1:Criteria>" +
" <q1:FilterOperator>And</q1:FilterOperator>" +
" <q1:Conditions>" +
" <q1:Condition>" +
" <q1:AttributeName>"+sID+"</q1:AttributeName>" +
" <q1:Operator>Equal</q1:Operator>" +
" <q1:Values>" +
" <q1:Value xsi:type=\"xsd:string\">"+sGUID+"</q1:Value>" +
" </q1:Values>" +
" </q1:Condition>" +
" </q1:Conditions>" +
" </q1:Criteria>" +
" </query>" +
" </RetrieveMultiple>" +
" </soap:Body>" +
"</soap:Envelope>" +
"";

var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");

xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xmlHttpRequest.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
xmlHttpRequest.send(xml);

// retrieve response and find attribute value
var result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName);
if (result == null)
return "";
else
return result.text;
}

16 comments:

Mitch Milam said...

Very good Jim. I too get questions like this all the time and you have created an excellent solution.

Mitch

Scott Sewell said...

Thanks for sharing this- it was perfect timing for me.

prince said...

Dear JIM,

I am a bit new to CRM customization. I have an issue which is the cause to a lot of hiccups in my customisation. In the account section when I select the "parent account" lookup it always selects the "Account name", instead my client wants account number to be appearing in the lookup. Is it possible to change the attribute? Because it always pulls the primary attribute. I guess I have to write a onload script to change the attribute. Can you help me with it?

Andy Milner said...

Excellent bit of code. However I seem to have a problem with it when running on a system with multiple organisations. I can run it OK on the default org, but if run on a different org it does not find the GUID. If I pass it a GUID from the default org it will return a value!!!! even though I am running the code from a different org. Do you have any ideas on this.

Prince said...

Jim,

Can you pls tell me how to multiselect in a lookup?
I tried visiting the below link but its giving me an error.
http://crm4.0/crm/_controls/lookup/lookupmulti.aspx?objecttypes=2.

Pls do let me know.

Thanx
Prince

Jim Wang said...

Thanks for your comments, it has been modified to support multi-tenent deployment.;-)

Special thanks for MVP Michael Hoehne and his great tool!
http://www.stunnware.com/crm2/topic.aspx?id=JSWebService2

peter said...

Jim, this is actually what I need..

However, I am not really a programmer so I dont know what I need to change on the script to make it work.

What I'm trying to accomplish is to auto fill the address when a user select an account thru a lookup field.

I hope you can help me.

Thank you

Gregory said...

Great script, just what I needed.

One question though: if the field I'm getting value from is a picklist it returns the selected items value (ie 2 if the second option is selected) - how can I get the text?

Jayyde said...

Gregory: I had the same question as you and here's the answer I got on the CRM forums:

Replace the line that reads the content of a single node to a line that reads the value of the name attribute of the particular node, as follows:

var result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName);

to:

var result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName).getAttribute("name");

This is due to the fact that the selected text is returned as the name attribute of the XML element, and not as its inner text.

. said...

酒店經紀PRETTY GIRL 台北酒店經紀人 ,禮服店 酒店兼差PRETTY GIRL酒店公關 酒店小姐 彩色爆米花酒店兼職,酒店工作 彩色爆米花酒店經紀, 酒店上班,酒店工作 PRETTY GIRL酒店喝酒酒店上班 彩色爆米花台北酒店酒店小姐 PRETTY GIRL酒店上班酒店打工PRETTY GIRL酒店打工酒店經紀 彩色爆米花

Bert-Jan said...

Jim, great post!

I'm using it for a custom asp.net page, but not very succesfull! I get an "object expected" on generateauthenticationheader() function. Is this because I'm not running in a CRM context?

The code works fine in an OnLoad event of the form within CRM, but not in the custom asp.net page in an IFRAME in that CRM-form.

Any ideas?


Cheers!

ravi said...

Hi Jim,
I created a n:n relationship, here what I want is the records which are associated should not be available in the availalbe records of the look up dialog. It would be great if you help me on this

酒店上班請找艾葳 said...

艾葳酒店經紀公司提供專業的酒店經紀, 酒店上班小姐,八大行業,酒店兼職,傳播妹,或者想要打工兼差打工,兼差,八大行業,酒店兼職,想去酒店上班, 日式酒店,制服酒店,ktv酒店,禮服店,整天穿得水水漂漂的,還是想去制服店日領上班小姐,水水們如果想要擁有打工工作、晚上兼差工作兼差打工假日兼職兼職工作酒店兼差兼差打工兼差日領工作晚上兼差工作酒店工作酒店上班酒店打工兼職兼差兼差工作酒店上班等,想了解酒店相關工作特種行業內容,想兼職工作日領假日兼職兼差打工、或晚班兼職想擁有鋼琴酒吧又有保障的工作嗎???又可以現領請找專業又有保障的艾葳酒店經紀公司!

艾葳酒店經紀是合法的公司工作環境高雅時尚,無業績壓力,無脫秀無喝酒壓力,高層次會員制客源,工作輕鬆,可日領現領
一般的酒店經紀只會在水水們第一次上班和領薪水時出現而已,對水水們的上班安全一點保障都沒有!艾葳酒店經紀公司的水水們上班時全程媽咪作陪,不需擔心!只提供最優質的酒店上班,酒店上班,酒店打工環境、上班條件給水水們。心動嗎!? 趕快來填寫你的酒店上班履歷表

水水們妳有缺現領、有兼職缺錢便服店的煩腦嗎?想到日本留學缺錢嗎?妳是傳播妹??想要擁有高時薪又輕鬆的賺錢,酒店和,假日打工,假日兼職賺錢的機會嗎??想實現夢想卻又缺錢沒錢嗎!??
艾葳酒店台北酒店經紀招兵買馬!!徵專業的酒店打工,想要去酒店的水水,想要短期日領,酒店日領,禮服酒店,制服店,酒店經紀,ktv酒店,便服店,酒店工作,禮服店,酒店小姐,酒店經紀人,
等相關服務 幫您快速的實現您的夢想~!!

Laurie said...

Like Bert-Jan, I keep getting an "object expected" error on the GenerateAuthenticationHeader() line of the script.
I've successfully used this script elsewhere but am now trying to open a new page from CRM and am getting this error.

zorica said...

hey, I get the same error as Bert-Jan and Laurie - "Object Expected" !

does anyone have a solution???

thanks,
Zorica

Joeri said...

Will this one work with CRM 2011 as well, or will we need to update the code ?