cub-e.net

just coding...

Access a web page in Dynamics CRM with JavaScript Code

Access a web page in Dynamics CRM with JavaScript Code


In this article, I will see how to you can access a web page with JavaScript code in Microsoft Dynamics CRM. You can process about CRM entities or different action in that page.

In sample JavaScript code; we will take Guid of on Product and we will pass this Guid to '/QuoteCalcs/Calcs.aspx' page. This page will make some process and it will return a result that in xml tags that in <baris>. If the result is "null" or "false" JavaScript code will show an error alert to user.
If you want cancel the save process of CRM after this error, you must add
"event.returnValue = false;" code block after error code.
If there is a value in object that passed a area for show to user.

You will find the c# code after
JavaScript code.

This code will show how to you will access a web page with JavaScript;

var oProduct = document.crmForm.all.productid;
// we passed the Lookup object for access to Guid//
var aProduct = new Array();
/
/The lookup is an array on CRM Form. So we must access to
//this objects of array with an array object.
aProduct = oProduct .DataValue;
//Yeah, we found the Guid of Product
var sProductID = aProduct [0].id;
sProductID = encodeURIComponent(sProductID);
if (sProductID!=null)
{
 
//We create an Microsoft.XMLDOM object
 
var oXmlDoc = new ActiveXObject('Microsoft.XMLDOM');
  oXmlDoc.async =
false; // we don't want asenkron code process
 
var path = '/QuoteCalcs/Calcs.aspx?productid=' + sProductID ;
  /
/we passed the path of our web page to XMLDOM object
 
oXmlDoc.load(path);
 
we look for <baris> xml tag - Baris is my name:-)
 
var oNode = oXmlDoc.selectSingleNode('baris');
  if (oNode != null && oNode.text == 'false')
 {
   alert(
'an error');
 }

 
if (oNode != null && oNode.text != 'false')
 {
   //we set value to price area in CRM Form
 
crmForm.all.price.value = oNode.text;
 }
}

The real process will run on this aspx page. We takes the parameters that passed from our JavaScriptCode. We are looking for that parameters are empty. Later, We access to CRM Web Services with default credential. If you aren't  same domain with Microsoft Dynamics CRM you didn't access to CRM Web Service with default credential so you must access to Web Services with username and password. We will send a query that like "select * from filteredproduct where productid=ProductId" with using web services. The response from web services is a BussinessEntityCollection that is the base of all entities in Microsoft Dynamics CRM. We convert the BussinessEntityCollection  class to product class. and we are find our value what you want and we return the this value in <baris> xml tag.

<%@ Page Language='c#'%>
<%@ Import Namespace='CrmSdk' %>
<script runat='server'>
protected override void Render(HtmlTextWriter writer)
{
 Response.Clear();
 Response.ContentType = 'text/xml';
 string ProductID = Request.QueryString['ProductID'];
 string TYPE = Request.QueryString['Type'];
 if (ProductID != null &&
 ProductID !='null')
 {
  CrmService service = new CrmService();
  service.Credentials = System.Net.CredentialCache.DefaultCredentials;
  QueryByAttribute attributeQuery = new QueryByAttribute();
  attributeQuery.ColumnSet = new AllColumns();
  attributeQuery.Attributes = new string [] {'productid'};
  attributeQuery.Values = new string [] {ProductID};
  attributeQuery.EntityName = EntityName.product.ToString();
  RetrieveMultipleRequest retrieve = new RetrieveMultipleRequest();
  retrieve.Query = attributeQuery;
  RetrieveMultipleResponse retrieved = (RetrieveMultipleResponse)service.Execute(retrieve);
  if (retrieved.BusinessEntityCollection.BusinessEntities.Length > 0)
  {
   product prd = (product)retrieved.BusinessEntityCollection.BusinessEntities[0];
   if (prd.price!=null)
   {
     Response.Write('<baris>'+prd.price.Value.ToString()+'</baris>');
   }
   else
   {
     Response.Write('<baris>false</baris>');
   }
  }
  else
  {
    Response.Write('<baris>false</baris>');
  }
}
}

</script>

All of this process we have a JavaScript and a c#Script code. In c#Script code we import the CrmSdk dll to the page with import method. You can make your CrmSdk ( Microsoft.Crm.Sdk.Wsdl.dll ) dll. In below you can find how to make your CrmSdk dll. All of those process we must put our code to a server and we must create a virtual directory in CRM Web Site in IIS.

Note:

Creating a DLL for the Microsoft CRM Web Service

When developing your solution, you first need to general a WSDL that will provide you with all the classes and methods in Microsoft CRM 3.0. You should always start with a clean installation of Microsoft CRM 3.0, one that has had no customizations made. This way your code will not rely on information not found on a customer installation.

The steps below demonstrate how to generate this reference file for the SDK. You can use the same procedure to generate a reference file for the metadata Web service.

  1. Click Start, point to All Programs, point to Microsoft Visual Studio .NET 2003, point to Visual Studio .NET Tools, and then click Visual Studio .NET 2003 Command Prompt.
  2. At the command prompt, create the reference file, Microsoft.Crm.Sdk.Wsdl.cs, by typing the following command, using the URL of your server running Microsoft CRM:
    								wsdl.exe /out: Microsoft.Crm.Sdk.Wsdl.cs /namespace:CrmSdk http://<yourserver>/mscrmservices/2006/crmservice.asmx				
    				
  3. Generate a WSDL DLL that will be packaged with your solution using the reference created in step 2 using this command:
    								csc /t:library Microsoft.Crm.Sdk.Wsdl.cs				
    				

This DLL can now be packaged with your add-on.

Barış KANLICA
Yazılım Uzmanı – Software Specialist
brsk@e-kolay.net
www.cub-e.net

CRM içerisinden Java Script kullanarak web sayfası çağırmak

CRM içerisinden Java Script kullanarak web sayfası çağırmak

Makalemizde CRM içerisinden JavaScript kodu kullanılarak, bir web sayfasını çağırmak ve ona işlem yaptırdıktan sonra dönen sonuca göre JavaScript kodundaki işlemlere devam edilmesi işleminin nasıl yapılacağı anlatılacaktır.

Örnek JavaScript kodunda; ürün kartı üzerindeki ürünün Guidi(productid) lookup alanından alınan guidi '/QuoteCalcs/Calcs.aspx' sayfasına parametre olarak gönderiliyor. Sayfa gerekli işlemleri yaptiktan sonra sonucu <baris> xml taglari içerisinde döndürüyor. standart hata kontrollerinde eğer değer "null" veya "false" geliyorsa ekrana uyarı çıkartılıyor (kaydetme işlemi sırasında hata oluşursa kaydetmeyi iptal etmek için "event.returnValue = false;" kodu hata kodundan sonra eklenir), eğer değer var ise gelen değer ilgili alana aktarılıyor. Kodun devaminda çağrılan sayfanın c# script kodu gelmektedir.

var oProduct = document.crmForm.all.productid;
var aProduct = new Array();
aProduct = oProduct .DataValue;
var sProductID = aProduct [0].id;
sProductID = encodeURIComponent(sProductID);
if (sProductID!=null)
{
 var oXmlDoc = new ActiveXObject('Microsoft.XMLDOM');
 oXmlDoc.async = false;
 var path = '/QuoteCalcs/Calcs.aspx?productid=' + sProductID ;
 oXmlDoc.load(path);
 var oNode = oXmlDoc.selectSingleNode('baris');
 if (oNode != null && oNode.text == 'false')
{
  alert(Fiyat getirilirken hata oluştu.');
}
 if (oNode != null && oNode.text != 'false')
 {
  crmForm.all.price.value = oNode.text;
 }
}

c# script ile paremetre alip işlem yapmak; bu kod içerisinde gelen parametrenin boş olup olmadığı kontrol ediliyor. Sonrasında ise CRM'den standart veri çağırma algoritması işliyor. Oluşan sonuçlar ilgili xml tagları ile birleştirilerek dönmeleri sağlanıyor.

<%@ Page Language='c#'%>
<%@ Import Namespace='CrmSdk' %>
<script runat='server'>
protected override void Render(HtmlTextWriter writer)
{
Response.Clear();
Response.ContentType = 'text/xml';
string ProductID = Request.QueryString['ProductID'];
string TYPE = Request.QueryString['Type'];
if (ProductID != null &&
ProductID !='null')
{
CrmService service = new CrmService();
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
QueryByAttribute attributeQuery = new QueryByAttribute();
attributeQuery.ColumnSet = new AllColumns();
attributeQuery.Attributes = new string [] {'productid'};
attributeQuery.Values = new string [] {ProductID};
attributeQuery.EntityName = EntityName.product.ToString();
RetrieveMultipleRequest retrieve = new RetrieveMultipleRequest();
retrieve.Query = attributeQuery;
RetrieveMultipleResponse retrieved = (RetrieveMultipleResponse)service.Execute(retrieve);
if (retrieved.BusinessEntityCollection.BusinessEntities.Length > 0)
{
product prd = (product)retrieved.BusinessEntityCollection.BusinessEntities[0];
if (prd.price!=null)
{
Response.Write('<baris>'+prd.price.Value.ToString()+'</baris>');
}
else
{
Response.Write('<baris>false</baris>');
}
}
else
{
Response.Write('<baris>false</baris>');
}
}
</script>

Bu işlemler sonucunda elimizde bir JavaScript ve bir c# Script kodu oluştu. Notlar kısmında nasıl oluşturulacağı anlatılan Microsoft.Crm.Sdk.Wsdl.dll 'i ile birlikte bütün bunlar ilgili CRM website'inin altında bir 'virtual directory' oluşturacak şekilde yerleştirilir ve IIS restart edilir.

Not:


Microsoft.Crm.Sdk.Wsdl.dll 'ini oluşturmak;

1.    Başlat’a tıklayın, Tüm Programlar’a tıklayın, Microsoft Visual Studio .NET 2003 ‘e tıklayın, Visual Studio .NET Tools ‘a tıklayın, Visual Studio .NET 2003 Command Prompt ‘u tıklayarak açın.

2.    Command Prompt’un içinde referans dosyasını oluşturun, Microsoft.Crm.Sdk.Wsdl.cs, bu işlemi şağıdaki gibi yapabilirsiniz (URL’in sizin Microsoft CRM 3.0 server’ı işaret ettiğinden emin olun):


wsdl.exe /out:Microsoft.Crm.Sdk.Wsdl.cs /namespace:CrmSdk http://<yourserver>/mscrmservices/2006/crmservice.asmx

3 Command Prompt’un içinde, Microsoft.Crm.Sdk.Wsdl.dll ‘ini şu komutu yazarak oluşturabilirsiniz : csc /t:library Microsoft.Crm.Sdk.Wsdl.cs

Artık Microsoft.Crm.Sdk.Wsdl.dll elinizde.


Barış KANLICA

Yazılım Uzmanı – Software Specialist
brsk@e-kolay.net
www.cub-e.net