cub-e.net

just coding...

Dynamics CRM 2016 upgrade sonrasi kullanicilarin kayitlari gorememesi problemi

Dynamics CRM'de bir yazilim ve bug'lari oluyor elbette. Karsilastigim bir bug ve cozumunu de sizinle paylasmak istiyorum.

CRM 2016'ya eger onceki veriyondan upgrade ederek gectiyseniz bazi kullanicilarin sisteme giris yaptiktan sonra hicbir kaydi goruntuleyemedigini gorebilirsiniz. Bu sorun upgrade islemi sirasinda yetki gruplarinda kaynaklanan bir hatadan olusmaktadir ve kullanicinin sisteme girmesine izin vermesine ragmen kayitlara erisimini engellemektedir.

Cozum ise bu sorunu yasayan kullanicilarin guvenlik rollerini kaldirip yeniden vermek. Konuyla ilgili Microsoft'ta case acilmis durumda ilk guncellemede duzelecegini umuyorum.

Bu sekilde sorun cozulmekte. Sizlerin de karsilastigi sorunlar varsa lutfen bildirin ki burada yayinlayarak herkese faydali olmaya calisalim.


Dynamics CRM 2015-2016 Messages Ozelliklerine Takilmadan Islemlerimizi Yapmak

Dynamics CRM icerisinde ozel amacla kullanilan bircok alan bulunmaktadir ve bu alanlarin ozel tipleri vardir. Yani bu alanlara standart .Net tipleri degil de CRM siniflarini parameter olarak atamaktayiz.

Bu duruma verebilecegimiz en unlu ornek ise statecode ve statuscode alanlarinin OptionSet deger almasi ve bunlarin kendilerine ozgu ozel message yapisi ile guncellenebilmesidir. Hatta bu islem oncesi kaydet guncellenemiz gerekiyorsa bu degerleri iceren bir SetStateRequest gondermeniz daha sonra da Update etmemiz gerekmektedir.

Kod uzerinde bu durumu  incelersek; Assign yani birisine kayit atama ve SetStateRequest yani kaydin durumunu guncellemek icin ayri islemler yaptigimizi ve kodun ne kadar uzadigini gorebilirsiniz.

            using (var service = new OrganizationService(crmConnection))

            {

                Entity account = new Entity("account");

                account["accountid"] = new Guid("0C2D5AC7-B7E4-E411-80E9-C4346BAC7DA8");

                account["name"] = "Adventure Works Inc.";

                account["creditlimit"] = new Money(100000);

 

                // Service call 1 – standart alanlari guncellestir

                var updateRequest = new UpdateRequest() { Target = account };

                var updateResponse = (UpdateResponse)service.Execute(updateRequest);

 

                // Service call 2 – sahipligi degistir

                var assignRequest = new AssignRequest()

                {

                    Assignee = new EntityReference

                    {

                        LogicalName = "team",

                        Id = new Guid("042d5707-6fe5-e411-80e5-fc15b428fa14")

                    },

 

                    Target = new EntityReference

                    {

                        LogicalName = "account",

                        Id = new Guid("0C2D5AC7-B7E4-E411-80E9-C4346BAC7DA8")

                    },

                };

                var assignResponse = (AssignResponse)service.Execute(assignRequest);

 

                // Service call 3 – kaydin durumunu degistir

                var setStateRequest = new SetStateRequest()

                {

                    EntityMoniker = new EntityReference

                    {

                        LogicalName = "account",

                        Id = new Guid("0C2D5AC7-B7E4-E411-80E9-C4346BAC7DA8")

                    },

                    State = new OptionSetValue(1), //inactive

                    Status = new OptionSetValue(2) //inactive

                };

                var setStateResponse = (SetStateResponse)service.Execute(setStateRequest);

            }

CRM 2015 update 1’den itibaren ise artik bu durumu daha iyi yonetebilmekteyiz. Cok basit bir update kodu icerisinde bu durumu cok rahat yonetebilmekteyiz. Bu ozellik sayesinde cok daha rahat ve hizli kod yazabilmekteyiz artik.

Bu durum entegrasyon calismalarimizda da bize hiz ve daha guvenli calisan bir kod yapisi sunmaktadir.

            using (var service = new OrganizationService(crmConnection))

            {

                Entity account = new Entity("account");

                account["accountid"] = new Guid("0C2D5AC7-B7E4-E411-80E9-C4346BAC7DA8");

                account["name"] = "Adventure Works Inc.";

                account["creditlimit"] = new Money(100000);

                account["statecode"] = new OptionSetValue(1); //inactive

                account["statuscode"] = new OptionSetValue(2); //inactive

                account["ownerid"] = new EntityReference { LogicalName = "team", Id = new Guid("042d5707-6fe5-e411-80e5-fc15b428fa14") };

 

                var request = new UpdateRequest() { Target = account };

                var response = (UpdateResponse)service.Execute(request);

            }

Daha fazla detayi bu adreste bulabilirsiniz: CRM online documentation page

Dynamics CRM 2016 - Upsert

CRM yazilimcilari cok asina olmasa da bu terim DBA’ler icin yabanci bir terim degil. Upsert aslinda bizim bildigimiz Update ve Insert islemlerinin bir metodda birlestirilmis hali. Isin ozu ise siz sisteme bir nesne gonderdiginizde ilk once bu var mi diye kontrol ediyor eger varsa update ediyor yoksa yenisini olusturuyor.

            using (var service = new OrganizationService(crmConnection))

            {

                // Use alternate key (accountnumber) field to identify an account record

                var account = new Entity("account")

                {

                    KeyAttributes = new KeyAttributeCollection

                    {

                        {"accountnumber", "MWNS-123" }

                    }

                };

 

                account["name"] = "Microsoft Turkey";

                account["creditlimit"] = new Money(200000);

 

                var request = new UpsertRequest() { Target = account };

                var response = (UpsertResponse)service.Execute(request);

            }

Kod calistiginda MWNS-123 kodlu kaydi arayacak varsa update yoksa insert edecek, iste bu kadar basit.

Bu arada sunu belirtmekte fayda var Upsert islemi icin ozel bir mesaj bulunmamakta yani islem Update olursa Update mesaji, Create olursa create mesaji calismakta. Plugin yazarken lutfen bunu goz onunde bulundurun.

Daha detayli bilgiyi asagidaki adreslerde bulabilrsiniz.

Dynamics CRM 2016 - Alternatif Anahtarlar (Alternate Keys)

Dynamics CRM 2016 icerisindeki guzel ozelliklerden biri de artik bir kaydi tanimlamak icin Guid disinda alternative bir anahtar da tanimlayabiliyor olmamiz. Bu sayede CRM’i baska sistemlerle entegre etmek daha da kolay hale gelmekte. Excel’den veri aktarimi yapmak ya da baska bir uygulamayla entegre ederken diger uygulamanin tanimlayicilarini CRM icersinde tanimlayabilmek bize buyuk esneklik kazandirmakta.

CRM arabiriminde Ayarlar(Settings)->Ozellestirmeler(Customization)->Sistemi Ozellestir(Customize System) adimlarini takip ederek herhangi bir nesne(entity)yi actigimizda anahtar tanimlama ekranina ulasabilmekteyiz.

Bu ekran vasitasiyla tanimlayicilari ekran goruntusunde gosterildigi gibi tanimlayabiliriz.

Burada onemli olan nokta ise gereksinimlerinize gore bir ya da birden fazla alani birlestirerek bir anahtar olusturabiliyorsunuz.

Bir alternative anahtar olusturdugunuzda arka tarafta CRM veritabani uzerinde sorgu performansini artirmak amaciyla bir bir sistem ise calismakta ve bir index olusturulmaktadir. Sistemdeki kayit sayiniza bagli olarak bu islem biraz zaman alabilir.

Bu arada String, Integer, Decimal alanlari bu islem icin kullanabilirsiniz. Olusturdugunuz key’i Update ve Upsert (yani Update or Insert) isleminde kullanabilirsiniz.

            using (var service = new OrganizationService(crmConnection))

            {

                // Use alternate key (accountnumber) field to identify an account record

                Entity account = new Entity("account", "accountnumber", "MWNS-123");

 

                // Set new credit limit;

                account["creditlimit"] = new Money(120000);

 

                // Entity reference using alternate key (emailaddress1) on contact entity

                account["primarycontactid"] = new EntityReference("contact", "emailaddress1", "test@test.com");

 

                UpdateRequest request = new UpdateRequest() { Target = account };

                UpdateResponse response = (UpdateResponse)service.Execute(request);

            }

Bu kullanim seklinin disinda bir de Entity ve Entity Reference siniflari icerisinde KeyAttributes olarak da erisme ve kullanma hakkina sahibiz.

            using (var service = new OrganizationService(crmConnection))

            {

                // Use alternate key (accountnumber) field to identify an account record

                Entity account = new Entity("account")

                {

                    KeyAttributes = new KeyAttributeCollection

                    {

                        {"accountnumber", "MWNS-123" }

                    }

                };

 

                // Set new credit limit;

                account["creditlimit"] = new Money(100000);

 

                // Entity reference using alternate key (emailaddress1) on contact entity

                account["primarycontactid"] = new EntityReference("contact")

                {

                    KeyAttributes = new KeyAttributeCollection

                    {

                        {"emailaddress1", "test@test.com"}

                    }

                };

 

                UpdateRequest request = new UpdateRequest() { Target = account };

                UpdateResponse response = (UpdateResponse)service.Execute(request);

            }

Eger CRM icerisinde talep ettigiginiz key bulunmaz ise asagidaki hatayi alabilirsiniz.

A record with the specified key values does not exist in account entity

Bu linklerden daha detayli bilgi alabilirsiniz.

New Features with Microsoft Dynamics CRM 2016

Mobile

Offline mobile capabilities

More new Cortana integrations (beyond what's there already in Dynamics CRM) with sales activities

Tighter integration with the Cortana Analytics Suite

Better mobile app management with Intune

Next release of Microsoft's CRM app for Outlook that will allow users to track emails, add contacts and create records through the browser on PCs or Macs or mobile browser on a phone

Ability to open Office apps within CRM or CRM mobile app


Sales

Personalized sales documents

New Excel templates for automating many core tasks

Integrated Delve functionality

Improved Outlook Experience

Customer Service

Unified Service Desk

Social

Social Listening and Social Analytics

More use of Azure Machine Learning for sentiment analysis in Microsoft Social Engagement



You can also quick lookup this document for more details : https://lnkd.in/exZ3E9V


Dynamics CRM ve Application Insights Entegrasyonu

Bircok Microsft Azure servisini Dynamics CRM ile entegre edebilmekteyiz. Bunlardan en guzel orneklerden birisi Application Insights ve Dynamics CRM birlikteligi. Bu makalede bu Application Insights ile Dynamics CRM'i nasil konusturacagimizi gorecegiz. Oncelikle Application Insights'in ne olduguyla baslayalim isterseniz. 
Visual Studio Application Insight bir telemetri servisidir yani bir sistemi detayli olarak incelemek sitediginizde ona veri gonderdginiz ve bu verileri detaylari bir sekilde grafikler ve tablolar halinde izlediginiz sonucunda rapolar alarak sisteminizin durumu hakkinda bilgiler edindiginiz bir hizmettir. Kisacasi size sisteminizin saglikli calisip calismadigi hakkinda olceklenebilir bilgiler vermektedir.
Dynamics CRM ise bir web tabanli uygulama oldugundan IIS uzerinde olusan web sayfasi goruntuleme taleplerini bunlarin suresini ve bu taleplerin kimden geldigini, hangi sayfalara bakildigini detayli olarak Application Insights'a aktarabiliriz.
Hadi baslayalim.

Azure icinde Application Insights kaynagi olusturalim

Azure hesabiniz yoksa bu adresten olusturabilirsiniz. Sisteme giris yaptiktan sonra Browse'a tikladiktan sonra Application Insights'i secenegini ile olusturma penceresini aciyoruz burada tek dikkat etmeniz gereken nokta Application Type seceneginde Asp.Net'i secmeniz gerekmekte. Gerekli bilgileri doldurdukran sonra Create dugmesiyle kendi Application Insights'inizi olusturabilirsiniz.



Bu noktadan sonra ekrandaki grafiklere tiklayarak her bir grafik bolumunun icinde o bolume nasil veri atabileceginize dair ornekler yer almakta.


JavaScript ile CRM icerisinden veri gonderelim

Dynamics CRM'i acip Ayarlar(Settings)>Ozellestirme(Customization)>Customize the System(Sistemi Ozellestir) bolumunden yeni Web Resource(Web Kaynagi) ekliyoruz.


Ben asagidaki kod parcasini kullaniyorum bu kod parcasi ile CRM icerisinden kullaniciyi ve islem yapilan entity'i(nesne) parametre olarak gonderiyorum.

var UserName;
var Alias;
var serverUrl;

function Getinfo() {
    var context;
    var UserID;
    var ODataPath;
    var selectFields = "$select=DomainName,FullName";

    context = Xrm.Page.context;
    serverUrl = context.getClientUrl();
    UserID = context.getUserId();
    ODataPath = serverUrl + "/XRMServices/2011/OrganizationData.svc";

    var retrieveUserReq = new XMLHttpRequest();
    retrieveUserReq.open("GET", ODataPath + "/SystemUserSet(guid'" + UserID + "')?" + selectFields, false);
    retrieveUserReq.setRequestHeader("Accept", "application/json");
    retrieveUserReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    retrieveUserReq.onreadystatechange = function () {
        retrieveUserReqCallBack(this);
    };
    retrieveUserReq.send();
}

function retrieveUserReqCallBack(retrieveUserReq) {
    if (retrieveUserReq.readyState == 4 /* complete */) {
        if (retrieveUserReq.status == 200) {
            var retrievedUser = JSON.parse(retrieveUserReq.responseText).d;
            if (retrievedUser.FullName != null) {
                UserName = retrievedUser.FullName;
                Alias = retrievedUser.DomainName;
            }
        }
    }
}

function captureTelemetry() {
    var appInsights = window.appInsights || function (config) {
        function s(config) { t[config] = function () { var i = arguments; t.queue.push(function () { t[config].apply(t, i) }) } } var t = { config: config }, r = document, f = window, e = "script", o = r.createElement(e), i, u; for (o.src = config.url || "//az416426.vo.msecnd.net/scripts/a/ai.0.js", r.getElementsByTagName(e)[0].parentNode.appendChild(o), t.cookie = r.cookie, t.queue = [], i = ["Event", "Exception", "Metric", "PageView", "Trace"]; i.length;) s("track" + i.pop()); return config.disableExceptionTracking || (i = "onerror", s("_" + i), u = f[i], f[i] = function (config, r, f, e, o) { var s = u && u(config, r, f, e, o); return s !== !0 && t["_" + i](config, r, f, e, o), s }), t
    }({
        instrumentationKey: "Burayi degistirin"
    });

    window.appInsights = appInsights;
    appInsights.trackPageView(Xrm.Page.data.entity.getEntityName(), serverUrl, { User: Xrm.Page.context.getUserName(), DomainName: Alias });
    appInsights.trackEvent(Xrm.Page.data.entity.getEntityName());
}

function startPoint() {
    Getinfo();
    captureTelemetry();
}

Kodun icerisindeki "instrumentationKey: "Burayi degistirin"" bolumundeki instrumentationKey "Essentials" altinda bulabilirsiniz. 

Ben yukaridaki kodu Account(Firma) ve Contact(Contact) entity'lerinin onLoad event'lerine yerlestirdim.


Bunu yapmak icin form uzerindeki uc noktaya tikiiyoruz ve form duzenleyicisini aciyoruz. Form duzenleyicisi uzerinden Form Ozelliklerini aciyoruz ve biraz once eklemis oldugumuz js web kaynagini buradan seciyoruz ve ekliyoruz.


Yapmis oldugumuz degisiklikleri kaydedip formu yayinliyoruz,
Artik form her acildiginda  Application Insights'e veriler gidecektir. Benim demo sistemimden elde ettigim ekran goruntuleri asagidaki gibidir. AppInsights'a ilk girdigimde asagida goruldugu gibi bir ekran bizi karsilamakta. Sirasiyla bu kutucuklara tiklafdigimda detayli bilgileri almaktayim.


Request ve Response zamanlarini;

Kullanicinin sayfalari ne zaman hangi cihazdan cagirdigi ve yuklenme surelerini;


hangi formlarin ne kadar cagrildigini;


ve metadata bilgilerine;


yukarida goruldugu gibi ulasabilmekteyim. Bunun haricinde formlarda olusan hatalari ve kullanici detaylarini(geolocation gibi) da almaktayim. 

Application Insights hakkinda daha fazla bilgiye buradan ulasabilirsiniz.

2015 Yılı CRM Trendleri - Bolum 2

Yazimiza kaldigimiz yerden devam ediyoruz. 1. Bolumu okumak icin buraya tiklayabilirsiniz,

3.      Sosyal Medya Entegrasyonu

Sosyal medya artık hayatımızın vazgeçilmez bir parçası haline geldi ve inanılmaz bir hızla da büyümeye ve Pazar payını arttırmaya devam ediyor. Bu internet şirketleri size sadece internet tabanlı içerikler sunarken aldıkları reklamlar üzerinden kendilerini finanse etmekte ve inanılmaz bir şekilde insanlar tarafından kabul görmekte. Yazının başında bahsettiğim Facebook ve diğer örnekler olan Twitter,Youtube, Instagram, Google bunların başında gelmekte. Kullanıcıların dilek, şikayet ve önerilerini bu mecralarda dile getirmesi doğal olarak firmalarında bu havuzdaki veriyi takip edip müşteri odaklı sonuçlar ortaya çıkarmasına neden oldu.

Bir müşterinin bir ürün hakkındaki şikayetinin hemen altına bundan fırsat bilerek rakip firmanın reklamını yerleştirmesi ya da reklamını yapması çok sık rastlanan hareketler oldu. Örnek verecek olursak TTNet’in sorusuna Yandex’in cevabı gibi.

 

Bu örnekleri çoğaltmak mümkün. Bunun haricinde müşteri şikayetlerinin de tam zamanlı takip edilmesi ve bunlara da en uygun çözümün sunulması şu anda çok önemli ve mevcut CRM yazılımları bunu sağlamakta. Yani sizin Facebook, Twitter gibi sosyal medya araçlarını takip edip size anında raporlayan, hatta belirlediğiniz kelimelere göre analizler yapan yazılımlar artık CRM yazılımlarının içinde yerini aldı bile. 2015 yılı içerisinde bunların kullanımını ve bunların entegrasyonun sağlanması en çok gündeme gelen konular arasında yer alacak.

4.      Otomatik Öngörü

En ilginç konulardan biri de otomatik öngörü ile müşterinin elinde ürün bitmeden yenisini ona sunmak. Örnek vermek gerekirse yazıcınızın toneri bitmesine yakın yazıcınızın üretici ile irtibata geçip kendisi için uygun olan kartuşları sipariş etmesi verilebilir. Böylece siz işinize odaklanırken sistem kendi içinde hem bir satış fırsatı yakalamış hem de müşteri memnuniyetini sağlamış olacak. Bu aslında biraz da nesnelerin interneti kavramıyla da ilgili ve bu anlattığım senaryo şu anda HP tarafından yapılmakta sadece sisteme üye olmanız gerekmekte. Ben Londra’da yaşıyorum ve bu sistemin bir üyesiyim böylece kartuşum hiç bitmiyor.

Aynı şekilde siz sürekli aynı marketten alışveriş yapıyorsanız o market sizin sürekli aldığınız ürünleri bildiğinden size bitmeden yenisini gönderebilir ya da en azından bir mail ile size yenilerini isteyip istemediğinizi sorabilir.

Her ne kadar bu konunun şu anda aktif olarak kullanılsa da 2015 içerisinde daha farklı senaryo ve kullanımları ile karşımıza çıkacak ve genişleyecek bir konu.

5.      BigData (Büyük Veri)

Bu kadar çok veriyi tutmak tabii ki problem bir de bunu analiz etmeye kalkmak daha da büyük bir işkence haline dönüşebilir. İşte bu nedenle teknoloji dünyasında son dönemde bu sıkıntılardan ortaya çıkan BigData ve NoSQL gibi kavramlar çıkmış bulunmakta. Artık verileri daha hızlı ve daha performanslı analiz etmenizi ve analiz ettiğiniz veriyi daha akıcı ve anlaşılır görseller halinde sunan yazılımlar sistemlerin içerisine entegre edilmeye başlandı.

Mesela Microsoft Dynamics CRM içerisinde Online olarak hizmet veren Social Listening platformu sizin için sosyal medya araçlarından veriyi analiz ettikten sonra Microsoft PowerView ile çok akıcı ve anlaşılır interaktif görsel grafikler halinde size vermekte. İşte bu bağlamda CRM kavramı içerisinde önümüzdeki günlerde öne çıkacak ve firmaları üzerinde düşünmeye itecek konulardan bir tanesi de bigdata kavramı olacak.

2016 Yılı Öngörüsü

Gelişen teknolojiyi göz önünde bulundurarak 2016 Trendleri için de ufak bir öngörüde bulunmak sanıyorum faydalı olacaktır.

1.      Giyilebilir Teknolojiler

Teknoloji dünyasını yakından takip edenler akıllı saatlerle başlayan yeni bir akımın da farkındadırlar. O ada giyilebilir teknolojiler. Şu an etrafımızda akıllı saatler olarak gördüğümüz ama yakın bir gelecekte giysilerimiz ve ayakkabılarımız dahil olmak üzere üzerimizdeki bir çok nesnenin üzerine devreler girecek ve girmekte zaten. Google’ın GoogleGlass isimli gözlüğü de bunlara en güzel örneklerden. Google’a girip Nike+ Shoes yazdığınızda karşınıza cep telefonunuzla haberleşen bir sürü ayakkabı modeli gelecektir.

Peki, bu bize niye gerekli? Kullanıcılar bu yönde ürünler aldıkça bu yönde servis veren hizmetler de ortaya çıkmakta işte tam bu noktada müşteri memnuniyeti ve müşteri deneyimini ölçekleyebilmek adına CRM araçlarımızın da bu bilgileri alıp analiz edip sonuçlar üretmesi ve müşteri memnuniyetini sağlaması gerekme.

2.      Internet of Things (Nesnelerin İnterneti)

Bir önceki maddeye bakıp e biz giyilebilen birşeyler üreten bir firma değiliz ne yapalım demeyin. Nesnelerin interneti kavramı bu yüzden var. Kısaca tanımlamak gerekirse içinde başka bir cihazla (ki genellikle bu cihaz cep telefonu olmakta) iletişim kurabilen bir devre olan araç gereçler demek. Mesela kolunuza taktığınız bileklik.

Ya da bir pizza üreticisiyseniz pizza kutuları içine yerleştirilen bir devre olarak düşünebilirsiniz. Bir pizzacının pizzaları dağıtırken cep telefonu sayesinde pizzaları müşteriye bıraktığı andaki kutu içindeki sıcaklık ve nem bilgisini merkeze ilettiğini düşünün. Eğer belli bir bölgeden pizzaların tazeliği ya da kokusu hakkında şikâyet geliyorsa CRM uygulamamız içinde tuttuğumuz bu veriler sayesinde pizzanın o bölgeye uzak bir bayiden dağıtıldığını bu nedenle müşteriye vardığı anda soğudunu ve tazeliğini kaybettiğini şikâyetlerin bu nedenle arttığını analiz edebilirsiniz.

İşte CRM içerisinde her noktadan elde ettiğimiz verinin analizi ve müşteri memnuniyetini arttırmaya yönelik çalışmalarımıza etkisi bu yönde olacak bu kavramın.

Sonuç

Teknolojik gelişmeler devam ettikçe bizler kendimize müşteriyle iletişim kuracak yeni alanlar bulacak ve bunları hep bir fırsat olarak değerlendireceğiz. İşte bu fırsatları her zaman iyi değerlendiren bir adım önde olacak.

2015 yılı içerisinde CRM dünyasında konuşulacak gözde olacak adlarından söz ettirecek konulara ve teknolojik gelişmelere göz atmaya çalıştık. Umarım sizler için faydalı bir yazı olmuştur.