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.

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.
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.
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 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;
}