cub-e.net

just coding...

Microsoft Dynamics CRM 3.0 ‘dan Veri Sorgulama Yöntemleri -2(Sql Kullanarak Veritabanına Erişim)

Microsoft Dynamics CRM 3.0 ‘dan Veri Sorgulama Yöntemleri -2(Sql Kullanarak Veritabanına Erişim)

Bir önceki makalemde Microsoft CRM Web Servislerini kullanarak veri sorgulama yöntemine bir örnek vermiştim. Şimdi ise Microsoft CRM’in veritabanına bağlanarak veri sorgulayacağız. Tabii bu sorgulama işlemi biraz programlama bilen bir kişinin yapabileceği kadar basit ve standart bir işlem. Burada size bir sql cümlesiyle nasıl sorgulama yapılırın ötesinde CRM’in veritabanı yapısı hakkında bilgi vermenin daha faydalı olacağını düşünüyorum.

Microsoft CRM veritabanında bilmeniz gerekenler;

  1. Bizim üzerinde alan açmamıza izin verdiği bütün entitylerin(CRM tablo nesnesi) çift tablodan oluştuğudur.
  2. CRM standart kurulumunda bizim onun üzerine açtığımız bütün alanların ve tabloların başına “new_” ibaresini koyar.
  3.  Veri sorgulamakta direkt tablolardan veri sorgulamak Microsoft tarafından yasaktır.
  4.  Bu yüzden Microsoft programlarımızda ve raporlarımızda “FilteredView” ismi verilen güvenlik altyapısını içerisinde bulunduran viewları kullanmamızı ister.
  5. Veritabanında relation’lar(ilişkiler) için Guid adı verilen unique(tekil) bir tanımlayıcı kullanılır.
  6. Her ne şartla olursa olsun veritabanına direkt veri yazmak Microsoft tarafından unsupported (sisteminize zarar geldiğinde Microsoft tarafından destek alamayacağınız durum) unsur olarak değerlendirilir. Veri yazmak için web servislerini kullanmak gerekmektedir

Burada sanıyorum açıklanmaya en ihtiyaç duyulan madde 1. Madde. Account(Firma) kartını ele alarak açıklayayım; CRM’in Microsoft tarafından açılmış “name”,”accountnumber” gibi alanları “accountbase” tablosu üzerinde yer alırken, bizim vergi_numarası diye bir alanı açtığımızı varsayalım. Bu alan “new_vergi_numarasi” şeklinde “AccountExtensionBase” tablosu içinde açılacaktır. Bu iki tablo birbirine “AccountId” isimli alandaki Guid ile bağlanacaktır. Bu örnekteki yapı bizim alan açmamıza izin verilen tablolarda buna benzer şekilde olacaktır.
Eğer filteredview kullanacaksanız bu yapının farkında bile olmayacaksınız. Çünkü “filteredview”lar bu ilgili tabloları birbirlerine join yaparak(yani birleştirerek) getirmektedir. “Filteredview”’lar bize, güvenlik,silinmiş ve pasife çekilmiş kayıtları göstermeme gibi bizim uğraşarak yapmamız gereken birçok şeyi içerisinde yapmış bir veri sorgulama ortamı sunmaktadırlar.
Bir filteredview'in yapisini incelerseniz en az 50 tablo ile joinli oldugunu görebilirsiniz; Aşağıdaki resimde FilteredAccount isimli view'in yapisinin bir kısmını bulabilirsiniz (Daha resme sığmayan en az 30 tablo var resmin altında)



Ayrica Özelleştirilebilir tabloların Extension isimli ek tablolarını veritabanında görebilirsiniz.



Benim oluşturduğum test uygulamasının “Veri Çek (Using a Sql Data Access)” düğmesinin altında yer alan kod; (Yine daha kolay olması için kod makale bundan sonra kod üzerindeki açıklamalarla devam edecek)

private
void btnQueryOnSql_Click(object sender, EventArgs e)
{
   
//sql server'a baglanmak icin gerekli olan baglanti cumlesini olusturuyoruz.
   
string ConnectionString = "data source=**sql_server**;database=**veritabani_adi**;user=**kullanici_adi**;password=**sifre**;";
   
//Baglanti cumlesini baglanti nesnemize parametre olarak vererek baglanti nesnemizi olusturuyoruz
   
SqlConnection myConnection = new SqlConnection(ConnectionString);
    try
   
{
       
//sql server baglantisini aciyoruz.
        myConnection.Open();
       
//veri cekmekte kullanacagimiz sql cumlesini olusturuyoruz.
       
string SQLstring = "select fullname, contactid from filteredcontact where address1_city like stanbul";
       
//sql cumlesini ve baglantimizi vererek bir veri cekme arabirimi olusturuyoruz.
       
SqlDataAdapter myDataAdapter = new SqlDataAdapter(SQLstring , myConnection);
       
//Verileri icerisinde barindiracak olan nesnemizi olusturuyoruz.
       
DataSet myDataSet = new DataSet();
       
//Verileri dolduruyoruz
        myDataAdapter.Fill(myDataSet);
       
if (myDataSet != null)
        {
               
if (myDataSet.Tables[0].Rows.Count > 0)
                {
                   
//Verileri gostermesi icin grdi'e veriyoruz.
                    GridView.DataSource = myDataSet.Tables[0];
                }
       
        else
       
        {
                   
throw new Exception("DataSet nesnesi kayt iermiyor.");
                }
        }
       
else
            throw
new Exception("DataSet nesnesi null geldi");
    }
   
catch (Exception ex)
    {
       
MessageBox.Show(ex.Message);
    }
   
finally
    {
       
//Baglanti acik ise kapatiyoruz.
       
if (ConnectionState.Open == myConnection.State)
        myConnection.Close();
    }
}

Bir makalemizin daha sonuna geldik. Unutmayın veri sorgulama yöntemleri ile ilgili 1 makale daha var sırada.

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

Microsoft Dynamics CRM 3.0 ‘dan Veri Sorgulama Yöntemleri -1 (Web Servisleri)

Microsoft Dynamics CRM 3.0 ‘dan Veri Sorgulama Yöntemleri -1 (Web Servisleri)

Microsoft CRM verilerini okumak isimli bir yazı dizisi oluşturmaya karar verdim. Bunun nedeni ise CRM ile uğraşan pek çok insanla tanışmam ve hepsinin farklı bir yol izlediğini görmem. Hepsi bir,iki yol biliyor ama çoğu eksik veya yanlış bilgilerle bu işi yapıyorlar. Bütün yöntemleri biraraya getirip anlatmak en iyisi olacak diye düşündüm.

Microsoft CRM üzerinde veri sorgulaması yapmanın üç yolu bulunmakta ve ben bu üç yolu, bu yazı dizisinde örnekleriyle anlatacağım. Bu üç yol sırasıyla, Web Servislerini kullanmak, Sql kullanarak veritabanına erişim ve FetchXML kullanmak. Yazımızın birinci bölümü web servisleri ile başlıyor;

Microsoft CRM, bizlere üzerinde uygulama geliştirmek için çok iyi bir platform mimarisi sunuyor. Bu mimarinin neredeyse temel yapıtaşı konumunda olan WebServis’leri ise bize özellikle veri yazarken büyük kolaylıklar sağlasa da veri okurken bazen karışık olabiliyor. Web Servisleri class(sınıf) mimarisinde olduğundan nesne paylaşımına dayalı bir altyapı sunuyor. Bu doğru kullanıldığında, bize, program yazarken uzun uzun attribute ve property hazırlamak derdinden kurtarıyor.

Microsoft CRM’in 2 adet temel Web Servisi bulunmakta;

  1. CRM Service : istediğiniz entity üzerinde Create(Oluşturma),Update(Güncelleme) , Delete(Silme) gibi işlemleri yapmanızı sağlıyor. Adresi;
    http://<yourservername(:port)>/mscrmservices/2006/crmservice.asmx
  2. Metadata Service : CRM’in entity ve picklist mimarisi gibi metadata veritabanında bulunan veriler üzerinde yine Create(Oluşturma),Update(Güncelleme) ,Delete(Silme) gibi işlemleri yapmanızı sağlıyor. Metadata verisi içerisinde bir picklist(yani combobox-dropdownbox)’in içeriği, bir alanın türü gibi sistem üzerinde kullandığımız nesnelere yönelik bilgileri tutmaktadır. Adresi;
    http://<yourservername(:port)>/mscrmservices/2006/metadataservice.asmx

Web Servisini Projemize Eklemek :



Visual Studio’da açtığımız uygulamamızın adı üzerinde sağ tuşa tıklayarak getirdiğimiz menüde aşağıdaki gibi “Add Web Reference”’a tıklıyoruz.

Açılan pencereye eklemek istediğimiz servisin url’ini yazıyoruz ve “go” düğmesine tıklıyoruz.





Servis credential yani kimlik doğrulamak için bizden kullanıcı adı ve şifre isteyecek. Bunu geçtikten sonra “Web reference name”’e servise verecegimiz ismi yazıyoruz. Burada ben “MyService” ismini veriyorum. “Add Reference” düğmesine tıklıyoruz.Artık servisimizi projemize eklemiş durumdayız.
XML Web Servisleri hakkinda daha fazla bilgi almak ve kendi web servislerinizi yazmak istiyorsaniz aşağıdaki linklerden gerekli bilgiye ulaşabilirsiniz;

http://www.yazgelistir.com/Makaleler/makaleler.aspx?KatId=1000000009&Kat=XML%20Web%20Servisleri

http://www.codeproject.com/cs/webservices/myservice.asp

Kod Yazmaya Başlamak:

Servisimizi ekledikten sonra kod yazma işlemine geçebiliriz. Örnek kod bize CRM Servislerini kullanarak “ select fullname, contactid from filteredcontact where address1_city like ‘İstanbul’ ’” sorgusunu nasıl çekebileceğimizi gösterecek. Uygulamamızın ekran görüntüsü aşağıdaki gibi olacak ve veri çektikten sonra(Veri Çek (Query Expression) düğmesine bastıktan sonra) bize mesaj kutusu içinde istediğimiz veriyi gösterecek

(Aşağıdaki örnek kodu kendi projeniz üzerine yapıştıbileceğinizi düşündüğümden makalemin bundan sonraki kısmına kod üzerindeki not alanlarında devam ediyorum.)
Düğmenin arkasında yazan kodlar ve bunların açıklamalaı ise aşağıdaki gibidir; (CRM nesnelerine kolayca erişmek için en tepeye “ using TestApplication.MyService; ” kodunu eklemeyi unutmuyoruz tabii ki) (TestApplication burada benim uygulamamın adı siz kendi uygulamanızın adını yazmalısınız bunun yerine)


private
void btnRetrieveData_Click(object sender, EventArgs e)
{
   
try
    {
       
// CRM Servis'ini cagiriyoruz
       
CrmService service = new CrmService();

       
// servise network'te kim oldugumuzu soyluyoruz. (Eger CRM Server'i ile ayni domainde degilseniz
        // bunu yapmak zorundasiniz yoksa "The request failed with HTTP status 401: Unauthorized." hatasini alirsiniz)
        System.Net.NetworkCredential MyCredential = new System.Net.NetworkCredential();
        MyCredential.UserName =
""; // Domain Kullanici Adi
        MyCredential.Password =
""; //Domain Kullanicisinin Sifresi
        MyCredential.Domain =
""; //Domain Adi
        service.Credentials = MyCredential;
       
// Eger crm server ile ayni domainde iseniz ve sizin crm'de bir rolunuz varsa asagida parantezler icerisinde
        // belirttigim komutu yukaridaki 5 satir yerine kullanabilirsiniz
        // ( service.Credentials = System.Net.CredentialCache.DefaultCredentials; )
        // istedigimiz sutunlari getirmemizi saglayacak olan ColumnSet nesnemizi olusturuyoruz.

        ColumnSet cols = new ColumnSet();
       
// ColumnSet nesnemize geri dondurmek istedigimiz sutunlarin adini veriyoruz.

        cols.Attributes =
new string[] { "fullname", "contactid" };
       
// ConditionExpression nesnemizi olusturuyoruz.

       
ConditionExpression condition = new ConditionExpression();
       
// Bize donecek olan contact'lar icerisinde adresinin sehri stanbul olanlari filtreliyoruz.

        condition.AttributeName =
"address1_city";
        condition.Operator =
ConditionOperator.Like;
        condition.Values =
new string[] { "stanbul" };

       
// FilterExpression nesnemizi olusturuyoruz.
       
FilterExpression filter = new FilterExpression();
       

        // Yukarida olusturdugumuz kosul filtresini FilterExpression'a veriyoruz.
        filter.FilterOperator = LogicalOperator.And;
        filter.Conditions =
new ConditionExpression[] { condition };

       
// QueryExpression nesnemizi olusturuyoruz.
       
QueryExpression query = new QueryExpression();

       
// Yukarida olusturdugumuz filtremizi ve donmesini istedigimiz sutunlari QueryExpression'a veriyoruz.
        query.EntityName = EntityName.contact.ToString();
        query.ColumnSet = cols;
        query.Criteria = filter;

       
// Bu kosula uyan contact'lari sistemde sorgulatiyoruz.
       
BusinessEntityCollection contacts = service.RetrieveMultiple(query);
       
if (contacts != null)
           
if (contacts.BusinessEntities.Length > 0)
            {
           
    //BusinessEntityCollection array'indan sorgulama sonucunda donen ilk degeri aliyoruz.
                //Ve bu ilk degeri contact sinifina ceviriyoruz.
               
contact myContact = (contact)contacts.BusinessEntities[0];
               
if (myContact != null)
                {
                   
//artik elimizde olan contact sinifi ile yukarida bize donmesini istedigimiz sutunlarin
                    //iceriklerini alabiliriz.
                   
MessageBox.Show("ad-soyad:" + myContact.fullname.ToString() + " id:" + myContact.contactid.Value.ToString());
                 }
            }
    }
    // Soap yani Web Servisi hatalarini yakalamak icin ilgili Exception sinifimiz ekliyoruz.
   
catch (System.Web.Services.Protocols.SoapException ex)
    {
       
MessageBox.Show(ex.Message + " " + ex.Detail.InnerText);
    }
   
// Soap disindaki Standart hatalari yakalamak icin Exception'i da kodumuza ekliyoruz.
   
catch (Exception ex)
    {
       
MessageBox.Show(ex.Message);
    }
}


Programımızı çalıştırdığımızda bize istediğimiz bilgiyi sorgulayıp getirecektir. Bir makalemizin daha sonuna geldik. Unutmayın veri sorgulama yöntemleri ile ilgili 2 makale daha var sırada.

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

  

Show navigation bar item in IFrame in Microsoft CRM

Show navigation bar item in IFrame in Microsoft CRM

We don't make anything without Navigation Bar in CRM. In default, CRM haven't a setting about showing their pages in a IFrame. But we can change this event and we can more effective a usage area in CRM Form. Specially sales persons don't want to click to lot of things and they want see the result of an action. So in this article we will learn how to show associated activities in centre of Contact card. We have a way that have two step. In first step, we will place a IFrame in Contact Card. In second step we will place a little JavaScript code for IFrame that we had placed. Let start;

a) IFrame :

"Settings" -> "Customizations" -> "Customize Entities" after this steps in CRM, we find the Contact card and we open this card. We select the "Forms and Views" in navigation bar at left and we clicked the Form.
Where you want place the your activities screen you select the interested tab and click the "Add IFrame" button. A window will be opened;

  1. set the Name "HistoryFrame",
  2. set the URL "about:blank",
  3. we select the "Pass record object-type code and unique identifier as parameters",
  4. we unselect the "Restrict cross-frame scripting"

The first step will be completed when we press the ok. Let the show second step;

b) JavaScript :

We click the "Form Properties" in same screen. We click the "OnLoad" on opened window. We replace the code that below. We click the buttons "ok" and "Save Form and Close".

function GetFrameSource(tabSet)
{
   
if (crmForm.ObjectId != null)
    {
       
var oId = crmForm.ObjectId;
       
var oType = crmForm.ObjectTypeCode;
       
var security = crmFormSubmit.crmFormSubmitSecurity.value;
       
return "areas.aspx?oId=" + oId + "&oType=" + oType + "&security=" + security + "&tabSet=" + tabSet;
    }
   
else
    {
       
return "about:blank";
    }
}

crmForm.all.IFRAME_HistoryFrame.src = GetFrameSource(
"areaActivityHistory");

We click to "Publish" that in the "actions" menu. We will see the activity history of contact when we open a contact card.

I hope it will done. Regards.

Barış KANLICA
Software Specialist
brsk@e-kolay.net
www.cub-e.net



 

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

Microsoft CRM 3.0 Navigation Bar Öğelerini Form İçinde IFrame İle Göstermek

Microsoft CRM 3.0 Navigation Bar Öğelerini Form İçinde IFrame İle Göstermek

CRM'le çalışırken sol taraftaki Navigation Bar'ı kullanmadan neredeyse hiçbirşey yapamayız. Bunun nedeni ise CRM'de Form üzerinde Navigation Bar içeriğinin default ayarlarda gelmemiyor oluşudur. Fakat küçük bir kod yardımıyla CRM Formlarımızı daha etkin kullanılabilir hale getirebiliriz. Bu makalede Contact (Kişi) kartı üzerine Activities(Aktiviteler)'ler öğesini yerleştirmeyi göreceğiz. Böylece CRM kullanan kişileri birkaç fazla tıklama yapmaktan kurtaracağız. Bunun içi iki adımlı bir yol izleyecegiz. Birinci adımda Formun üzerine IFrame yerleştireceğiz. İkinci adımda ise JavaScript kodu ile dinamik bir şekilde her açılışta IFrame'in adresini değiştirerek açtığımız kart ile ilgili aktivitelerin gelmesini sağlayacağız. Başlayalım;

a) IFrame :

CRM içerisinde; Settings (Ayarlar) -> Customizations (Özelleştirmeler) -> Customize Entities (Varlıkları Özelleştir) adımlarından sonra Contact (İlgili Kişi)  kartına ulaşıyoruz ve bu kartı açıyoruz. Sol taraftaki menüden Forms and Views (Formlar ve Görünümler)'e tıklıyoruz. Formlar öğesini açıyoruz. Aktiviler IFrame'imizi nereye yerleştirmek istiyorsak o tabın altında iken sağ taraftan Add IFrame (IFrame Ekle) yazısına tıklıyoruz. Açılan pencerede;

  1. İsim (Name) kısmına; HistoryFrame yazıyoruz,
  2. URL kısmına; "about:blank" yazıyoruz,
  3. Pass record object-type code and unique identifier as parameters (Kayıt nesne türünü ve tanıtıyıcıyı parametre olarak geçir) kutusunu işaretliyoruz,
  4. Restrict cross-frame scripting  (Komut dosyasını çerçeveler arasında kısıtla) kutusundaki işareti kaldırıyoruz.

Daha sonra tamam'a basıyoruz. İşin birinci kısmı tamamlandı. İkinci kısımda ise JavaScript kodunu yerleştirmek var.

b) JavaScript :

Yine aynı Form üzerinde iken Form Properties (Form Özellikleri) yazısına tıklıyoruz. Açılan küçük pencereden OnLoad (Yüklendiğinde) yazısına çift tıklıyoruz. Açılan pencereye aşağıdaki kodu yerleştirip Tamam'a basıyoruz ve Formu Kaydet ve Kapat düğmesine tıklıyoruz.

function GetFrameSource(tabSet)
{
   
if (crmForm.ObjectId != null)
    {
       
var oId = crmForm.ObjectId;
       
var oType = crmForm.ObjectTypeCode;
       
var security = crmFormSubmit.crmFormSubmitSecurity.value;
       
return "areas.aspx?oId=" + oId + "&oType=" + oType + "&security=" + security + "&tabSet=" + tabSet;
    }
   
else
    {
       
return "about:blank";
    }
}

crmForm.all.IFRAME_HistoryFrame.src = GetFrameSource(
"areaActivityHistory");

Daha sonra Actions (Eylemler) menüsünden Publish (Yayımla) düğmesine tıklıyoruz. Şimdi Contact kartımıza gittiğimizde aşağıdaki görüntü gibi aktivitelerimizi görmeye başlayacağız.

Bu makale de burada biter. Umarım faydalı olmuştur. Hoşçakalın.

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

CRM Metadata Browser

Microsoft Dynamics CRM 3.0 Metadata Browser

Microsoft’un MSDN sitesinde bile Metadata Browser birkaç kelime ile özetlenmiş. Ama bu onun kullanışsız bir araç olduğu anlamına gelmesin. Bu makalemizde Microsoft Dynamics CRM 3.0'ın derinliklerinde gizli kalmış bir aracı ortaya çıkartıyoruz.

Metadata Browser hakkında çok fazla söylenecek bir şey yok. Ama işin ilginç yanı söylenecek çok fazla kelime olmamasına karşın bununla çok tezat bir şekilde çok kullanışlı bir araç. Microsoft’un MSDN sitesinde bile Metadata Browser birkaç kelime ile özetlenmiş (MSDN adresi : http://msdn2.microsoft.com/EN-US/library/aa682837.aspx)
CRM’in 1.2 versiyonunda statik olan bu araç 3.0 versiyonu ile birlikte Dinamik hale geldi ve canlı veri okuma özelliği kazandı.
Bu küçük, kolay kullanımlı arayüze sahip uygulama veritabanı yapısını anlamanıza yarıyor.
Metadata Browser dokümantasyon yapmak istediğinizde veya program yazarken bir şeyleri aradığınızda işlerinizi gerçekten kolaylaştırıyor. Meadata Browser seçilen entity’nin alanlarını, bu alanların uzunluğunu, grid’de yer alıp almadığını, create,update,delete metodlarını destekleyip desteklemediği gibi bir çok bilgiyi kullanıcıya sunuyor. Bunun yanı sıra entity’nin ilişkilerini de gösteriyor.
Metadata bilgisine şöyle ulaşabilirsiniz :
http://crmserverin_ip_si ( :varsa port)/sdk/list.aspx
Standart CRM kurulumu ile birlikte geliyor ve sizin ona erişmek için yapmanız gereken tek şey adresini yazmak oluyor.
Asağıdaki ekran görüntülerinde sırasıyla;

  1.  Metadata Browser’ın ilk açılıştaki ekran görüntüsünü (entitylerin sıralandığı bir yapı ki buarada en güzel özellik bizim açtığımız entity’leri de desteklemesi) ,
  2.  Contact entity’sinin alanlarını ve her bir alanın özelliğini,
  3.  Entity’nin ilişkili olduğu diğer entity’lerin yapısını göreceksiniz.
    Tekrar grüşmek dileğiyle. 



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