Разработка
20
Окт
8

Ascentium CrmService

Ascentium CrmService – это своего рода фрэймворк, обеспечивающий простой способ манипулирования данными в MS CRM, вместо написания сложных и громоздких SOAP-запросов.

Состоит из одного файла – CrmService.js, который отправляет сообщения непосредственно в веб-службы CRM 4.0, используя только JavaScript. Вы можете использовать этот файл в своих ASPX-страницах и HTML-страницах, с форм CRM или где-нибудь еще.

Поддерживаются следующие методы:

  • Create
  • Retrieve
  • Update
  • Delete
  • Fetch
  • Associate
  • Disassociate
  • SetState

Для многих из них Вы можете также передать функцию обратного вызова, что позволяет им выполняться асинхронно.

Create, Retrieve, Update, Delete

Эти примеры показывают, как Создать, Вернуть, Обновить и Удалить записи в MS CRM. Обратите внимание, что при создании Контакта и установки значения для parentcustomerid Вы должны использовать специальный объект CrmLookup:

function Run() {

	//создаем объект Ascentium_CrmService и подключаемся к серверу http://mmcrm.ru:5555 и оганизации MicrosoftCrm
	var oService = new Ascentium_CrmService("MicrosoftCrm", "http://mmcrm.ru:5555"); 
    
	//создаем объект Бизнес-партнера
	var beAccount = new BusinessEntity("account"); 
	beAccount.attributes["name"] = "Ascentium"; 
	beAccount.attributes["numberofemployees"] = 600.00; 
	var sAccountId = oService.Create(beAccount); 

	alert("Account Created. Account ID = " + sAccountId); 
	//обновляем объект
	var beAccountToUpdate = new BusinessEntity("account"); 
	beAccountToUpdate.attributes["accountid"] = sAccountId; 
	beAccountToUpdate.attributes["revenue"] = 1000000000.00; 
	oService.Update(beAccountToUpdate); 

	alert("Account Updated"); 
	//возвращаем значения
	var asCols = ["name", "revenue", "createdon", "createdby"]; 
	var beRetrievedAccount = oService.Retrieve("account", sAccountId, asCols); 

	alert("Account Retrieved: " + 
	beRetrievedAccount.attributes["name"].value + " : " + 
	beRetrievedAccount.attributes["revenue"].value + " : " + 
	beRetrievedAccount.attributes["createdon"].value + " : " + 
	beRetrievedAccount.attributes["createdby"].value); 
	//создаем объект с атрибутом лукап
	var beContact = new BusinessEntity("contact"); 
	beContact.attributes["firstname"] = "Joe"; 
	beContact.attributes["birthdate"] = "2008-01-01T00:00:00"; 
	beContact.attributes["parentcustomerid"] = new CrmLookup("account", sAccountId); 
	var sContactId = oService.Create(beContact); 

	alert("Contact Created: " + sContactId); 
	//удаляем объект
	oService.Delete("account",sAccountId); 

	alert("Account Deleted");
    
}

Fetch

Этот пример, как использовать язык запросов Fetch, чтобы вернуть набор записей, основанную на переданном запросе. Для получения дополнительной информации о языке Fetch смотрите статью FetchXML.

function Fetch() { 

	//создаем объект Ascentium_CrmService 
	var oService = new Ascentium_CrmService(orgName.value, serverUrl.value); 
	//выполняем Fetch-запрос 
	var sFetchXml = "<fetch mapping='logical'><entity name='account'><attribute name='accountid'/><attribute name='name'/></entity></fetch>"; 
	var aoFetchResult = oService.Fetch(sFetchXml); 
	//перебираем возвращенную коллекцию записей
	var sResults = "Accounts:\n"; 

	for (var i = 0; i < aoFetchResult.length; i++) { 
		var beResult = aoFetchResult[i]; 
		sResults += i + ": " + beResult.attributes["accountid"].value + ", " + beResult.attributes["name"].value + "\n";   
	} 

	alert(sResults);
    
}

Asynchronous

Этот пример показывает, как использовать обратные асинхронные вызовы функций.

function WhoAmI() { 

	//создаем объект Ascentium_CrmService
	var oService = new Ascentium_CrmService(orgName.value, serverUrl.value); 
	//определяем fetchxml-запрос, который возвращает только текущего пользователя 
	var sFetchXml = "<fetch mapping=\"logical\"><entity name=\"systemuser\"><attribute name=\"fullname\"/><attribute name=\"systemuserid\"/><filter type=\"and\"><condition attribute=\"systemuserid\" operator=\"eq-userid\"/></filter></entity></fetch>"; 
	//выполняем fetch асинхронно путем передачи функции callback в Fetch метод 
	oService.Fetch(sFetchXml, WhoAmICallback);

}

function WhoAmICallback(aoFetchResult) { 

	if (aoFetchResult.length > 0) { 

		var beUser = aoFetchResult[0]; 
		alert("You are " + beUser.attributes["fullname"].value + ", System User ID = " + beUser.attributes["systemuserid"].value); 

    } 
}

Associate/Disassociate

Этот пример показывает, как устанавливать иснимать связь между записями. Он используется, когда у Вас есть отношения «многие-ко-многим». Пятый параметр – название отношения N:N.

function Associate() { 

	//создаем объект Ascentium_CrmService 
	var oService = new Ascentium_CrmService(orgName.value, serverUrl.value); 
	//создаем бизнес-партнера 
	var beAccount = new BusinessEntity("account"); 
	beAccount.attributes["name"] = "Ascentium"; 
	var sAccountId = oService.Create(beAccount); 

	alert("Account Created"); 
	//создаем интерес 
	var beLead = new BusinessEntity("lead"); 
	beLead.attributes["fullname"] = "Mr. Lead"; 
	var sLeadId = oService.Create(beLead); 

	alert("Lead Created"); 
	//связываем бизнес-партнера и интерес 
	oService.Associate("account", sAccountId, "lead", sLeadId, "accountleads_association"); 

	alert("Account and Lead Associated"); 
	//снимаем связь 
	oService.Disassociate("account", sAccountId, "lead", sLeadId, "accountleads_association"); 

	alert("Account and Lead Disassociated"); 

	//удаляем бизнес-партнера 
	oService.Delete("account", sAccountId); 
	alert("Account Deleted"); 

	//удаляем интерес 
	oService.Delete("lead", sLeadId); 
	alert("Lead Deleted");

}

SetState

Этот пример показывает, как изменить статус записи.

function SetState() { 

	//создаем объект Ascentium_CrmService
	var oService = new Ascentium_CrmService(orgName.value, serverUrl.value); 
	//создаем бизнес-партнера 
	var beAccount = new BusinessEntity("account"); 
	beAccount.attributes["name"] = "Ascentium"; 
	var sAccountId = oService.Create(beAccount); 

	alert("Account Created"); 
	//деактивируем бизнес-партнера 
	oService.SetState("account", sAccountId, "Inactive", -1); 
	alert("Account State set to Inactive"); 
	//удвляембизнес-партнера 
	oService.Delete("account", sAccountId); 
	alert("Account Deleted"); 

}

Использование

Весь сервис состоит из одного JavaScript-файла, который содержит конструктор для составления необходимых SOAP запросов. Для того чтобы подключить сервис в обычную веб-страницу необходимо использовать такую строчку:

<script type="text/javascript" src="CrmService.js"></script>

Она просто включает внешний js-файл в текущую страничку. В архиве вместе сервисом находится и html-страничка с подробными примерами.


Если же Вы хотите использовать его на форме CRM, то нужно действовать немного подругому. Рассмотрим это на примере:

  • Скачайте AscentiumCrmService и разархивируйте в папку <сайт CRM>/ISV
  • Далее откройте форму Бизнес-партнера не редактирование. На событие онлоад добавьте следующи код:
    function load_script (url) {
    	var x = new ActiveXObject("Msxml2.XMLHTTP");
    	x.open('GET', url, false);
    	x.send('');
    	eval(x.responseText);
    	var s = x.responseText.split(/\n/);
    	var r = /^(?:function|var)\s*([a-zA-Z_]+)/i;
    	for (var i = 0; i < s.length; i++) {
    		var m = r.exec(s[i]);
    		if (m != null) {
    			window[m[1]] = eval(m[1]);
    		}
    	}
    }
     
    load_script("/ISV/ascentiumcrmservice/CrmService.js");
     
    //создаем объект Ascentium_CrmService
    var oService = new Ascentium_CrmService("superfirma", "http://crm2008"); 
    
    //создаем объект
    var beAccount = new BusinessEntity("account"); 
    beAccount.attributes["name"] = "Ascentium123"; 
    beAccount.attributes["numberofemployees"] = 600.00; 
    
    var sAccountId = oService.Create(beAccount);
    

    В первой его части, мы подключаем внешний скрипт (наш сервис). Далее описанными выше способами, подключаемся к серверу http://crm2008 и организации superfirma. Затем создаем новую запись Бизнес-партнера с названием Ascentium123.

  • Далее на окне настройки формы перейдите Предварительный просмотр — Создать форму. Этого будет достаточно, чтобы сработал скрипт.
  • Будет создана новая запись. Все 🙂



Комментарии (8)
  • Евгений 20.10.2009

    Потрясающая штука, вот только одно не понятно, как использовать если CRM развернута по IFD схеме.

    В моем случае адрес сервера имеет такой формат http://..ru:5555, по сути домен второго уровня.

  • Евгений 20.10.2009

    Вопрос снимаю, разобрался. Я не правильно вызывал скрипт 🙂

  • Kipetcoff 20.10.2009

    Круто! Спасибо!

  • Oleg 20.10.2009

    Подскажите пожалуйста что надо указывать в скрипте если я использую IFD развертывание? Если я пишу var oService = new Ascentium_CrmService(«superfirma», «http://superfirma.crm.com.ua») то у меня постоянно зарашивается пароль при поптыке получения данных по fetch. При этом моя доменная учетная запись, которая используется в CRM не подходит

  • slivka_83 20.10.2009

    Точно не знаю, возможно этот фреймворк просто не предназначен для работы через IFD. Насколько я знаю там нужны для аутентификации какие-то CrmTicket, а для этого нужно обращаться к CrmDiscoveryService:
    http://msdn.microsoft.com/en-us/library/cc151054.aspx

  • axelcust 20.10.2009

    Пытаюсь создать Opportunity, не получается. Пишет неправильно передан customerid. Что делать?

  • axelcust 20.10.2009

    Долго гуглил, но нашел

    beContact.attributes["customerid"] = new CrmLookup("account", sAccountId);
    

    или

    beContact.attributes["customerid"] = new CrmLookup("contact", scontactId);
    
  • Borisvil 20.10.2009

    Видимо в какой-то момент сервис «переименовали» в Avanade поэтому если скачиваете свежую сборку, то надо делть вызов так:
    var oService = new Avanade_CrmService(«superfirma», «http://crm2008»);

*

code