code to retrieve the Marketing lIst memebers in MSCRM 2011:
Query Expression: we will fetch 5000 records first then next 5000 ...continued... more useful in custom workflows
ArrayList memberGuids = new ArrayList();
PagingInfo pageInfo = new PagingInfo();
pageInfo.Count = 5000;
pageInfo.PageNumber = 1;
QueryByAttribute query = new QueryByAttribute("listmember");
// pass the guid of the Static marketing list
query.AddAttributeValue("listid", marketingListId);
query.ColumnSet = new ColumnSet(true);
EntityCollection entityCollection = service.RetrieveMultiple(query);
foreach (Entity entity in entityCollection.Entities)
{
memberGuids.Add(((EntityReference) entity.Attributes["entityid"]).Id);
}
// if list contains more than 5000 records
while (entityCollection.MoreRecords)
{
query.PageInfo.PageNumber += 1;
query.PageInfo.PagingCookie = entityCollection.PagingCookie;
entityCollection = service.RetrieveMultiple(query);
foreach (Entity entity in entityCollection.Entities)
{
memberGuids.Add(((EntityReference)entity.Attributes["entityid"]).Id);
}
}
Fetch XML:
string ListMembersfetchXml = @"<fetch version=""1.0"" output-format=""xml-platform"" mapping=""logical"" distinct=""false"">
<entity name=""listmember"">
<attribute name=""entityid"" />
<attribute name=""entitytype"" />
<filter type=""and"">
<condition attribute=""listid"" operator=""eq"" value=""" + new Guid(marketingListId) + @""" />
</filter>
</entity>
</fetch>";
EntityCollection listMemberResult = service.RetrieveMultiple(new FetchExpression(ListMembersfetchXml));
Javascript code: BY NIshanth Rana
// call this function and pass the id of the static marketing list to it
function GetAllMembers(listGuid)
{
_oService='';
_sOrgName = "";
memberArray = new Array();
morePages = 'true';
pageNumber = 1;
pageCookie = '';
recordGuid='';
XMLHTTPSUCCESS = 200;
XMLHTTPREADY = 4;
context = typeof (Xrm) == "undefined" ? GetGlobalContext() : Xrm.Page.context;
var _sServerUrl = context.getServerUrl();
if (_sServerUrl.match(/\/$/)) {
_sServerUrl= _sServerUrl.substring(0, serverUrl.length - 1);
}
GetMarketingListMembers(listGuid);
}
function GetMarketingListMembers(listGuid) {
fetchOnLoad(pageNumber, pageCookie, listGuid);
for (var i = 0; i < memberArray.length; i++) {
alert(memberArray[i]);
// Iterates over numeric indexes from 0 to 5, as everyone expects
}
}
function fetchOnLoad(pageNumber, pageCookie, listGuid) {
recordGuid = listGuid;
var sFetch = "<fetch mapping='logical' page='" + pageNumber + "' count='5000' paging-cookie='" + pageCookie + "' version='1.0'>" +
"<entity name='listmember'>" +
"<attribute name='entityid' />" +
"<filter>" +
"<condition attribute='listid' operator='eq' value='" + recordGuid + "' />" +
"</filter>" +
"</entity>" +
"</fetch>";
_oService = new FetchUtil(_sOrgName, _sServerUrl);
_oService.Fetch(sFetch, myCallBack);
}
function myCallBack(results) {
// add all the member in the array
for (i in results) {
memberArray.push(results[i].attributes.entityid.guid);
}
if (morePages == 'true') {
fetchOnLoad(pageNumber, pageCookie, recordGuid);
}
}
function FetchUtil(sOrg, sServer) {
this.org = sOrg;
this.server = sServer;
if (sOrg == null) {
if (typeof(ORG_UNIQUE_NAME) != "undefined") {
this.org = ORG_UNIQUE_NAME;
}
}
if (sServer == null) {
this.server = window.location.protocol + "//" + window.location.host;
}
}
FetchUtil.prototype._ExecuteRequest = function(sXml, sMessage, fInternalCallback, fUserCallback) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", this.server + "/XRMServices/2011/Organization.svc/web", false);
xmlhttp.setRequestHeader("Accept", "application/xml, text/xml, */*");
xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
if (fUserCallback != null) {
//asynchronous: register callback function, then send the request.
var crmServiceObject = this;
xmlhttp.onreadystatechange = function() {
fInternalCallback.call(crmServiceObject, xmlhttp, fUserCallback)
};
xmlhttp.send(sXml);
} else {
//synchronous: send request, then call the callback function directly
xmlhttp.send(sXml);
return fInternalCallback.call(this, xmlhttp, null);
}
}
FetchUtil.prototype._HandleErrors = function(xmlhttp) {
/// <summary>(private) Handles xmlhttp errors</summary>
if (xmlhttp.status != XMLHTTPSUCCESS) {
var sError = "Error: " + xmlhttp.responseText + " " + xmlhttp.statusText;
alert(sError);
return true;
} else {
return false;
}
}
FetchUtil.prototype.Fetch = function(sFetchXml, fCallback) {
/// <summary>Execute a FetchXml request. (result is the response XML)</summary>
/// <param name="sFetchXml">fetchxml string</param>
/// <param name="fCallback" optional="true" type="function">(Optional) Async callback function if specified. If left null, function is synchronous </param>
var request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
request += "<s:Body>";
request += "<Execute xmlns='http://schemas.microsoft.com/xrm/2011/Contracts/Services'>" + "<request i:type=\"b:RetrieveMultipleRequest\" " + ' xmlns:b="http://schemas.microsoft.com/xrm/2011/Contracts" ' + ' xmlns:i="http://www.w3.org/2001/XMLSchema-instance">' + '<b:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic">' + '<b:KeyValuePairOfstringanyType>' + '<c:key>Query</c:key>' + '<c:value i:type="b:FetchExpression">' + '<b:Query>';
request += CrmEncodeDecode.CrmXmlEncode(sFetchXml);
request += '</b:Query>' + '</c:value>' + '</b:KeyValuePairOfstringanyType>' + '</b:Parameters>' + '<b:RequestId i:nil="true"/>' + '<b:RequestName>RetrieveMultiple</b:RequestName>' + '</request>' + '</Execute>';
request += "</s:Body></s:Envelope>";
return this._ExecuteRequest(request, "Fetch", this._FetchCallback, fCallback);
}
FetchUtil.prototype._FetchCallback = function(xmlhttp, callback) {
///<summary>(private) Fetch message callback.</summary>
//xmlhttp must be completed
if (xmlhttp.readyState != XMLHTTPREADY) {
return;
}
//check for server errors
if (this._HandleErrors(xmlhttp)) {
return;
}
var moreRecordsXML = xmlhttp.responseXML.selectSingleNode("//a:MoreRecords").text;
if (moreRecordsXML == 'true') {
morePages = 'true';
pageCookie = xmlhttp.responseXML.selectSingleNode("//a:PagingCookie").text;
pageCookie = pageCookie.replace( /\"/g , '\'');
pageCookie = pageCookie.replace( /</g , '<');
pageCookie = pageCookie.replace( />/g , '>');
pageCookie = pageCookie.replace( /'/g , '"');
pageNumber = pageNumber + 1;
} else {
morePages = 'false';
}
// get the value of the morerecords
var sFetchResult = xmlhttp.responseXML.selectSingleNode("//a:Entities").xml;
var resultDoc = new ActiveXObject("Microsoft.XMLDOM");
resultDoc.async = false;
resultDoc.loadXML(sFetchResult);
//parse result xml into array of jsDynamicEntity objects
var results = new Array(resultDoc.firstChild.childNodes.length);
for (var i = 0; i < resultDoc.firstChild.childNodes.length; i++) {
var oResultNode = resultDoc.firstChild.childNodes[i];
var jDE = new jsDynamicEntity();
var obj = new Object();
for (var j = 0; j < oResultNode.childNodes.length; j++) {
switch (oResultNode.childNodes[j].baseName) {
case "Attributes":
var attr = oResultNode.childNodes[j];
for (var k = 0; k < attr.childNodes.length; k++) {
// Establish the Key for the Attribute
var sKey = attr.childNodes[k].firstChild.text;
var sType = "";
// Determine the Type of Attribute value we should expect
for (var l = 0; l < attr.childNodes[k].childNodes[1].attributes.length; l++) {
if (attr.childNodes[k].childNodes[1].attributes[l].baseName == 'type') {
sType = attr.childNodes[k].childNodes[1].attributes[l].text;
}
}
switch (sType) {
case "a:OptionSetValue":
var entOSV = new jsOptionSetValue();
entOSV.type = sType;
entOSV.value = attr.childNodes[k].childNodes[1].text;
obj[sKey] = entOSV;
break;
case "a:EntityReference":
var entRef = new jsEntityReference();
entRef.type = sType;
entRef.guid = attr.childNodes[k].childNodes[1].childNodes[0].text;
entRef.logicalName = attr.childNodes[k].childNodes[1].childNodes[1].text;
entRef.name = attr.childNodes[k].childNodes[1].childNodes[2].text;
obj[sKey] = entRef;
break;
default:
var entCV = new jsCrmValue();
entCV.type = sType;
entCV.value = attr.childNodes[k].childNodes[1].text;
obj[sKey] = entCV;
break;
}
}
jDE.attributes = obj;
break;
case "Id":
jDE.guid = oResultNode.childNodes[j].text;
break;
case "LogicalName":
jDE.logicalName = oResultNode.childNodes[j].text;
break;
case "FormattedValues":
var foVal = oResultNode.childNodes[j];
for (var k = 0; k < foVal.childNodes.length; k++) {
// Establish the Key, we are going to fill in the formatted value of the already found attribute
var sKey = foVal.childNodes[k].firstChild.text;
jDE.attributes[sKey].formattedValue = foVal.childNodes[k].childNodes[1].text;
}
break;
}
}
results[i] = jDE;
}
//return entities
if (callback != null) callback(results);
else return results;
}
function jsDynamicEntity(gID, sLogicalName) {
this.guid = gID;
this.logicalName = sLogicalName;
this.attributes = new Object();
}
function jsCrmValue(sType, sValue) {
this.type = sType;
this.value = sValue;
}
function jsEntityReference(gID, sLogicalName, sName) {
this.guid = gID;
this.logicalName = sLogicalName;
this.name = sName;
this.type = 'EntityReference';
}
function jsOptionSetValue(iValue, sFormattedValue) {
this.value = iValue;
this.formattedValue = sFormattedValue;
this.type = 'OptionSetValue';
}
No comments:
Post a Comment