Crm 2011'de Web Resources Olarak Eklediğimiz Silverlight Kontrolünü Debug Etmek

Crm 2011'de Crm 4.0'dan farklı olarak artık aspx sayfaları kullanmamız önerilmiyor. Kullanmak isteyen için yine ISV klasörü mevcut ancak daha sonraki versiyonlarda o destek de kaldırılacak. Şu an Crm 4.0'dan Crm 2011'e geçiş için Crm 4.0 servisi ve ISV klasörü duruyor.

Durum böyleyken bizde aspx sayfalarından vazgeçip özel işlemlerimizi Silverlight ile yapmaya başladık. Tabiki ilk başlarda Silverlight'a alışmak biraz zaman alıyor, bazı kısıtlamalar, engeller mevcut, ama yine de programlaması keyifli.

Gelelim konumuza, Silverlight ile debug, kullanıcı tarafında çalıştığı için normal debugdan biraz farklı. Hatta Crm üzerinde çalışan Silverlight'ı debug etmek direk yazdığımız bir Silverlight kontrolünü debug etmekten de farklı.

Basitçe aşağıdaki videoda David Yack 'ın anlattığı şekilde Crm üzerinde silverlight kontrolümüz açıkken, Visual Studio'dan Debug > Attach to Process 'e tıklayıp, iexplorer.exe (Silverlight, x86)yı seçmek debug işlemine başlayabilmek için yeterli.

Ancak videoda anlatılmayan ufak bir detay var, ve benim gibi onu gözden kaçırırsanız debug işlemini gerçekleştiremiyorsunuz. Eğer Internet Explorer'ı 64 bit olarak kullanıyorsanız, Attach to Process ekranında tip olarak Silverlight seçeneği gelmiyor. Ufak bir detay belki ama böyle bir durumla karşılaşanlar için çok önemli olabilir.

 

Kurulu Crm 4 Üzerinde Report Server'ı 2008'den 2008 R2'e Aldıktan Sonra Oluşan Hatalar

Geçenlerde aktif bir Crm 4 kurulumunun kullandığı Report Server'ın versiyonunu 2008'den 2008 R2'ye aldık. Ancak raporlar çalışmamaya başladı, ve detaylı hataya baktığımda aşağıdaki hata ile karşılaştım.

The type Microsoft.Crm.Web.Reporting.CrmReportServerConnection, Microsoft.Crm.Application.Pages, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 does not implement IReportServerConnection or could not be found

Önce biraz araştırdım fakat bir sonuca ulaşamadım. Daha sonra bir yerde Microsoft Report Viewer Redistributable 2008'ı kurmam gerekli olduğunu öğrendim. Bu kurulumu yaptıktan sonra Crm 4 web.config'de bulunan 2 alanı güncellememiz gerekiyormuş.
Bunlar versiyonu 8.0.0.0 olarak belirtilen Report Server ile ilgili yerler. İkisinide 9.0.0.0 yapmamız gerekiyor.
 
Bir tanesi httpHandlers altında bulunuyor.
<httpHandlers>
  <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false" />
</httpHandlers>

Diğeri compliation assemblies altında ki report server satırı, o da şu şekilde olmalı

<add assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

Ve sorun çözülmüş oluyor.

Crm 2011'de Silverlight ile Organizasyon Servisini Referans Olarak Eklemeden JSON Data Çekme

Başlık biraz uzun oldu farkındayım :) Ama şimdi yapacağımız şeyi ancak bu kadar kısa yazabilirdim. Neyse konumuza dönelim. Diyelim ki bir silverlight kontrolünüz var ve bunu aynı Crm 2011 kurulumu üzerinde birden fazla organizasyonda da kullanmak istiyorsunuz. Haliyle sadece bir organizasyonun servisini referans olarak eklemek istemiyorsunuz.

Bu yazıda bu gibi bir durumda standart HttpWebRequest sınıfı ile nasıl servise bağlanıp, JSON data alacaksınız onu anlatacağım. Öncelikle kodlara geçmeden önce Crm 2011 üzerinde Odata sorgularını kolayca oluşturabilmek için yapılmış CRM 2011 OData Query Designer aracını indirmenizi şiddetle tavsiye ederim.

Evet şimdi servise isteğimizi yapalım

var queryUrl = "http://crm2011/Organizasyon/xrmservices/2011/OrganizationData.svc/AccountSet?"; // tüm accountları getirir, yukarıda bahsetmiş olduğum araç ile sorgunuzu oluşturabilirsiniz
var uri = new Uri(queryUrl);
var req = (HttpWebRequest)WebRequest.Create(uri);
req.Accept = "application/json";
req.BeginGetResponse(new AsyncCallback(RequestCompleted), req);

Silverlight üzerinde sadece asenkron istek yapabildiğimiz için HttpWebRequest i asenkron olarak tetikledik ve tamamlandığı zaman RequestCompleted metodunu çağırmasını istedik. RequestCompleted metodunda ise gelen veriyi alıp parse edeceğiz.

JsonObject, JsonArray gibi sınıfları kullanabilmemiz için System.Json referansını projemize dahil etmemiz gerekli.

private void RequestCompleted(IAsyncResult a)
{
    HttpWebRequest req = (HttpWebRequest)a.AsyncState;
    HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(a);

    var root = JsonObject.Load(res.GetResponseStream());
    var results = (JsonArray)root["d"]["results"];

    foreach (var result in results)
    { // sonuçlar arasında dönüyoruz
        //result["name"].ToString().Trim('"'); 
    }
}

Verdiğim örneklerde hata ayıklaması koymadım, kullanırken try, catch bloklarına ihtiyacınız olabilir.

Crm 2011 İçerisinde Silverlight ile Çoklu Dil Desteği

Eğer Crm 2011 üzerinde, kullanıcılara çoklu dil desteği sunuyorsanız, bu desteği silverlight kontrollerinizde de sunmak isteyebilirsiniz. Bunu başarabilmek için yazmamız gereken 1-2 metod var.

Öncelikle Crm kullanıcısının şu anda kullanmakta olduğu dili almalıyız. Aşağıdaki method ile kullanıcının dilini alıyoruz, eğer alamazsak varsayılan olarak İngilizce (1033) dönecek.

/// 
/// Get user language LCID 
/// 
/// default 1033
public static int GetUserLCID()
{
    try
    {
        var langCode = Convert.ToInt32(HtmlPage.Window.GetProperty("USER_LANGUAGE_CODE"));
        return langCode;
    }
    catch
    {
        return 1033;
    }
}

Fazlası...

Crm 2011'de Silverlight ile Form Değerini Almak ve Değiştirmek

Crm 2011'de form üzerine eklediğimiz silverlight kontrolleri içerisinden form üzerinde bulunan elemanların verisini okumak yada değiştirmek çok kolay. Form üzerinde bulunan silverlight kontrolleri diğer elemanlarla aynı yerde (context) bulunduğundan, javascript kullanır gibi silverlight içerisinden bu işleri yapabilmek mümkün.

///
/// Set value to form element
///
///
///
public static void SetValue(string elmId, string val)
{
    dynamic Xrm = (ScriptObject)HtmlPage.Window.GetProperty("Xrm");
    Xrm.Page.getAttribute(elmId).setValue(val);
}

///
/// Get value from form element
///
///
/// 
public static object GetValue(string elmId)
{
    dynamic Xrm = (ScriptObject)HtmlPage.Window.GetProperty("Xrm");
    var value = Xrm.Page.getAttribute(elmId).getValue();
    return value;
}

I'm blogging in English too. To visit my English blog click here.

Ali Rıza Üneş Hakkında

Amatör olarak 1998, profesyonel olarak 2001 yılından bugüne kadar web sitesi tasarımı ve programlama üzerine çalışmıştır. 2008 yılında Microsoft .NET teknolojileri üzerine eğitim almış, ASP.NET, C# ile yazılımlar/web siteleri ve Microsoft Dynamics CRM üzerine özel uygulamalar geliştirmektedir.

Profilin tamamını görüntüle

Sayfalar

Stackoverflow

Arşiv

Son Yorumlar

Comment RSS

• Microsoft Dynamics™ CRM 4.0 Installation and Deployment
• Microsoft Dynamics™ CRM 4.0 Customization and Configuration
• Microsoft Dynamics™ CRM 4.0 Applications