Cengiz ATİLLA

Microsoft Dynamics CRM

Dynamics CRM - Bakım zamanı

Merhaba Arkadaşlar 

Bildiğiniz gibi kurduğumuz sistemler ilk başlarda çok hızlı çalışırken zamanla kullanıcılar sistemin yavaşladığını eskiden x işlemi hemen yapabiliyor iken şimdi bu işlem için beklemem gerekiyor dediğini çoğu zaman duymuşuzdur. 

Birşeyler zamanla mı değişti , yoksa bazı şeyler yanlış mı kurgulandı.

Sanırım sistemimizi bakım zamanına alma zamanı geldi ...

Başlamadan önce 

İşlerimize başlamadan önce yapmamız ve sistem üzerinde incelememiz gereken bazı noktalardan maddeler halinde bahsedelim.

  • Projemizde kullandığımız iş akışlarımızın ve iletişim kutularımızın listesini proje dosyamızdan çıkartalım, hangisinin geride bıraktığı iz bizim için önemli bunları tespit edelim. 
  • Sistemlerimiz yaşayan bir organizma gibi zaman içerisinde istenen yeni kurgular veya düzenlemeler üzerine birde her zamanki gibi zamansızlık eklenince çok incelemeye fırsat kalmadan benzer iş akışları yapmış veya bir iş akışının altına eklememiz gereken bir işlemi yeni bir iş akışı olarak oluşturmuş olabiliriz. iş akışlarımızı kontrol edelim 
  • Projemiz içerisinde yazmış olduğumuz plug-in lerimizi inceleyelim ilk madde içerisinde belirttiğim gibi plug-in lerimizide inceleyelim.
  • Kullanıcılarımızın zaman içerisinde gelişmiş bul yetenekleri gelişip data boyutuda çoğaldığı zaman sistemde aynı orantıda yavaşlar, bunları tespit edelim kullanıcılarımız hangi zaman aralıklarında ne büyüklükte raporlar çekiyorlar. 
  • Projemiz içerisinde tanımladığımız ve genelde test aşamasında zamanını ayarlamayı atladığımız o windows servisler , mesai saati içerisinde çalışan hangi windows servislerimiz var, bunların mesai saati dışında çalışması sistemimizi ne kadar etkiler veya çalışma aralıklarını ne kadar uzatabiliriz. 
  • Crm uygulamasının kurulu olduğu sunucu içerisindeki hata loglarımızı inceleyelim , son 15 veya 30 gün içerisinde crm bize neler demek istemiş.
    Örnek olarak sunucu bize aşağıdaki şekilde bir event log ile database içerisindeki AsyncOperationBase tablomuz içerisindeki kayıtların arttığını haber vermektedir. 
Event Type: Error
Event Source: MSCRMDeletionService
Event Category: None
Event ID: 16387
Date: 2009/01/26
Time: 11:41:54 AM
User: N/A
Computer: CRMSERVER
Description: Error: Deletion Service failed to clean up table=CleanupInactiveWorkflowAssembliesProcedure For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

Kontollerimizi tamamladık, şimdi işlemlere geçelim. 

İşlemlerimize başlamadan önce aşağıdaki iki maddeye dikkat etmemiz gerekmektedir. 

  • Sistem yöneticimizden projenin olduğu makinelerin yedeklerinin alınmasını isteyelim. 
  • İşlerimizi mesai saati dışında yapalım ve kullanıcılarımıza bakımı haber verelim , 
    • Muhasebe veya operasyon gibi bazı bölümler bizim bakım zamanımıza denk gelen bir çalışma aralığında çok önemli işler yapabiliyorlar. 

İş Akışları - İletişim Kutuları

Projemiz içerisinde kullanmış olduğumuz iş akışlarımızı ve iletişim kutularımızın listesini gözden geçirip, hangi iş akışımızın logları önemli hangilerinin logları önemsiz olduğunu bakım işlemlerimize başlamadan önce tespit etmiştik. 

Her bir iş akışı veya iletişim kutusu eğer seçim yapılmadı ise standart davranış olarak yaptıkları işlemler sonrasında arkalarında bir log bırakırlar. Datalarımız büyüdüğü ve iş akışlarımız yüzlerce kez çalıştığı zaman arkada bırakmış oldukları bu loglar sistem için bir yük haline gelir. Projemiz içinde loglarının takibi gerekmeyen işlemlerimizin loglarını aşağıda paylaşmış olduğum ekrandaki seçim kutusunu işaretleyerek kapatabiliriz. 

ikinci madde içerisinde belirttiğimiz gibi iş akışlarımızı veya iletişim kutularımız içerisinden birleştirebildiklerimiz var ise bunları planlı bir şekilde birleştirelim. 

Plug-in

Sistem içerisinde geliştirdiğimiz plug-inlerimizin çalıştıktan sonraki log işlemlerini kapatmak için aşağıda paylaşmış olduğum ekranraki seçim kutusunu işaretleyerek kapatabiliriz. 

Raporlar 

Kullanıcılarımızın mesai saati içerisinde gelişmiş bul ile çekmiş oldukları raporların boyutlarını araştıralım , datalarımız arttıkça raporların süreleride uzamaktadır.

Datalarımızı yaşlandırarak veya ilgili raporları özel olarak yazarak mesai saati içerisinde çekilen dataları kontrol altına alabiliriz. 

Windows Servisler 

Projemiz içerisinde genelde olmaz ise olmazlarımızdan birisi olan windows servislerimizin çalışma sıklıklarını iyi analiz etmeli en uygun zaman aralıkları verilmelidir. 

Günde bir kere çalışacak olan bir windows servisimiz var ise , o zaman aralığı personelin yemek molası , sabah mesai saati başlamadan önce veya mesai sonrasında olarak ayarlanması bize performans olarak fayda verecektir. 

Özel Kod İşlemleri 

Satış veya operasyon gibi bazı departmanlarımızın sistemin içerisine toplu olarak bazı dataları aktarmaları gerektiğinde yazmış olduğumuz aktarım uygulamaları iyi kurgulanmaz ise performans kaybı yaşatabilecek durumları oluşturabilir. 

Bir örnek ile konuyu açıklayalım; 

Satış tarafından bize içerisinde 10.000 tane kayıt olan bir potansiyel müşteri listesi geldi , bizde bunu crm sistemi içerisindeki potansiyel müşteri varlığına aktaracağız. Varlık üzerinde bir iş akışı tanımlı her tanımlanan potansiyel müşteri için call center ekibimize bir telefon aktivitesi oluşturuyor. 

Excel listemizi aldık ve aktar butonuna bastık ... 

İşlem başarılı !

Evet sistemimizde çalışmayı bekleyen 10.000 tane iş akışı ile beraber işlemimiz başarılı.

Aktarım uygulamarı içerisine yazılabiliyor ise bu tür kodları eklemeli ve iş akışlarını aktarım zamanında kapatmalıyız. 

Dynamics 365 içerisindeki custom action mantığını kullanarak işlerimizi custom action mantığına uygun tasarlayıp özel kodumuzda veya iş akışımızda hazırlamış olduğumuz custom action çağırabiliriz. 

Event Log

Projemizin bulunduğu sunucu üzerindeki event log larımız inceleyelim sistem içerisinde hata logu olarak neler var ? 

EventlogId değeri ile sorunların çözümlerini arayalım. 

Özet olarak 

Sistemimiz içerisindeki yavaşlamalar yukarıda belirttiğimiz ayrıntılara dikkat edersek gözle görülür oranda azalacaktır.

https://support.microsoft.com/en-us/help/968520/performance-is-slow-if-the-asyncoperationbase-table-becomes-too-large adresindeki adımlarıda yapmanızı öneririm. 

 

 

 

Dynamics CRM 365 - Xrm.Page.data.entity

Merhaba Arkadaşlar , 

Dynamics crm içerisinde formları tasarlarken sıklıkla javascript ile forma müdahale etmemiz datalar üzerinde kıyaslama yapmamız veya kullanıcılarımızı yönlendirmemiz gerekir. Bu makalemizde Xrm.Page.data.entity altında bulunan başlıklar ile inceleyeceğiz. 

  • attributes
  • getDataXml
  • getEntityName
  • getId
  • getIsDirty
  • OnSave
  • save

attributes 

Formun kayıt olayında çalısıp kayıt esnasında form üzerinde bulunan alanların değerleri ile birlikte listesini verir.

Örnek Kullanım
Xrm.Page.data.entity.attributes;

getDataXml

Formun kayıt olayında çalışıp kayıt esnasında sunucuya giden bilgileri bize string tipinde xml olarak verir. Sadece değişen veya değer olan kayıtların listesini verir.

Örnek Kullanım
Xrm.Page.data.entity.getDataXml();

getEntityName

Üzerinde çalıştığı entity nin adını string tipinde döndürür.

Örnek Kullanım
Xrm.Page.data.entity.getEntityName();

getId

Üzerinde çalıştığı entity nin ID değerini döndürür.

Örnek Kullanım
Xrm.Page.data.entity.getId();

getIsDirty

Form üzerindeki alanların değişip değişmediğini bize true / false olarak bildirir.

Örnek Kullanım
Xrm.Page.data.entity.getIsDirty();

OnSave

Form kayıt sırasında eklemek istediğimiz başka methodlar var ise addOnSave eklediğimiz ve bir mantıksal sisteme göre kaldırmak istediğimiz kayıtlar var ise removeOnSave methodlarını kullanabiliriz.

Örnek Kullanım

Xrm.Page.data.entity.addOnSave(Eklemek_istedigimiz_function);
Xrm.Page.data.entity.removeOnSave(Eklemek_istedigimiz_function);

save

Form üzerinde kullanıcının belirli bir aşamada formu kaydetmesini istemek yerine bunu aşağıdaki javascript methodları ile yapabiliriz.

Örnek Kullanım
Xrm.Page.data.entity.save( null | "saveandclose" |"saveandnew" )

save()
Herhangi bir parametre vermez isek sadece formu kayıt eder.
save("saveandclose")
Kayıt işlemini gerçekleştirir ve formu kapatır.
save("saveandnew")
Kayıt işlemini gerçekleştirir ve yeni form açar

Dynamics CRM 365 - Xrm.Page.data.entity.attributes

Merhaba Arkadaşlar

Dynamics crm içerisinde formları tasarlarken sıklıkla javascript ile forma müdahale etmemiz datalar üzerinde kıyaslama yapmamız veya kullanıcılarımızı yönlendirmemiz gerekir. Bu makalemizde Xrm.Page.data.entity.attributes ( Xrm.Page.getAttribute  )   altında bulunan başlıklar ile inceleyeceğiz.

  • getInitialValue
  • getOption
  • getOptions
  • getSelectedOption
  • getText
  • controls
  • getAttributeType
  • getFormat
  • getIsDirty
  • getMaxLength
  • getName
  • getUserPrivilege
  • getMax
  • getMin
  • getPrecision
  • OnChange - addOnChange
  • OnChange - remove
  • OnChange OnChange - fireOnChange
  • RequiredLevel - getRequiredLevel
  • RequiredLevel - setRequiredLevel
  • Value - getValue
  • Value - setValue
  • Value - Set Lookup Attribute Value

getInitialValue

Form üzerindeki picklist veya boolean alanlar için geçerli olan bir fonksiyondur. Form açıldığı zaman fonksiyon içerisinde belirtilmiş olan alanın default değerini bize verir. 

Örnek Kullanım 

Xrm.Page.getAttribute(alan_adı).getInitialValue();

getOption

Form üzerinde bulunan picklist alanlar için geçerli bir fonksiyondur. Parametre olarak verilen value değeri ilgili picklist içerisinde bulunursa geriye bir nesne üzerinde text ve value değerini döner , herhangi bir değer ile eşleşemez ise geriye null olarak dönüş yapar.

Örnek Kullanım

Xrm.Page.getAttribute(alan_adı).getOption(deger);

getOptions

Form üzerinde bulunan picklist alanlar için geçerli bir fonksiyondur. Belirtilen picklist içerisindeki tüm değerleri object[] olarak geri verir.

Örnek Kullanım

Xrm.Page.getAttribute(alan_adı).getOptions();

getSelectedOption

Form üzerinde bulunan picklist alanlar için geçerli bir fonksiyondur. Picklist in seçilen değerini bir nesne üzerinde text ve value değerini döner.

Örnek Kullanım

Xrm.Page.getAttribute(alan_adı).getSelectedOption();

getText

Form üzerinde bulunan picklist alanlar için geçerli bir fonksiyondur. Picklist in seçilen değerinin text bilgisini bize geri döner.

Örnek Kullanım

Xrm.Page.getAttribute(alan_adı).getText();

controls

Form üzerinde bulunan alanların listesini control tipinde bize geri döner. Liste içerisinde bulunan alanların üzerinde işlemler yapabilmemizi sağlar . 

Örnek Kullanım 

Xrm.Page.getAttribute(varlık_adı).controls

Form üzerinde bulunan tüm alanları gizlemek için    : SDK.Sample.hideAllAttributeControls(varlık_adı);
Form üzerinde bulunan tüm alanları göstermek için : SDK.Sample.showAllAttributeControls(varlık_adı);

getAttributeType

Form üzerinde olan tüm alanlar için geçerlidir. parametre olarak verilen alanın sistemsel tipini bize string tipinde geri döndürür. 
Veri tipleri : boolean - datetime - decimal - double - integer - lookup - memo - money - optionset - string 

Örnek Kullanım

Xrm.Page.getAttribute(varlık_adı).getAttributeType()

getFormat

Form üzerinde bulunan alanın sahip olduğu format bilgisini string olarak geri döner. 
Veri tipleri : date - datetime - duration - email - language - none - phone - text - textarea - tickersymbol - timezone - url 

Örnek Kullanımı 

Xrm.Page.getAttribute(varlık_adı).getFormat()

getIsDirty

Form üzerinde bulunan alanın üzerinde veri girişi yapılıp yapılmadığının bilgisini bize true / false olarak döner . Tüm alanlar için geçerlidir. 

Örnek Kullanım 

Xrm.Page.getAttribute(varlık_adı).getIsDirty()

getMaxLength

Form üzerinde bulunan string ve memo alanlar için geçerlidir. Belirtilen alanın maximum alabileceği değeri bize bildirir. 

Örnek Kullanım 

Xrm.Page.getAttribute(varlık_adı).getMaxLength()

getName

Form üzerinde bulunan alanın sistemsel adını almak için kullanılır. Tüm alanlar için geçerlidir. 

Örnek Kullanım 

Xrm.Page.getAttribute(varlık_adı).getName()

getUserPrivilege

Form üzerinde belirtilen alan için mevcut crm kullanıcısının yetkilerini bize object olarak geri döner. Gelen değer ile alan üzerinde kullanıcının okuma yazma oluşturma işlemleri yapıp yapamadığı bilgisini almış oluruz. 

Örnek Kullanım 

Xrm.Page.getAttribute(varlık_adı).getUserPrivilege()

getMax

Form üzerinde belirtilen alanın maximum değerini bize iletir. money - decimal - integer- double tipindeki alanlar için çalışır. 

Örnek Kullanım 

Xrm.Page.getAttribute(varlık_adı).getMax()

getMin

Form üzerinde belirtilen alanın minimum değerini bize iletir. money - decimal - integer- double tipindeki alanlar için çalışır. 

Örnek Kullanım 

Xrm.Page.getAttribute(varlık_adı).getMin()

getPrecision

Form üzerindeki Number alanlar için geçerlidir , belirtilen alanın izin verdiği ondalık rakamları ile birlikte verir. 

Örnek Kullanım 

Xrm.Page.getAttribute(arg).getPrecision()

OnChange - addOnChange

Form üzerinde belirtilen alanın onchange olayını ayarlar . addOnChange içerisine hazırlamış olduğumuz function vererek çalışmasını sağlayabiliriz. Genelde runtime da bir alana onchange olayı atamak istersek kullanılır. 

Örnek Kullanım

 Xrm.Page.getAttribute(arg).addOnChange(function)

OnChange - removeOnChange

Form üzerinde belirtilen alanın üzerinde bulunan onchange olayını kaldırmak için kullanılır , removeonChange içerisinde verilen funtion alan üzerinden ( on change olayından ) kaldırılır. 

Örnek Kullanım 

Xrm.Page.getAttribute(arg).removeOnChange(function)

RequiredLevel - getRequiredLevel 

Form üzerinde belirtilen alanın bize gereklilik bilgisini string olarak döner . Geri dönüş değeri string tipindendir. Tüm crm alanları için geçerlidir. 

  • none : Gereklilik düzeyi yok 
  • required : Zorunlu alan 
  • recommended : Önerilen alan 

Örnek Kullanım 

Xrm.Page.getAttribute(arg).getRequiredLevel()

RequiredLevel - setRequiredLevel 

Form üzerinde belirtilen alanın gereklilik düzeyini ayarlamamıza yarar. Tüm crm alanları için geçerlidir. 

setRequiredLevel() alacağı değerler 

  • none : Gereklilik düzeyi yok 
  • required : Zorunlu alan 
  • recommended : Önerilen alan 

Örnek Kullanım 

Xrm.Page.getAttribute(alan_adı).setRequiredLevel(requirementLevel)

Value - getValue

Form üzerinde belirtilen alanın üzerindeki değeri verir. Tüm crm alanlar için geçerlidir 

Örnek Kullanım 

Xrm.Page.getAttribute(alan_adı).getValue()

Value - setValue

Form üzerinde belirtilen alana değer ataması yapmamıza yarar. Lookup nesnesi haricinde olan alanlar için geçerlidir. 

Örnek Kullanım 

Xrm.Page.getAttribute(alan_adı).setValue()

Set Lookup Attribute Value

Form üzerinde bulunan lookup nesnelerine değer atamak için aşağıdaki function kullanılır. 

function setSimpleLookupValue(LookupId, Type, Id, Name) {
var lookupReference = [];
lookupReference[0] = {};
lookupReference[0].id = Id;
lookupReference[0].entityType = Type;
lookupReference[0].name = Name;
Xrm.Page.getAttribute(LookupId).setValue(lookupReference);
}