Bazı ERP uygulamalarının veritabanlarında, spesifik amaçlar için yazılmış SQL fonksiyonları var. Örneğin Türkiye’de sık kullanılan ERP’lerden birinde sıklıkla karşıma çıkan bir Türkçe karakter sorunu var. Power Query ile veritabanına doğrudan bağlantı yaptığınızda text tipindeki sütunların değerlerinde “i,ş,ü,ğ” gibi karakterler varsa “bozuk” çıkıyor.
İlgili ERP uygulaması, bunu veritabanına bir SQL scalar fonksiyon ekleyerek çözmüş.
Fonksiyonun tek amacı, bu “bozuk” Türkçe karakterleri “düzgün” göstermek!
Eğer herhangi bir text sütuna bu fonksiyonu kullanmadan SELECT çekerseniz karakter sorunu devam ediyor. Misal, “İZMİR” olması gerektiği gibi gözükmüyor!
Ama fonksiyonu kullanarak SELECT çektiğinizde sorun düzeliyor!
SQL ile çalışırken SQL View’larını kullanmak ve veri kaynağı olarak bu view’lardan veri çekmek önerilen bir “best practice”. Peki bunu view’la değil de sadece Power Query’yi kullanarak yapmak istesek nasıl yapacağız?
Birkaç opsiyonumuz var:
Birincisi bu sorguyu bir SQL statement olarak veritabanına bağlanırken kullanabiliriz.
Fakat bunu yaparsakta şöyle bir teknik durumla karşılaşıyoruz: Sorguyla birlikte ne aldıysak aldık, ondan sonra Power Query tarafındaki bütün stepler’de –stepin kendisi normalde desteklese bile– query folding’ten faydalanamıyoruz!
Bunu çözmenin de bir yolu var! SELECT cümlesini Value.NativeQuery fonksiyonu ile birlikte kullanmak! Linkteki yazıya bir göz atarsanız query folding’i destekleyecek şekilde SQL statement nasıl yazabiliriz anlatıyor! (Bu konuyu ayrı bir yazı olarak bloga ekleyeceğim.)
Bu yazının asıl konusu ise mevcut SQL scalar fonksiyonu Power Query ile nasıl kullanabiliriz!
…
Herhangi bir SQL veritabanına bağlandığımızda Power Query’nin bize gösterdiği listede genelde üç farklı yapı var:
- Veritabanındaki tablolar
- Veritabanındaki view’lar
- Veritabanındaki SQL fonksiyonlar!
Bu ERP uygulamasına bağlanırken lazım olan tablolarla birlikte bu fonksiyona da bağlanıyorum!
Bu şekilde fonksiyonu da aldığımızda Power Query fonksiyonu hemen çalıştırıyor: Yani “invoke” ediyor.
Bu step’i siliyorum!
Bu örnekteki fonksiyonun çalışma mantığı belli: Text bir değerdeki “bozuk” gözüken karakterleri düzeltmek, dolayısıyla parametre olarak text bir değer istiyor.
Sonraki aşamada, diğer sorgudaki Türkçe karakter sorunu olan sütunu seçiyorum. Sonrada sırasıyla Add Column → Invoke Custom Function ve fonksiyonu çağırıyorum.
Bu işlemi tamamladığımda yeni bir sütun oluşuyor, ama bu sefer Türkçe karakter sorunu yok!
Peki bu aşamadan sonra query folding çalışıyor mu bakalım:
Çalışmıyor gözüküyor! Ama bu tamamen fonksiyonun nasıl yazıldığıyla ilgili! Power Query ile denediğim diğer SQL fonksiyonlarının çoğu query folding’i destekliyor.
Desteklemeyen bir fonksiyon çağırdıysanız bu stepi en sonlara bırakırsanız refresh süresini fazla uzatmadan fonksiyondan faydalanmış olursunuz.