var LOGICAL_OPERATOR_AND = "And"; var LOGICAL_OPERATOR_OR = "Or"; var CONDITION_OPERATOR_LIKE = "Like"; var CONDITION_OPERATOR_EQUAL = "Equal"; var CONDITION_OPERATORNOT_EQUAL = "NotEqual"; var JOINOPERATOR_INNER = "Inner"; var JOINOPERATOR_LEFTOUTER = "LeftOuter"; var JOINOPERATOR_NATURAL = "Natural"; function CrmService(entityName, logicalOperator) { // Double check in case you pass a variable that hasn't been set // This error is hard to track down if (logicalOperator == null) throw new Error("Must specify non-null value for logicalOperator"); if (entityName == null) throw new Error("Must specify non-null value for entityName"); this.entityName = entityName; this.ColumnSet = new Array(); this.LogicalOperator = logicalOperator; this.Conditions = new Array(); this.LinkedEntities = new Array(); } CrmService.prototype.getEntityName = function() { return this.entityName; } function Condition(field, value, operator) { this.Field = field; this.Value = CrmEncodeDecode.CrmXmlEncode(value); // Double check in case you pass a variable that hasn't been set // This error is hear to track down if (operator == null) throw new Error("Must specify non-null value for operator"); this.Operator = operator; } CrmService.prototype.setEntityName = function() { return this.entityName; } CrmService.prototype.AddColumn = function(columnName) { this.ColumnSet[this.ColumnSet.length] = columnName; } CrmService.prototype.AddFilterCondition = function(field, value, conditionOperator) { this.Conditions[this.Conditions.length] = new Condition(field, value, conditionOperator); } function LinkedEntity(linkFromEntityName, linkToEntityName, linkFromAttributeName, linkToAttributeName, joinOperator) { this.LinkFromEntityName = linkFromEntityName; this.LinkToEntityName = linkToEntityName; this.LinkFromAttributeName = linkFromAttributeName; this.LinkToAttributeName = linkToAttributeName; if (joinOperator == null) throw new Error("Must specify non-null value for operator"); this.JoinOperator = joinOperator; this.Conditions = new Array(); this.FilterOperator = LOGICAL_OPERATOR_AND; } LinkedEntity.prototype.AddFilterCondition = function(field, value, conditionOperator) { this.Conditions[this.Conditions.length] = new Condition(field, value, conditionOperator); return this.Conditions[this.Conditions.length - 1]; } CrmService.prototype.AddLinkedEntityCondition = function(linkFromEntityName, linkToEntityName, linkFromAttributeName, linkToAttributeName, joinOperator) { this.LinkedEntities[this.LinkedEntities.length] = new LinkedEntity(linkFromEntityName, linkToEntityName, linkFromAttributeName, linkToAttributeName, joinOperator); return this.LinkedEntities[this.LinkedEntities.length - 1]; } function RetrieveMultipleResult(crmService) { this.Rows = new Array(); this.CrmService = crmService; } RetrieveMultipleResult.prototype.AddRow = function() { this.Rows[this.Rows.length] = new Row(); return this.Rows[this.Rows.length - 1]; } function Row() { this.Columns = new Array(); } function Column(columnName, value, dataType) { this.ColumnName = columnName; this.Value = value; this.DataType = dataType; } Row.prototype.AddColumn = function(columnName, value) { this.Columns[this.Columns.length] = new Column(columnName, value); } Row.prototype.GetColumn = function(columnName) { for (columnNumber in this.Columns) { var column = this.Columns[columnNumber]; if (columnName.toLowerCase() == column.ColumnName.toLowerCase()) return column; } throw new Error("Column " + columnName + " does not exist"); } Row.prototype.GetValue = function(columnName) { var column = this.GetColumn(columnName); return column.Value; } CrmService.prototype.RetrieveMultiple = function() { //create SOAP envelope var xmlSoapHeader = "" + "" + ""; var xmlAuthHeader = GenerateAuthenticationHeader(); var xmlSoapBody = "" + " " + " " + " " + this.getEntityName() + " " + " " + " "; for (columnNumber in this.ColumnSet) { var column = this.ColumnSet[columnNumber]; xmlSoapBody = xmlSoapBody + " " + column + ""; } xmlSoapBody = xmlSoapBody + " " + " " + " false " + " " + " 0 " + " 0 " + " " + " "; if (this.LinkedEntities.length > 0) { for (linkedEntityNumber in this.LinkedEntities) { var linkedEntity = this.LinkedEntities[linkedEntityNumber]; xmlSoapBody += " "; xmlSoapBody += " " + linkedEntity.LinkFromAttributeName + " "; xmlSoapBody += " " + linkedEntity.LinkFromEntityName + " "; xmlSoapBody += " " + linkedEntity.LinkToEntityName + " "; xmlSoapBody += "" + linkedEntity.LinkToAttributeName + " "; xmlSoapBody += "" + linkedEntity.JoinOperator + " "; xmlSoapBody += " "; if (linkedEntity.FilterOperator == null) throw new Error("Must specify non-null value for FilterOperator"); xmlSoapBody += " " + linkedEntity.FilterOperator + " "; xmlSoapBody += " "; for (conditionLinkedNumber in linkedEntity.Conditions) { var conditionLinked = linkedEntity.Conditions[conditionLinkedNumber]; xmlSoapBody += " "; xmlSoapBody += " " + conditionLinked.Field + " "; xmlSoapBody += " " + conditionLinked.Operator + " "; xmlSoapBody += " "; xmlSoapBody += " " + conditionLinked.Value + " "; xmlSoapBody += " "; xmlSoapBody += " "; } xmlSoapBody += " "; xmlSoapBody += " "; xmlSoapBody += " "; xmlSoapBody += ""; xmlSoapBody += ""; } } if (this.LogicalOperator == null) throw new Error("Must specify non-null value for LogicalOperator"); xmlSoapBody += "" + " " + " " + this.LogicalOperator + " " + " "; for (conditionNumber in this.Conditions) { var condition = this.Conditions[conditionNumber]; if (condition.Operator == null) throw new Error("Must specify non-null value for condition Operator"); xmlSoapBody += " " + " " + condition.Field + " " + " " + condition.Operator + " " + " " + " " + condition.Value + " " + " " + " "; } xmlSoapBody += " " + " " + " " + " " + " " + " " + " " + " "; var xmlt = xmlSoapHeader + xmlAuthHeader + xmlSoapBody; 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", xmlt.length); xmlHttpRequest.send(xmlt); if (xmlHttpRequest.responseXML == null || xmlHttpRequest.responseXML.xml == null || xmlHttpRequest.responseXML.xml == "") { if (xmlHttpRequest.responseText != null && xmlHttpRequest.responseText != "") throw new Error(xmlHttpRequest.responseText); else throw new Error("Error returning response"); } var xmlResponse = xmlHttpRequest.responseXML.xml; if (xmlHttpRequest.responseXML.documentElement.selectNodes("//error/description").length > 0) { throw new Error(xmlResponse); } var objNodeList = xmlHttpRequest.responseXML.documentElement.selectNodes("//BusinessEntity"); var totalNodesCount = objNodeList.length; var result = new RetrieveMultipleResult(this); var nodeIndex = 0; var fieldTextTemp = ""; var fieldText = ""; if (totalNodesCount > 0) { do { var row = result.AddRow(); for (columnNumber in this.ColumnSet) { var columnName = this.ColumnSet[columnNumber]; fieldText = ""; var valueNode = objNodeList[nodeIndex].getElementsByTagName("q1:" + columnName)[0]; if (valueNode != null) { fieldTextTemp = valueNode.childNodes[0].nodeValue; if (fieldTextTemp != null && fieldTextTemp != "") { fieldText = fieldText + fieldTextTemp; } } row.AddColumn(columnName, fieldText); } nodeIndex = nodeIndex + 1; } while (totalNodesCount > nodeIndex) } return result; } function RunTest() { try { // Simple query on one entity var LOGICAL_OPERATOR_OR = "Or"; var CONDITION_OPERATOR_EQUAL = "Equal"; // Create object passing in the entity you are selecting from var crmService = new CrmService("lead", LOGICAL_OPERATOR_OR); crmService.AddColumn("fullname"); crmService.AddColumn("leadid"); // Add filter conditions (note: the "OR" logical operator was specified in constructor) crmService.AddFilterCondition("address1_city", "Bloomington", CONDITION_OPERATOR_EQUAL); crmService.AddFilterCondition("address1_city", "Minneapolis", CONDITION_OPERATOR_EQUAL); // Retrieve the result object var result = crmService.RetrieveMultiple(); // Loop through rows and select values (they return strings) for (rowsNumber in result.Rows) { var row = result.Rows[rowsNumber]; // Get Column By Name alert(row.GetValue("fullname")); alert(row.GetValue("leadid")); } // Query that Links in Multiple Tables var LOGICAL_OPERATOR_AND = "And"; var LOGICAL_OPERATOR_OR = "Or"; var CONDITION_OPERATOR_EQUAL = "Equal"; var JOINOPERATOR_INNER = "Inner"; // Create object passing in the entity you are selecting from var crmService = new CrmService("account", LOGICAL_OPERATOR_OR); // Specify select columns crmService.AddColumn("accountnumber"); crmService.AddColumn("accountid"); crmService.AddColumn("name"); // Define linked entity - similar to SDK overload var entityLinked = crmService.AddLinkedEntityCondition("account", "contact", "accountid", "parentcustomerid", JOINOPERATOR_INNER) // Set filter operator (AND, OR, Ect) entityLinked.FilterOperator = LOGICAL_OPERATOR_AND; // Add filter condition (can add as multiple) entityLinked.AddFilterCondition("contactid", "{BB1F590A-37D0-DC11-AA32-0003FF33509E}", CONDITION_OPERATOR_EQUAL); // Retrieve the result object var result = crmService.RetrieveMultiple(); // Loop through rows and select values (they return strings) for (rowsNumber in result.Rows) { var row = result.Rows[rowsNumber]; // Get Column By Name alert(row.GetValue("accountnumber")); alert(row.GetValue("name")); alert(row.GetValue("accountid")); } } catch (er) { alert(er.message); } return; }