Dynamics CRM 2015 Kodlama Mimarisi v1.0 -

Ebat: px
Şu sayfadan göstermeyi başlat:

Download "Dynamics CRM 2015 Kodlama Mimarisi v1.0 -"

Transkript

1 Dynamics CRM 2015 Kodlama Mimarisi v1.0 - Baris KANLICA

2 Icerik Yazar Hakkinda... 3 E-Kitap Hakkinda... 3 Dynamics CRM Servis Mimarisi... 4 Device ID bilgisini vermek istemezsek... 4 Device ID bilgisini vermek istersek... 5 Ek Bilgi... 5 Organization Servis... 5 Execute Metodu... 7 Early ve Late Binding Arasındaki Farklar... 8 CrmSvcUtil.exe ile Early-Bound Sınıflar Oluşturmak Veri Turleri Hakkinda OptionSetValue EntityReference Null Değer Atama Veri Sorgulama FetchXML Sorguyu Hazırlama Sorguyu Çalıştırma Sorgu Sonucu İleri Seviye Sorgular FetchXML ile Aggregate(Toplama Sorguları) İşlemleri Create/Update/Delete Metodları Dynamics CRM 2015 Plug-in Mimarisi Plug-in Execution Context Organization Servise Erisme Notification Servise Erisme Input ve Output Parametreleri Pre ve Post Entity Imajlari Plug-in ler Icerisindeki Hatalari Yakalamak Plug-in Yapici Metodlari Hadi Plug-in Yazalim Veritabanina gitmeden kayitlari değiştirmek Update aninda update edilmemiş değerlere ulaşmak Uzerinde calistigim nesnenin id si nerede? Plug-in ler arasinda bilgi paylasimi P a g e

3 Plug-in Registration Tool u Kullanmak Plug-in i Debug Etmek Servis lere Attach olarak Debug Etme Plug-in Profiller i kullanarak Debug etme P a g e

4 Yazar Hakkinda Yaklasik 15 yildir profesyonel olarak yazilim geliştirmekteyim. Bundan yaklasik 10 yil once Microsft Dynamics CRM 1.2 versiyonu ile tanistiktan sonra CRM yazilim danismani olarak yillardir Microsoft Dynamics CRM projeleri içerisinde cesitli pozisyonlarda görev aldim. Turkiye de CRM alaninda danismanlik yapan Omerd Business Solutions in kurucu ortagi olarak yillardir Yazilim Departman Mudur u unvanıyla bu sirkette görev yapmaktayım. 2 senedir de bu sirketin yurtdisi uzantisi olarak kurulan Mawens Business Solution da Genel Mudur u sifatiyla Londra da yasamaktayim ve CRM projeleri geliştirmeye burada devam etmekteyim. Bugune kadar 100 den fazla firmaya 150 den fazla CRM projesi geliştirdim ve bu alanda yaptigim calismalardan dolayi Microsoft tan 5 kere Dynamics CRM MVP odulunu ve unvanini aldim. Bilkom-Apple tarafından da Dijital Yasam Kocu unvanini almis bulunmaktayım. Turkiye de Edirne den Elazig a kadar ve yurtdisinda Londra da birçok universite, kurum ve etkinlikte konusmaci/egitmen olarak bulundum. Bircok sitede de editör ve yazar olarak yazilarim yayinlanmaktadir. Bana ulaşmak icin asagidaki kişisel bloğum olan i takip edebilir ve adresine mail atabilirsiniz. E-Kitap Hakkinda Bu kitap Dynamics CRM alaninda yazilim yapan/yapmak isteyen herkese aciktir. Kodlar c# dilinde Visual Studio da yazilmis ve bunlar uzerinden anlatilmaktadir. Bu kitaptaki ornekleri yapabilmeniz icin 1. CRM CRM 2015 SDK 3. Visual Studio Araclarina ihtiyaciniz bulunmaktadir. Bu e-kitap teki yazilarin biraraya toplanmis halidir. Ilereyen zamanlarda diger yazilarimi da 2015 versiyonuna guncelleyerek daha genis bir e-kitap olusturmayi amaclamaktayim. Umarim hepinize faydali olur. 3 P a g e

5 Dynamics CRM Servis Mimarisi Dynamics CRM üzerinde uygulama geliştirebileceğiniz çok güçlü bir mimari ile gelmektedir. Bu mimarinin temel yapı taşı ise WCF servisleridir. Bu yazımda sizlere CRM'in temel web servisleri olan Discovery ve Organization Servislerinin yapısını ve ne işe yaradıklarını anlatacağım. CRM için kod geliştirirken her ne kadar sdk'nın içinden çıkan dll'leri kullansak da bu dll'ler vasıtasıyla ilk önce servis bağlantısı oluşturmamız gerekmektedir. Yani verilere ulaşmak ve veri yazmak için WCF servislerini kullanmak zorundayız. Bu servislerle daha hızlı ve güvenli bir şekilde CRM platformuna entegre olmamızı sağlamaktadır. WCF standartlaşmış bir teknoloji olduğu için biz yazılım geliştiricilere yeni özellikler sunmakta ve sürekli kendi içerisinde gelişmektedir. Dynamics CRM yapısında entity ve attribute katmanlı bir mimari bulunmaktadır. Yani biz CRM'in Business Logic katmanına müdahele edip yazılımlarımızı onunla entegre hale getirmekteyiz. Temel olarak nesne katmanı Entity isimli nesneden türemiştir. late-bound türlerde bu nesneyi sıklıkla kullanmaktayız. Early-bound olarak program geliştirme metodolojisini tercih edersek Entity class'ı ile işimiz olmamaktadır ama arka planda bütün nesnelerin bu class'dan türediği unutulmamalıdır. Bu konuya aşağıda bir örnekle tekrar değineceğim. CRM servislerine OrganizationServiceProxy ve DiscoveryServiceProxy sınıflarıyla bağlanmaktayız. Aşağıdaki kod bize bunu göstermektedir; using (OrganizationServiceProxy _serviceproxy = new OrganizationServiceProxy(organizationUri, homerealmuri, usercredentials, devicecredentials)) ; Discovery Servis Dynamics CRM 4.0 versiyonundan itibaren multi-tenant bir mimaridedir. Yani tek bir uygulama birden fazla organizasyonu içerisinde barındırmaktadır. Yazılımcı olarak birden fazla organizasyon arasında geçiş yapmamız gerekiyorsa sistemde hangi organizyonlar olduğunu sorgulama işini Discovery servis ile yapmamız gerekmektedir. Bu servis yazma okuma işlemlerinin yapılacağı ana servise bağlanmamıza yardımcı olacak ve organizasyonların bilgisini bize döndürecektir. Aşağıdaki kod bize bu servise nasıl bağlanacağımızı ve organizasyonların bilgisine nasıl ulaşacağımızı göstermektedir. Device ID bilgisini vermek istemezsek Uri dinfo = new Uri("http:// /XRMServices/2011/Discovery.svc"); ClientCredentials clientcred = new ClientCredentials(); DiscoveryServiceProxy dsp = new DiscoveryServiceProxy(dInfo, null, clientcred, null); dsp.authenticate(); RetrieveOrganizationsRequest rosreq = new RetrieveOrganizationsRequest(); RetrieveOrganizationsResponse r = (RetrieveOrganizationsResponse)dsp.Execute(rosreq); foreach (OrganizationDetail o in r.details) Console.WriteLine("Organizasyon Adı : " + o.friendlyname); Console.ReadLine(); 4 P a g e

6 Device ID bilgisini vermek istersek Normalde dokümantasyonlarda bu sekilde bir ayrim göremezsiniz. Ben bunu deneyimlerime dayanarak yapıyorum. Aslinda yukarıdaki kod da Online Organizasyon a baglanir ama DiscoveryService in varsayilan yapici metoduna 4. Parametreyi gönderirseniz yani DeviceCredential null olmazsa calisir.sorun ise DeviceCredential i oluşturmak icin CRM SDK\SampleCode\CS\HelperCode klasöründeki DeviceIdManager.cs kodunu kendi kodunuza implemente etmeniz gerekmekte. Ek Bilgi Bu kodla discovery servise bağlandıktan sonra ClientCredentials'ı kullanarak hali hazırda oturum açmış kullancının bilgisini sisteme göndermekteyiz. Ama her zaman bunu kullanmak istemeyebiliriz yani başka bir kullanıcı adı ve şifre ile sisteme girmek istediğimizde ClientCredentials'a kullanıcı adı, şifre bilgilerini verebiliriz. clientcred.windows.clientcredential = new System.Net.NetworkCredential("kullanici adi", "sifre", "domain"); Yukarıdaki kodun çalışabilmesi için System.ServiceModel.Description,System.Runtime.Seriliazation, Microsoft.Crm.Sdk.Proxy ve Microsoft.Xrm.Sdk dll'lerinin referanslara eklenmiş olduğundan emin olun. Ayrıca uygulamayı.net Framework 4.5.2'de derlemek gerekiyor. Organization Servis Dynamics CRM 2015'in ana web servisi Organization Servis'tir. Bu servis içerisinde entity instance'ları üzerinde işlem yapabileceğimiz 6 metod ve execute metodu bulunmaktadır. CRM Servis sınıfını oluşturabilmek için Organization Service Proxy'nin bir instance'ını 5 P a g e

7 oluşturmamız gerekmekte. Daha sonrasında ise Organization Servis sınıfını bunu göre ayarlayacağız. Uri organizationuri = new Uri("https://!organizasyon crm url! /XRMServices/2011/Organization.svc"); ClientCredentials clientcred = new ClientCredentials(); clientcred.username.username = " kulllanici adi "; cientcred.username.password = " sifre "; OrganizationServiceProxy _serviceproxy = new OrganizationServiceProxy(organizationUri, null, clientcred, null); IOrganizationService _service = (IOrganizationService)_serviceproxy;Yukarıdaki kodun çalışabilmesi için System.ServiceModel.Description, Microsoft.Xrm.Sdk ve Microsoft.Xrm.Sdk.Proxy dll'lerinin referanslara eklenmiş olduğundan emin olun. Ayrıca uygulamayı.net Framework 4.5.2'de derlemek gerekiyor. Oluşturduğumuz bu servisi daha sonra programımızın ilerleyen bölümlerinde çağırıp işlemler yapacağız. Tabi burada belirtilmesi gereken bir konu da işlem yapmak istediğiniz nesnenin üzerinde yetkilerinizin olmasıdır. Bir kayıt oluşturabilmek için oluşturma yetkisine sahip olmanız gerekmektedir. Sadece okuma yetkisiyle bir kayıt oluşturamazsınız. Bir sonraki yazımda sizlere entity mimarisi ve yazma okuma işlemlerini anlatacağım. Yukaridaki kod orneginde biz bir kullanici adi ve sifre ekledik. Eger her kullanicinin kendi kullanici haklariyla sistem üzerinde işlem yapmasini istiyorsaniz yukarıdaki kodda kullanici adi ve sifre kodunu silip asagidaki kodu eklemeniz gerekir. ClientCredentials clientcred = new ClientCredentials(); Boylece sistemde oturum acmis kullanici bilgileri ile devam etmis olacagiz. Bilmemiz gereken diğer bir konu da eger Early Bind veri tipi kullanacaksak servisi oluştururken ek bir komut daha girmemiz gerekmektedir. Yani linq ile sorgulama ve generated code üzerinde işlemler yapabilmek icin oluşturduğunuz servis nesnesine bu sekilde işlem yapacaginizi belirtmeniz lazim iste bunun icin asagidaki satiri eklememiz gerekmekte. _serviceproxy.enableproxytypes(); Bu arada CRM servisi olusturmanin yeni bir yöntemi daha bulunmakta. Bu da CrmConnection nesnesini kullanmak. Bu nesneye erişebilmek icin Microsoft.Xrm.Client dll ini referans olarak eklemeniz gerekmekte. CrmConnection crmconnection = CrmConnection.Parse("Url=https://! Crm organizasyon url!/xrmservices/2011/organization.svc; Username= kullanici adi; Password= sifre"); OrganizationService service = new OrganizationService(crmConnection); Boylece servis oluşturma işlemini 2 satirda da halledebilmekteyiz. Tabii bu bilgileri ben bu sekilde kod içerisine koymus gibi oldum size gostemek icin ama projelerde tabii ki bunlari ya app.config, web.config içerisine ya da belli bir lokasyonda tuttuğumuz xml dosyasi içerisinde tutuyoruz ki bu bilgiler degistiginde sürekli kod degisikligi yapmak zorunda kalmayalım. 6 P a g e

8 Execute Metodu CRM Servisi içerisindeki Execute Metodu Request ve Response yani Talep ve Yanit seklinde calismaktadir. Sistem üzerinde yapacaginiz butun hareketleri bu sekilde yapabilirsiniz ki buna ayri metodlari bulunan Create, Update, Delete bile dahildir. Konu aslinda basit olduğundan çokça açıklanacak bir tarafi da yok gibi ama calisma yapisina bakacak olursak siz bir talepte bulunursunuz o da size yanit verir diye kisaca özetleyebiliriz. Execute metodunun alabileceği Request lere makalenin sonunda yer vereceğim. Ama oncelikle sunu da belirteyim ki Request nesnesi opsiyonel parametrelere de sahiptir. Bu parametreler sunlardir. Parameter Description Messages SolutionUniqueName Islemin yapilacagi Cozumun Adi AddPrivilegesRoleRequest CreateRequest DeleteRequest MakeAvailableToOrganizationTemplateRequest SuppressDuplicateDetection Eslenen kayitlar bulunsun mu bulunmasin mi UpdateRequest CreateRequest UpdateRequest Kullanima dair ornek kod ise su sekilde; Account target = new Account(); target.name = "Fabrikam"; CreateRequest req = new CreateRequest(); req.target = target; req["suppressduplicatedetection"] = true; req["solutionuniquename"] = "MySolutionName"; CreateResponse response = (CreateResponse)_service.Execute(req); Eger isterseniz Execute Metodunu asenkron olarka da calistirabilirsiniz. Bu ekranda donmalari ve kullanicilarin ekrandan işlem bitmeden cikmalarini önleyecektir. Bunun için yapmaniz gereken ExecuteAsyncRequest mesajini geçmek olacaktır. ExecuteMultipleRequest ile de toplu daha aktarimlarinda kullanabileceğiniz mesajdir. 7 P a g e

9 xrm Mesajlarinin tamamina bu adresten ulaşabilirsiniz : https://msdn.microsoft.com/enus/library/gg aspx CRM mesajlarina da bu adresten ulaşabilirsiniz : https://msdn.microsoft.com/enus/library/gg aspx Early ve Late Binding Arasındaki Farklar Dynamics CRM 2011 ve sonrasinda CRM içerisinde programcılar kendilerine birden fazla programlama biçimi seçebilirler. Dynamics CRM de WSDL kullanarak early-bound tipleri ve Dynamics Entity sınıflarını kullanarak da late-bound programlama yapabilirsiniz. Plug-in ve Workflow yazabilmek için late-bound tipleri kullanmamız gerekmektedir. Dynamics CRM 4.0 da entity sınıflarının duruşu aşağıdaki şekildeki gibiydi; Şimdi ise Dynamics CRM 2011 de bu yapı şu şekilde değişti; DynamicEntity sınıfı artık Entity sınıfı isimli bir sınıfla yer değiştirdi. Bunun anlamı ise build time yani early bound tiplerle, runtime yani late bound tiplerin artık tek sınıftan türemesinin gerçekleşmiş olduğudur. Dynamics CRM de artık WSDL e direkt ulaşamıyoruz. Daha önceki makalemde de anlattığım gibi 2 tane dll i referans olarak eklemek ve servise bağlantı kurmak gerekmektedir. 8 P a g e

10 Late-Bound olarak isimlendiren mimaride siz Entity sınıfından bir nesne türetmeli ve bu nesnenin attribute collection da da değerlere yer vermelisiniz. Tabii burada değer alanlarının crm içerisindeki logical name lerini kesinlikle bilmeniz gerekmektedir. Aşağıdaki örnek bize late-bindig yapısının nasıl işlediğini gösterecektir; Entity lead = new Entity("lead"); lead.attributes["subject"] = "Deneme Firmasi"; lead.attributes["firstname"] = "Baris"; lead.attributes["lastname"] = "KANLICA"; lead.attributes["companyname"] = "Mawens Business Solutions"; lead.attributes["numberofemployees"] = 20; Guid leadid = service.create(lead); Entity sınıfını kullanmaya başladığımız zaman late-binding e giriş yapmış oluyoruz. Entity türünden oluşturduğumuz nesneye biz Lead türünden bilgileri içine dolduracağız diyoruz. Contact, Opportunity gibi CRM içerisindeki bütün nesneleri bu şekilde oluşturabiliriz. Daha sonra ise alanların logical name lerini vererek bunların değerleri veriyoruz. Burada.net tabanlı türleri kullanabilmekteyiz. CRM 4.0 da CrmBoolean, CrmNumber gibi türlere çeviriler yaparak nesnelerin içini doldururken artık buna ihtiyacımız bulunmamaktadır. service isimli WCF tabanlı servisimizden türemiş nesnenin Create Metodunu kullanarak nesnemizi CRM içerisinde bir kayıt olarak oluşturuyoruz. 9 P a g e

11 Early-Bound olarak isimlendirilen mimaride de ise CrmSvcUtil.exe aracını kullanarak bir OrganizationServiceContext türetmelisiniz. Daha sonra ise bu aracın türettiği nesneleri kullanabilir hale gelebilirsiniz. Tabii burada her bir nesnenin şema isimleriyle hareket ettiğimiz unutulmamalıdır. Aşağıdaki örnek bize early-binding yapısının nasıl işlediğini gösterecektir; CrmDataContext orgcontext = new CrmDataContext(ServiseBaglan()); var contact = new Contact() FirstName = "Alan", LastName = "Smith" ; orgcontext.addobject(contact); orgcontext.savechanges(); Burada ServiseBaglan() daha önceki makelemde belirttiğim gibi IOrganizationService Interface inden türemiş bir sınıfı teşkil etmektedir. Yani CRM in WCF servisine hazır ve açık bir bağlantıdır. Contact ise CRM içerisinde kişiler entity sidir, Account, Lead, Invoice,Quote gibi daha bir çok entity bulunmaktadır. Firstname ve Lastname ise kişinin adı ve soyadı için değerleri temsil etmektedir ve bu bilgi OrganizationContext ten gelmektedir. Bir sonraki yazında CrmDataContext isimli bu OrganizationContext in CrmSvcUtil.exe aracılığıyla nasıl oluşturulduğu göstereceğim. Daha sonra ise bu doldurduğumuz contact nesnesini OrganizationContext e teslim ediyoruz ve işlem yapılması için SaveChanges() metodumuzu çağırıyoruz. 10 P a g e

12 Farklılıkları ise şu şekilde sıralayabiliriz; Early-Bound Entity Sınıflarının en büyük avantajı compile time da bize bütün hataları göstermesidir. Yani uygulamamızı yazarken ya da derlerken türler arası uyumsuzluk ya da yanlış değer atama gibi bütün yanlışlıklarımızı gözler önüne sermektedir. CrmSvcUtil bize tüm CRM mimarisini örneklerken bütün nesneleri ve onun ilişkilerini de getirmektedir. Böylece nesne dönüşümleri ve tür güvenliği de sağlanmış olmaktadır. Visual Studio içerisinde inteli sense özelliğini kullanmamızı sağlar. Dynamics CRM 4.0 dan beri WSDL ile çalışan kişiler bu yeni yapıda hiçbir farklılık hissetmeyeceklerdir. CrmSvcUtil.exe ile Early-Bound Sınıflar Oluşturmak Early-Bound tiplerle çalışabilmek için obje modelini bilmeye ihtiyacımız vardır. İşte CrmSvcUtil.exe bize bu kodu üretecek olan programdır. Program early-bound.net Framework sınıflarını ve entity modellerini Microsoft Dynamics CRM 2015 içerisinden almakta ve bize bir.cs dosyası halinde vermektedir. Bu noktadan sonra üretilen bu.cs dosyasını ya Visual Studio ile kodunuzun bir parçası olarak kullanabilir ya da bir dll haline getirip projenize referans olarak ekleyebilirsiniz. Bu sayede Visual Studio içerisinde intelli-sense özelliği ile kod geliştirebilirsiniz. Eğer isterseniz uygulama her bir entity için ayrı bir partial class da oluşturabilir. CRM in SDK sında bin klasörü içerisinde bulabileceğiniz bu aracı command prompt ile çalıştırabilirsiniz. crmsvcutil.exe /url: buraya Organization Service in adresi gelecek /out: çıktının hangi dosyaya olacağı bilgisi /username : servise bağlanılacak kullanıcı adı /şifre : servise bağlanılacak şifre Eğer CRM de zaten kullanıcı olan bir kişi ile oturum açtıysanız k.adı ve şifre belirtmenize gerek yok. 11 P a g e

13 Bu şekilde gerekli cümleyi command promt a yazdığınızda yukarıdaki ekranda olduğu gibi.cs dosyanızı alabilirsiniz. Ek olarak aşağıdaki parametreleri de verebilirsiniz; /servicecontextname: Eğer.cs dosyanızı LINQ Service Context vasıtasıyla LINQ sorgularını da desteklemesini istiyorsanız bu özelliği kullanmalısınız. Buraya türetilecek servis context inin adını girmelisiniz örneğin CrmDataContext gibi. Burada ek olarak şunu da belirtmeliyim ki bu komutu varsayalında ben hep kullanıyorum. Bu komutu kullandığımız zaman 2 şeyi unutmamız gerekmekte; 1. Bir OrganizationContext oluşmakta artık onu kullanmamız gerekmekte, aşağıdaki örnekte olduğu gibi; CrmDataContext orgcontext = new CrmDataContext(ServiseBaglan()); 2. Crm Servis çağrısına şu özelliği eklememiz gerekmekte; _serviceproxy.enableproxytypes(); Bu iki maddenin detayını LINQ ile veri sorgulama makalemde daha detaylı anlatacağım. /namespace : Varsayılanda.cs dosyası bir namespace olmadan türetilir bu özelliği kullanarak kodu bir namespace altında toplayabilirsiniz. /language : CrmSvcUtil.exe varsayılanda C# kodu üretil eğer VB kodu üretmek istiyorsanız bu özelliğe VB değerini vermeniz gerekmekte. Bu tool aşağıdaki örnekte olduğu gibi bir kod üretmektedir; /// <summary> /// Bir müşteriyi veya potansiyel müşteriyi temsil eden işletme. Ticari işlemlerde faturalanan şirket. /// </summary> [System.Runtime.Serialization.DataContractAttribute()] [Microsoft.Xrm.Sdk.Client.EntityLogicalNameAttribute("account")] [System.CodeDom.Compiler.GeneratedCodeAttribute("CrmSvcUtil", " ")] public partial class Account : Microsoft.Xrm.Sdk.Entity, System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged 12 P a g e

14 /// <summary> /// Default Constructor. /// </summary> public Account() : base(entitylogicalname) public const string EntityLogicalName = "account"; public const int EntityTypeCode = 1; public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; public event System.ComponentModel.PropertyChangingEventHandler PropertyChanging; private void OnPropertyChanged(string propertyname) if ((this.propertychanged!= null)) this.propertychanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 13 P a g e

15 Veri Turleri Hakkinda Microsoft Dynamics CRM 2011 ve Microsoft Dynamics CRM Online'da programlama modeli.net'in temel türlerini kullanacak şekilde değiştirildi. Bu tabloda beni en çok şaşırtan ise Customer, Lookup, Owner nesnelerinin artık EntityReference türünden sadece bir değer almaları. CRM'i yeni öğrenler için işler gerçekten kolaylaştırılmış. Artık kod yazarken CRM ile başlayan nesnelerimiz yok. Aşağıdaki tablo bize Microsoft Dynamics CRM 4.0 ile CRM 2011, 2013 ve 2015 arasındaki tür dönüşümünü göstermektedir. Özellik Adı Microsoft Dynamics CRM 2011, 2013, 2015 Türü AttributeTypeCode.Boolean bool ya da System.Boolean CrmBoolean AttributeType.CalendarRules EntityCollection Microsoft Dynamics CRM 4.0 Türü DynamicEntity[] or calendarrule[] AttributeType.Customer EntityReference Customer AttributeType.DateTime System.DateTime CrmDateTime AttributeType.Decimal decimal ya da System.Decimal CrmDecimal AttributeType.Double double ya da System.Double CrmFloat AttributeType.Integer int ya da System.Integer CrmNumber AttributeType.Internal System.Object Kayıtlarda Kullanılmaz AttributeType.Lookup EntityReference Lookup Kayıtlarda Kullanılmaz. AttributeType.Memo string ya da System.String System.String AttributeType.Money Money CrmMoney AttributeType.Owner EntityReference Owner AttributeType.PartyList EntityCollection or ActivityParty[] AttributeType.Picklist OptionSetValue Picklist AttributeType.PrimaryKey System.Guid Key activityparty[] or DynamicEntity [] AttributeType.String System.String System.String AttributeType.State OptionSetValue yada oluşturulan enumeration kullanılmalı AttributeType.Status OptionSetValue ya da int Status AttributeType.Uniqueidentifi er AttributeType.Virtual Eski Tür CrmAttributeType Class (MetadataService) Moniker Class (CrmService) SecurityPrincipal Class (CrmService) System.Guid System.Object Kayıtlarda Kullanılmaz Yeni Tür EntityNameStateInfo UniqueIdentifier Kayıtlarda Kullanılmaz Microsoft.Xrm.Sdk.Metadata.AttributeTypeCo de Microsoft.Xrm.Sdk.EntityReference Microsoft.Xrm.Sdk.EntityReference 14 P a g e

16 OptionSetValue OptionSetValue a değer atamak için ilk önce OptionSetValue türünden bir nesne oluşturmanız gerekmektedir. Burada dikkat çekmek istediğim konu ise eğer state alanı ile çalışacaksanız (yani firma için aktif/pasif, teklif için açık/kazanıldı/kaybedildi gibi) earlybound sınıflarda bunlar için mutlaka bir enumaration oluşturulmakta. Ama late bound sınıflarda bu durumu programcı yönetmektedir. Örnek olarak adres üzerindeki bir optionset alana değer atama aşağıdaki şekilde olmaktadır; OptionSetValue osv = new OptionSetValue(1); contact.attributes["address1_freighttermscode"] = osv; EntityReference CRM sisteminde iki entity yi birbirine bağlamak için lookup nesnesini kullanmak zorundayız. Lookup lar üzerinde programatik işlem yapabilmek için EntityReference nesnesini kullanmaktayız. Bu nesneye Lookup alana reference vermek istemiz nesnenin türü ve Id sini vermemiz gerekmektedir. Aşağıdaki örnekte parentaccountid atama yapılacak nesnenin guid cinsinden Id si olmalı; EntityReference parentaccountid = new EntityReference("account", parentaccountid)); accountentity.attributes["parentaccountid"] = parentaccountid; ioservice.update(accountentity); Null Değer Atama CRM 4.0 dan farklı olarak.net Type türleri kullanıldığı için null değer atama işlemi artık sadece alana değer vermekten ibaret oldu. İşte birkaç örnek; EntityAdi.IndustryCode = null; EntityAdi.AccountId = Guid.Empty; EntityAdi.AccountNumber =""; EntityAdi.Address1_Country = String.Empty; Veri Sorgulama Bu noktada sizlere Dynamics CRM den veri çekmek için kullanabileceğiniz yapıları anlatacağım. FetchXML ile veri çekmek bence şu anda kullanılabilecek en pratik yöntem ama bunun haricinde.net Language-Integrated Query(LINQ) ile early ve late binding türler üzerinden veri çekebileceğiniz gibi Dynamics CRM in Query Expression mimarisini kullanarak da veri çekebilirsiniz. Bu üçü haricinde OData ve Filtered View ları kullanarak da veri çekebilirsiniz. OData(Open Data Protocol) Rest tabanlı servisler için protokol görevi gören bir veritabanı sorgulama yapısıdır. Filtered View lar ise standart SQL ile SQL Server üzerinden direkt veri çekmek için kullanabileceğimiz yapılar ama Filtered View ve OData ile geriye CRM obje sınıflarıyla veri döndürememekteyiz. Yani SQL ile bir veri çektiğinizde DataSet ya da DataTable gibi yapılara veriyi çekebiliriz ama FetchXML ile CRM entity sınıfından geriye dönüş alırız bu yüzden kullanım açısından ilk yöntem daha kullanışlıdır. 15 P a g e

17 LINQ ile veriler üzerinde işlem yapabilmek için Organization Service Context sınıfını türetip projeye eklemek gerekmektedir. Benzerliklerini bir tablo üzerinde karşılaştırırsak; Sorgu Biçimi FetchXML Özellikleri QueryExpression'ın bütün özelliklerine destek verdiği gibi matematiksel işlemler ve gruplamaya da destek verir. Sorgular XML standartlarına göre yazılır. QueryExpression Sorgular bir obje modeli üzerinde icra edilir. LINQ QueryExpression'ın limitleriyle sınırlıdır. Yetenekleri bakımından karşılaştırırsak; Odata QueryExpression FetchXML LINQ Filtered Views Create, Update, Delete desteği X X Sorgu sonucu kayıtları döndürme X X X X X Rapor yaparken kullanılabilirlik X X Sorgu sonucu birden fazla türde kayıt döndürme X X X X X outer joins yapabilme X X X Çalışma zamanında doğrulama X X İlişkisiz nesneleri bağlama (Union) X X Matematiksel İşlemleri destekleme X (Sınırlı) X X X 16 P a g e

18 FetchXML FetchXML en güzel tarafı Dynamics CRM içerisinde Gelişmiş Ara (Advanced Find) ile oluşturduğumuz sorguların da bu şekilde sistemde kaydedilmesi. Ayrıca bu şekilde oluşturduğumuz sorguları da.xml olarak CRM den alabiliyoruz böylece yazdığımız uygulama ya da rapor içerisinde de kullanabilmekteyiz. Böylece uzun uzun FecthXML hazırlamak yerine sistemin nimetlerinden yararlanarak sorgumuzu hazırlayabilmekteyiz. Bunun için gelişmiş bul içerisinde Fetch XML indir düğmesine tıklıyoruz. CRM de de bu kullanıcı sorguları userquery, organizasyon sorguları ise savedquery içerisinde saklanmaktadır. IOrganizationService.RetrieveMultiple methodu ile FetchXML sorgulaması yapabilmekteyiz bunun için FetchXMLToQueryExpressionRequest mesajını kullanmak gerekmektedir. Ayrıca daha önce de belirttiğim gibi aggregations yani sum, max, min, count gibi matematiksel işlemleri de FetchXML ile yapabilmekteyiz. Bu makaledeki örneklerde CRM Servisini çağırmak daha önceki Singleton Tasarım Deseni üzerinden geliştirdiğim servise bağlanma metodunu kullanıyorum. Sözünü ettiğim makaleye buradan ulaşabilirsiniz. Bu noktayı siz de kendinize uygun olarak değiştirebilirsiniz. Sorguyu Hazırlama Bu noktada örnek bir fetchxml i inceleyelim; <fetch mapping='logical'> <entity name='account'> 17 P a g e

19 <all-attributes/> </entity> </fetch> FetchXML mutalaka fetch kelimeleri arasında yer almalı. Sonrasında ise entity kelimesi ile geri dönecek nesnenin türünü söylüyoruz. Sonrasında ise hangi alanların geri döneceğini ve nasıl koşullar olacağını belirtiyoruz. Tabii yukarıdaki örnekte bunlar yok all-attributes ile biz bütün alanları geri döndür diyoruz. Size bu sorguyu SQL ile anlatmam gerekirse : select * from account şeklinde olacak. Şimdi işi biraz daha renklendirelim; <fetch mapping='logical'> <entity name='contact'> <attribute name='fullname'/> <attribute name='createdon'/> <filter type='and'> <condition attribute='jobtitle' operator='eq' value='purchasing Assistant'/> </filter> </entity> </fetch> Bu sorguda ise geriye contact yani ilgili kişi nesnesi geri dönecek ama sadece fullname ve createdon alanları ile. Ayrıca burada bir kriterimiz de var jobtitle alanı Purchasing Assistant olacak kayıtları alıyoruz. Yani yine SQL ile anlatırsam : select fullname, createdon from contact where jobtitle='purchasing Assistant' Burada dikkat ettiyseniz operatör diye bir ifade yer almakta. Sorgulama yaparken değerlerin nasıl koşullarda alınması gerektiğini burada belirtiyoruz. Yani aşağıdaki tabloda da görebileceğiniz üzere 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. Koşul Koşul İfadesi Değer equals x eq x does not equal x ne x is greater than x gt x 18 P a g e

20 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 does not exist anytime yesterday today tomorrow in next 7 days in last 7 days next week last week this week this month last month next month this year next year not-null null not-null yesterday today tomorrow next-seven-days last-seven-days next-week last-week this-week this-month last-month next-month this-year next-year 19 P a g e

21 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 not between in not in equals user id does not equal user id equals business id does not equal business id between not-between in not-in eq-userid ne-userid eq-businessid ne-businessid Sorguyu Çalıştırma Bu sorguyu çalıştırcak metod ise RetrieveMultiple metodudur ve servisi örneklediğimizde karşımıza çaıkmaktadır. Bu metod makalenin başında bahsettiğim QueryExpression sınıfını da alarak işlem yapabilmektedir. Bu metodun bir de kardeşi vardır ve hazır yeri gelmişken bundan da bahsedeyim. Retrieve Metodu ID si verilen entity nesnesinin bildirdiğiniz sütünlarını bize geri döndürür. Kullanımı çok basit olan bu metod geriye Entity türünden bir nesne döndürür. Bu nesne zaten bizim parametre olarak verdiğimiz nesne adının kendisidir ve bizim belirttiğimiz sutünları doldurarak getirir. Bu metod aslında sql cümlesi olarak bakarsak select alanisimleri from (nesne)entity where entityid = '...' işlemini yerine getirmektedir. Aşağıdaki örnekle devam edelim; Entity slead = servis.retrieve("lead", new Guid("7bE545CCD3-9A3A-E011-BA8B- 78E7D1623F9D"), newcolumnset(new string [] "fullname", "companyname" )); foreach (var item in slead.attributes) 20 P a g e

22 Console.WriteLine(item.Key + ":" + item.value); Eğer entity nin bütün alanlarını geri döndürmek istiyorsak new ColumnSet(true) komutunu ColumnSet yerine vermemiz gerekmektedir. Yani eğer siz sorgulayacağımız nesnenin GUID türünden idsini biliyorsanız ve join gibi işlemlerle işiniz yoksa düz mantıkta bir sorgulama yapmak için bu metodu kullanabilirsiniz. RetrieveMultiple Metodu ise gerçek anlamda karışık sorguları yapmamıza olanak tanır. Ama burada tamamen object oriented bir mimari söz konusudur yani temelde bir sorgulama cümlesi olmadan QueryExpression ya da QueryByAttribute sınıflarının örnekleri üzerinden sorgulama işlemi yapılmasına da olanak sağlar. Bizim odak konumuz ise fetchxml olduğu için konuyu fazla dağıtmadan devam edelim. Bu fetchxml sorgusunu çalıştırmak için ise şu şekilde bir kod yazdım; string fetchxml mapping='logical'> <entity name='contact'> <attribute name='fullname'/> <attribute name='createdon'/> <filter type='and'> value='purchasing Assistant'/> <condition attribute='jobtitle' operator='eq' </filter> </entity> </fetch>"; EntityCollection contactlist = (EntityCollection)ServiseBaglan().RetrieveMultiple(new FetchExpression(fetchXml)); foreach (var cnt in contactlist.entities) Console.WriteLine(cnt.Attributes["fullname"].ToString() + ":" + cnt.attributes["createdon"].tostring()); Console.ReadLine(); 21 P a g e

23 Sorgu Sonucu İşte biraz önce bahsettiğim RetrieveMultiple metoduna fetchxml i veriyorum. Dönüşte ise sistem bana EntityCollection içerisinde talep ettğim entity i vermekte. Bu noktadan sonra foreach ile bütün kayıtar içinde dolaşabilir ve Attributes ile alanlara ulaşabilirim. Bu kodu çalıştırınca da aşağıdaki gibi sonucu almaktayım; İleri Seviye Sorgular Yukarıda temel bilgileri verdikten sonra ileri seviye bilgilerle buradan devam edebiliriz. <fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='lead'> <attribute name='fullname' /> <attribute name='createdon' /> <filter type='and'> <condition attribute='ownerid' operator='eq-userid' /> <condition attribute='statecode' operator='eq' value='0' /> </filter> </entity> </fetch> 22 P a g e

24 Bu sorguda ise lead türünden nesneleri geri döndürmekteyiz. fullname ve createdon alanlarını istemekteyiz sorgu ile ama ownerid yani kayıtların sahibi eq-userid diyerek servise kim bağlandıysa onun kayıtları olacak ve durumları da aktif olacak. Düz mantıktaki tek bir nesne üzerinden sorgular işte bu şekilde yapılmakta ama sistem bundan daha fazlasına izin verebilmekte yani biz eğer istersek inner ya da outer join yaparak başka nesneler ile de ilişki içerisindeki kayıtları da geriye döndürebiliriz. Aşağıdaki örnek üzerinden açıklamaya çalışayım; <fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='account'> <attribute name='name' /> <attribute name='address1_city' /> <attribute name='telephone1' /> <order attribute='name' descending='true' /> <filter type='and'> <condition attribute='name' operator='like' value='0%' /> </filter> <link-entity name='contact' from='contactid' to='primarycontactid' alias='kisi'> <attribute name=' address1' /> <filter type='and'> <condition attribute='firstname' operator='like' value='0%' /> </filter> </link-entity> <linkentity name='systemuser' from='systemuserid' to='createdby' visible='false' linktype='outer' alias='kullanici'> <attribute name='firstname' /> </link-entity> </entity> </fetch> Burada temelde yine bir nesne üzerinde yani account nesnesi üzerinden hareket ediyor gibi gözüksek de link-entity düğümleriyle işi genişletiyoruz. Örnekte görebileceğiniz üzere contact ve systemuser nesneleri üzerinden de geriye alan döndürdüğümüz gibi bunlar üzerinden de sorgulama yapabilmekteyiz. link-entity içerisinde sisteme hangi nesne ile link yapacağımızı ve bu nesnelerin hangi alanlar üzerinde birbirleriyle ilişki içerisinde olduklarını söylemekteyiz. Ayrıca alias vererek de kodun ilerleyen kısımlarında buradan gelecek alanlar için bir tanımlayıcı da oluşturabilmekteyiz. 23 P a g e

25 Burada ben link-type olarak outer kullandım ama siz isterseniz inner join yapmak için inner de kullanabilirsiniz. Bu arada belirtmeliyim ki order komutu ile de belli bir alan üzerinden kayıtların ascending ya da descending olarak sıralanmasını da sağlayabilmekteyiz. Örnekte ben firma adı ve kişi adı için konsoldan parametre almaktayım bu yüzden orada 0 ifadesini görmektesiniz. Bu sorguyu daha raht anlamanız için SQL cümlesine çevirecek olursam; select name, address1_city, telephone1, kisi. address1, kullanici.firstname from a ccount innerjoin contact kisi on kisi.contactid = account.primarycontactid inner join systemuser kullanici on kullanici.systemuserid = account.createdby where account.name like '%%' and kisi.firstname like '%%' order by account.name desc Böyle bir sorgu yazmamız gerekirdi. Bu kodu çalıştıracak örnek uygulama ise şu şekilde; string fetch <fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='account'> <attribute name='name' /> <attribute name='address1_city' /> <attribute name='telephone1' /> <order attribute='name' descending='true' /> <filter type='and'> value='0%' /> <condition attribute='name' operator='like' </filter> to='primarycontactid' alias='kisi'> <link-entity name='contact' from='contactid' <attribute name=' address1' /> <filter type='and'> operator='like' value='0%' /> <condition attribute='firstname' </filter> </link-entity> <link-entity name='systemuser' from='systemuserid' to='createdby' visible='false' link-type='outer' alias='kullanici'> <attribute name='firstname' /> 24 P a g e

26 </link-entity> </entity> </fetch>"; Console.WriteLine("bir karakter yazın:"); fetch = string.format(fetch, Console.ReadLine()); EntityCollection groupby1_result = ServiseBaglan().RetrieveMultiple(newFetchExpression(fetch)); foreach (var c in groupby1_result.entities) Console.WriteLine("ad:" + c["name"].tostring()); Console.WriteLine("sehir:" + c["address1_city"].tostring()); Console.WriteLine("telefon:" + c["telephone1"].tostring()); Console.WriteLine("kisi eposta:" + ((AliasedValue)c["kisi. address1"]).Value.ToString()); Console.WriteLine("kullanici:" + ((AliasedValue)c["kullanici.firstname"]).Value.ToString()); Console.WriteLine("\n"); Console.ReadLine(); Burada bir noktanın üzerinde durmamız gerekmekte. Kişi ve Kullanıcı üzerindeki alanlardan veri alabilmek için kisi ve kullanici isimli alias ları kullanmıştık. İşte bu alanlardan veri okuyacağımız zaman şu şekilde bir kullanıma ihtiyacımız bulunmakta; ((AliasedValue)c["kullanici.firstname"]).Value.ToString() Yani gelen değeri önce AliasedValue e parse etmemiz sonrasında ise Value üzerinden değerini almalıyız. Çıktımız ise şu şekilde. Yani adı a ile başlayan bir firma ve ona adı a ile başlayan birinci ilgili kişi kaydı olarak eklenmiş bir kayıt bulunmakta. 25 P a g e

27 Eğer XSD dosyalarını okumayı biliyorsanız fetchxml üzerinde nereye hangi değerlerin nasıl gelebileceğini anlayabilirsiniz. Ayrıca bunu dosya haline getirerek Visual Studio ya tanıtırsanız fetchxml yazarken denetleme yaparak size hataları da gösterecektir. Ama şu anda en güzel fetchxml oluşturma yöntemi daha önce de belirttiğim gibi Gelişmiş Ara aracını kullanmaktır. <?xml version="1.0" encoding="utf-8"?> <xs:schema id="fetch" elementformdefault="qualified" xmlns:xs="http://www.w3.org/2001/ XMLSchema" xmlns:mstns="http://tempuri.org/fetch/unique"> <xs:annotation> <xs:documentation>schema name: fetch-schema</xs:documentation> </xs:annotation> <!-- condition element - used for capturing entity and link-entity "where" clause criteria --> <!-- [XDR-XSD] "value" element --> <xs:element name="value" type="xs:string"></xs:element> <!-- [XDR-XSD] "condition" element --> <xs:element name="condition"> <xs:complextype> <xs:choice minoccurs="0" maxoccurs="unbounded"> <!-- --> 26 P a g e

28 <!-- The attribute "value" is used for all operators that compare to a single value (for example, eq). The element "value" is used for operators that compare to multiple values (for example, in). Some operators require neither the attribute "value" or the element "value" (for example, null). --> <xs:element name="value" minoccurs="0" maxoccurs="unbounded"> <xs:complextype> <xs:simplecontent> <xs:extension base="xs:string"> <xs:attribute name="uiname" type="xs:string" /> <xs:attribute name="uitype" type="xs:string" /> </xs:extension> </xs:simplecontent> </xs:complextype> </xs:element> </xs:choice> <!-- --> <xs:attribute name="column" type="xs:string" /> <xs:attribute name="attribute" type="xs:string"></xs:attribute> <xs:attribute name="entityname" type="xs:string"></xs:attribute> <xs:attribute name="operator" use="required" type="operator"></xs:attribute> <!-- The attribute "value" is used for all operators that compare to a single value (for example, eq). The element "value" is used for operators that compare to multiple values (for example, in). Some operators require neither the attribute "value" or the element "value" (for example, null). --> <xs:attribute name="value" type="xs:string"></xs:attribute> <xs:attribute name="aggregate" type="aggregatetype"></xs:attribute> <xs:attribute name="alias" type="xs:string"></xs:attribute> <xs:attribute name="uiname" /> <xs:attribute name="uitype" /> 27 P a g e

29 <xs:attribute name="uihidden" type="truefalse01type" /> </xs:complextype> </xs:element> <!-- filter element - used for constructing complex conditionals legal on entity and link-entity --> <!-- [XDR-XSD] "filter" element --> <xs:element name="filter"> <xs:complextype> <xs:choice minoccurs="0" maxoccurs="unbounded"> <!-- --> <xs:element ref="condition" minoccurs="0" maxoccurs="500" /> <xs:element ref="filter" minoccurs="0" maxoccurs="unbounded" /> </xs:choice> <!-- --> <xs:attribute name="type" default="and"> <xs:simpletype> <xs:restriction base="xs:nmtoken"> <xs:enumeration value="and" /> <xs:enumeration value="or" /> </xs:restriction> </xs:simpletype> </xs:attribute> <xs:attribute name="isquickfindfields" type="xs:boolean" /> </xs:complextype> </xs:element> <!-- attribute elements - used for selecting attributes from the surrounding entity / link-entity, these values are returned as part of the fetch 28 P a g e

30 --> <!-- [XDR-XSD] "all-attributes" element --> <xs:element name="all-attributes"> <xs:complextype></xs:complextype> </xs:element> <!-- [XDR-XSD] "attribute" element --> <xs:complextype name="fetchattributetype"> <xs:attribute name="name" use="required" type="xs:string"></xs:attribute> <xs:attribute name="build" type="build"></xs:attribute> <xs:attribute name="addedby" type="xs:string" /> <xs:attribute name="alias" type="xs:string"></xs:attribute> <xs:attribute name="aggregate" type="aggregatetype"></xs:attribute> <xs:attribute name="groupby" type="fetchbooltype"></xs:attribute> <xs:attribute name="dategrouping" type="dategroupingtype"></xs:attribute> <xs:attribute name="usertimezone" type="fetchbooltype"></xs:attribute> </xs:complextype> <!-- order element - used to specify a sort order --> <!-- [XDR-XSD] "order" element --> <xs:complextype name="fetchordertype"> <xs:choice minoccurs="0" maxoccurs="unbounded"> <!-- --> </xs:choice> <!-- --> <xs:attribute name="attribute" type="xs:string"></xs:attribute> <xs:attribute name="alias" type="xs:string"></xs:attribute> <xs:attribute name="descending" default="false" type="xs:boolean"></xs:attribute> </xs:complextype> <!-- link-entity element - used for joining one entity to its "parent" 29 P a g e

31 --> <!-- [XDR-XSD] "link-entity" element --> <xs:complextype name="fetchlinkentitytype"> <xs:choice minoccurs="0" maxoccurs="unbounded"> <!-- --> <xs:element ref="all-attributes" minoccurs="0" /> <xs:element name="attribute" type="fetchattributetype" minoccurs="0" maxoccurs=" unbounded" /> <xs:element name="order" type="fetchordertype" minoccurs="0" maxoccurs="1" /> <xs:element ref="filter" minoccurs="0" /> <xs:element name="link-entity" type="fetchlinkentitytype" /> </xs:choice> <!-- --> <xs:attribute name="name" use="required" type="xs:string"></xs:attribute FetchXML ile Aggregate(Toplama Sorguları) İşlemleri Bir önceki bolumde FetchXML ile neler yapabileceğimize değindik. Eğer istersek FetchXML ile grouping ve aggregate işlemlerini de yapabilmekteyiz. FetchXML ile aşağıdaki işlemler desteklenmektedir; sum avg min max count(*) count(attribute name) Aggregate yapabileceğimiz sorgu örneği standart olarak bildiğimiz fetchxml kurgusundan farklı değil burada sadece attribute kısmında aggregate ile ilgili keyword yer almakta. Aggregate=true diyerek bu şekilde bir sorgulama yapacağımızı sisteme söylüyoruz. Sonrasında ise sırasıyla hangi alan üzerinden işlem yapılacağını, alias yani etiketin ne olacağını ve aggregate türümüzün ne olacağını sisteme söylüyoruz. <fetch distinct='false' mapping='logical' aggregate='true'> <entity name='opportunity'> <attribute name='name' alias='opportunity_count' aggregate='count'/> </entity> </fetch> Bu şekilde oluşturduğumuz bir sorgu ile aslında şunu demek istiyoruz : select count('name') as opportunity_count from opportunity yani standart bir count işleminden fazlası değil yaptığımız. 30 P a g e

32 Bu fetchxml i çalıştırmak için ise aşağıdaki gibi bir kod hazırladım; string opportunity_count <fetch distinct='false' mapping='logical' aggregate='true'> <entity name='opportunity'> <attribute name='name' alias='opportunity_count' aggregate='count'/> </entity> </fetch>"; EntityCollection opportunity_count_result = ServiseBaglan().RetrieveMultiple(new FetchExpression(opportunity_count)); foreach (var c in opportunity_count_result.entities) Int32 aggregate2 = (Int32)((AliasedValue)c["opportunity_count"]).Value; System.Console.WriteLine("Count of all opportunities: " + aggregate2); Burada dikkat edilmesi gereken nokta geriye EntityCollection döndürmesi. Bir önceki makalemden hatırlarsanız normalde bu tarz sorgulama ile biz geriye account, contact gibi sitem içerisindeki nesnelerden oluşmuş bir dizi alıyoruz. FetchXML yapısı gereği tek bir metod kullanıyoruz ve bu metod sonucunda yukarıdaki örnekte olduğu gibi tek bir satır dahi dönecek olsa bile yine sonucu bir collection içerisinde almaktayız. Bu nedenle mecbur foreach içerisinde dönüyoruz ya da collection un 0. üyesini alıyoruz. Ben örneğimde foreach ile collection içinde döndüm ve gördüğünüz gibi değeri aldım. Yine bir önceki makalemde ileri düzey sorgular bölümünde anlattığım gibi eğer nesne üzerinden direkt bir değer döndürmeyeceksek sonuç her zaman AliasedValue olarak gelmekte. işte bu nedenden dolayı şu şekilde bir convert işlemi yapıyoruz; Int32 aggregate2 = (Int32)((AliasedValue)c["opportunity_count"]).Value Bu işlem sonucunda bu koddan aşağıdaki gibi çıktımızı alabiliyoruz. Eğer distinct yapmak istersek de fetchxml içerisine yerleştireceğimiz bir distinct= true ifadesiyle ile sisteme bunu beliretebiliriz. Aşağıda ise distinct yapılmış bir kod örneği bulunmakta; <fetch distinct='false' mapping='logical' aggregate='true'> <entity name='opportunity'> <attribute name='name' alias='opportunity_distcount' aggregate='countcolumn' distinct='true'/> </entity> </fetch> Bu FetxhXML i de aşağıdaki kodla çalıştırabiliriz. 31 P a g e

33 string opportunity_distcount <fetch distinct='false' mapping='logical' aggregate='true'> <entity name='opportunity'> <attribute name='name' alias='opportunity_distcount' aggregate='countcolumn' distinct='true'/> </entity> </fetch>"; EntityCollection opportunity_distcount_result = ServiseBaglan().RetrieveMultiple(new FetchExpression(opportunity_distcount)); foreach (var c in opportunity_distcount_result.entities) Int32 aggregate4 = (Int32)((AliasedValue)c["opportunity_distcount"]).Value; System.Console.WriteLine("Distinct name count of all opportunities: " + aggregate4); Console.ReadLine(); Bu kod sonucunda da aşağıdaki gibi bir cevap alabiliriz sistemden; Gelin olayı biraz renklendirelim. Bu sefer de bir sorgu içerisinde birden fazla aggregate seçeneğinin cevabını isteyelim. Böyle bir işlem için standart fetchxml in içerisinde sırasıyla hangi özelliklerin bize geri döneceğini belirtiyoruz tabii unutulmaması gereken nokta ise hepsi için ayrı birer alias olması gerektiğidir. <fetch distinct='false' mapping='logical' aggregate='true'> <entity name='opportunity'> <attribute name='opportunityid' alias='opportunity_count' aggregate='count'/> <attribute name='estimatedvalue' alias='estimatedvalue_sum' aggregate='sum'/> <attribute name='estimatedvalue' alias='estimatedvalue_avg' aggregate='avg'/> </entity> </fetch> Bu sorgu için ise aşağıdaki kodu hazırladım; string estimatedvalue_avg2 <fetch distinct='false' mapping='logical' aggregate='true'> <entity name='opportunity'> <attribute name='opportunityid' alias='opportunity_count' aggregate='count'/> <attribute name='estimatedvalue' alias='estimatedvalue_sum' aggregate='sum'/> <attribute name='estimatedvalue' alias='estimatedvalue_avg' aggregate='avg'/> </entity> 32 P a g e

34 </fetch>"; EntityCollection estimatedvalue_avg2_result = ServiseBaglan().RetrieveMultiple(new FetchExpression(estimatedvalue_avg2)); foreach (var c in estimatedvalue_avg2_result.entities) Int32 aggregate8a = (Int32)((AliasedValue)c["opportunity_count"]).Value; System.Console.WriteLine("Count of all opportunities: " + aggregate8a); decimal aggregate8b = ((Money)((AliasedValue)c["estimatedvalue_sum"]).Value).Value; System.Console.WriteLine("Sum of estimated value of all opportunities: " + aggregate8b); decimal aggregate8c = ((Money)((AliasedValue)c["estimatedvalue_avg"]).Value).Value; System.Console.WriteLine("Average of estimated value of all opportunities: " + aggregate8c); Console.ReadLine(); İşte bu şekilde aynı anda count, sum ve avg işlemlerini yapabilmekteyim. Sonuç ise aşağıdaki gibi; Create/Update/Delete Metodları CRM servis nesnesi bize kayıtlar üzerinde işlem yapma özelliği sağlamaktadır. Servis içinden yapmak istediğimiz harekete uygun metodu çağırmamız gerekmektedir. Tabii burada unutulmaması gereken konu servisi çağıran kullanıcının çağrılan metodda işlem yapmaya yetkili olması gerekmektedir. Create Metodu CRM 2015 içerisinde bir entity içerisinde yeni bir nesne oluşturmamıza olanak tanır. Metod parametre olarak entity türünden bir nesne alır ve yeni oluşturulmuş nesnenin GUID türünden değerini geri döndürür. Aşağıdaki örnek bu metodun late-bound sınıfla kullanımını göstermektedir. // Entity nesnesinin yeni bir instance ini olusturuyoruz Entity account = new Entity("account"); 33 P a g e

35 // Gerekli attribute lara atama yapiyoruz. account["name"] = "Örnek Firma"; // Örnek Firma adında bir firma karti olusturuyoruz. _accountid = ioservice.create(account); Aşağıdaki örnek bu metodun early-bound sınıfla kullanımını göstermektedir. Contact contact = new Contact() FirstName="Deneme", LastName="Kisisi", Address1_City="İstanbul", ; Guid contactguid =_service.create(contact); Update Metodu CRM 2011 içerisinde bir entity içerisinde bir nesneyi güncellememizi sağlar. Metod parametre olarak entity türünden bir nesne alır. Güncellenecek nesnenin id si mutlaka parametre olarak verilmelidir. Guid gcontact = new Guid("7bE545CCD3-9A3A-E011-BA8B-78E7D1623F9D"); Contact contact = new Contact() ContactId = gcontact, FirstName="Test", LastName="Kisisi", Address1_City="Ankara", ; _service.update(contact); Delete Metodu CRM 2011 içerisinde Id sini verdiğiniz bir nesneyi sistemden silmeye yarar. Metod parametre olarak silinecek nesnenin Id si yanında bu nesnenin türünü ister. Guid gcontact = "7bE545CCD3-9A3A-E011-BA8B-78E7D1623F9D"; _service.delete("contact", gcontact); Bir programcı olarak çok standart olan bu işlemleri isterseniz bir class mantığı altında birleştirelim. Bu sayede daha yönetilebilir bir CRUD (Create, Read, Update, Delete) yapısı oluşturabiliriz. Ben bu sınıf için Process adını kullandım ve Process sınıfı içerisinde şu anda Oluşturma, Güncelleme ve Silme işlerimi yapmaktayım. İlerleyen makalelerde Okuma yapılarını incelerken onları da bu sınıfa dâhil ederiz. Burada öncelikle açıklamalıyım ki bir önceki makalede yer alan Singleton tasarım deseniyle CRM servisini oluşturma yazımdaki class tan faydalanarak servisi çağırma işlemini gerçekleştirdim. O yazıyı okumak isterseniz buraya tıklayınız Ek olarak hata olaylarını kontrol etmek için Result isimli bir class kullandım bu class ın içeriği şu şekilde public class Result public string Message get; set; public bool iserror get; set; public Object BusinessObject get; set; public Result(string _Message, bool _iserror, Object _BusinessObject) 34 P a g e

36 Message = _Message; iserror = _iserror; BusinessObject = _BusinessObject; public Result(string _Message, bool _iserror) Message = _Message; iserror = _iserror; BusinessObject = null; Görüldüğü üzere çok basit bir class bize sonucun başarılı mı başarısız mı olduğunu döndürecek o kadar. Bunun haricinde bir de Base isimli bir class ım var ki Process sınıfını aslında bu class dan türetmekteyim. Şu anda bu class ı sadece ErrorNumber ve ErrorDetail gibi hata oluştuğunda bilgi almamızı sağlayacak iki property ile kullanmaktayım ama ileride farklı propertyler de eklenecek. public class Base public int ErrorCode get; set; public string ErrorDetail get; set; Bu iki class ımı açıkladıktan sonra asıl yapıda kullanacağımız metodlara gelelim. İlk önce create metodunu inceleyelim. Hatırlayacağınız üzere CRM servisinde Create metdonun Update metodundan tek farkı id ye ihtiyaç duymamasıydı. Çünkü bu metod id yi üretip bize geri döndürecek. Ben de kurguyu buna göre planladım. public Result Create(Entity EntityForCreate) try Service service = Service.GetService(); if (service == null) throw new Exception("Service is null"); if (service!= null && service.errorcode > 0) throw new Exception(service.ErrorDetail); Guid EntityID = service.organizationservice.create(entityforcreate); DetailedLog.CreateLog("Entity Created! Type: " + EntityForCreate.LogicalName + ", ID : " + EntityID, System.Diagnostics.EventLogEntryType.Information); return new Result("", false, EntityID); catch (Exception ex) ErrorCode = 100; ErrorDetail = ExceptionHandler.HandleException(ex); DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name 35 P a g e

37 + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString() + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error); return new Result(ErrorDetail, true); Aslında yapı çok basit servis nesnemi çağırıyorum, servis oluşurken hata var mı diye bakıyorum eğer hata varsa hatayı fırlatıyorum. (bu noktada şunu belirtmeliyim ki catch bölümünde yer alan DetailLog ve ExceptionHandler benim daha önceden yazmış olduğum hata yönetimi ile ilgili class lar catch bölümünü siz de istediğiniz gibi düzenleyebilirsiniz) Eğer hata yok ise OrganizationService metodumu kullanarak nesnemi oluşturuyorum. Bu noktada da bir hata yoksa servis bana oluşturduğu nesnenin id sini döndürüyor yok eğer hata varsa zaten kod catch bloğuna düşüyor. İşte bu kadar. Şimdi gelin diğer metodlara bir göz atalım; public Result Update(Entity EntityForUpdate, Guid EntityID) try Service service = Service.GetService(); if (service == null) throw new Exception("Service is null"); if (service!= null && service.errorcode > 0) throw new Exception(service.ErrorDetail); service.organizationservice.update(entityforupdate); DetailedLog.CreateLog("Entity Updated! Type: " + EntityForUpdate.LogicalName + ", ID : " + EntityID, System.Diagnostics.EventLogEntryType.Information); return new Result("", false); catch (Exception ex) ErrorCode = 100; ErrorDetail = ExceptionHandler.HandleException(ex); DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString() + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error); return new Result(ErrorDetail, true); Update metodu neredeyse Create metodunun aynısı tek fark daha önce de ifade ettiğim gibi güncellenecek nesnenin id sini alması. Bunu almalı ki neyi güncellediğini bilebilsin. Aslında burada şöyle bir mantıksal kargaşa var update metodu ek olarak id yi almamakta zaten sizin ona update edilmesi için vereceğiniz entity nin Id alanına vermelisiniz. Benim burada ek olarak almamdaki amaç onu loglamak için. 36 P a g e

38 Bir de Delete metoduna göz atalım; public Result Delete(string EntityName, Guid EntityID) try Service service = Service.GetService(); if (service == null) throw new Exception("Service is null"); if (service!= null && service.errorcode > 0) throw new Exception(service.ErrorDetail); service.organizationservice.delete(entityname, EntityID); " + EntityID, DetailedLog.CreateLog("Entity Deleted! Type: " + EntityName + ", ID : System.Diagnostics.EventLogEntryType.Information); return new Result("", false); catch (Exception ex) ErrorCode = 100; ErrorDetail = ExceptionHandler.HandleException(ex); DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString() + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error); return new Result(ErrorDetail, true, null); Delete metodu entity nin adını ve id sini almakta. Bu iki veriyi de servise vermekteyiz. Class ın tamamına bakacak olursak; public class Process : Base public Result Create(Entity EntityForCreate) try Service service = Service.GetService(); if (service == null) throw new Exception("Service is null"); if (service!= null && service.errorcode > 0) throw new Exception(service.ErrorDetail); Guid EntityID = service.organizationservice.create(entityforcreate); DetailedLog.CreateLog("Entity Created! Type: " + EntityForCreate.LogicalName + ", ID : " + EntityID, System.Diagnostics.EventLogEntryType.Information); return new Result("", false, EntityID); catch (Exception ex) 37 P a g e

39 ErrorCode = 100; ErrorDetail = ExceptionHandler.HandleException(ex); DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString() + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error); return new Result(ErrorDetail, true); public Result Update(Entity EntityForUpdate, Guid EntityID) try Service service = Service.GetService(); if (service == null) throw new Exception("Service is null"); if (service!= null && service.errorcode > 0) throw new Exception(service.ErrorDetail); service.organizationservice.update(entityforupdate); DetailedLog.CreateLog("Entity Updated! Type: " + EntityForUpdate.LogicalName + ", ID : " + EntityID, System.Diagnostics.EventLogEntryType.Information); return new Result("", false); catch (Exception ex) ErrorCode = 100; ErrorDetail = ExceptionHandler.HandleException(ex); DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString() + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error); return new Result(ErrorDetail, true); public Result Delete(string EntityName, Guid EntityID) try Service service = Service.GetService(); if (service == null) throw new Exception("Service is null"); if (service!= null && service.errorcode > 0) throw new Exception(service.ErrorDetail); service.organizationservice.delete(entityname, EntityID); 38 P a g e

40 " + EntityID, DetailedLog.CreateLog("Entity Deleted! Type: " + EntityName + ", ID : System.Diagnostics.EventLogEntryType.Information); return new Result("", false); catch (Exception ex) ErrorCode = 100; ErrorDetail = ExceptionHandler.HandleException(ex); DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString() + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error); return new Result(ErrorDetail, true, null); Class ımızı bu şekilde oluşturduktan sonra gelin onu bir konsol uygulaması yardımıyla çağıralım ve iş başında görelim. static void Main(string[] args) try Entity lead = new Entity("lead"); lead.attributes["subject"] = "Fuardan Gelenler"; lead.attributes["firstname"] = "Barış"; lead.attributes["lastname"] = "KANLICA"; lead.attributes["companyname"] = "Omerd Business Solutions"; Process process = new Process(); Result result = process.create(lead); if (result.iserror) throw new Exception(result.Message); Console.WriteLine("Lead created : " + result.businessobject.tostring()); Console.ReadLine(); catch (Exception ex) Console.WriteLine("Error : " + ex.message); Console.ReadLine(); Gördüğünüz üzere Entity nesnemi çağıyor ve ona lead adını veriyorum. İçerisi istediğim bilgiler ile dolduruyor ve Process class ımın içindeki Create metodu vasıtasıyla CRM içerisinde oluşmasını sağlıyorum. İşte hepsi bu kadar :) Dynamics CRM 2015 Plug-in Mimarisi Sizlere bugun Dynamics CRM icerisindeki Plug-in Mimarisinden soz etmek isitiyorum. Plug-in ler IPlugin arayuzunden turetilmis kod parcaciklaridir ve CRM in icerisinde belli bir sira icerisinde calisirlar. Kabaca tariff edersek bunlar birer.dll dosyalaridir ve CRM e bu dosyaya ne zaman bakmasi 39 P a g e

41 gerektigini biz soyleriz. Plug-in ler olay bazli olarak calisirlar. Yani herhangi bir kayit olusturuldugunda, guncellendiginde, silindiginde vb.. olaylar oldukca biz ilgili ayari yapmissak calisirlar. Plug-in lerin en güzel yani pre ve post olarak calismaya ayarlanabilmeleridir. Plug-in ler olay bazli calisirlar demiştim iste bu olay olmadan önceki kaydin son hali üzerinden ve olay olduktan sonraki hali üzerinden işlem yapmaniza olanak sağlarlar. Plug-in lerin calismasi icin Microsoft.Xrm.Sdk.dll ve Microsoft.Crm.Sdk.Proxy.dll dosyalarinin referanslara eklenmis olmasi gerekmektedir. Tam yeri gelmisken bahsedeyim eger siz ucuncu parti bir.dll kullaniyorsaniz (yani kendi yazdiginiz siniflarin oldugu ya da diger uygulamalardan aldiginiz) bu.dll lerin ilgili serverin assembly klasöründe olduğundan emin olun yoksa plug-in calismayabilir. public class MyPlugin: IPlugin public void Execute(IServiceProvider serviceprovider) Detaya inecek olursak IPlugin arayuzunden turerilmis bir sinif içerisinde Execute metodu yer almalidir. Bu metod parametre olarak IServiceProvider arayuzunden türetilmiş bir bilgi yiginini içerir. Yani CRM kod içerisinde yapacagimiz işlemlerde bize CRM içerisinde olan olaylardan bize bilgi tasir ki biz de bu bilgileri kodun içerisinde kullanalim. Ne gibi veriler içinde tasimakta derseniz cok fazla detay verebilirim mesela su anda hangi kullanicinin işlem yaptigi, tasidigi nesnenin turunu, eger pre-plugin ise değerlerin değişmeden önceki halini vb bir cok veri içermekte. Simdi sirasiyla gelen veri yiginlarini inceleyelim. Plug-in Execution Context Calisma zamaninda oluşan veriler bu yapi içerisinde yer almaktadır. Bunlara kodun calisma hiyerarşisi ve entity bilgileri de dahildir. IPluginExecutionContext context = (IPluginExecutionContext) serviceprovider.getservice(typeof(ipluginexecutioncontext)); Bir olay olduğunda kayit edilmiş bir plug-in e bu veriler aktarılır aslinda o anda calisan butun plugin lere bu veriler aktarılır ama execution pipeline denen sralamaya uyarak aktarılır once pre sonra post pluginlere veri aktarılır. Hatta siz pre-plugin ile bir veriyi değiştirirseniz post-plugin e o veri aktarılır. Tabii burada yeri gelmişken bahsedeyim burada sozu edilen kodlarin sonsuz döngüye girmemeleri için sistem içerisinde Depth denen bir anahtar yer almaktadır. Varsayilanda bu bir plugin i arda arda 8 kere calistirir ve durdurur. Boylece sistemin bir kod yanlisigi ile çökmesi engellenmiştir. Bu değer değiştirebilir bir değerdir. Sistemin calismasi da aslinda su mantiga dayanmakta; 40 P a g e

42 Yani Event Execution Pipeline a bir mesaj girdiginde Pre-Event -> Platform Islemleri (Yani CRM in kendi ic isleyisi) -> Post-Event seklinde islenmekte. Bu dongu senkron ve asenkron yapilar için böyle ilerlemekte. Organization Servise Erisme CRM içerisinde işlem yapabilmek her zaman bir servis nesnesine ihtiyaç duymaktayız. Iste kullanicinin hareketi neticesinde acilmiş bu servisi bize kullanmamiz için geçirmekte serviceprovider nesnesi. IOrganizationServiceFactory servicefactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOr ganizationservicefactory)); IOrganizationService service = servicefactory.createorganizationservice(context.userid); Notification Servise Erisme Senkron olarak işaretlenmiş plug-in ler Microsoft Azure Service Bus a veri mesaj gondebilirler. IServiceEndpointNotificationService turunden olan bu bilgi Azure Service Bus a gönderilir. Bu sayede Azure Service Bus içerisinde endpoint oluşturulmuş ve endpoint i dinleyen 3. Parti bir servis ile iletişime geçebilmektedir. Input ve Output Parametreleri InputParameters nesnesi su anda yapilan hareketin yani su anda tetiklenmiş olayin bilgisini ve su anda üzerinde işlem görülen entity nin bilgisini içerir. Bu bilgiye erişmek için Target nesnesine 41 P a g e

43 bakmamiz gerekmektedir ve bu nesneyi alip Entity class ina çevirebiliriz. Input nesneleri Request message yapisindadir. if (context.inputparameters.contains("target") && context.inputparameters["target"] is Entity) // Obtain the target entity from the input parameters. Entity entity = (Entity)context.InputParameters["Target"]; Fakat unutmaniz gereken bir nokta var her mesaj Entity nesnesini içermeyebilir. Ornegin DeleteRequest; Entity değil EntityReference dondurur. if (context.inputparameters.contains("target") && context.inputparameters["target"] is EntityReference) // Obtain the target entity from the input parameters. EntityReference entity = (EntityReference)context.InputParameters["Target"]; Benzer sekilde OutputParameters da Response message içerir. Ama sunu unutmayin ki senkron postevent ve asenkron plug-in ler OutputParameters turunden nesneler içerirler. Pre ve Post Entity Imajlari Bu konuyu okurken sakin Ingilizce Images kelimesinin resim anlamiyla karistirmayin buradaki anlami verinin o anki goruntusu seklinde ifade etmek daha doğru olur. Aslinda tam Ingilizce tabiriyle snapshot. PreEntityImages ve PostEntityImages verileri sistem tarafından size gönderilir ama siz ozellikle beklediğiniz alanlari plug-in in kayit işlemi sirasinda sisteme soyleyebilrsiniz. Burada tabii ki bir mantik çerçevesi olduğunu da unutmayin Create aninda bir nesnenin preimage i olamayacagi gibi Delete işleminden sonra da bir postimage beklemeyin. Simdi bu bilgileri verdikten sonra butun bunlari birleştirerek bir plug-in temel goruntusune bakalim. Aciklamalar kodun içinde. using System; using System.ServiceModel; using Microsoft.Xrm.Sdk; public class MyPlugin: IPlugin public void Execute(IServiceProvider serviceprovider) // Sandbox içerisinde calisan plug-in ler TracingService den yararlanabilirler. ITracingService tracingservice = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); 42 P a g e //Context i elde ediyoruz. IPluginExecutionContext context = (IPluginExecutionContext) serviceprovider.getservice(typeof(ipluginexecutioncontext)); // InputParameters dan gelen verileri aliyoruz

44 if (context.inputparameters.contains("target") && context.inputparameters["target"] is Entity) // Target ile entity e erisiyoruz. Entity entity = (Entity)context.InputParameters["Target"]; // Beklediginiz entity geldi mi diye kontrol ediyoruz. if (entity.logicalname!= "account") return; // CRM Servisi elde ediyoruz IOrganizationServiceFactory servicefactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFac tory)); IOrganizationService service = servicefactory.createorganizationservice(context.userid); try / Iste buradan sonrasi size kalmis istediğiniz kodu yazabilirsiniz. catch (FaultException<OrganizationServiceFault> ex) throw new InvalidPluginExecutionException("An error occurred in MyPlug-in.", ex); catch (Exception ex) tracingservice.trace("myplugin: 0", ex.tostring()); throw; Plug-in ler Icerisindeki Hatalari Yakalamak Senkron calisan plug-in ler sandbox da olsun ya da olmasin herhangi bir hata ile karsilastiklarinda geriye kullaniciya uyari gösterecek bir yapiya sahiptirler ve bu durumu Dynamics CRM yönetir. Yani siz sadece hatayi geriye dondurursunuz. Asenkron calisan yapilar için CRM içerisinde System Job(AsyncOperation) isimli bir bolum yer almaktadır. Iste asenkron hatalari da buradan takip edebilirsiniz. Senkron calisan plug-in lerde ise hata mesajlarini InvalidPluginException turunden bir hata göndererek kontrol edebilirsiniz. Message ozelligine herhangi bir değer gönderirseniz sistem onu gösterir aksi takdirde varsayilan hata mesaji görüntülenir. Ayrica sunu da belirteyim Sandbox içinde calismayan plug-in ler için hata mesajlari sistemin calistigi serverdaki Olay Goruntuleyici içerisinde Uygulama hatalari bolumu içerisine de kaydedilir. Plug-in içerisinde uygun gordugunuz yerde su sekilde hata fırlatabilirsiniz: throw new InvalidPluginExecutionException("The account number can only be set by the system."); 43 P a g e

45 Bir plug-in hata firlattiginda CRM su sekilde bir uyari vermektedir. Log dosyasini incelediğimizde de detaylari almaktayız. Bizim gönderdiğimiz mesaja dikkat edin lütfen; Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version= , Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: The account number can only be set by the system. Detail: <OrganizationServiceFault xmlns="http://schemas.microsoft.com/xrm/2011/contracts" xmlns:i="http://www.w3.org/2001/xmlschema-instance"> <ErrorCode> </ErrorCode> <ErrorDetails xmlns:a="http://schemas.datacontract.org/2004/07/system.collections.generic"> <KeyValuePairOfstringanyType> <a:key>callstack</a:key> <a:value i:type="b:string" xmlns:b="http://www.w3.org/2001/xmlschema"> at Microsoft.Crm.Sdk.Samples.AccountNumberPlugin.Execute(IServiceProvider serviceprovider) at PluginProfiler.Library.PluginAppDomainProxy.ExecuteCore(Stopwatch watch, ProfilerExecutionReport report, Object instance, Object executionparameter) at PluginProfiler.Library.AppDomainProxy.Execute(ProfilerExecutionConfiguration configuration, ProfilerExecutionReport report) </a:value> </KeyValuePairOfstringanyType> </ErrorDetails> <Message>The account number can only be set by the system.</message> <Timestamp> T15:29: Z</Timestamp> <InnerFault i:nil="true" /> <TraceText i:nil="true" /> </OrganizationServiceFault> Ama siz temel bir hata yönetim sinifina sahip olmak ve yazdiginiz butun kodlarda kullanmak isterseniz su sekilde bir Exception mimarisini yazdiginiz kodda kullanabilirsiniz. Fakat burada unutmamaniz gereken nokta siz hata fırlatmaz hatalari kendiniz Handle ederseniz CRM kullaniciya hata mesaji göndermeyecektir. Bunun için InvalidPluginException i siz firlatmalisiniz. Asagidaki kodu Plug-in ler içerisinde kullanmanizi pek tavsiye etmem cunku sistem gayet detayli bir geri bildirim yapmakta ama bir hata aliyor ve isin içinden cikamiyorsaniz bu kodu denemenizde fayda olabilir. Hatayi serverda ya da CRM içinde bir yerlere yazdırıp incelebilrisiniz. Yine uygun gordugunuz bir yerde kullaniciya hata göstermek istiyorsaniz InvalidPluginExecutionException firlatmayi unutmayin. catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex) 44 P a g e

46 error."); Inner Fault"); Console.WriteLine("The application terminated with an Console.WriteLine("Timestamp: 0", ex.detail.timestamp); Console.WriteLine("Code: 0", ex.detail.errorcode); Console.WriteLine("Message: 0", ex.detail.message); Console.WriteLine("Inner Fault: 0", null == ex.detail.innerfault? "No Inner Fault" : "Has catch (System.TimeoutException ex) Console.WriteLine("The application terminated with an error."); Console.WriteLine("Message: 0", ex.message); Console.WriteLine("Stack Trace: 0", ex.stacktrace); Console.WriteLine("Inner Fault: 0", null == ex.innerexception.message? "No Inner Fault" : ex.innerexception.message); catch (System.Exception ex) Console.WriteLine("The application terminated with an error."); Console.WriteLine(ex.Message); // Display the details of the inner exception. if (ex.innerexception!= null) Console.WriteLine(ex.InnerException.Message); FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> fe = ex.innerexception as FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>; if (fe!= null) Console.WriteLine("Timestamp: 0", fe.detail.timestamp); Console.WriteLine("Code: 0", fe.detail.errorcode); Console.WriteLine("Message: 0", fe.detail.message); Console.WriteLine("Trace: 0", fe.detail.tracetext); Console.WriteLine("Inner Fault: 0", null == fe.detail.innerfault? "No Inner Fault" : "Has Inner Fault"); Plug-in Yapici Metodlari Bir plug-in için Microsoft Dynamics CRM de opsiyonel olarak kullanabileceğiniz yapici metod(constructor) türleri mevcuttur. Hic parametre vermeden yapici metod cagirabileceginiz gibi bir ya da iki parametre vererek de cagirabilirsiniz. SamplePlugin isimli plug-in için 3 cesit yapici metod ornegi asagidaki gibidir. public SamplePlugin() public SamplePlugin(string unsecure) 45 P a g e

47 public SamplePlugin(string unsecure, string secure) Yapici metodun ilk parametresi public yani unsecure bilgi yigini içermelidir. Ikinci parametre ise nonpublic (secure) bilgi yigini içermelidir. Buradan da anlayabileceğiniz uzere secure string encrypted yani sifrelenmis veri unsecure ise unencrypted yani sifrelenmemis değer içermelidir. Office Outlook client da calisan bir plug-in yazdiysaniz bilmelisiniz ki secure string offline yani cevrimdisi modda calismayacaktir. Bu bilgileri bir plug-in e Plugin Registration Tool vasitasiyla bir step in kaydi sirasinda sisteme iletiyoruz. Bu mesajlar için ayrilmis 2 alan bulanmaktadır. Step içerisinde bu ayarlamalari yaptıktan sonra yazmis olduğumuz degerlere kod içerisinden asagidaki gibi ulaşabilirsiniz. private readonly string _unsecurestring; private readonly string _securestring; public AdvancedPlugin(string unsecurestring, string securestring) if (String.IsNullOrWhiteSpace(unsecureString) String.IsNullOrWhiteSpace(secureString)) throw new InvalidOperationException ("Unsecure and secure strings are required by the Advanced Plug-in, but not provided."); _unsecurestring = unsecurestring; _securestring = securestring; 46 P a g e

48 Hadi Plug-in Yazalim Plug-in ler hakkında temel bilgileri öğrendiğimize gore artik plug-in yazabiliriz. Asagida vereceğim orneklerde bir plug-in içerisinde yapabileceğiniz temel işlemleri anlatmaya calisacagim. Bu kodlara CRM SDK\SampleCode\CS\Plug-ins içerisinden ulaşabilirsiniz. Veritabanina gitmeden kayitlari değiştirmek Daha once de ifade ettiğim gibi CRM içerisinde bir kayit veritabanina gitmeden Pre-Operation(Pre- Event) adiminda kaydettiğiniz bir plug-in ile kullanicinin oluşturmak istediği kayda ulaşabilirsiniz. Asagidaki kod oluşturulan bir account(firma) nesnesinin içerisine eger yok ise bir numara oluşturarak bunu accountnumber(müşteri numarasi) alanina vermekte böylece kayitta olmayan bir alan veritabanina bu alan eklenmiş bir sekilde gidecek. Kodda da görebileceğiniz uzere ilk once Execute metodumuzu oluşturuyoruz. Biliyorsunuz ki bu metod parametre olarak içine aldigi ServiceProvider ile bize ihtiyacimiz olan butun verileri sunacak. Ilk once Context i ServiceProvider dan türetiyoruz. Daha sonra da Context içerisindeki Target in bir Entity mi olup olmadigina bakıyoruz. Tam bu noktada gelin Context nesnesinin içerisine bir bakalim. Asagidaki ekran goruntusunu bu plug-in i debug ettiğim anda aldim. Ilerleyen bölümlerde bir plugin in nasil debug edileceğini anlatacagim. Simdilik Context e odaklanalim. Gorebileceginiz uzere Context UserId, BusinessUnitId, MessageName, PrimaryEntityName, CreatedOn gibi o anda isimize yarayacak birçok veri yiginini içermekte. Iste Plug-in içerisinde ihtiyacimiz olanlari buradan alip kullanacagiz. 47 P a g e

49 Entity ise onu entity sinifindan bir nesne haline getiriyoruz. Bu sefer bu oluşturduğumuz yeni entity nesnesi account turunden bir nesne midir diye bakıyoruz. Daha sonra Icinde accountnumber diye bir alan var mi diye bakıyoruz. Yoksa iste tam bu noktada veritabanina doğru yolculuğa cikmis olan kullanicinin bu kaydına müdahale edip içerisine bizim urettigimiz numara ile accountnumber nesnesini doldurarak entity mize veriyoruz. Artik içerisinde accountnumber alani da var. /// <summary> /// A plug-in that auto generates an account number when an /// account is created. /// </summary> /// <remarks>register this plug-in on the Create message, account entity, /// and pre-operation stage. /// </remarks> //<snippetaccountnumberplugin2> public void Execute(IServiceProvider serviceprovider) // Obtain the execution context from the service provider. Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext) serviceprovider.getservice(typeof(microsoft.xrm.sdk.ipluginexecutioncontext)); 48 P a g e

50 // The InputParameters collection contains all the data passed in the message request. if (context.inputparameters.contains("target") && context.inputparameters["target"] is Entity) // Obtain the target entity from the input parameters. Entity entity = (Entity)context.InputParameters["Target"]; //</snippetaccountnumberplugin2> false) // Verify that the target entity represents an account. // If not, this plug-in was not registered correctly. if (entity.logicalname == "account") // An accountnumber attribute should not already exist because // it is system generated. if (entity.attributes.contains("accountnumber") == // Create a new accountnumber attribute, set its value, and add // the attribute to the entity's attribute collection. Random rndgen = new Random(); entity.attributes.add("accountnumber", rndgen.next().tostring()); else // Throw an error, because account numbers must be system generated. // Throwing an InvalidPluginExecutionException will cause the error message // to be displayed in a dialog of the Web application. throw new InvalidPluginExecutionException("The account number can only be set by the system."); Umarim birsey dikkatinizi çekmiştir. Entity içerisine direkt alani Attributes.Add metodu ile ekliyoruz. Yani bir update işlemi yapmıyoruz zaten kayit daha veritabanina gitmedi doğal olarak CRM Service nesnesinin bir instance ini olusturmamiza da gerek kalmadi. Update aninda update edilmemiş değerlere ulaşmak Baslik biraz karisik gelebilir ama aslinda tam olarak da durum bu update aninda update edilmemiş alanlara ulaşmak istiyorsaniz birazdan bahsedecegim yöntemi uygulamniz gerekmekte. Peki biz neye neden ulasamiyoruz diye soracak olursaniz aciklayayim. Dynamics CRM in Create aninda kayit ile ilgili elde ettiği butun bilgileri bize Target tan türettiğimiz entity içerisinde verir. Asagidaki ekran goruntusunde de bu durumu görebilirsiniz. 49 P a g e

51 Update aninda durum bundan farkli sistem bize sadece (doğal olarak) update edilmiş alanlari vermektedir. Asagidaki ekran goruntusune bakabilirsiniz. Ben bu contact üzerinde sadece jobtitle alanini güncelledim. Sistem jobtitle ve yaninda ihtiyaç duyulacak birkaç bilgiyi daha Target a vermekte o kadar. Simdi konu basligina dönecek olursak iste tam bu update aninda ben update edilmemiş bir alanin değerine ulaşmak istersem ne yaparim? Sistemde bunun için Image yani o kaydin o anki snapshot ini almamizi sağlayan bir ozellik var. Herhangi bir plug-in step i üzerinde sag tuşa basarak create new image seçeneğini seçtiğimizde asagidaki ekran karsimiza gelecektir. 50 P a g e

52 Bu ekranda Pre ve Post olarak istediğimiz alanlari parametre olarak seçebilir ve bunlara genel bir isim verebiliriz. Ben Target dedim. Iste bu ayarlamayi yapdiginizda asagidaki ekran goruntusundeki gibi update aninda değişmeyen ama sizin erişmek istediğiniz alan/alanlar PreEntityImages içerisinde hazir olacaktır. 51 P a g e

53 Hangi Message da hangi image lara ualasabileceginizin listesi asagidaki gibidir. Mesaj Stage Pre-Image Post-Image Create PRE Hayir Hayir Create POST Evet Evet Update PRE Evet Hayir Update POST Evet Evet Delete PRE Evet Hayir Delete POST Evet Hayir Peki kod tarafında buna nasil ulasacagiz derseniz o da su sekilde olacak; Once image nesnesine ulaşıyoruz: Entity image = (Entity)context.PreEntityImages["Target"]; Sonra image içerisinden istediğimiz alana erişiyoruz: String descriptionmessage = "Old full name: " + image["fullname"]; Uzerinde calistigim nesnenin id si nerede? Update edilmis ya da post-operation durumdaki bir nesnenin id sine ihtiyaç duyarsaniz su sekilde elde edebilirsiniz: Guid id = new Guid(context.OutputParameters["id"].ToString()); Ya da Guid id = context.primaryentityid; Plug-in ler arasinda bilgi paylasimi Eger bir plug-in içinde oluşturduğumuz bir veriyi diğer plug-in lerin de erişmesini istiyorsak SharedVariables yapisini kullanmamiz gerekmekte. SharedVarabiles aslinda bir parametre kolleksiyonu ve içerisinde paylaşmak istediğiniz nesneleri saklayabilirsiniz. Asagida 2 tane plug-in yer almakta. Ilk plug-in (PreEventPlugin) context.sharedvariables.add("primarycontact", (Object)contact.ToString()); 52 P a g e

54 Kodu ile Contact isimli Guid nesnesini PrimaryContact adinda SharedVariables içerisinde saklamakta. Ikinci plug-in ise Post-event aninda calismakta ve SharedVariables den istediği değeri örnekteki gibi almaktadır. Boylece plug-inler arasi veri transferi ve yapilmis olmakta. Guid contact = new Guid((string)context.SharedVariables["PrimaryContact"]); public class PreEventPlugin : IPlugin public void Execute(IServiceProvider serviceprovider) // Obtain the execution context from the service provider. Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext) serviceprovider.getservice(typeof(microsoft.xrm.sdk.ipluginexecutioncontext)); // Create or retrieve some data that will be needed by the post event // plug-in. You could run a query, create an entity, or perform a calculation. //In this sample, the data to be passed to the post plug-in is // represented by a GUID. Guid contact = new Guid("74882D5C-381A-4863-A5B9-B C2D0"); // Pass the data to the post event plug-in in an execution context shared // variable named PrimaryContact. context.sharedvariables.add("primarycontact", (Object)contact.ToString()); public class PostEventPlugin : IPlugin public void Execute(IServiceProvider serviceprovider) // Obtain the execution context from the service provider. Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext) serviceprovider.getservice(typeof(microsoft.xrm.sdk.ipluginexecutioncontext)); // Obtain the contact from the execution context shared variables. if (context.sharedvariables.contains("primarycontact")) Guid contact = new Guid((string)context.SharedVariables["PrimaryContact"]); // Do something with the contact. 53 P a g e

55 Plug-in Registration Tool u Kullanmak Ilk plug-in imizi yazdıktan sonra geldi onu CRM içerisine eklemeye. Bu işlem için Plugin Registration Tool dediğimiz CRM SDK içerisinden cikan bir uygulamayi kullanacagiz. Bu uygulama sayesinde hem plug-in hem de custom workflow lari CRM içerisine ekleyebilmekteyiz. SDK\Tools\PluginRegistration\PluginRegistration.exe yolu ile ulaşabileceğiniz uygulamayi calistirdiginizda sizden bağlanmak istediğiniz server ile ilgili bilgileri isteyecektir. Dynamics CRM Online için Online i seçebilirsiniz ama unutmayin ki Office 365 hesabi kullaniyorsaniz Office 365 i seçmeniz gerekmekte. Ikisi de Online ama yetki mekanizmaları farkli. Eger On-Premises yani Microsoft disinda host edilen bir CRM e erişmek istiyorsaniz o zaman On- Premises seçeneğini seçmeniz gerekmekte. IFD ler için de bu seçeneği kullanabilirsiniz. 54 P a g e

56 Eger Always display list of available orgs seçeneğiniz seçerseniz bağlanmak istediğiniz kullanici ile erişebileceğiniz organizasyonlarin listesini görüntüleyebilirsiniz. Basarili bir sekilde giriş yaptiginizda asagidaki gibi bir ekran karsiniza gelecektir. 1. Plug-in i sisteme kayit edebilmek için yukarıdaki Register düğmesine tikliyoruz ve ardindan Register New Assembly ye tikliyoruz. 55 P a g e

57 2. Step#1 bolumundeki düğmesine tikliyarak kayit ettirmek istediğimiz.dll i seçiyoruz. 3. Step#2 bolumunde kaydetmek istediğimiz plug-in class ini seçiyoruz. 4. Step#3 bolumunde 2 tane seçeneğimiz bulunmakta; a. Sandbox : Bu seçeneği seçer isek plug-in bir Sandbox içerisinde calisacak yani dis ortamdan izole edilecek. Boylece bu plugin sistem içerisinde calisacak ama sisteme zarar veremeyecek ve izlenebilir olacak. Kisacasi yazdiginiz bir plug-in production ortamina tasimadan once test etmek için bu senecegi kullaniyoruz. b. None : hiçbir kisitlama olmadan.dll içerisindeki kodlar icra edilir. 5. Step#4 bolumunde ise plug-in nerede duracagini seçmemizi istemekte. a. Database: tavsiye edilen yöntem budur. Boylece dll işletim sistemi kaynakli sorunlardan izole edilir. Veritabani yedeklendikçe dll de içinde olduğundan yedeklenecektir ve herhangi bir durumda geriye dönmenizi sağlar. 56 P a g e

58 b. Disk: Sistemin varsayilan dll yerleştirme yeri olan CRM Kurulum Yolu\Server\bin\assembly klasörü içerisinden dll i okur. Her bir server icin dll lerin belirtilen klasöre konmasi gerekmektedir. c. GAC: Global Assembly Cache üzerinden dll leri okur. Bu noktada bir not ileteyim eger server üzerinde calisan kodu debug etmek isterseniz yine server\bin\assembly klasörüne.pdb uzantili debug symbol lerinizi yerleştirmeniz gerekmekte. Ikinci bir not da eger serverda custom code execution kapaliysa açmak için server üzerinde powershell ile su kodlari calistirmaniz gerekmekte: Add-PSSnapin Microsoft.Crm.PowerShell $setting = get-crmsetting customcodesettings $setting.allowexternalcode="true" Degerleri kontrol etmek için bu komutlari calistirabilirsiniz : set-crmsetting $setting get-crmsetting customcodesettings Ayarlari tersine çevirmek için AllowExternalCode a False değerini vermeniz yeterli. Butun bu adimlari tamamladıktan sonra Register Selected Plugin düğmesine tikliyoruz. Plug-in kaydetmediki ilk adimi gerçekleştirmiş olduk sira diğer adimlarda :) Bu noktada plug-in i hangi event(ler) için yazdiysak onun için adim(lar) eklememiz gerekiyor. Plug-in anlatirken hep bir olay olduğunda yani veritabanina bir kayit eklendiğinde, silindiğinde ya da bir alani güncellendiğinde tetiklenebilir gibi orneklerle anlatıyoruz ama aslinda olay bundan daha derin gelin simdi custom entity ler için yani bizim oluşturduğunuz varliklar için sistem üzerinde nasil olaylarin tetiklenmelerini yakalayabiliyoruz. Literaturde bu konu message olarak geçmekte yani CRM eventlarina mesaj adi verilmekte. Message Name Ownership Type Message Availability Entity Supported Deployment Assign User-owned entities only Server Server Create User-owned and organizationowned entities Both Server Delete User-owned and organizationowned entities Both Server 57 P a g e

59 GrantAccess User-owned entities only Server Server ModifyAccess User-owned entities only Server Server Retrieve User-owned and organizationowned entities Both Server RetrieveMultiple User-owned and organizationowned entities Both Server RetrievePrincipalAccess User-owned entities only Both Server RetrieveSharedPrincipalsAndAccess User-owned entities only Both Server RevokeAccess User-owned entities only Server Server SetState User-owned and organizationowned entities Both Server SetStateDynamicEntity User-owned and organizationowned entities Both Server Update User-owned and organizationowned entities Both Server Listede de yer aldigi gibi Retrieve, RetrieveMultiple yani veritababindna sorgulama ya da SetState yani bir kaydin durumun değişmesi gibi birçok farkli mesaj için plug-in i tetikletebilmekteyiz. 58 P a g e

60 Lutfen sunu unutmayin yukarıdaki liste sadece custom entity ler için campaign, campaignactivity, list gibi entity ler için farkli mesajlar da mevcut tum listeye SDK içindeki Message-entity support for plug-ins.xlsx isimli dosyadan ulaşabilirsiniz. Simdi yeni bir adim ekleyerek bir mesaj için plug-in imizin tetiklenmesini saglayalim. Bunun için plugin üzerinde sag tuşa tıklayarak ya da yukarıdaki Register düğmesine tıklayarak acilan menüden Register New Step e tikliyoruz. Karsimiza asagidaki gibi bir pencere cikacak: Message: Yukarida bahsettigim mesajlardan birini buraya yazabilirsiniz. Hangi mesaji yazarsaniz plugin bu olay icin calisacak. Create/Update gibi mesaj isimleri yazarken otomatik olarak tamamlamaya calistigini göreceksiniz. Her bir mesaj icin ayri step ler tanimlaniz gerekmektedir. Primary Entity: Bu plug-in hangi entity yani varlik üzerinde calisacak. Buraya account, contact gibi bir varlik adi yazabilirsiniz. Secondary Entity: Bu plug-in i ikinci bir varlik icin tanıtacaksak buraya yazabiliriz. Event Pipeline Stage of Execution: Bu kisimda plug-in i pre yani veri veritabanina gitmeden mi calistiracagiz yoksa post yani kaydedildikten sonra mi calistiracagiz bunu seçiyoruz. Execution Mode: (sadece post da ikisinden birini seçebilmekteyiz) kod senkron yani sistemde kullanici ile etkileşimli ayni anda mi hareket etsin yoksa asenkron yani kullanicidan bagimsiz arka tarafta sessizce mi calissin bunu seciyoruz. Deployment: Bu kod server da mı calissin yoksa Outlook client gibi offline modda da calissin seçeneğidir. Bu yukarida acikladigim bolumler standart ayarlar. Yani her plug-in step i tanimladigimizda mutlaka bakmamiz gereken ayarlar. Ekranda bir de farkli ayarlar var onlara da bakalim. Event Handler: Bu kodun calismaya baslayacagi class in seçildiği yerdir. Cok değişik bir hareket yapmadiginiz surece zaten plugin registration tool otomatik bir sekilde Execute metodunu görecek ve orayi seçecektir. Name: Sistem bu step icin otomatik bir atamakta ama değiştirmek isterseniz buradan yapabilirsiniz. 59 P a g e

61 Run in User s Context: Belki dokunmaniz gereken noktalardan biri olabilir. Bu kodu hangi kullanici yetkileriyle calistirmak istiyorsaniz onu seçebilirsiniz. Standartta ayari Calling User yani hangi kullanici bu işlemi yaparsa seçilidir. ExecutionOrder: eger ayni varlik içinde ve ayni mesaj icin başka bir plug-in daha varsa buraya sira numaralari vererek hangisini once-sonra calisacagini belirleyebilirsiniz. Unsecure ve Secure Configuration larin ne ise yaradigina zaten Plug-in Yapici Metodlari basligi altinda değinmiştim. Butun gerekli ayarlamalari yaptıktan sonra en allta bulunan Register New Step düğmesine tıklayarak işlemi tamamlıyoruz. Artik plug-in i test edebilirsiniz. Plug-in i Debug Etmek CRM 2015 icerisinde yazmis olduğumuz bir plug-in i debug etmenin iki temel yolu bulunmakta. Birinci yol calisan sisteme visual studio ile attach olarak yapilan, ikinci yol ise plug-in profiller kullanmak. Profiller icin Microsoft dokümantasyonlarda plug-in performansini ölçmek icin kullaniliyor dese de aslinda 1. Yöntemden daha saglikli olduğunu söyleyebilirim. Ozellikle Online sistemler icin başka çareniz de yok zaten. Servis lere Attach olarak Debug Etme Plug-in i sisteme kaydettikten sonra visual studio ile nereye attach olacagimizi seçmemiz gerekmekte. Kayit Ayari online offline asynchronous olarak kaydedilmis plugin ler (ya da custom workflow lar) sandbox (isolation mode) Servis w3wp.exe Microsoft.Crm.Application.Hoster.exe CrmAsyncService.exe Microsoft.Crm.Sandbox.WorkerProcess.exe Online : CRM Web arabirimini Offline : Outllok Client gibi offline yapidaki yazilimlar Kendimize uygun olan secimi yaptıktan sonra geriye bir tek breakpoint i seçip attach olmak kaliyor. Visual Studio yu acip Attach to Process.. diyoruz. 60 P a g e

62 Sonra asagidaki ekran goruntusu gelecek ve ilgili servisi seçeceğiz. Asagidaki ekran goruntusunde de goruldugu uzere visual studio ilgili yerde devreye girecek ve bizim kodu debug etmemizi saglayacaktir. 61 P a g e

63 Islem bu kadar basit sadece dikkat etmeniz gereken noktalar bulunmakta; 1. Eger disk e yaz adimini seçerek plug-in i sisteme kayit ettiyseniz bu plug-in in debug modda yeni bir versiyonunu ayni dizine kopyalamak icin plug-in üzerinde calistigi servisi yeniden baslatmaniz gerekir. 2. Plug-in üzerinde değişiklikler yaptiginizda her seferinde registration tool u ile güncelleme islemini yapin. 3. Eger plug-in i bu sekilde test edip butun işlemleri bitirdiyseniz onu veritabanina kaydetmenizi tavsiye ederim. Disk olarak birakmaniz pek önerilen bir yöntem değildir. 4. Her ne olursa olsun.pdb uzantili dosyalari assembly klasörü içerisinde birakmayin. 5. Sandbox içindeki bir plug-in i debug etmek istiyorsaniz asagidaki registery ayarinin 1 (DWORD) değeri tasidigindan emin olun : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM\SandboxDebugPlugins Plug-in Profiller i kullanarak Debug etme Bu yöntemi kullanmak birçok bakimdan daha avantajli nedeni ise CRM size kullanicinin yaptigi hareketi simule ediyor ve böylece siz bunun üzerinden debug ediyorsunuz. Ayrica ciktilari baskalarina gönderme opsiyonu da bulunmakta. En değerli ozelligi ise plug-in i derleyip derleyip CRM e atmak gibi bir derdiniz yok. Yani bir hata mi yakaladiginiz ya da kodun bir yerini mi değiştirmek istiyorsunuz tek yapmaniz gereken degisikligi yapip uygulamaya yeniden bağlanmak ayni kullanici hareketi tekrar simule edilecek ve siz de yaptiginiz degisikligin etkilerini göreceksiniz. Simdi sirasiyla bu işlemi nasil yapacagimiza bakalim. Oncelikle Plug-in Registration Tool u aciyoruz ve işlem yapmak istediğimiz organizasyonu seçiyoruz. Tool üzerindeki Install Profiller düğmesine tikliyoruz. Boylece Plug-in Profiller da listemizde gozukmeye basliyor. Daha sonra test etmek istediğimiz step i seçiyoruz ve yine toolbar da yer alan Start Profilling düğmesine basıyoruz. Karsimiza asagidaki gibi Profiler Settings ekrani cikiyor. 62 P a g e

ASP.NET CLASS KULLANARAK VERİTABANI İŞLEMLERİ

ASP.NET CLASS KULLANARAK VERİTABANI İŞLEMLERİ ASP.NET CLASS KULLANARAK VERİTABANI İŞLEMLERİ Asp.NET mimarisinin temelini oluşturan CLASS yapısını kullanarak veri tabanı işlemlerini nasıl daha az kodla ve daha stabil yapabiliriz bunu göreceğiz. Mevzu

Detaylı

Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015

Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015 Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015 KONU BAŞLIKLARI 1. Yazılım Mimarisi nedir? 2. Yazılımda Karmaşıklık 3. Üç Katmanlı Mimari nedir? 4. Üç Katmanlı Mimari

Detaylı

İlk Konsol Uygulamamız 2 İlk Windows Uygulamamız 9.Net Framework Yapısı 18 Neler Öğrendik 19. Veri Tipleri 24 Tanımlı Veri Tipleri 27 Basit Tipler 28

İlk Konsol Uygulamamız 2 İlk Windows Uygulamamız 9.Net Framework Yapısı 18 Neler Öğrendik 19. Veri Tipleri 24 Tanımlı Veri Tipleri 27 Basit Tipler 28 ix 1 İlk Konsol Uygulamamız 2 İlk Windows Uygulamamız 9.Net Framework Yapısı 18 Neler Öğrendik 19 23 Veri Tipleri 24 Tanımlı Veri Tipleri 27 Basit Tipler 28 Kayan Nokta Tipleri 30 Sayısal Veri Tipi Dönüşümleri

Detaylı

DAO İLE SQL KOMUTLARI. Sql komutlarını artık veri tabanında kullanmaktan başka çaremiz yok arkadaşlar. Şimdi bu sql derslerimize başlayalım.

DAO İLE SQL KOMUTLARI. Sql komutlarını artık veri tabanında kullanmaktan başka çaremiz yok arkadaşlar. Şimdi bu sql derslerimize başlayalım. DAO İLE SQL KOMUTLARI Sql komutlarını artık veri tabanında kullanmaktan başka çaremiz yok arkadaşlar. Şimdi bu sql derslerimize başlayalım. SQL-1 SELECT En basit SQL cümleciği oluşturmak için SELECT sözcüğü

Detaylı

PayNet Sanal POS Teknik Dökümanı PAYNET İşlemleri PAYNET sistemi, Arena Bilgisayar A.Ş. nin, bayilerine artı değer olarak sunduğu bir online ödeme sistemidir. Bu sistem v1.0 itibariyle, sadece kredi kartları

Detaylı

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Yazılım Kodlama ve İ simlendirme Standartları v1.0 Yazılım Kodlama ve İ simlendirme Standartları v1.0 İçerik Yazılım Kodlama ve İsimlendirme Standartları... 2 1. Amaç... Hata! Yer işareti tanımlanmamış. 2. Kapsam... Hata! Yer işareti tanımlanmamış. 3.

Detaylı

FIRAT ÜNİVERSİTESİ BİLGİSAYAR MÜH.

FIRAT ÜNİVERSİTESİ BİLGİSAYAR MÜH. FIRAT ÜNİVERSİTESİ BİLGİSAYAR MÜH. WSDL-SOAP MURAT TEZGİDER Web Servisi Nedir? web servisi :standart formatları kullanarak programlama dili, işletim sistemi ve platformdan bağımsız olarak bilgiyi paylaşan

Detaylı

C# ile e-posta Göndermek

C# ile e-posta Göndermek Kemal Demir http://kemal.csharpturk.net kemal@csharpturk.net C# ile e-posta Göndermek 25.12.2006 Web sitemizin üyelerine ya da adreslerini bir yerde biriktirdiğimiz arkadaşlarımıza toplu olarak eposta

Detaylı

«BM364» Veritabanı Uygulamaları

«BM364» Veritabanı Uygulamaları HAFTA 8 DB içerisinde CLR Bileşenleri" Yaşar GÖZÜDELİ ygozudeli@verivizyon.com http://blog.verivizyon.com/ygozudeli «BM364» Veritabanı Uygulamaları Konu Akışı SQL Server ve.net CLR SQL Server içerisinde

Detaylı

Basit SQL Sorguları Veritabanından verilerin SELECT cümleleri ile alınması işlemine sorgulama denir.

Basit SQL Sorguları Veritabanından verilerin SELECT cümleleri ile alınması işlemine sorgulama denir. SQL SELECT CÜMLELERİ Oracle birçok kullanışlı ve güçlü özellikleri olan bir veritabanıdır. Bu özelliklerinin birçoğu SQL ile ilgilidir. VTYS lerinin çoğunluğunda veriler ile çalışmak için SQL kullanılmaktadır.

Detaylı

SORGULAR. Öğr.Gör.Volkan Altıntaş

SORGULAR. Öğr.Gör.Volkan Altıntaş SORGULAR Öğr.Gör.Volkan Altıntaş SORGULAR VE ÇEŞİTLERİ Seçme Sorguları: En sık kullanılan sorgu türüdür. Seçme sorguları, bilgileri veri sayfası görünümü nde gösteren veri tabanı nesnesi türüdür. Sorgu,

Detaylı

ÜNİTE NESNE TABANLI PROGRAMLAMA I. Uzm. Orhan ÇELİKER VERİTABANI SORGULARI İÇİNDEKİLER HEDEFLER

ÜNİTE NESNE TABANLI PROGRAMLAMA I. Uzm. Orhan ÇELİKER VERİTABANI SORGULARI İÇİNDEKİLER HEDEFLER VERİTABANI SORGULARI İÇİNDEKİLER Select İfadesi Insert İfadesi Update İfadesi Delete İfadesi Verileri Sıralamak Verileri Gruplandırmak Veriler Üzerinde Arama Yapmak NESNE TABANLI PROGRAMLAMA I Uzm. Orhan

Detaylı

Maltepe Üniversitesi Bilgisayar Mühendisliği Bölümü Veri Tabanı ve Yönetimi (BİL 301)

Maltepe Üniversitesi Bilgisayar Mühendisliği Bölümü Veri Tabanı ve Yönetimi (BİL 301) Maltepe Üniversitesi Bilgisayar Mühendisliği Bölümü Veri Tabanı ve Yönetimi (BİL 301) GENEL DERS BİLGİLERİ Öğretim Elemanı : Öğr. Gör. Erdal GÜVENOĞLU Ofis : MUH 313 Ofis Saatleri : Pazartesi: 10.00-12.00,

Detaylı

İNTERNET TABANLI PROGRAMLAMA- 12.ders

İNTERNET TABANLI PROGRAMLAMA- 12.ders İNTERNET TABANLI PROGRAMLAMA- 12.ders TEMEL SQL KULLANIMLARI Örnekleri uygulamak için aşağıdaki gibi bir altyapı hazırlayalım. using System.Data.OleDb; *************** protected void Button1_Click(object

Detaylı

C#.Net & Linq (Language Integrated Query)

C#.Net & Linq (Language Integrated Query) C#.Net & Linq (Language Integrated Query) Adım-1 Adım-2 Adım-3: aşağıdaki ekran gelir. Bu ekrandan Server Explorer seçeneği ile SQL sunucuya bağlanılırsa Adım-4 deki gibi bir ekran gelir Adım-4: Soldaki

Detaylı

Genel Kavramlar. Bilgisayar ortamında işlenebilecek durumda bulunan kayıtlar. Birbiri ile ilişkili veriler topluluğu ve veriler arası ilişkiler

Genel Kavramlar. Bilgisayar ortamında işlenebilecek durumda bulunan kayıtlar. Birbiri ile ilişkili veriler topluluğu ve veriler arası ilişkiler Genel Kavramlar Veri Nedir? Bilgisayar ortamında işlenebilecek durumda bulunan kayıtlar Veri Tabanı Nedir? Birbiri ile ilişkili veriler topluluğu ve veriler arası ilişkiler Veritabanı Yönetim Sistemi (DBMS)Nedir?

Detaylı

MVC. Zeki çocuklar için Serisi. Altan TANRIVERDİ http://javam.org. Ocak'08. CopyLeft

MVC. Zeki çocuklar için Serisi. Altan TANRIVERDİ http://javam.org. Ocak'08. CopyLeft MVC Zeki çocuklar için Serisi Altan TANRIVERDİ http://javam.org Ocak'08. CopyLeft Başlarken MVC (Model View Controller) herhangi bir PHP yazılımcısının olmazsa olmazları arasında bulunması gereken kodlama

Detaylı

Veritabanı. SQL (Structured Query Language)

Veritabanı. SQL (Structured Query Language) Veritabanı SQL (Structured Query Language) SQL (Structured Query Language) SQL, ilişkisel veritabanlarındaki bilgileri sorgulamak için kullanılan dildir. SQL, bütün kullanıcıların ve uygulamaların veritabanına

Detaylı

Bu işleçlerin dışında, aşağıda belirtilen karşılaştırma işleçlerinden de yararlanılır.

Bu işleçlerin dışında, aşağıda belirtilen karşılaştırma işleçlerinden de yararlanılır. 18 SQL SORGU DİLİ SQL (Structured Query Language) yapısal sorgu dili, veritabanı yönetim sistemlerinin standart programlama dili olarak bilinmektedir. SQL dilinin Access içinde sorgu pencerelerinde veya

Detaylı

Aşağıdaki şemaya dikkat edin. Sorgulamalarımızı genellikle bu şemaya göre yapacağız.

Aşağıdaki şemaya dikkat edin. Sorgulamalarımızı genellikle bu şemaya göre yapacağız. Bu Derste Öğrenecekleriniz: 1- Birden Fazla Tablodan Sorgulama 2- Tablo Birleştirme işlemleri (JOIN) a. INNER JOIN b. OUTER JOIN i. LEFT OUTER JOIN ii. RIGHT OUTER JOIN iii. FULL OUTER JOIN 3- Tablo Ekleme

Detaylı

Bilgisayar Uygulamaları. MySql

Bilgisayar Uygulamaları. MySql MySql MySql,; Oracle, Progress, MsSql, PostgreSql gibi veri tabanı programıdır. Kullanılan dil SQL (Structured Query Language) yapısal sorgulama dilidir. Lisansı GNU General Public License olarak bilinen

Detaylı

Kullanıcı Dökümanı. Flash B2B. Versiyon 0.1

Kullanıcı Dökümanı. Flash B2B. Versiyon 0.1 Kullanıcı Dökümanı Flash B2B Versiyon 0.1 12 Kasım 2004 Geçmiş Değişiklikler İsim Tarih Değişiklik Nedeni Versiyon İçindekiler GEÇMİŞ DEĞİŞİKLİKLER... 2 1. KURULUM... 4 2. KULLANIM... 5 2.1. MAP OLUŞTURMA...

Detaylı

Kaynak Kod Güvenliği Bir Güvensiz API Örneği

Kaynak Kod Güvenliği Bir Güvensiz API Örneği Kaynak Kod Güvenliği Bir Güvensiz API Örneği Bedirhan Urgun, Ağustos 2010, WGT E-Dergi 6. Sayı Bu yazıda Tomcat J2EE kısmi uygulama sunucusunda bulunan bir güvenlik açığına, güvenlik probleminin kaynağına

Detaylı

Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals

Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals The European Union s Making the Labour Market more Inclusive III programme For North Cyprus Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals Module

Detaylı

VERİTABANI ve YÖNETİMİ

VERİTABANI ve YÖNETİMİ VERİTABANI ve YÖNETİMİ Maltepe Üniversitesi Bilgisayar Mühendisliği Bölümü 2 BÖLÜM -7- VERİLERİ GRUPLAYARAK ANALİZ ETMEK 3 Genel Bakış Grup fonksiyonlarının tanımlanması, Gruplama işlemlerini, Gruplama

Detaylı

Masa üstünde vt34.mdb dosyası var, onu projemize eklemek için, App_Data ya sağ tıkla Add Existing Item vt34.mdb adlı dosyayı seç Add

Masa üstünde vt34.mdb dosyası var, onu projemize eklemek için, App_Data ya sağ tıkla Add Existing Item vt34.mdb adlı dosyayı seç Add 29 Aralık 2011 / Perşembe Visual studio dan veri tabanından veri çekmek için önce bir aspx dosyası açıp,,accessde yeni veri tabanı dosyası açıyoruz. Dikkat : Dosyanın uzantısı.mdb olacak. Masa üstünde

Detaylı

Global Haberleşme API Kullanıcı Notları

Global Haberleşme API Kullanıcı Notları Global Haberleşme API Kullanıcı Notları Yazar : Global Haberleşme Son Değiştirme Tarihi : 2015-02-14 Not: API Dökümanının en güncel halini kullanınız. En güncel halini http://uye.globalhaberlesme.com/uploads/api_user.pdf

Detaylı

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi 5.HAFTA Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi Sınıf Kavramı: Sınıf (class) soyut bir veri tipidir. Nesne (object) onun somutlaşan bir cismidir. Java da sınıf (class) kavramını

Detaylı

SQL Komutları (2) Uzm. Murat YAZICI

SQL Komutları (2) Uzm. Murat YAZICI SQL Komutları (2) Uzm. Murat YAZICI Sıralama Sıralama işlemi için SELECT ifadesinde ORDER BY kullanılır. Bu ifadede ASC kelimesi kullanılırsa sıralama küçükten büyüğe doğru (A-Z), DESC kullanılırsa büyükten

Detaylı

BOTAŞ EBT BİLGİ YÖNETİM SİSTEMİ WEB SERVİSLERİ

BOTAŞ EBT BİLGİ YÖNETİM SİSTEMİ WEB SERVİSLERİ BOTAŞ EBT BİLGİ YÖNETİM SİSTEMİ WEB SERVİSLERİ KULLANIM KLAVUZU 21.10.2013 Sürüm: 2.2.0 Sayfa 1 / 10 Giriş EBT Sisteminin, Web Servisleri birinci versiyonu, BOTAŞ ile yapılan ayrıştırma çalışmalarına paralel

Detaylı

Her bölüm için kısa bazı girişler yapılacak ve bölüm içerisinde anlatılacak olan konuların genel başlıkları belirtilecektir.

Her bölüm için kısa bazı girişler yapılacak ve bölüm içerisinde anlatılacak olan konuların genel başlıkları belirtilecektir. Eğitim Adı Seviye Toplam Süre : SQL 2008 Sorgular Eğitim Serisi : Başlangıç/Orta/Yüksek : 56 Saat 05 Dakika 05 Saniye Video Adedi : 209 Merhaba arkadaşlar ben İLKER IŞIK yine www.yazilimhocasi.com katkılarıyla

Detaylı

BOTAŞ EBT BİLGİ YÖNETİM SİSTEMİ WEB SERVİSLERİ

BOTAŞ EBT BİLGİ YÖNETİM SİSTEMİ WEB SERVİSLERİ BOTAŞ EBT BİLGİ YÖNETİM SİSTEMİ WEB SERVİSLERİ KULLANIM KLAVUZU 21.10.2013 Sürüm: 2.2.1 (27.12.2013) Sayfa 1 / 11 Güncellenen Bölümler Sürüm 2.2.1 Yayınlanma Tarihi 27.12.2013 Güncellenen Bölümler GUNSONUAKISGONDER

Detaylı

https://twitter.com/farukbozan 19 Şubat 2016 Cuma

https://twitter.com/farukbozan 19 Şubat 2016 Cuma Bugünkü yazımda çok basit ve temel anlamda Spring ile XML tanım tabanlı bean okuma işlemini anlatmaya çalışacağım. Spring framework bizim yerimize nesnelerin birbirine olan bağımlılıklarını düzenleyip,

Detaylı

Aşağıdaki tabloyu inceleyin. Sorgulama işlemlerini bu tabloya göre yapacağız.

Aşağıdaki tabloyu inceleyin. Sorgulama işlemlerini bu tabloya göre yapacağız. Bu Derste Öğrenecekleriniz: 1- Basit Sorgulamalar a. Tablodan tüm alanları sorgulama b. Tablodan alanları belirterek sorgulama c. Tekrarlı satırları önleme d. Belirli sayıda veya oranda sorgulama yapma

Detaylı

VERİ TABANI ve YÖNETİMİ

VERİ TABANI ve YÖNETİMİ VERİ TABANI ve YÖNETİMİ Maltepe Üniversitesi Bilgisayar Mühendisliği Bölümü 2 BÖLÜM -12- TETİKLEYİCİ (TRIGGER) 3 Giriş Trigger lar Trigger lar Ne Zaman Kullanılmalıdır? Klasik Trigger ların Özellikleri

Detaylı

Öğr. Gör. Serkan AKSU http://www.serkanaksu.net. http://www.serkanaksu.net/ 1

Öğr. Gör. Serkan AKSU http://www.serkanaksu.net. http://www.serkanaksu.net/ 1 Öğr. Gör. Serkan AKSU http://www.serkanaksu.net http://www.serkanaksu.net/ 1 JavaScript JavaScript Nedir? Nestcape firması tarafından C dilinden esinlenerek yazılmış, Netscape Navigator 2.0 ile birlikte

Detaylı

Oluşturmak istediğimiz OU ye bir isim veriyoruz. Name kısmına ISTANBUL yazıyoruz,

Oluşturmak istediğimiz OU ye bir isim veriyoruz. Name kısmına ISTANBUL yazıyoruz, ORGANİZATİONAL UNİT (OU) OrganizationUnit(OU): Türkçe Yapısal Birim olarak adlandırılan ve merkezi yönetimimizi kolaylaştıran bir objedir. Organizational Unit domain içerisindeki kullanıcı, group ve bilgisayarları

Detaylı

VERİTABANI. SQL (Structured Query Language)

VERİTABANI. SQL (Structured Query Language) VERİTABANI SQL (Structured Query Language) SQL'de Gruplama Bir tablonun satırları gruplara ayrılarak fonksiyonların bunlara uygulanması mümkündür. Gruplara ayırmak için SELECT deyimi içerisinde GROUP BY

Detaylı

Üst Düzey Programlama

Üst Düzey Programlama Üst Düzey Programlama JDBC (Java Database Connectivity) Üst Düzey Programlama-ders07/ 1 JDBC JDBC ilişkisel veritabanlarına erişim için Java dilinde kullanılan standart bir kütüphanedir. Bu kütüphanedeki

Detaylı

Durum Yönetimi. Olan sayfalar ekleyelim. BasitSayac.aspx

Durum Yönetimi. Olan sayfalar ekleyelim. BasitSayac.aspx Durum Yönetimi Bu gün dersimizde durum yönetimine (state management) değineceğiz. Önce adı DurumYonetimi isimli yeni bir site oluşturalım. Burada programın otomatik olarak oluşturacağı Default.aspx dosyasını

Detaylı

Birden Çok Tabloda Sorgulama (Join)

Birden Çok Tabloda Sorgulama (Join) Birden Çok Tabloda Sorgulama (Join) Join(Birleştirici), iki ya da daha fazla tabloyu aynı anda sorgulayarak bir sonuç tablosu (result table) oluşturmaya yarar. Örneğin: İki tabloyu birleştirici ile birleştirerek

Detaylı

Mysql Veritabanı Komutları

Mysql Veritabanı Komutları Mysql Veritabanı Komutları Mysql Veri Tabanı Komutları Hazırlayan : M. Başar ACAROĞLU Kaynaklar: http://www.hrzafer.com/sql-dersleri http://www.w3schools.com/sql/default.asp Veri Tabanı Nedir? Mysql Veritabanı

Detaylı

8. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ. hakanyilmaz@karabuk.edu.tr

8. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ. hakanyilmaz@karabuk.edu.tr 8. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II Öğr.Gör. Hakan YILMAZ hakanyilmaz@karabuk.edu.tr Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 2 İçindekiler QUERYSTRING KOLEKSIYONU... 3 FORM

Detaylı

Cybersoft Bilişim Teknolojileri Sunucu Tarafı Programlaması Kursu Final soruları. Tarih: 27 Kasım 2010 Saat: 13:30 Süre: 3 saat

Cybersoft Bilişim Teknolojileri Sunucu Tarafı Programlaması Kursu Final soruları. Tarih: 27 Kasım 2010 Saat: 13:30 Süre: 3 saat Cybersoft Bilişim Teknolojileri Sunucu Tarafı Programlaması Kursu Final soruları. Tarih: 27 Kasım 2010 Saat: 13:30 Süre: 3 saat 1. Kısım Çoktan Seçmeli (48 puan) 1) Aşağıdaki JAVA kod parçası çalıştırıldığında

Detaylı

ADO.NET VERİTABANINA BAĞLANTI. Bir web formu üzerinden veritabanına bağlantımızı anlatacağım. UYGULAMA 1

ADO.NET VERİTABANINA BAĞLANTI. Bir web formu üzerinden veritabanına bağlantımızı anlatacağım. UYGULAMA 1 ADO.NET Web üzerinden veritabanına bağlanmak ve veri işlemleri gerçekleştirmek için ADO.NET teknolojinden faydalanarak işlemlerimizi gerçekleştireceğiz. ADO.NET her ne kadar ADO teknolojine benzesede aslında

Detaylı

EĞİTİM : LINQ to SQL. Bölüm : LINQ e Genel Bakış. Konu : LINQ Nedir? Page 1 of 25

EĞİTİM : LINQ to SQL. Bölüm : LINQ e Genel Bakış. Konu : LINQ Nedir? Page 1 of 25 EĞİTİM : LINQ to SQL Bölüm : LINQ e Genel Bakış Konu : LINQ Nedir? Page 1 of 25 LINQ, program ve veri arasındaki ilişkiyi başka bir boyuta taşıyan devrimsel bir programlama metodolojisidir. LINQ, bir programalama

Detaylı

SQL veri tabalarına erişmek ve onları kullanmak için geliştirilmiş bir lisandır.

SQL veri tabalarına erişmek ve onları kullanmak için geliştirilmiş bir lisandır. SQL veri tabalarına erişmek ve onları kullanmak için geliştirilmiş bir lisandır. Bu dersimizde biz Microsoft SQL Server veritabanı sistemini kullanmayı öğreneceğiz. SQL Nedir? SQL Structured Query Language

Detaylı

Bölüm 10: PHP ile Veritabanı Uygulamaları

Bölüm 10: PHP ile Veritabanı Uygulamaları Bölüm 10: PHP ile Veritabanı Uygulamaları -231- Öğr.Gör. Serkan DİŞLİTAŞ 10.1. PHP PHP, platformdan bağımsız sunucu taraflı çalışan betik bir web programlama dilidir. PHP programlama dili ile MySQL, MSSQL,

Detaylı

TÜİK e-vt. Web Servis Kılavuzu

TÜİK e-vt. Web Servis Kılavuzu TÜİK e-vt Web Servis Kılavuzu Mayıs 2015 ANKARA Versiyon: 1.2 1/12 Versiyon Yayım Tarihi Eklenen/Silinen/Değişen Bölüm 1.0 20.02.2014 ---- Kılavuzun ilk sürümü. 1.1 17.04.2014 Sayfa 13 Hata Kodu Tablosu

Detaylı

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM 2014) //Class (Sınıf) // Sınıf (class) soyut veri tipidir. // Nesne (object) sınıfın somutlaşan bir cismidir. // static : nesnesi oluşturulmaz.

Detaylı

Her Yönüyle SQL Enjeksiyonu. OWASP-Türkiye Bünyamin Demir

Her Yönüyle SQL Enjeksiyonu. OWASP-Türkiye Bünyamin Demir Her Yönüyle SQL Enjeksiyonu OWASP-Türkiye Bünyamin Demir Bünyamin Demir ( @bunyamindemir ) OWASP Türkiye Bölüm Lideri Founder & CTO @ Enforsec Ltd. Sızma Testleri Uzmanı Web, Mobil, Network, SCADA, Wireless,

Detaylı

Veritabanına Giriş. Oğuzhan Ceylan. 19 Eylül 2011

Veritabanına Giriş. Oğuzhan Ceylan. 19 Eylül 2011 Veritabanına Giriş Oğuzhan Ceylan 19 Eylül 2011 Outline Veritabanı MYSQL Mysql Sorgu Komutları Bir veritabanı yaratmak ve kullanmak Veritabanı Veritabanı Verittabanı hangi alanlarda kullanılıyor. Web sitesi

Detaylı

«BM364» Veritabanı Uygulamaları

«BM364» Veritabanı Uygulamaları HAFTA 6 T-SQL ile Programlar Yazmak" Yaşar GÖZÜDELİ ygozudeli@verivizyon.com http://blog.verivizyon.com/ygozudeli «BM364» Veritabanı Uygulamaları Konu Akışı Programlama dili olarak T-SQL Fonksiyonlar Programlamak

Detaylı

Yerel Ağlarda Port 139 ve Saldırı Yöntemi

Yerel Ağlarda Port 139 ve Saldırı Yöntemi Yerel Ağlarda Port 139 ve Saldırı Yöntemi Merhaba arkadaşlar. Gerek kitap hazırlığında olmam, gerekse de işlerimin oldukça yoğun olmasından dolayı, bir süredir makale yayınlayamadım. Bu süre boşluğunu

Detaylı

Aşağıdaki şemaya dikkat edin. Sorgulamalarımızı genellikle bu şemaya göre yapacağız.

Aşağıdaki şemaya dikkat edin. Sorgulamalarımızı genellikle bu şemaya göre yapacağız. Bu Derste Öğrenecekleriniz: 1- Sorgulama Yaparken Gruplama (GROUP BY) 2- Gruplamada Koşul Kullanımı (HAVING) 3- Sorgulama Yaparken Sıralama (ORDER BY) 4- Sorgulamalarda İşlem Yapma 5- Güncellemelerde İşlem

Detaylı

NOT: VERİTABANINDAKİ TABLOLARI OLUŞTURMAYI DA UNUTMAYACAĞIZ.

NOT: VERİTABANINDAKİ TABLOLARI OLUŞTURMAYI DA UNUTMAYACAĞIZ. 20 Ocak 2012 / Cuma Yeni uygulama Yönetim adlı bir klasör oluşturacağız. Yönetim klasörü içerisine bir masterpage oluşturacağız. (tabloyla) Örneğin; Ana Sayfa Albüm ekle Fotoğraf ekle Content Place Holder(Değişecek

Detaylı

Veritabanı Yönetim Sistemleri (Veritabanı Tasarımı) SQL (Structured Query Language)

Veritabanı Yönetim Sistemleri (Veritabanı Tasarımı) SQL (Structured Query Language) Veritabanı Yönetim Sistemleri (Veritabanı Tasarımı) SQL (Structured Query Language) Konular Yapısal SQL Komutları Gruplama İşlemi SQL Fonksiyonları Kaynaklar 2 SQL (Structured Query Language) SQL Carlos

Detaylı

PAKET TRANSFER SİSTEMİ

PAKET TRANSFER SİSTEMİ İLAÇ TAKİP SİSTEMİ ŞUBE MÜDÜRLÜĞÜ PAKET TRANSFER SİSTEMİ Kullanıcı Dökümanı Version 1.1 1 1. Revizyonlar... 1 2. Giriş... 1 2.1 Kapsam...1 2.2 Hedef Kitle...1 3. Gereksinimler... 1 3.1 Yazılım Gereksinimleri...1

Detaylı

Yeni bir proje açarken File New - Web Site diyoruz. Gelen ekranda Visual Basic veya C# seçilebilir. Biz ders kapsamında C# programlama dilini seçtik.

Yeni bir proje açarken File New - Web Site diyoruz. Gelen ekranda Visual Basic veya C# seçilebilir. Biz ders kapsamında C# programlama dilini seçtik. ASP.NET DERS 1 Yeni bir proje açarken File New - Web Site diyoruz. Gelen ekranda Visual Basic veya C# seçilebilir. Biz ders kapsamında C# programlama dilini seçtik. Gelen ekranda Visual C# seçildikten

Detaylı

TRIGGER. Trigger lar, tablo üzerinde tanımlanabilen ve bu tablo üzerinde bir işlem gerçekleştiğinde tetiklenen programlama ögeleridir.

TRIGGER. Trigger lar, tablo üzerinde tanımlanabilen ve bu tablo üzerinde bir işlem gerçekleştiğinde tetiklenen programlama ögeleridir. TRIGGER Trigger lar, tablo üzerinde tanımlanabilen ve bu tablo üzerinde bir işlem gerçekleştiğinde tetiklenen programlama ögeleridir. DML ve DDL trigger lar olarak ikiye ayırmak mümkündür. DML (Data Manipulation

Detaylı

GENETİK ALGORİTMA GEZGİN SATICI ÖDEVİ

GENETİK ALGORİTMA GEZGİN SATICI ÖDEVİ GENETİK ALGORİTMA GEZGİN SATICI ÖDEVİ Aşağıda belli bir yere kadar programlanmış olan Gezgin satıcı problemine ait kodları inceleyerek programın geri kalan kısmını tamamlayınız. Seçme, Çaprazlama ve Mutasyon

Detaylı

PostgreSQL ve PL/pgSQL

PostgreSQL ve PL/pgSQL PostgreSQL ve PL/pgSQL Adnan DURSUN Uygulama tasarım ve geliştiricisi @ : adnandursun.at.asrinbilisim.com.tr : +AdnanDURSUN Sunum Akışı PL/pgSQL nedir PL/pgSQL neden kullanmalıyız PL/pgSQL in yapısı Saklı

Detaylı

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler C# Programlama Dili İlk programımız Tür dönüşümü Yorum ekleme Operatörler 1 İlk Programımız Bu program konsol ekranına Merhaba dünya! yazıp kapanır. Programı geçen derste anlatıldığı gibi derleyin, sonra

Detaylı

MARKAM SMS SMS GÖNDERİM WEB SERVİSLERİ VERSİYON 1.4

MARKAM SMS SMS GÖNDERİM WEB SERVİSLERİ VERSİYON 1.4 MARKAM SMS SMS GÖNDERİM WEB SERVİSLERİ VERSİYON 1.4 AĞUSTOS 2015 1. WEB SERVİS ADRESİ 2. WEB SERVİS METODLARI a. Mesaj Başlığı Listesi Servisi b. Rehberdeki Gruplar Servisi c. Rehberdeki Kişiler Servisi

Detaylı

Data Structures Lab 1 2012-Güz

Data Structures Lab 1 2012-Güz Data Structures Lab 1 2012-Güz C# Ortamı Tanıtımı ve Uygulama Geliştirilmesi Visual Studio 2010 Ortamının Temini -NYG'ndan MSDN üyeliği için başvuru dilekçesi alınıp doldurulmalı ve yine NYG'ye teslim

Detaylı

Emrah UYSAL www.emrahuysal.com 1

Emrah UYSAL www.emrahuysal.com 1 ORACLE DERS 2 BİRDEN FAZLA TABLO ÜZERİNDE ÇALIŞMAK(JOIN İŞLEMLERİ) Şekilde görüldüğü gibi Employees tablosundan employee_id ve department_id alanı Departments tablosundan ise department_name alanı kullanılıp

Detaylı

Turkcell Paf Takımı Proje Raporu. Hazırlayan : Oben IŞIK

Turkcell Paf Takımı Proje Raporu. Hazırlayan : Oben IŞIK Turkcell Paf Takımı Proje Raporu Hazırlayan : Oben IŞIK 1 Giriş Proje, yazılım dünyasındaki uygulamaların minimum maaliyet ile karşılanabilmesi için, web servis kullanımına ilişkin bir takım işlemleri

Detaylı

STORED PROCEDURE LER (Saklı Yordamlar)

STORED PROCEDURE LER (Saklı Yordamlar) STORED PROCEDURE LER (Saklı Yordamlar) Eskiden yazılımlar, sadece prosedür denilen kod parçalarından oluşurdu. Her prosedür belli bir işlevi yerine getirmek için yazılmış kod parçalarıdır. Mesela, 2 sayı

Detaylı

Bu gün dersimizde değişik web kontrollerinin kullanımını gösteren birkaç web sitesi hazırlayacağız. Önce Visual Studio 2005 i açalım.

Bu gün dersimizde değişik web kontrollerinin kullanımını gösteren birkaç web sitesi hazırlayacağız. Önce Visual Studio 2005 i açalım. Bu gün dersimizde değişik web kontrollerinin kullanımını gösteren birkaç web sitesi hazırlayacağız. Önce Visual Studio 2005 i açalım. VS2005 den yeni bir web sitesi oluşturmasını isteyelim. Yeni bir ASP.NET

Detaylı

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir; abstract Sınıflar 1 Özet sınıflar ya da özet metotlar abstract anahtar sözcüğü kullanılarak tanımlanırlar. Bir temel sınıf içinde bildirilen abstract metotların içeriği boştur. Kendisinden yeni bir instance

Detaylı

YAPISAL SORGULAMA DİLİ (SQL)

YAPISAL SORGULAMA DİLİ (SQL) YAPISAL SORGULAMA DİLİ (SQL) OGRENCI Tablosu 1234 Zeynep Makina K 23.06.1984 1. Cad 3.4 CREATE TABLE VERİ TANIMLAMA DİLİ (VTD) Veritabanında yeni bir tablonun oluşturulmasını sağlar. Yukarıda tanımlanan

Detaylı

Sunum İçeriği. Programlamaya Giriş 22.03.2011

Sunum İçeriği. Programlamaya Giriş 22.03.2011 Programlamaya Giriş Nesne Tabanlı Programlamaya Giriş ve FONKSİYONLAR Sunum İçeriği Nesne Tabanlı Programlama Kavramı Fonksiyon tanımlama ve kullanma Formal Parametre nedir? Gerçel Parametre nedir? Fonksiyon

Detaylı

1 JAVASCRIPT NEDİR? 1

1 JAVASCRIPT NEDİR? 1 İÇİNDEKİLER IX İÇİNDEKİLER 1 JAVASCRIPT NEDİR? 1 2 TEST ORTAMINI TANIMAK (FİREFOX VE FİREBUG) 5 Firefox 6 Firebug 8 CSS Sekmesi 10 DOM Sekmesi 11 Net ve Çerezler Sekmeleri 11 Script Sekmesi 11 Konsol Sekmesi

Detaylı

Exchange Server 2010 Sertifika Oluşturma

Exchange Server 2010 Sertifika Oluşturma Exchange Server 2010 Sertifika Oluşturma Bildiğimiz üzere Exchange Server 2003 ve 2007 de default olarak SSL oluşturulup kullanılıyordu. Ancak bir müddet sonra sertifikanın süresi dolduğu için artık çalışmayacaktı.

Detaylı

Samsun Çocuk Hizmetleri İ l Koordinasyon Sekretarya Birimi

Samsun Çocuk Hizmetleri İ l Koordinasyon Sekretarya Birimi Samsun Çocuk Hizmetleri İ l Koordinasyon Sekretarya Birimi Veri Giriş Sistemi Klavuzu Amaç Veri Giriş Sistemi, koruyucu ve destekleyici tedbir kararlarının takibinde ve uygulamasında ilgili kurumları daha

Detaylı

http://www.microsoft.com/visualstudio/eng/downloads

http://www.microsoft.com/visualstudio/eng/downloads Visual Studio 2012'nin kurulumunu, Visual Studio'nun kullanımını ve Windows Store'da basit bir proje hazırlanmasını anlatacağım. Hepsinden önce Visual Studio ortamından biraz bahsedelim. Visual Studio

Detaylı

Üst Düzey Programlama

Üst Düzey Programlama Üst Düzey Programlama Servlet Üst Düzey Programlama-ders01/ 1 Servlet Nedir? Web sayfaları ilk başlarda durağan bir yapıya sahipti ve kullanıcıdan bilgi alarak işlemler yapmıyordu. Zamanın geçmesiyle kullanıcıya

Detaylı

Blogcu Kullanma Kılavuzu

Blogcu Kullanma Kılavuzu Blogcu Kullanma Kılavuzu İnternet tarayıcınıza www.blogcu.com adresini yazın ve görüntüleyin. 1 İki adımda basit olarak Web günlüğü oluşturabilirsiniz. Lütfen aşağıdaki adımları takip edin. Adım 1 : Sayfa

Detaylı

İnternet Programcılığı

İnternet Programcılığı 1 PHP le Ver tabanı İşlemler Yaptığımız web sitelerinin daha kullanışlı olması için veritabanı sistemleri ile bağlantı kurup ihtiyaca göre verileri okuyup yazmasını isteriz. 1.1 Veritabanı Nedir? Veritabanı

Detaylı

PERKON PDKS Kurulum ve hızlı başlangıç rehberi

PERKON PDKS Kurulum ve hızlı başlangıç rehberi Oluşturma 02.11.2015 Revizyon: 19.01.2016 Rev. No: 03 Yazan: Süleyman FAKİR Düzenleyen: F. DELİRİ PERKON PDKS Kurulum ve hızlı başlangıç rehberi 1) PDKS Kurulumu, Lisans Onaylaması Ve Veri Tabanı Ayarları

Detaylı

T.C GAZİ ÜNİVERSİTESİ BİLİŞİM ENSTİTÜSÜ YÖNETİM BİLİŞİM SİSTEMLERİ ANA BİLİM DALI MS SQL KOMUTLARI VE MS SQL KOMUTLARI İLE İLGİLİ UYGULAMALAR

T.C GAZİ ÜNİVERSİTESİ BİLİŞİM ENSTİTÜSÜ YÖNETİM BİLİŞİM SİSTEMLERİ ANA BİLİM DALI MS SQL KOMUTLARI VE MS SQL KOMUTLARI İLE İLGİLİ UYGULAMALAR T.C GAZİ ÜNİVERSİTESİ BİLİŞİM ENSTİTÜSÜ YÖNETİM BİLİŞİM SİSTEMLERİ ANA BİLİM DALI MS SQL KOMUTLARI VE MS SQL KOMUTLARI İLE İLGİLİ UYGULAMALAR YÜKSEK LİSANS PROJESİ Mehmet Emin AKKAYA Danışman: Yrd. Doç.

Detaylı

Module 2 Managing User And Computer accounts

Module 2 Managing User And Computer accounts 16 Creating Users Accounts With Command ( Komutla Kullanıcı Hesabı Oluşturma ) Organization Unit i komutla oluşturmak istersek aşağıda bulunan şekildeki yönergeleri takip ediyoruz. Module 2 Managing User

Detaylı

SQL'e Giriş. SELECT Deyimi. SQL Komutları. Yardımcı Deyimler

SQL'e Giriş. SELECT Deyimi. SQL Komutları. Yardımcı Deyimler SQL'e Giriş SQL komutları kullanılarak aşağıdaki işlemler yapılabilir: Veritabanı nesnelerinin oluşturulması ve bu nesnelerle ilgili işlemlerin yapılması Bilgilerin istenilen koşullara göre görüntülenmesi

Detaylı

15 Aralık 2011 / Perşembe. www.arifceylan.com/sql,www.arifceylan.com/default.aspx http://www.arifceylan.com/sql/default.aspx

15 Aralık 2011 / Perşembe. www.arifceylan.com/sql,www.arifceylan.com/default.aspx http://www.arifceylan.com/sql/default.aspx 15 Aralık 2011 / Perşembe www.arifceylan.com/sql,www.arifceylan.com/default.aspx http://www.arifceylan.com/sql/default.aspx veri sorgulamak için select sorguları: Tüm tabloyu seçmek için * Select * from

Detaylı

SQL e Giriş. Uzm. Murat YAZICI

SQL e Giriş. Uzm. Murat YAZICI SQL e Giriş Uzm. Murat YAZICI SQL (Structured Query Language) - SQL Türkçe de Yapısal Sorgulama Dili anlamına gelmektedir ve ilişkisel veritabanlarında çok geniş bir kullanım alanına sahiptir. - SQL ile

Detaylı

SP_RENAMEDB eski_isim, yeni_isim VEYA SP_RENAMEDB 'eski isim', 'yeni isim'

SP_RENAMEDB eski_isim, yeni_isim VEYA SP_RENAMEDB 'eski isim', 'yeni isim' Bu Derste Öğrenecekleriniz: 1- Veri Tabanı Adı Değiştirme 2- Nesnelerin Adını Değiştirme a. Tablo Adı Değiştirme b. Alan Adı Değiştirme c. Constraint (Kısıtlama) Adı Değiştirme 3- Tablo Düzenleme Komutları

Detaylı

SQL (Structured Query Language) kendisi bir programlama dili olmamasına rağmen bir çok kişi tarafından programlama dili olarak bilinir.

SQL (Structured Query Language) kendisi bir programlama dili olmamasına rağmen bir çok kişi tarafından programlama dili olarak bilinir. SQL'e Giriş SQL (Structured Query Language) kendisi bir programlama dili olmamasına rağmen bir çok kişi tarafından programlama dili olarak bilinir. SQL (Structured Query Language) kendisi bir programlama

Detaylı

CRYSTAL REPORT EĞĠTĠM DÖKÜMANLARI

CRYSTAL REPORT EĞĠTĠM DÖKÜMANLARI CRYSTAL REPORT EĞĠTĠM DÖKÜMANLARI Create a new Crystal report Document: Yeni bir Crystal Report dökümanı oluşturmak için aşağıdaki optionlardan biri seçilir a) Using the report expert: Crystal Reportun

Detaylı

Başlangıç 2. Generic İfadeler 3. Arayüzler (Interfaces) 5. LINQ ile Sık Kullanılan Arayüzler 7. Koleksiyon Sınıfları 14

Başlangıç 2. Generic İfadeler 3. Arayüzler (Interfaces) 5. LINQ ile Sık Kullanılan Arayüzler 7. Koleksiyon Sınıfları 14 ix Başlangıç 2 Seçime Bağlı (Optional) ve Adlandırılmış Parametreler 2 Generic İfadeler 3 Arayüzler (Interfaces) 5 Tanımlanması 5 Örnek 6 LINQ ile Sık Kullanılan Arayüzler 7 IEnumerator (Numaralandırıcı,

Detaylı

Örnek Veritabanı Çalışması. Kütüphane Veritabanı

Örnek Veritabanı Çalışması. Kütüphane Veritabanı Örnek Veritabanı Çalışması Kütüphane Veritabanı İçindekiler Kütüphane veritabanı şeması Tabloların oluşturulması Tablolar arası ilişkilerin varlık ilişki ve ilişkisel modeldeki gösterimleri Sorgu örnekleri

Detaylı

V-Count API v3.5. - İnsan Sayma sonuçları için istekler https://cloud.v-count.com/vcountapi/vcountapi.php adresine gönderilecektir.

V-Count API v3.5. - İnsan Sayma sonuçları için istekler https://cloud.v-count.com/vcountapi/vcountapi.php adresine gönderilecektir. V-Count API v3.5 Bu dokümanın amacı V-Count veritabanından insan sayma, mağaza önü sayma ve hava durumu verilerinin dışa aktarımı; ciro, fiş, stok ve ürün adedi bilgilerinin veritabanına içe aktarımı yöntemlerini

Detaylı

Tablolar Arası İlşikiler ve Alan Özellikleri. Şekil 1. Magaza veritabanının tabloları ve tablolar arasındaki ilişkiler

Tablolar Arası İlşikiler ve Alan Özellikleri. Şekil 1. Magaza veritabanının tabloları ve tablolar arasındaki ilişkiler SQL'de Veri İşleme Komutları SQL'de verileri işlemek için kullanılan komutlara DML (Data Manipulation Language Veri İşleme Dili) denilmektedir. Bu komutlar ile oluşturulan ifadeler tablolara kayıt eklemek,

Detaylı

TARİHÇE. Versiyon Tarih Düzenleyen Açıklama 0.1 04.11.2015 Engin DURMAZ İlk versiyon

TARİHÇE. Versiyon Tarih Düzenleyen Açıklama 0.1 04.11.2015 Engin DURMAZ İlk versiyon İçindekiler 1 GİRİŞ... 2 2 KOD ÖRNEKLERİ... 3 2.1 AÇILIŞTA YAPILMASI GEREKENLER... 3 2.2 ÖKC-HARİCİ CİHAZ EŞLEŞMESİ... 3 2.3 MALİ REFERANS İSTEĞİ... 4 2.4 PROGRAMLAMA BİLGİLERİNİN GÖNDERİLMESİ... 5 2.5

Detaylı

MARKAM SMS SMS GÖNDERİM WEB SERVİSLERİ VERSİYON 1.2

MARKAM SMS SMS GÖNDERİM WEB SERVİSLERİ VERSİYON 1.2 MARKAM SMS SMS GÖNDERİM WEB SERVİSLERİ VERSİYON 1.2 KASIM 2014 1. WEB SERVİS ADRESİ 2. WEB SERVİS METODLARI a. Mesaj Başlığı Listesi Servisi b. Rehberdeki Gruplar c. Rehberdeki Kayıtlar d. Anlık Sms Gönderim

Detaylı

Web Formlar ve Sayfalar Arasında Bilgi Gönderme. BATML İnternet Programcılığı 1

Web Formlar ve Sayfalar Arasında Bilgi Gönderme. BATML İnternet Programcılığı 1 Web Formlar ve Sayfalar Arasında Bilgi Gönderme BATML İnternet Programcılığı 1 Bazı web sitelerinde sayfalar arasında bilgi veya değişken göndermek gerekebilir. Gönderilen bu bilgi kullanıcı adı ve şifre

Detaylı

Virtualization. VMware vcenter Server Yapılandırılması

Virtualization. VMware vcenter Server Yapılandırılması Virtualization VMware vcenter Server Yapılandırılması VMware vcenter Server sanallaştırılmış datacenter, kurumsal sunucular gibi yapıların yönetilmesini sağlayan ve maliyetleri aşağılara çeken bir yönetim

Detaylı

Client Server Database

Client Server Database Java Server Faces Ahmet Demirelli Sabancı Üniversitesi 2007 Ajanda Model-1 Mimari Model-2 Mimari MVC Framework Java Server Faces Örnek Uygulama Model 1 Mimari 1 2 3 6 JSP (View) 5 JavaBeans (Model) 4 Client

Detaylı

Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals

Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals The European Union s Making the Labour Market more Inclusive III programme For North Cyprus Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals Module

Detaylı

İÇERİK YÖNETİM SİSTEMİ (CMS) Bir web sitesi yayınlamak için yapılması gerekenler:

İÇERİK YÖNETİM SİSTEMİ (CMS) Bir web sitesi yayınlamak için yapılması gerekenler: İÇERİK YÖNETİM SİSTEMİ (CMS) Bir web sitesi yayınlamak için yapılması gerekenler: Yer satın alınır. İsim tescil ettirilir. Ftp ile wordpress klasörü upload edilir. Kendi bilgisayarımızda web sitesi yayınlamak

Detaylı