MS CRM Gelişmiş Bul Sorgularının Sql Scripti

Aşağıdaki gelişmiş  bul sorgu muzun kullandığı sql sorgusunu bulalım.


Gelişmiş Bul Sorgusu

Sağ üst taraftaki kişilere ver butonuna tıklayalım.

Gelişmiş Bul Sorgusu Excel Export

Açılan ekranda dinamik çalışma sayfasını seçiyoruz ve ileriyi seçip istediğimiz alanları seçip ver diyoruz.

Dinamik Çalışma Sayfası

İndirdiğimiz xml dosyasını herhangi bir text editor ile açıyoruz ve  tagları arasında kalan kısımı alıyoruz. İşte bizim sql sorgumuz:

Not: İsterseniz xml dosyasının uzantısı excel dosyası uzantısına çevirip ile excel dökümanından da sql sorgusuna ulaşabilirsiniz. Bunun için excel dosyasını açıp Data>Connection>Properties>Detail>Query yolunu takip etmelisiniz.

ELMAH ile hata yakalama/loglama

ELMAH nedir ? ELMAH ile neler yapılabilir?

  • ELMAH (Error Logging Modules and Handlers)  ASP.NET web uygulamaları için hata loglama ve yönetimi kütüphanesidir
  • ELMAH ile exceptionları yakalayıp loglayabilirsiniz.
  • ELMAH ile bütün hataların loglarını tek bir websayfa üzerinden görüntüleyebilirsiniz.
    Örnek:
  • ELMAH ile loglanmış herhangi bir hatanın ayrıntılarını gene tek bir websayfası üzerinden görüntüleyebilirsiniz.
  • ELMAH ile web sayfanızda oluşan hataların oluşma anında mail atılmasını sağlayabilirsiniz.

ÖZELLİKLER:

  • Tüm hata loglarını gerek filtrelemek gerekse Microsoft Excel’ de analiz etmek için CSV olarak kaydedebilirsiniz.
  • Iphone, Ipad veya Custom uygulamanıza notification/tweet gönderilmesini sağlayabilirsiniz.
  • ObjectDataSource ile birlikte ErrorLogDataSourceAdapter kullanarak kendi özel hata log sayfanızı oluşturabilirsiniz.
    Örnek:
  • Hata logunuzu JSON/XML biçiminde alabilirsiniz.
Örnek:
  • Visual Studio kullanarak Web Projesi oluşturuyoruz(Web Forms, Asp.Net MVC2,3,4 farketmiyor)
  • Web projemize sağ tıklayıp Manage Nuget Packages diyoruz. (Nuget Package Manager hakkında daha fazla bilgi almak için şu başlığı inceliyebilirsiniz)
  • Buradan ELMAH yazıyoruz. Yazdığımız gibi karşımıza çıkıyor.
  • Install diyerek ELMAH dll ini projemize ekliyoruz.
  • Projemizi çalıştırıp URL adresine localhost/elmah.axd yazarak ELMAH hata mesajlarına erişebiliyoruz.

Daha fazla ayrıntı ve indirme adresi için tıklayınız.
Örnek web.config dosyası için tıklayınız.
Client Side javascript hatalarını yakalamak için şu başlığı inceliyebilirsiniz.
Detaylı olarak elmahı projenizde nasıl kullanabilirsiniz öğrenmek şu başlığı inceliyebilirsiniz.

Not: Asp.NET 1x, ve Asp.NET 2′ yi destekler.
Not: Logların veritabanına kaydedilmesi için web config ayarlarının yapılması gerekmektedir.

Swagger ile Restfull API Dökümantasyonu

Swagger için, restfull apilerimizi dökümante edebileceğimiz son zamanlarda standart haline gelmiş bir kütüphane diyebiliriz. Java,.net, node.js, php, python, ruby gibi birçok yazılım diline frameworku bulunmakta. Ben burada asp.net web api için oluşturulmuş(node.js versiyonu daha sonra) Swagger.net ‘i anlatacağım. Öncelikle Visual Studiomuzu açıp yeni asp.net mvc4 projesi diyelim ve açılan pencereden web api seçeneğini seçelim. 

Visual Studio bizim için varsayılan bir web api projesi oluşturdu. Solution Explorer dan controllerlarımızın olduğu Controllers klasörüne baktığımız zaman 2 adet (HomeController.cs ve ValuesController.cs) controller olduğunu görüyoruz.

Bunlardan ValuesController sınıfını açtığımız zaman sınıfımızın ApiController isimli classdan inherit ettiğini görüyoruz.

Bunun anlamı ValuesController sınıfı web apimiz için metodlar yazacağımız sınıfımız olduğu(Eğer istersek kendimiz controller oluşturup ApiController sınıfından inherit etmesini sağlayabilirdik).

Dikkat edersek metodların üzerinde yorum satırları olduğunu görürüz. İşte Swaggerın bize sunacağı dökümantasyon kütüphanesi bu yorum satırlarından oluşuyor.

Projemize swagger kütüphanesini nuget paket yöneticisini kullanarak ekleyebiliriz. Öncelikle nuget package manager consoluna Install-Package Swagger.Net  yazalım ve Swagger.Net in kütüphanesini projemize ekleyelim.

Artık ValuesController sınıfımızda web api metodlarımızın üzerine yazdığımız yorum satırlarına swaggerın sunduğu api üzerinden erişebiliriz. Ama önce projemizi derleyip çalıştıralım. Aşağıdaki hata ile karşılaşmamız normal çünkü gereken bazı ayarları yapmadık.

Hatada da yazdığı gibi swaggerın çalışabilmesi için projemize sağ tıklayıp Properties >Build ‘ e geliyoruz .

Buradan XML documentation file seçeneğini işaretliyoruz(varsayılan olarak işaretsiz geliyor) ve dökümantasyon dosyamızın nereye kaydedileceğini seçiyoruz. Default değerde bırakıyoruz( Eğer custom bir yol belirlemişsek çalışmayacak. Çalışması için  AppStart/SwaggerNet.cs dosyasını düzenlememiz gerekiyor)

Şimdi projemizi derleyip çalıştıralım ve Url adresine http://localhost:xxxxx/api/swagger girelim. Karşımıza json formatında bazı bilgiler çıkacaktır.


Aslında bu gördüğümüz bilgiler Swagger kütüphanesinin bize sunduğu dökümantasyon bilgilerimiz. Ama dikkat edersek description kısmında ” No Documentation Found” diyor. Yani dökümantasyon bulunamadı. Bunun sebebi swaggerın metodun üzerine yazdığınız dökümantasyon commentlerinin formatını öyle kafanıza göre veremiyor olmanız. Yazılım dünyasında genel olarak kabul gören dökümantasyon formatlarını kullanmalısınız  ki swagger bunu net birşekilde algılayıp parametre yollamanıza olanak sağlasın(Parametre olayı ileride işlenecek). O zaman biraz dökümantasyon yapalım.

        

///         public IEnumerable Get()         {             return new string[] { “value1”, “value2” };         }         ///
/// Get a single Value by it’s id         ///

///         ///         public string Get(int id)         {             return “value”;         }         ///
/// Post api/values         ///

///         ///         public void Post([FromBody]string value)         {         }         ///
/// Put api/values         ///

///         ///         ///         public void Put(int id, [FromBody]string value)         {         }         ///
/// Remove a Value by it’s id         ///

///         public void Delete(int id)         {         }

Metodlarımızı dökümante ettikten sonra swagger apisini çağırdığımızda bize vereceği veri aşağıdaki gibi oluyor.

{“apiVersion”:”4.0.0.0″,”swaggerVersion”:”2.0″,”basePath”:”http://localhost:59501″,”resourcePath”:null,”apis”:[{“path”:”/api/docs/Values”,”description”:”Get all of the values.”,”operations”:[]}]}

Şimdi ikinci kullanacağımız araç swagger-ui . Bu kütüphane swagger apide bize dönen değerleri güzel bir arayüzde bize sunup dökümante ettiğimiz metodları test edebilmemize ve dökümanteyi görebilmemize olanak sağlayan bir UI. Bunuda Nuget yardımıyla projemize ekliyoruz. Package Manager Consolumuza Install-Package Swagger.Net.UI yazıyoruz ve enter a basıyoruz. Gerisini nuget halledecek ve projemize ekleyecektir.


Dikkat eder isek projemize SwaggerUi diye bir klasör ekledi. Bu klasörün içerisinde swagger apisinden dönen değerleri bize sunan arayüz, html ve js ler bunlunmakta.

Projemizi derleyip çalıştırıyoruz. Ve url adresimize http://localhost:xxxxx/swaggerui/ yazıyoruz. Karşımıza gelen ekran SwaggerUi ‘ın ana ekranı.


Burada dikkat edersek http://YOUR-URL-HERE:PORT/api/swagger diye bir url yazıyor. Bu url adresi bizim swagger apimizin url i (swagger ui kurmadan önce bize json formatında veri veren api).
Oraya kendi swagger apimizin adresini giriyoruz ve explorer butonuna basıyoruz.

Farkettiyseniz bizim Values isimli web apimiz geldi. Hemen üzerine tıklıyoruz.

Gördüğünüz gibi Values isimli web api sınıfımızın içindeki tüm metodlar ve dökümantemiz geldi.(Yorumlarımız sağda gözüküyor). Şimdi ilk olarak /api/Values isimli metodumuzu temsil eden get metodumuza tıklayalım.

Try it out isimli buton karşımıza geldi. Tıklayalım.

Evet metodumuz çalıştı ve veriyi json formatında gönderdi. Bu şekilde restfull metodlarınıda SwaggerUi üzerinden test edebiliyoruz. Peki ya parametre göndermek istersek o zaman nasıl yapacağız? Aşağıdaki gibi…

Örnek Projenin Github Adresi:https://github.com/fuattatar/swaggernet.git

Kaynak:
https://github.com/Swagger-Net/Swagger.Net
https://github.com/wordnik/swagger-spec
http://swagger.io/
https://www.nuget.org/packages/Swagger.Net.UI/

MS CRM 4.0 ekler için dosya boyutu sınırını değiştirmek

CRM 4.0 ekler için dosya boyutu sınırını değiştirmek:

1. Web.config dosyasını açıyoruz (C:InetpubCRMweb.config).

2.    elementi içerisini aşağıdaki gibi değiştiriyoruz (10240 i istediğimiz şekilde değiştirebiliriz)

3. web.config dosyamızı kaydediyoruz.

4. Tarayıcıdan Crm’ i açıyoruz.

5. Ayarlar | Yönetim| Sistem Ayarları kısmına giriyoruz.

6. E-posta sekmesine tıklıyoruz.

7.Maiksimum dosya boyutu kısmını (kilobytes) 10240 yapıyoruz.

9.Tamam butonuna basıp kapatıyoruz.

10. Sonrada IIS i yeniden başlatıyoruz. .

CRM 4.0 Menü ve Kontrolleri Özelleştirme

MS CRM 4.0′ da menü ve kontrolleri 2 yöntem ile özelleştirebiliyoruz:

  • Site Map
  • ISV.Config
Not: Her iki yöntemde de XML yapısını kullanacağımızdan XML ile ilgili temel bilgileri edinmiş olmanız gerekiyor. Eğer XML hakkında daha fazla bilgi edinmek istiyorsanız şuradaki adrese bakmakta fayda var.

Site Map (Site Haritası)

Site haritaları Ms Crm’de her alanda gösterilecek olan nesnelerin yazıldığı xml dosyasıdır. Örneğin çalışma alanındaysanız(workplace area) sol tarafta aktiviteler(activities), takvim(calendar) gibi seçenekler görürsünüz. Bu seçenekler varlıklara(entities) kısa yoldan erişmemizi sağlayan kısayollardır.
Özelleştirmeleri Ver
Özelleştirmeleri Ver
Site haritalarını düzenlemek için öncelikle dışa aktarmalıyız(export). Bunun için ayarlar(setting)>özelleştirme(customization)>export customization’dan sitemap seçilip özelleştirmeleri ver denir. Daha sonra değişikliğimizi yapıp sisteme tekrardan yüklemeliyiz. Site haritasının içerdiği xml’in yapısı aşağıdaki gibidir:
SiteMap: En üst seviyedeki xml etiketidir. Aynı isimde area’ları içeren bir etiket içerebilir.
Area: Her alan(area)’ın kendine has navigasyon butonları bulunur. Varsayılan olarak Site Haritası(SiteMap) 6 tane alan(area) ile beraber gelir. Bunlar:
  • Çalışma Alanı(Workplace)
  • Satış(Sales)
  • Pazarlama(Marketing)
  • Servis(Service)
  • Ayarlar(Setting)
  • Kaynak Merkezi(Resource Center)
Aşağıda Çalışma alanı(Workplace) için varsayılan xml attributeları ve değerleri verilmiştir.
Not: ResourceId ve DescriptionResourceId yerine Title kullanabiliriz.
Bu Attributelardan:
  • Id: Alanın benzersiz tanımlayıcısı.
  • ResourceId: Resource id.(Internal)
  • ShowGroups: Eğer alan birden fazla gurup içeriyor ise zorunludur.
  • Icon: Görsel url adresi.
  • DescriptionResourceId.(Internal)
Group: Alanların içerdiği gurupları ifade eder. Bir veya birden fazla olabilir.

SubArea: Herhangi bir sayfaya veya web adresine gitmek için kullandığımız adrestir.

ISV.Config

ISV.Config dosyası toolbar’a kontrol ekleyebildiğiniz crm’e ekstra özellikler katabilmek için kullandığımız xml dosyasıdır. Varlıklara veya web uygulamalarına hızlı bir şekilde erişmemizi sağlayan kısayollar oluşturabildiğimiz  site haritalarının aksine crm varlıklarından olmayan bir web uygulaması veya 3.parti bir yazılıma erişmemizi sağlayan, kısayollar oluşturmamızı sağlayan xml dosyasıdır. Site haritasındaki gibi önce export edilmeli gerekli değişiklik yapıldıktan sonra tekrar import edilmelidir.

Isv.Config dosyası varsayılan olarak kapalıdır. Xml dosyasındaki değişikliklerin crm’e yansıması için isv.config dosyasının aktif edilmesi gerekir. Bunu:
Ayarlar>Yönetim>Sistem  Ayarları>Özelleştirme tabından  yapabilirsiniz.

Sistem Ayarları

ISV.Config dosyasının içerdiği xml’in yapısı aşağıdaki gibidir:

IsvConfig: sadece etiketini içerebilir. En üst seviyedeki etikettir.
configuration: Versiyon numarasını içerir. Örneğin:
root: Global menü ve toolbar’ları içerir. Örneğin:

           

 

Button: Buton oluşturmamızı sağlayan etikettir. Aşağıdaki etiketleri kapsayabilir:

Buton elementi aşağıdaki attribute’lara sahip olabilir:

  • Client: Bu attribute butonumuzun hangi client uygulamasında görüntüleneceğini belirtir. 2 seçenek vardır. Outlook, web.
  • AccessKey: Butonumuzu faremiz ile değilde klavyemizden tetiklemek için oluşturacağımız kısayoldur. Tek 1 harf alabilir. Alt +{seçtiğiniz harf} şeklinde çalışır. (Alt kısayolu değiştirilemez)
  • AvalibleOffline: Bu attribute outlookta offline çalıştığımız zaman butonumuzun görünüp görünmeyeceğini belirtir.
  • Icon: Bu attribute butonumuzun üzerinde görüntülecek resmi belirtir. (Icon dosyası gif olmalıdır. 16×16 8-bit (256) web için, 16×16 veya 32×32 outlook için)
  • Javascript: Bu attribute butona tıklandıktan sonra çalışacak javascript i belirler. Örneğin:
  • PassParams: O anki varlığın url’ine parametre ekler.
  • Url: Url adresi. Eğer javascript attribute’unda değer varsa bu attribute işlemez.
  • ValidForCreate: Eğer buton bir varlık içerisine konulmuş ise o varlıktan yeni bir kayıt oluşturulduğunda butonun gösterilip gösterilmeyeceğini belirler.
  • ValidForUpdate:  Eğer buton bir varlık içerisine konulmuş ise o varlıktan bir kayıt güncelleniyorsa butonun gösterilip gösterilmeyeceğini belirler.
  • WinMode:
    • 0=Window: Url’i içeren yeni pencere açar.
    • 1=Modal Dialog Box: Yeni pencere açar(kutu şeklinde) ve opencereyi kapatmadan önceki sayfada işlem yapamayız.
    • 2=Modeless Dialog Box: Yeni pencere açar(kutu şeklinde). İstersek kapatmadan önceki sayfaya dönüp işlem yapabiliriz.
  • WinParams: Açılacak olan dialog box’ın boyutunu, yerini ve rengini gibi özelliklerini parametre olarak yollayabileceğimiz parametre. Örneğin:

 Entities: Her varlığın kendi menü ve toolbarı mevcuttur. Ondan dolayı eğer biz varlığa menü ve toolbar itemi eklemek istiyor ise isv.config dosyasında bu varlığı belirtmek zorundayız. Örneğin:

Not: Title daki LCID kodu dil kodudur. 1055 türkçe dil kodudur.

MongoDB’ yi windows servisi olarak başlatmak

Herseferinde mongodb’yi herseferinde konsoldan başlatmak zahmetli ve zaman alan bir olay. Bunun için mongodb’yi nasıl windows servisi olarak başlatırız ona bakalım. Öncelikle daha önce mongodb’yi servis olarak kaydettiysek onu siliyoruz:

C:mongodbbin>mongod –remove


Not:mongodb dosyalarını c’de mongodb klasörüne attığınızı varsayıyorum.
Daha sonra ise aşağıdaki kodu konsolumuza yazıyoruz:

 

C:mongodbbinmongod –dbpath=C:datadb –logpath=C:mongodblog.txt –install


Not:burada dbpath’e dikkat etmeliyiz. Datalarımızı nerede saklıyorsak oranın adresini vermemiz gerekli.
En son olarakta konsola services.msc yazarak servislerimizin bulunduğu pencereyi açıyoruz ve Mongodb servisini bulup başlat diyoruz. İşte bu kadar. Artık mongodb otomatikmen servis olarak başlatılacak.

Node.js için faydalı modüller: Nodemon ile web server’ı otomatik yeniden başlatma

Node.js kullanırken en büyük sıkıntılardan biri de değişikliklerin aktif olması için server’ı sürekli yeniden başlatmak zorunda kalmamızdı. İşte nodemon bizi bu sıkıntıdan kurtaran bir modül. Klasörlerimizi izleyip bir değişiklik gördüğü anda kendisi otomatik olarak server’ımızı yeniden başlatıyor bizi manual olarak yeniden başlatma derdinden kurtarıyor. Benim de sürekli kullandığım vazgeçilmez modüllerden 😀  Github adresi için tıklayınız. Öncelikle kurmak için node konsoluna:

-npm install nodemon  

yazmamız yeterli . Daha sonra server’ımızı node app.js ile değil de
-nodemon app.js ile başlatmamız yeterli. Nodemon artık uygulamamızı izleyecek ve herhangi bir dosyada bir değişiklik gördüğünde otomatik olarak server’ımızı yeniden başlatacaktır.

Regular Expression Debugger ile Regex patternlerinizi debug edin

Her yazılımcının olmassa olmazı Regular Expression. İster küçük bir regex isterseniz kompleks bir regex patterni kullanıyor olun. Patterninizi test/debug etmenize  yarayan gerçek zamanlı bu siteye buradan erişebilirsiniz.
Siteye girdiğiniz zaman aşağıdaki gibi bir ekran ile karşılaşacaksınız.

Sol taraftan Javascript’ i seçip  “REGULAR EXPRESSION”  kısmına istediğimiz regex patternini “TEST STRING” kısmına ise test etmek istediğimiz stringi yazıyoruz. Ve web uygulaması gerçek zamanlı olarak patternimizi debug edip test stringi üzerinde sonucu gösteriyor. Sağ taraftaki “EXPLANATION” kısmında ise patternimizin tek tek ne işe yaradığını gösteriyor.

Site Adresi: http://regex101.com/

Mssql pivot table kullanımı.

Karşılaştığım sorgularda fark ettiğim olay pivot kullanılmaması. Örnek olması açısından paylaşmak istedim. Aşağıda aynı sonucu veren 2 tane query var biri pivot kullanılarak biride kullanılmayarak hazırlanmış. Sonuçlar aynı tatbikî. Ama pivot kullanmadan aşağıdaki sonucu almak için iki kat fazla sorgu yazılmış. Geri dönüp bakıldığında anlaşılması çok zorlaşıyor.  Örnekte adventurework veri tabanı kullandım.
Sonuç:
 
Pivot Kullanılmadan
SELECT Table1.ShiftName
      ,SUM(Table1.Production) AS Production
      ,SUM(Table1.Engineering) AS Engineering
      ,SUM(Table1.Marketing) AS Marketing
FROM (
      SELECT S.NAME AS ShiftName
            ,COUNT(H.BusinessEntityID) AS Production
            ,0 ASEngineering
            ,0 AS Marketing
      FROM HumanResources.EmployeeDepartmentHistory H
      INNER JOINHumanResources.Department D
            ON H.DepartmentID = D.DepartmentID
      INNER JOINHumanResources.Shift S
            ON H.ShiftID = S.ShiftID
      WHERE H.EndDate IS NULL
            AND D.NAME = ‘Production’
      GROUP BY S.NAME
     
      UNION ALL
     
      SELECT S.NAME AS ShiftName
            ,0 ASProduction
            ,COUNT(H.BusinessEntityID) AS Engineering
            ,0 AS Marketing
      FROM HumanResources.EmployeeDepartmentHistory H
      INNER JOINHumanResources.Department D
            ON H.DepartmentID = D.DepartmentID
      INNER JOINHumanResources.Shift S
            ON H.ShiftID = S.ShiftID
      WHERE H.EndDate IS NULL
            AND D.NAME = ‘Engineering’
      GROUP BY S.NAME
     
      UNION ALL
     
      SELECT S.NAME AS ShiftName
            ,0 ASProduction
            ,0 ASEngineering
            ,COUNT(H.BusinessEntityID) AS Marketing
      FROM HumanResources.EmployeeDepartmentHistory H
      INNER JOINHumanResources.Department D
            ON H.DepartmentID = D.DepartmentID
      INNER JOINHumanResources.Shift S
            ON H.ShiftID = S.ShiftID
      WHERE H.EndDate IS NULL
            AND D.NAME = ‘Marketing’
      GROUP BY S.NAME
      ) Table1
GROUP BY Table1.ShiftName
Pivot kullanılarak
SELECT * FROM (SELECT S.NAME AS ShiftName
      ,H.BusinessEntityID
      ,D.NAME DepartmentName
FROM HumanResources.EmployeeDepartmentHistory H
INNER JOIN HumanResources.Department D
      ON H.DepartmentID = D.DepartmentID
INNER JOIN HumanResources.Shift S
      ON H.ShiftID = S.ShiftID
WHERE H.EndDate IS NULL
      AND D.NAME IN (
            ‘Production’
            ,‘Engineering’
            ,‘Marketing’
            )
)AS a
PIVOT
(
COUNT(BusinessEntityID)
FOR DepartmentName IN ([Production],[Engineering],[Marketing])
)AS b

Node.js uygulama yapınızı geliştirin

Stackoverflow’da node.js başlıklarını gezerken karşılaştığım. Sürekli node.js ile ilgili sorularıma sabırla cevap veren Peter Lyons’dan express projenizi nasıl profösyönel olarak yapılandıracağınıza dair tavsiyeler. Kesinlikle okunması gerekiyor. Hele ki benim gibi node.js dünyasına yeni adım attıysanız.Projesini Github’a atmış birde arkadaş
Stackoverflow Adresi
Github adresi