cub-e.net

just coding...

Microsoft Dynamics CRM 2011 Scripting Cookbook

Bugün sizlere bir kitap tanıtacağım. Umarım sizler için faydalı olur.

"Microsoft Dynamics CRM 2011 Scripting Cookbook" okuyucuya özelleştirme mimarisi, en basit konulardan başlayarak özel alanların ve türlerin oluşturulması, formlar ile çalışma, ileri düzeyde script yazma konuları ve kodu debug etme, yeni formlar ve ribbonlar dizayn etme, script kütüphanlerinin kullanımı ve dış veri kaynakları ile entegrasyon dahil olmak üzere özelleştirme çerçevisinde her konuyu örnekleriyle açıklayacak anlatmaktadır.



Kitabı bitirdiğinizde kendi özelleştirmenizi nasıl yapacağınızı kavramış ve bunları artık nasıl bir çözüm(solution) haline getirebileceğiniz anlatılmaktadır.

Bu kitap iş analizcileri ve kod geliştiricileri için gerçekten yeterli bir kaynak. Konular gerçekten güzel bir mantık sırasında anlatılmış ve açıklanmış. Örnekler de gayet açıklayıcı ve doyurucu bir şekilde konuları pekiştirmiş.

Dynamics CRM konusunda piyasada gerçekten önemli bir yere geçecek faydalı bir eser olmuş. Nicolae Tarla'yı tebrik etmek gerekli.

Kitabın kağıt haricinde her türlü cihaz için dijital baskıları da mevcut.

Kitaba amazon.com üzerinden bu adresten ulaşabilirsiniz : http://www.amazon.com/Microsoft-Dynamics-2011-Scripting-Cookbook/dp/1849688826/ref=tmm_pap_title_0

Ayrıca yayınevi üzerinden de ulaşabilirsiniz : http://www.packtpub.com/microsoft-dynamics-crm-2011-scripting-cookbook/book

 

Dynamics CRM 4.0 SDK ver. 4.0.4 (CRM SDK Versiyon 4.0.4 hazır)

Microsoft Dynamics CRM 4.0 SDK Versiyon 4.0.4 indirilmeye hazır. Bu versiyon çok fazla yenilik ve güncelleştirme içermekte. Detayları aşağıda bulabilirsiniz.

---

Version 4.0.4 of the Microsoft Dynamics CRM 4.0 SDK is now available for download! This version contains lots of great new and updated information:

· Offline Plug-in Security  - New information about the additional security restriction for an offline plug-in, which requires that a registry key named after the public key token of the plug-in assembly be added to the system registry. The online/offline plug-in sample code and walkthrough was updated too.

· Plug-in Constructor - Added a topic explaining how to write a constructor for a plug-in that accepts parameters. These strings can be used to pass information to the plug-in at run time.

· Privileges by Message – The appendix showing the required privileges for each message has been updated. There are a few outstanding messages that will be completed in the next SDK release.

· Outlook Sample Code and Programming Reference – The reference topics for the Microsoft.Crm.Outlook.Sdk assembly have been completed. Added new sample code that interacts with Microsoft Dynamics CRM for Microsoft Office Outlook using this assembly.

· Using the Discovery Service in Microsoft Dynamics CRM Live - Added a topic to show how to get the Web reference for Microsoft Dynamics CRM Live.

· SiteMap Sample Code - Added step-by-step instructions for how to change the label text in the navigation pane.

· Scripting Sample Code - Added a new scripting sample that allows you to control which users can update data in a field.

· Report Writers Guide - Added a new topics on linking reports, managing reports offline and new information about publishing reports.

· Other Sample Code 

    • How to Send a Bulk E-mail and Monitor the System Job
    • How to Start an Asynchronous Bulk Delete Job and Review Results
    • Using the BackgroundSendEmail Message
    • Using the QualifyMembersList Message

The online version of the SDK will be available within a few days, so check back to the Microsoft Dynamics CRM Developer Center later this week.

Core Entity mi Dynamic Entity mi? ( 2.Bölüm Veri Yazma)

Dynamic Entity'ler ile ilgili birinci makalemiz veri sorgulama idi. İkinci makalede ise veri yazma yöntemlerini göreceğiz. Burada dynamic entity'i anlatmadan önce core entity yöntemiyle veri yazmaya değineceğim. Böylece aradaki farkları görmemiz daha kolay olacaktır.

Konuyu hatırarsak; bir web servisini add web reference diyerek projenize dahil ettiğinizde visual studio arka tarafta bir bir class mimarisi oluşturur ve siz o mimariyi kullanırsınız. Eğer core enitity kullanırsanız, bu class özelleştirme nedeniyle her firmada farklı bir hal alabilir ve kodu yeniden derlemize neden olur. İşte bundan kurtularak çalışma zamanında nesneler yaratıp bunlara değer atamayı göreceğiz.

Hatırlarsanız bir örnek uygulamamız vardı. Senaryo şöyle idi; bir web sitemiz olacak ve bu web sitemize insanlar ad,soyad,e-mail,ilçe ve il bilgilerini yazarak kayıt olacaklar. Fakat biz forma girilen e-mail'i kullanarak veritabanımızda bu kişinin kayıtlı olup olmadığını kontrol edeceğiz eğer yoksa müşteri adayı (lead) olarak bu kişiyi Microsoft Dynamics CRM'e kaydedeceğiz.

Kaydet düğmesinin arkasında aşağıdaki kod yer almakta.
Mail adresinin yazılıp yazılmadığına bakıyoruz. Eğer yazıldı ise
dynamicRetrieve metodu ile bu mailinde birilerinin sistemde olup olmadığına bakıyoruz.



/// <summary>
///
Kaydet Dugmesi Click Olayi
/// </summary>
///
<param name="sender"></param>
///
<param name="e"></param>
protected void btnSave_Click(object sender, EventArgs e)
{
   
if (txtMail.Text != "")
    {
       
if (!dynamicRetrieve(txtMail.Text))
        {
           
if (coreCreate())
                lblMessage.Text =
"başarıyla oluşturuldu";
           
if (dynamicCreate())
                lblMessage.Text =
"başarıyla oluşturuldu";
        }
    }
}

Birinci makalede e-mail adresinden kontrol etmeyi gördük. Kontrol sonucunda e-mail adresinin sistemde bulunmadığını ve oluşturmamız gerektiğini düşünelim.


1.Core Entity

Burada önemli 3 adım bulunmakta.
1. web servisteki lead sınıfını çağırıyoruz
        lead myLead = new lead();
2. class içerisindeki proprty'e ilgili değeri atıyoruz
        myLead.firstname = txtName.Text.ToString();
3. içersisini veri ile doldurduğumuz class'ı servise oluşturması için veriyoruz.
        MyService.Create(myLead);

/// <summary>
///
coreCreate metdodu Core Entity kavramiyla lead olusturmayi bize gosterecek
/// </summary>
private bool coreCreate()
{
   
try
   
{
       
// CRM Servis'ini cagiriyoruz
       
CrmService MyService = service();
       
//lead sınıfımız aryoruz ve üretiyoruz.
       
lead myLead = new lead();
       
       
//textbox'ın değer içerip içermediğine bakıyoruz.
       
if (txtName.Text != string.Empty)
           
//eğer değer içeriyor ise class içerisindeki ilgili attribute a değerini veriyoruz.
           
myLead.firstname = txtName.Text.ToString();
       
if (txtSurname.Text != string.Empty)
            myLead.lastname = txtSurname.Text.ToString();
       
if (txtMail.Text != string.Empty)
            myLead.emailaddress1 = txtMail.Text.ToString();
       
if (txtState.Text != string.Empty)
            myLead.address1_stateorprovince = txtState.Text.ToString();
       
if (txtCity.Text != string.Empty)
            myLead.address1_city = txtCity.Text.ToString();
       

        //Son olarak da değer atamalarımız bitince servisin Create metodu ile
        //lead imizi oluşturuyoruz.
       
MyService.Create(myLead);
       
return true;
    }
   
catch (Exception ex)
    {
        HandleException(ex);

        return false;
    }
}

2. Dynamic Entity

Eğer bu oluşturma işlemini dynamic entity özelliğini kullanarak yapmış olsaydık kod bu sefer aşağıdaki gibi olacaktı.
Ama önce ne yaptığımızı anlatalım;

1. CRM Servis'ini cagiriyoruz. Burada service(); benim yazdığım bir metod ve crm servisini oluşturuyor.

       
CrmService MyService = service();
2. DynamicEntity nesnesini yaratyoruz

        DynamicEntity leadEntity = new DynamicEntity();
3. Entity ismini veriyoruz.

       
leadEntity.Name = EntityName.lead.ToString();
4. Eger deger iceriyorsa; Property nesnemizi cagiriyoruz ve adın ve degeri veriyoruz. Boylece calisma aninda bir class'in icerisindeki bir nesneye deger vermis oluyoruz.

           
StringProperty firstname = new StringProperty();
            firstname.Name =
"firstname";
            firstname.Value = txtName.Text;

Tabii burada yeri gelmişken söz etmekte fayda var CRM sadece string türünde bir değişken biçimi ile çalışmıyor. Yukarıdaki örnek "StringProperty" classından bir değişken türeterek string oluşturmaya yarıyor. Diğer değişken türleri (sınıflar) ise aşağıdaki listede yer almakta;


Sınıf Adı Microsoft Dynamics CRM Attribute Türü
CrmBooleanProperty CrmBoolean
CrmDateTimeProperty CrmDateTime
CrmDecimalProperty CrmDecimal
CrmFloatProperty CrmFloat
CrmMoneyProperty CrmMoney
CrmNumberProperty CrmNumber
CustomerProperty Customer
DynamicEntity N/A
DynamicEntityArrayProperty N/A
EntityNameReferenceProperty EntityNameReference
KeyProperty Key
LookupProperty Lookup
OwnerProperty Owner
PicklistProperty Picklist
Property N/A
StateProperty State
StatusProperty Status
StringProperty String
UniqueIdentifierProperty UniqueIdentifier
N/A Internal

Memo

Virtual



///
<summary>
///
dynamicCreate metdodu Dynamic Entity kavramiyla lead olusturmayi bize gosterecek
/// </summary>
private bool dynamicCreate()
{
    try
   
{
       
// CRM Servis'ini cagiriyoruz
       
CrmService MyService = service();
   
       
// DynamicEntity nesnesini yaratyoruz
       
DynamicEntity leadEntity = new DynamicEntity();
       
// Entity ismini veriyoruz.
       
leadEntity.Name = EntityName.lead.ToString();
       
// Property'ler icin bir Array olusturuyoruz.
       
ArrayList arrProps = new ArrayList();
   
       
// Textbox deger iceriyor mu diye kontrol ediyoruz.
       
if (txtName.Text != string.Empty)
        {
           
// Eger deger iceriyorsa; Property nesnemizi cagiriyoruz ve
            // adn ve degeri veriyoruz. Boylece calisma aninda bir class'in
            // icerisindeki bir nesneye deger vermis oluyoruz.
           
StringProperty firstname = new StringProperty();
            firstname.Name =
"firstname";
            firstname.Value = txtName.Text;
            arrProps.Add(firstname);
        }
       
if (txtSurname.Text != string.Empty)
        {
           
StringProperty lastname = new StringProperty();
            lastname.Name =
"lastname";
            lastname.Value = txtSurname.Text;
            arrProps.Add(lastname);
        }
       
if (txtMail.Text != string.Empty)
        {
           
StringProperty mail = new StringProperty();
            mail.Name =
"emailaddress1";
            mail.Value = txtMail.Text;
            arrProps.Add(mail);

        }
       
if (txtState.Text != string.Empty)
        {
           
StringProperty state = new StringProperty();
            state.Name =
"address1_stateorprovince";
            state.Value = txtState.Text;
            arrProps.Add(state);
        }
       
if (txtCity.Text != string.Empty)
        {
           
StringProperty city = new StringProperty();
            city.Name =
"address1_city";
            city.Value = txtCity.Text;
            arrProps.Add(city);
        }
       
// Property'leri bir DynamicEntity'e teslim ediyoruz.
       
leadEntity.Properties = (Property[])arrProps.ToArray(typeof(Property));
       
       
// Ve final entity'imizi olusturmasi icin servise veriyoruz.
       
MyService.Create(leadEntity);
        return true;
    }
   
catch (Exception ex)
    {
        HandleException(ex);
   
    return false;
    }
}


Uygulamamızı çalıştırdığımızda aşağıdaki ekran görüntüsünü elde edeceğiz.



Bir makale daha burada biter. Hepiniz hoşçakalın.

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

 

Core Entity mi Dynamic Entity mi? ( 1.Bölüm Veri Sorgulama)

Microsoft Dynamics CRM üzerinde program geliştiriren herkes veri yazarken ve veri okurken web servisinden faydalanmamız gerektiğini bilir. (Veri okurken ek olarak fetchxml ve filteredview da kullanılabilir)
 
Peki bu işlemler sırasında web servisindeki nesnelere nasıl erişirsirsiniz?

Peki CRM üzerinde çalışacak bir uygulama geliştirdiniz ve bu uygulama web servislerini kullanarak CRM üzerine veri yazan bir uygulama olsun. Amacınız bu uygulamayı CRM kullanan firmalara satarak çok para kazanmak. Ama her müşterideki özelleştirme (customization) birbirinden farklı olacağından web servisleri de birbirinden farklı olacak. Çünkü standart yöntemde web servisindeki bir sınıf türetilerek, türetilen sınıftaki nesnelere erişilir. Her firmada nesneler de birbirinden farklı olabilir.  Sonucunda uygulamanızı her müşteri için derleyecek misiniz?

Bu çok saçma ve çok yorucu olurdu. Bu durumda bize kod zamanında değil çalışma zamanında nesneleri yönetmemizi sağlayacak bir yapıya ihtiyacımız var. Yani çalışma zamanında nesneler yaratıp bunlara değer atamalıyız.

İşte CRM içerisinde bu düşünülmüş, Core Entity yani standart nesne yönetimini yerine Dynamic Entity modeli ile nesneleri çalışma zamanında oluşturabilir ve yönetebiliriz. Dynamic Entity yöntemiyle veri sorgulayabilir ve veri yazabiliriz. Sırasıyla bu ikisini göreceğiz.

Konuyu örnek uygulamamızda irdeleyelim. Örnek uygulamamız için şöyle bir senaryo düşünelim. Bir web sitemiz olacak ve bu web sitemize insanlar ad,soyad,e-mail,ilçe ve il bilgilerini yazarak kayıt olacaklar. Fakat biz forma girilen e-mail'i kullanarak veritabanımızda bu kişinin kayıtlı olup olmadığını kontrol edeceğiz eğer yoksa müşteri adayı (lead) olarak bu kişiyi CRM'e kaydedeceğiz.




Kaydet düğmesinin arkasında aşağıdaki kod yer almakta.
Mail adresinin yazılıp yazılmadığına bakıyoruz. Eğer yazıldı ise
dynamicRetrieve metodu ile bu mailinde birilerinin sistemde olup olmadığına bakıyoruz.

/// <summary>
///
Kaydet Dugmesi Click Olayi
/// </summary>
///
<param name="sender"></param>
///
<param name="e"></param>
protected void btnSave_Click(object sender, EventArgs e)
{
   
if (txtMail.Text != "")
    {
       
if (!dynamicRetrieve(txtMail.Text))
        {
           
if (coreCreate())
                lblMessage.Text =
"başarıyla oluşturuldu";
           
if (dynamicCreate())
                lblMessage.Text =
"başarıyla oluşturuldu";
        }
    }

}

Dynamic Entity yönetemiyle veri sorgulamayı göreceğiz ilk önce. (Core entity ve diğer veri sorgulama yöntemleri ile ilgili olarak 3 makalelik bir yazı dizisi yayınlamıştım hatırlarsanız o yüzden bu makalede bu konulara girmeyeceğim.)

İlk önce kodu inceleyelim.


1. query nesnemizi oluşturuyoruz

        QueryByAttribute query = new QueryByAttribute();

2. hangi entity üzerinde sorgulama yapacağımızı söylüyoruz.

        query.EntityName =
EntityName.lead.ToString();

3. sorgulama sonucunda hangi alanları geri istiyoruz bunu söylüyoruz

       
ColumnSet cs = new ColumnSet();
        cs.Attributes =
new string[] { "firstname","lastname","address1_city" };
        query.ColumnSet = cs;

 4. koşulumuzu veriyoruz.
        query.Attributes =
new string[] { "emailaddress1" };
        query.Values =
new object[] { mail };

        Aslında buraya kadar ( " select firstname","lastname","address1_city from filteredlead where emailaddress1 = '"+ mail +"' ") dedik. Ama servis kullanarak bunu demek daha zahmetli.

5. servisimizi çağırıyoruz. Burada service(); benim oluşturduğum bir metod. CRM 3.0 ve CRM 4.0 arasında servise bağlanmakta farklılıklar var. Bunu daha önceki bir makalemde anlattığım için burada anlatmıyorum.

       
CrmService MyService = service();

6. işte can alıcı nokta burası geriye core entity değil dynamic entity istediğimizi söylüyoruz.
        retrieved.ReturnDynamicEntities =
true;

7. gelen sınıfı DynamicEntity türüne çeviriyoruz.
           
DynamicEntity entity = (DynamicEntity)responsed.BusinessEntityCollection.BusinessEntities[0];

8. işte ikinci can alıcı nokta burası. gelen DynamicEntity içinden property leri birer birer çıkartıyoruz.
Gelen property inin Value attribute 'u içerisinde değer bulunmakta bunu set ediyoruz.
           
StringProperty property = (StringProperty)entity.Properties[i];
            firstname = property.Value;

Kodun tamamı aşağıdadır.

/// <summary>
///
dynamicRetrieve metdodu Dynamic Entity kavramiyla veri cekmeyi bize gosterecek
/// </summary>
private bool dynamicRetrieve(string mail)
{
   
try
   
{
        //query nesnemizi oluşturuyoruz
        QueryByAttribute query = new QueryByAttribute();

        //hangi entity üzerinde sorgulama yapacağımızı söylüyoruz.
        query.EntityName =
EntityName.lead.ToString();

        //sorgulama sonucunda hangi alanları geri istiyoruz bunu söylüyoruz
       
ColumnSet cs = new ColumnSet();
        cs.Attributes =
new string[] { "firstname","lastname","address1_city" };
        query.ColumnSet = cs;

        //koşulumuzu veriyoruz.
        query.Attributes =
new string[] { "emailaddress1" };
        query.Values =
new object[] { mail };

        //aslında buraya kadar ( " select firstname","lastname","address1_city from filteredlead where emailaddress1 = '"+ mail +"' ") dedik.

        //
servisimizi çağırıyoruz.
       
CrmService MyService = service();
       
RetrieveMultipleRequest retrieved = new RetrieveMultipleRequest();

        //işte can alıcı nokta burası geriye core entity değil dynamic entity istediğimizi söylüyoruz.
        retrieved.ReturnDynamicEntities =
true;
        retrieved.Query = query;
       
RetrieveMultipleResponse responsed = (RetrieveMultipleResponse)MyService.Execute(retrieved);
       
if (responsed != null && responsed.BusinessEntityCollection.BusinessEntities.Length > 0)
        {

   
        //gelen sınıfı DynamicEntity türüne çeviriyoruz.
           
DynamicEntity entity = (DynamicEntity)responsed.BusinessEntityCollection.BusinessEntities[0];
           
string firstname = "";
           
string lastname = "";
           
string city = "";
           
for (int i = 0; i < entity.Properties.Length; i++)
            {
               
if (entity.Properties[i].Name.ToLower() == "firstname")
                {
           
        //işte ikinci can alıcı nokta burası. gelen DynamicEntity içinden property leri birer birer çıkartıyoruz.
                    //gelen property inin Value attribute 'u içerisinde değer bulunmakta bunu set ediyoruz.
                   
StringProperty property = (StringProperty)entity.Properties[i];
                    firstname = property.Value;
                }
               
if (entity.Properties[i].Name.ToLower() == "lastname")
                {
                   
StringProperty property = (StringProperty)entity.Properties[i];
                    lastname = property.Value;
                }
               
if (entity.Properties[i].Name.ToLower() == "address1_city")
                {
                   
StringProperty property = (StringProperty)entity.Properties[i];
                    city = property.Value;
                }
            }
           
string result = "<table border=1><tr>";
            result +=
"<td>Ad</td>";
            result +=
"<td>Soyad</td>";
            result +=
"<td>Şehir</td>";
            result +=
"</tr>";
            result +=
"<tr>";
            result +=
"<td>" + firstname + "</td>";
           
result += "<td>" + lastname + "</td>";
            result +=
"<td>" + city + "</td>";
            result +=
"</tr></table>";
            lblMessage.Text =
"eşleşen kayıtlar bulundu";
            lblMessage.Text += result;
           
return true;
        }
       
return false;
    }
   
catch (Exception ex)
    {
        HandleException(ex);
       
return false;
    }
}

Daha önceden sitemize kayıt olmuş test1 kişisinin sitemize tekrar kayıt olmaya çalıştığını düşünelim uygulama eşleşen bir kayıt bulacağından görüntü şöyle olacak.




Bu makaleye de burada noktayı koyalım. Unutmayın sırada veri yazma ile ilgili bir makale var.

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

  

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