cub-e.net

just coding...

CRM Saturday'in ardindan

26 Kasim tarihinde Microsoft Turkiye ofisinde gerceklestirdigimiz CRM Saturday etkinligi hem katilimcilar hem de konusmacilar acisindan cok verimli gecti. Birbirinden degerli konusmacilar deneyimlerini aktardilar ve soru-cevap bolumlerinin ardi arkasi kesilmeyince etkinlik toplamda tam 1 saat uzadi. Etkinlikte cekilen 2 fotografi sizlerle paylasmak istiyorum. 




CRM Saturday - Istanbul

1 Kasım’da Microsoft yeni bulut bilişim platformu Dynamics 365’i duyurdu. Yeni platform CRM ve ERP çözümlerinin bulutta yeni ve mükemmel birleşimi ve birçok yeni özellikle birlikte gelmekte. Microsoft’un bu yeni çözümünü bütün detaylarıyla inceleyeceğimiz bu etkinlikte Dynamics 365’in bulutta ne özellikler sunduğunu ve diğer Microsoft ürünleri olan Azure ve Office 365 ile nasıl entegre olduğunu konunun uzmanlarından dinleyeceksiniz.

26 Kasım 2016
10:00 – 15:45


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.


"Satış problemlerinizi Dynamics CRM ile çözün" seminer duyurusu

Eğer siz de aşağıdaki sorunları yaşayan bir satış organizasyonu içerisindeyseniz internet üzerinden canlı olarak gerçekleşecek olan etkinliğimize katılabilir Microsoft Dynamics CRM ürününün nasıl bütün sorunların üstesinden geldiğini görebilirsiniz. Canlı etkinlik sırasında sorular da sorabilirsiniz.

“Sektöründe iyi bir konumda yer alan firmanın sahibi Ahmet Bey, satışla ilgili sorunlarının nereden kaynaklandığını tam teşhis edemiyordu. Satış ekipleri mi yeterince potansiyel yaratamıyordu yoksa çoğu potansiyelden haberdar olmalarına rağmen işleri rakiplerine mi kaptırıyorlardı?

Sorunu çözmek için daha ayrıntılı bilgiye sahip olmaları gerekiyordu ancak satış ekiplerinden daha fazla bilgi toplamak için girişimde bulunduğunda, çok tepki çekiyordu. Dışa dönük ve satışa odaklanmış bu ekipler, sistemle uğraşmaya ve bilgi girişi yapmaya direniyorlar, tüm zamanlarını satışa ayırmak ve şirket dışında olmak istiyorlardı. Satış ekiplerinden her görüşmelerini, her teklifi, her teklif sonrası takip adımlarını sisteme girmelerini istemek kolay değildi. Siparişlerin takibi ve ofis isleri de bu nedenle aksamaktaydı.

Ahmet Bey'e bir arkadaşı, aradığı çözümün Microsoft Dynamics CRM olabileceğinden bahsetti. Pek çok firmanın bu yazılım ile satış ekiplerini hiç yormadan, Outlook içinden kendi ajandalarını takip ederken bilgi topladıklarını ve satış etkinliğini fazlasıyla artırdıklarından bahsetti. Ayrıca mobil durumda da sisteme bağlanabilmekte islerini her yerden takip edip bilgi alış-verişi yapabilmekteydiler.”

Gelin Ahmet Bey’in bu sorunu nasıl çözebileceğini beraber görelim.

Microsoft’tan 5 kere üst üste Dynamics CRM MVP(En Değerli Uzman) ödülünü almış olan Barış Kanlıca’nın sunumu 28 Mart 2016 Pazartesi günü saat 09:30’da başlayacak. Sunuma katılmak ve bundan sonraki sunumlardan haberdar olmak ve soru/önerileriniz için info@mawens.com adresine mail atabilirsiniz.

Daha fazla bilgi için http://www.mawens.com adresini ziyaret edebilirsiniz.

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.

CRM Semineri

15 KasimPazar günü saat 10:30 - 16:30 arasında Omerd Business Solutions ofisinde "CRM, XRM Kavramları ve Dynamics CRM" konulu bir seminer vereceğim.

CRM Semineri Duyurusu

11Temmuz Cumartesi günü saat 10:30 - 12:30 arasında Bahçeşehir Üniversitesinde "CRM, XRM Kavramları ve Dynamics CRM" konulu bir seminer vereceğim. İçerik ise şu şekilde olacak; Dünya’da uzun yıllardır konuşulan CRM “Müşteri İlişkileri Yönetimi” kavramı müşterimizin neleri sevdiğini, neye para harcadığını ve neleri yapmaktan hoşlandığını kısacası bize müşterimizin kim olduğu gösteren temeller üzerine oturmuştur. XRM sadece müşteri değil onun haricinde dış dünyada yönettiğimiz varlıkların bize kim/ne olduğunu  göstermektedir. İşte bu seminerde Microsoft Dynamics CRM’in bu iki kavramın ortasına nasıl oturduğunu ve programatik olarak nasıl geliştirilebileceği anlatılacaktır.

Microsoft Dynamics CRM, adındaki CRM ibarisi nedeniyle sadece Müşteri İlişkileri departmanlarını ilgilendiren bir yazılım olarak anlaşılmaktadır. Aslında Dynamics CRM bir platfomdur ve üzerinde sizin şekillendirdiğimiz bir çok altyapıya destek verebilir.

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.