cub-e.net

just coding...

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

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

Önceki iki makalemde Microsoft CRM Web Servislerini ve Sql kullanarak veri sorgulama yöntemlerini örnekler vererek açıklamıştım. Son yöntemimiz ise FetcXML kullanarak CRM veri katmanına erişmek. Bu yöntem bir ad-hoc query yaratır ve bu query Microsoft CRM sistemi üzerindeki entityler üzerinde servisler vasıtasıyla icra edilir. Bu yöntemi QueryExpression (yani 1. makalede ele aldığım konu)'den farklı kılan taraf ise Fetch yönteminin bize Microsoft CRM BusinessEntity sinifindan bir XML döndürmesidir. 

FetchXML'in ayrı bir sorgulama dili olduğu ve kendi yazım kuralları olduğu unutulmamalıdır.

Bu yöntemi kullanarak veri okuyabilme işlemi sırasında sorguyu çağıran kişinin sistem erişim hakları (access rights) üzerinde Read privilege yetkisi olması gerekmektedir.

Biçim

			[Visual Basic]Public Function Fetch(  ByVal fetchXml As String) As String
			
			[C#]public string Fetch(  string  fetchXml);
			
			[JScript]public function Fetch(  fetchXml : String) : String;
			
Parametreler fetchXml : İcra edilecek Fetch query.
Dönen Değer String türünde içerisinde sorgu sonucunu bulunduran XML döner.
Sorgu İfadeleri
Koşul
Koşul İfadesi Değer
equals x eq x
does not equal x ne x
is greater than x gt x
is greater than or equal to x ge x
is less than x lt x
is less than or equal to x le x
begins with x like x%
does not begin with x not-like x%
ends with x like %x
does not end with x not-like %x
contains x like %x%
does not contain x not-like %x%
exists not-null  
does not exist null  
anytime not-null  
yesterday yesterday  
today today  
tomorrow tomorrow  
in next 7 days next-seven-days  
in last 7 days last-seven-days  
next week next-week  
last week last-week  
this week this-week  
this month this-month  
last month last-month  
next month next-month  
this year this-year  
next year next-year  
last year last-year  
on x on x
on or after x on-or-after x
on or before x on-or-before x
in between between  
not between not-between  
in in  
not in not-in  
equals user id eq-userid  
does not equal user id ne-userid  
equals business id eq-businessid  
does not equal business id ne-businessid  

Örnek Uygulama :
Yukarıdaki tabloda sorgu ifadeleri kısmında "Koşul İfadesi" kısmında yazan değerler bizim normal sql cümlesinde kullandığımız ifadelere benzemektedir. Tek fark "=","<",">" gibi ifadelerin yerlerine "eq","gt","lt" gibi text bazlı ifadelerin gelmiş olmasıdır. Aşağıdaki örnek kodda ben sql'den bildiğimiz "like" operatörünü kullanacağım.
Herzaman olduğu gibi şimdi de kod üzerinde açıklama yönetimi tercih ediyorum ki kodu uygulamalarınıza kopyalayıp yapıştırdığınızda açıklamalar da beraberinde kodun içinde olsun diye. Unutulmamalıdır ki buradaki uygulamayı çalıştırabilmeniz için Veri Sorgulama Yöntemleri-1 isimli makalemde yer alan CRM Web Servisinin eklenmesi adımının yapılmış olması gerekmektedir.

private
void btnQueryWithFetchXML_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; )
       
       
// Geri donecek butun Contact'lardan Contactid ve FullName degerlerini istiyoruz
        // Sehir ismi "Istanbul" olanlar cagiriyoruz.
       
string fetch = "<fetch mapping='logical'>"+
                                       
"<entity name='contact'>"+
                                           
"<attribute name='contactid'/>"+
                                           
"<attribute name='fullname'/>"+
                                               
"<filter type='and'>"+
                                                   
"<condition attribute='address1_city' operator='like' value='İstanbul'/>"+
                                               
"</filter>"+
                                       
"</entity>"+
                               
"</fetch>";
       
// Service'e gonderiyoruz
       
string result = service.Fetch(fetch);
       
MessageBox.Show(result);
        // Gelen result'u XML objeleri ile parse edebiliriz.
    }
   
// 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);
    }
}

Microsoft CRM 3.0'dan veri sorgulama yöntemleri isimli makalemizin sonuna ulaştık. Umarım bu konuları detaylı açıklayabilmişimdir. Bana her türlü sorunda mail adresimden ulaşabilirsiniz. Yeni bir makalede görüşmek üzere.

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 -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