|
Microsoft Dynamics CRM 3.0’da Callout Yazmak, ve Bir Örnek |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bu makalemizde MS
CRM 3.0 ile özelleştirme yapmak isteyen okuyucularımıza temel callout kavramlarını
açıklamaya çalışacağız. Yazının özeti kısaca ağıdaki gibidir:
o “Callout” nedir? Nerede kullanılır?
o Hangi olaylar callout’ları tetikler?
o Bir Callout örneği: TCKN (=Türkiye Cumhuriyeti Kimlik Numarası)
kontrolü
Gereken
Altyapı Bilgisi
Bu yazıdan yararlanmak
için iyi seviyede C# bilgisi faydalı olacaktır. Öncelikle callout programlamanın
temel kamvramlarından bahsedelim.
“Callout”
nedir?
Callout’lar basitçe
.NET Framework (=FW) 1.1 ile derlenmiş kütüphanelerdir.
Yukarıdaki cümleyi
okuduktan sonra aklımıza hemen bir soru gelecektir: Acaba FW 2.0 veya FW 3.0
kullanarak callout yazılabilir mi? Bu sorunun yanıtı çok basit “Ne yazık ki
yazılamaz”. Çünkü bir “application pool”da sadece bir .NET Framework sürümü
koşabilir. Bu kısıtlama Microsoft tarafından getirildiği için callout kodlarımızı
FW 1.1’de yazmamız gerekecektir. Bunun asıl nedeni CRM 3.0’ın FW 1.1‘da yazılmış
olmasıdır, reflection kullanılılarak callout’lar çalıştırılmaktadır.
Nasıl Framework
1.1 kodu üretilir?
Bunu yapmak için
iki yol vardır.
İlk yol alışılagelmiş
yoldur, Visual Studio .NET (=VSNET) 2003 kullanılarak FW 1.1 kodu üretilebilir.
İkinci yol biraz
daha karışık. VSNET 2005 kullanılarak ve sistemimizde de fw1.1 yüklü ise msbee
yüklenmesini gerektirir ve uygun bir config dosyası yaratılmalıdır. Yazılacak
bir msbuild komutu ile fw1.1 kullanlarak derlenmiş bir dosya elde ederiz.
Bu yol biraz daha
karmaşık olduğundan farklı bir makalede anlatılacaktır.
MS CRM 3.0’ın özelliklerini
artırmak için calloutlar yazılmaktadır. Özellikle entegrasyon projelerinde verinin
bütünlüğünü ve tutarlılığını sağlamak için calloutlar kullanılırlar. Örnein
aynı çalışa n numarasına sahip iki kişiyi kaydetmek istemezsiniz, bunu calloutlar
sağlar, MS CRM aynı verilerin girilmesine bir kısıt koymaz, aynı kayıttan yüzlerce
yaratılabilir. Yazılacak bir callout ile çalışan numaraları kontrol edilir ve
girilen numara daha önceden kayıt edilmiş ise yeni kayıt oluşturma işlemi durdurulabilir,
eğer böyle bir numara yok ise kayıt oluşturmaya her zamanki gibi devam edilebilir.
CrmCalloutBase
Sınıfının Önemi
Bu sınıf microsoft.crm.platform.callout.base.dll
dosyasında yer alır. Bu dosyayı MS CRM 3.0’ın sistem dizininde bulabilirsiniz.
|
Tüm
callout’lar CrmCalloutBase sınıfından türetilmek zorundadır, yani her callout
projemize referans olara microsoft.crm.platform.callout.base.dll kütüphanesini
eklememiz gerektiği sonucuna varabiliriz. Bu dosyayı MS CRM 3.0 kurulum
dosyalarının bulunduğu aşağıdaki yoldan bulabilirsiniz: Microsoft CRM 3.0
Professional Edition Disk \Bin\Assembly\Microsoft.Crm.Platform.Callout.Base.dll
|
Aşağıda calloutların
kullanılabildiği olayların listesi mevcuttur. Bu olaylar kullanılarak MS CRM’de
özel kontroller ve ek özellikler gerçekleştirilebilir.
Yukarıdaki tablo
calloutlarla yapılabilecek işlemlerin listesini göstermektedir. Oluşturma/Güncelleme/Silme/Atama
işlemlerini tamamen özelleştirebiliriz. Diğer işlemleri biraz açıklayalım:
Atama:
Bir kaydın CRM’deki sahibinin değişmesi anlamına gelen bu işlem callout’lar
tarafından tamamen özelleştirilebilir.
SetState:
Bir kaydın aktif veya pasif yapılması anlamına gelen bu işlem tamamen özelleştirilebilir
niteliktedir.
Merge:
iki kaydın birleştirilmesi işlemi anlamına gelir. Yani bu kayıtlardaki veriler
birleştirilir. Öncesine veya sonrasına callout yazılabilir türden yanı tamamen
özelleştirilebilir türden bir olaydır.
Yazacağımız bir
sınıfı CrmCalloutBase sınıfından türettikten sonra yukarıdaki fonksiyonlardan
bir tanesini override ederiz. Ve derleme işlemi gerçekleştirildikten sonra oluşan
DLL dosyası yayımlanmaya hazır bir callout kodu oluşturur. MS CRM sunucusuna
ilgili dizine kopyalanarak ayar dosyasına kayıt atılır ve bir kez iisreset yapıldıktan
sonra callout çalışmaya hazır hale gelir.
Yukarıda anlatıldığı
gibi oluşturulan .NET kütüphane dosyası (class library) MS CRM sunucusunun bin\assembly
dizinine yerleştirilir. Yani: eğer sunucu
C:\Program Files\Microsoft CRM yoluna kurulduysa callout dll
dosyalarımızı C:\Program Files\Microsoft CRM\Server\bin\assembly
dizinine yerleştiririz.
|
MS
CRM 3.0 sunucunuzu kurduğunuz dizin şu ise:
C:\Program Files\Microsoft CRM\ callout’larınız aşağıdaki dizinde olmalıdır.
C:\Program Files\Microsoft CRM\Server\bin\assembly\ |
Yukarıdaki dizine
callout dll’i konduktan sonra CRM sunucusuna yeni konan callout ile ilgili bilgi
verilmesi gerekmektedir. Sunucunun calloutlar hakkında bilgi almak için okuduğu
dosya callout.config.xml dosyasıdır. Bu xml dosyası da callout’ların konduğu
dizinde yer alır. Aşağıdaki örnek bir callout.config.xml dosyasıdır.
<?xml version="1.0"
encoding="utf-8" ?>
<callout.config version="2.0">
<callout entity="contact" event="PreCreate">
<subscription
assembly="DontPermitDuplicates.dll" class="DontPermitDuplicates.NoDblNames"
/>
</callout>
</callout.config>
|
Callout dosyamızın
isim alanı olarak yukarıda DontPermitDuplicates olduğunu görüyoruz.
Herhangi bir Lead varlığı oluşturulmadan önce CRM’de burada belirttiğimiz dll’deki
PreCreate fonksiyonu çalışacaktır.
CRM DontPermitDuplicates.NoDblNames
sınıfından bir nesne türetir ve PreCreate fonksiyonunu çağırır. Bu metod bazı
kontroller yapabilir veya iş süreci için ihtiyaç duyulan operasyonları gerçekleştirebilir.
Bu işlemler sırasında kod oluşturma işleminin kesilmesi gerekiyorsa abort
enum’unu geri döndürerek Lead oluşturma sürecini durdurabilir ve bir hata mesajı
ekrana getirebilir. Eğer her şey iş mantığı açısından yolunda gidiyorsa method
çalışması sonucunda continue enum’unu döndürerek sorunsuz bir
şekilde Lead’in oluşturulmasına izin verebilir.
Adım Adım Basit bir Callout Örneği
1. VSNET 2003 kullanarak
bir “Sınıf Kütüphanesi” (=Class Library) oluşturun.
2. microsoft.crm.platform.callout.base.dll
dosyasını referans olarak ekleyin.
3. CrmCalloutBase
‘den türeyen bir sınıf yazın.
4. Bu sınıfın içerisinde
PreCreate yazdıktan sonra CTRL+BOŞLUK tuşlarına basın ve override edebileceğiniz
fonksiyonların listesini görün, bu listeden PreCreate’i seçin ve ENTER tuşuna
basın.
Aşağıdaki örnek
callout kodunu kullanarak ilk callout’umuzu yazabiliriz.
public
override PreCalloutReturnValue PreCreate(
CalloutUserContext userContext, CalloutEntityContext
entityContext,
ref string entityXml, ref string errorMessage
)
{
PreCalloutReturnValue calloutRetVal
= PreCalloutReturnValue.Continue;
// error message is not set at the
begining
errorMessage = string.Empty;
XmlDocument xd = new XmlDocument();
xd.LoadXml(entityXml);
/* all the elements in the XML file
is iterated, and only desired ones are added
to the nvPostedInfo collection */
NameValueCollection nvPostedInfo =
new NameValueCollection();
foreach (XmlElement element in xd.GetElementsByTagName("Property"))
{
string
strAttributeName = element.Attributes.GetNamedItem("Name").Value;
switch
(strAttributeName) {
case
"tbs_tckn":
nvPostedInfo.Add("tbs_tckn",
element.InnerText);
break;
}
}
if ( ! IsTcknValid( nvPostedInfo["tbs_tckn"]
) ) {
errorMessage
= "The TCKN value is not valid!";
calloutRetVal
= PreCalloutReturnValue.Abort;// abort operation
}
return calloutRetVal;
}
|
Yukarıdaki kod
IsTcknValid adında bir fonksiyon kullanmaktadır, bu fonksiyon bool bir değer
döndürmektedir. Eğer parametre olarak verilmiş TCKN geçerli yani gerçek olabilecek
bir TCKN ise doğru değil ise yalnış sonucu döndürecektir.
Aşağıda TCKN kontrol
eden kodu bulacaksınız. Bu fonksiyon kullanılarak sisteminize geçersiz TCKN’lerin
girilmesini engelleyebilirsiniz. Bu veri doğruluğunu sağlamak için çok faydalı
bir araçtır. (Aşağıda sunulan kod şu adreste yer alan SQL fonksiyonunun C#’a
çevrilmiş halidir: http://www.verivizyon.com/detail.asp?catid=17&cid=317
)
private
bool IsTcknValid(string TcknToValidate)
{
bool isValid = false;
TcknToValidate = TcknToValidate.Trim();
if (TcknToValidate.Length != 11) return
isValid;
short C1, C2, C3, C4, C5, C6, C7,
C8, C9;
int Q1, Q2;
Int64 TCNO = Convert.ToInt64(TcknToValidate);
Int64 ATCNO = TCNO / 100;
Int64 BTCNO = TCNO / 100;
C1 = Convert.ToInt16( ATCNO % 10 );
ATCNO /= 10;
C2 = Convert.ToInt16( ATCNO % 10 );
ATCNO /= 10;
C3 = Convert.ToInt16( ATCNO % 10 );
ATCNO /= 10;
C4 = Convert.ToInt16( ATCNO % 10 );
ATCNO /= 10;
C5 = Convert.ToInt16( ATCNO % 10 );
ATCNO /= 10;
C6 = Convert.ToInt16( ATCNO % 10 );
ATCNO /= 10;
C7 = Convert.ToInt16( ATCNO % 10 );
ATCNO /= 10;
C8 = Convert.ToInt16( ATCNO % 10 );
ATCNO /= 10;
C9 = Convert.ToInt16( ATCNO % 10 );
ATCNO /= 10;
Q1 = ((10 - ((((C1 + C3 + C5 + C7
+ C9) * 3) + (C2 + C4 + C6 + C8)) % 10)) % 10);
Q2 = ((10 - (((((C2 + C4 + C6 + C8)
+ Q1) * 3) + (C1 + C3 + C5 + C7 + C9)) % 10)) % 10);
if ( TCNO == ((BTCNO * 100) + (Q1
* 10) + Q2) ) {
isValid = true;
}
return isValid;
}
|
Yukarıdaki kodu
da yazdıktan sonra Sınıf Kütüphanemizi derlememiz gerekmektedir. Oluşan DLL
dosyası aşağıdaki dizine konacaktır: "C:\Program Files\Microsoft CRM 3.0\Server\bin\assembly"
Bu dizinde callout.config dosyası bulunmaktadır, sözkonusu xml dosyasında sistemde
çalıştırılacak callout DLL’lerinin bildirimi mevcuttur.
Biz de aşağıdaki
bildirimi callout.config.xml dosyasının içerisinde koyacağız.
<?xml version="1.0"
encoding="utf-8" ?>
<callout.config version="2.0">
<callout entity="contact"
event="PreCreate">
<subscription
assembly="DontPermitDuplicates.dll" class="DontPermitDuplicates.NoDblNames"
/>
</callout>
</callout.config>
|
DİKKAT!
XML uzantısını callout.canfig dosyasının sonuna koymayı unutmayınız!
örneğin: callout.config.xml
Şimdi geçersiz bir TCKN girerek kodu test edelim J
Kodun Test Edilmesi
Öncelikle TCKN
numarasını tutacak bir alan oluşturmamız gerekmektedir. Bu alanımızın adı "new_tckn"
ve nvarchar tipinde olsun. Bu alanı oluşturduktan sonra contact varlığının formuna
bu alan yerleştirilmelidir.
1) contact varlığı
için özellik oluşturulur
2) contact formuma
alan yerleştirilir, sonra değişiklikler yayımlanır.
3) Aşağıdaki dosyayı
düzenleyin, eğer mevcut değilse notepad.exe ile bu dosyayı oluşturun ve kaydedin.
"C:\Program Files\Microsoft CRM\Server\bin\assembly\callout.config.xml"
4) iisreset komutunu
başlat -> çalıştır bölümünden çalıştırın
Şimdi yeni bir
contact varlığı oluşturmaya başlayın ve TCKN değeri olarak “12345678901” ifadesini
girin, daha sonra kaydet tuşuna basın. Bu operasyon yazdığımız callout taradınfan,
12345678901 değerini geçerli bir TCKN olarak değerlendirmediğinden, engellenecektir.
Girilen geçersiz bir TCKN değeri olduğu için aşağıdaki hata mesajı da callout
tarafından önyüze gönderilecektir.
Sonuç
Bu makalede callout
programlamanın temelleri gösterilmiştir. Örnek bir callout olarak Türkiye Cumhuriyeti
Kimlik Numarası doğrulayıcı kontrolü konmuş ve test edilmiştir. Callout kütüphanelerinin
CRM’e reflection kullanılarak yüklendiği düşünülürse, ve CRM 3.0’ın .NET Framework
1.1 kullanılarak yazıldığı gözönüne alınırsa, yazacağımız callout projelerinin
.NET 1.1 ile derlenmiş olması gerekmektedir. Çünkü bir “application domain”
de birden fazla framework CLR’si çalıştırılamaz.
Örneğimizde veritabanı
bağlantısına gerek duyulmadığından, bağlantı cümleciği kullanılmamıştır. Eğer
gerekseydi bağlantı cümleciğimizi kodumuzun içerisine gömmemeyi tercih edecektik.
Bu durumda bir config dosyasınra bu bilginin tutulması gerekecekti. Burada kullanılacak
web.config dosyası MS CRM 3.0’daki web.config dosyası olacaktır.
Yeri gelmişken
belirtmekte fayda var, eğer veri manipülasyonu ile ilgili bir kod yazıyorsak
veri erişim katmanımızın Enterprise Library Data Application Block kullanılarak
yazılabileceğini hatırlamalıyız. Gelecek makalemizde veri erişim katmanın olarak
bu kütüphanenin kullanımını inceleyeceğiz. Tekrar görüşünceye dek kod yazmaktan
keyif almaya devam edin!
Ekler
A.1.
Eğer Callout’larınız çalışmıyorsa şunlara bir göz atın!
Ustalıkla kaleme
alınmış iki sorun giderme makalesi için aşağıdaki adresleri ziyaret edin:
"Is your Microsoft
CRM callout not working?", http://blog.sonomapartners.com/2007/03/is_your_microso.html
"The functionality
that you expect from a callout .dll file does not work as expected in Microsoft
Dynamics CRM 3.0"http://support.microsoft.com/kb/933842
A.2
Diğer Callout Kaynakları
Microsoft’un örnek
callout kodu CRM SDK’sının 3.0.7 sürümünde mevcuttur.
http://msdn2.microsoft.com/en-us/library/aa680675.aspx
A.3. Enterprise Library for .NET Framework 1.1
Source:
http://msdn2.microsoft.com/en-us/library/ms954827.aspx
Enterprise Library
Data Access Application Block hakkında bilgi almak isterseniz yukarıdaki adrese
bir göz atınız. Tekrar kullanılabilir ve genişletilebilir kaynak kodu verilen
bir kütüphane olarak veri erişim katmanlarınızda kolaylık sağlayacak bu kütüphaneyi
incelemeyi unutmayın.
Download Latest
Release (for .NET Framework 1.1): Enterprise Library, June 2005
See
also: Enterprise Library for .NET Framework 2.0, January 2006
Lisans End
User Licensing Agreement (EULA)
Pratik Laboratuvar çalışması Enterprise
Library - Hands on Labs
Eğitim Videosu Enterprise
Library Data Access Application Block (Level 300)
Topluluk Enterprise
Library Community
Enterprise
Library for .NET Framework 1.1 için sistem gereksinimleri
* Desteklenen işletim sis.: Windows 2000; Windows Server 2003; Windows XP Professional
Edition
* Microsoft .NET Framework version 1.1
* Microsoft Visual Studio .NET 2003 (Enterprise Architect, Enterprise Developer,
veya Professional)
* Bazı örneklerin kullanımı için Microsoft SQL Server ‘a ihtiyaç vardır.
* Eğer projelerinizde otomatik testler kullanmak istiyorsanız NUnit 2.1.4 kullanmanız
tavsiye edilir.
A.4 Örnek bir Callout dizininin içeriği aşağıdaki gibidir
Makale:
Microsoft Dynamics CRM 3.0’da Callout Yazmak, ve Bir Örnek C#, Visual C# ve .NET Ziver Alen Malhasoğlu
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|