MicroStrategy Command Manager Script’lerini C# ile Tetiklemek

03.10.2017 / Emir Bora Turan

Merhaba,

Bugün iş hayatımızda sıklıkla başımıza gelebilecek bazı istenmeyen olayları engellemek adına MicroStrategy Command Manager Script’lerini kullanarak nasıl önlem alabileceğimizi anlatmaya çalışacağım. Aslında konuyu bir senaryo üzerinden incelemek daha net anlamamızı sağlayacak.

Gece kaynak sistemden ETL ile SQL tarafına akan günlük satış sipariş verilerimiz var ve ETL tamamlandıktan sonra veri MicroStrategy tarafında Intelligent Cube’lere alınıyor ve gece tüm bu süreç tamamlandıktan sonra sabah 08.30’da üst yönetime MicroStrategy’den günlük satış sipariş verilerini içeren kritik mailler gönderiliyor.

Kritik olan konu burada ne dediğinizi duyar gibiyim. O zaman sorunuza kısaca yanıt verelim. Eğer kaynak sistemden gelen veriler yanlışsa ya da gece sistemlerde bir kesinti yaşanmışsa ve akabinde yönetime eksik veri içeren mailler giderse bununla ilgili sıkıntılar yaşamanız kaçınılmaz olacaktır.

Burada işte yapmamız gereken şey verinin kaynak sistemden yanlış gelip gelmediğini anlamak ve eğer etl job adımlarınızı log tablonuzda tutuyorsanız joblarınızın düzgün çalışıp çalışmadığını loglardan kontrol etmektir.

Teori kısmını geçip hemen işi pratiğe dökelim. Bunun için bir tane C# Console uygulaması yazacağız. Bu uygulama ile hem kaynak sistemden gelen verileri ve hem de bizim ETL joblarımızın doğru çalışıp çalışmadığını log tablosuna bakarak kontrol edeceğiz. Eğer kaynak sistemden gelen verilerde veya joblarımızda bir problem varsa üst yönetime mail gitmeden önce sql tablolarındaki verileri silip MicroStrategy Intelligent küplerini boş olarak güncelleyeceğiz. Böylece küplerin içinde boş veri olduğunda MicroStrategy mail göndermeyecektir. MicroStrategy ayarlarında veri yoksa mail gönderme şeklinde bir seçenek bulunmaktadır. Biz de tam olarak bunu kullanacacağız.

Deliveries - Error Handling

Deliveries – Error Handling

Peki tüm bunları nasıl yapacağız?

Bunun için yemekte (C# Console Application) kullanacağımız malzemeler:

  • 1 Adet MicroStrategy Command Manager Script
  • 1 Adet ETL Log Tablosu
  • 1 Adet Kaynaktan Akan Ham Verinin Tutulduğu Tablo
  • 1 Adet Sunucuda Tanımlı Mail Hesabı

C# uygulamamızda her bir bölümün ne iş yaptığını kod içinde yorumlarda belirttim. Beyninizin yanmasını istemiyorsanız kod içideki yorumları okumanızı şiddetle salık veririm xD


using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Linq;
using System.Net.Mail;
using System.Text;

namespace SE_DATA_CHECK
{
class Program
{
static void Main(string[] args)
{
try
{
//Dünün tarihini DD.MM.YYYY formatında verir.
string bir_gun_onceki_tarih = DateTime.Now.AddDays(-1).ToShortDateString();

//Bugünün tarihini DD.MM.YYYY formatında verir.
string bugunku_log_tarih = DateTime.Now.AddDays(0).ToShortDateString();

//Bugünkü tarihin gün ismini İngilizce olarak verir.
string gun = System.DateTime.Now.DayOfWeek.ToString();

//scp uzantılı dosyamızda bulundan MicroStrategy Command Manager scriptlerimizi çalıştırmak için aşağıdaki yapıyı kullanıyoruz.
//Bu yapıyı daha sonra cmdmgr.exe üzerinden çalıştırarak scriptlerimiz içinde bulunan trigger’ları tetikleyeceğiz.
//Trigger’lar da kendilerine bağlı olan MicroStrategy Intelligent Cube’leri çalıştıracak.
string cmd = “-n \”YOUR_MSTR_SERVER_NAME\” -u YOUR_MSTR_USERNAME -p YOUR_MSTR_PASSWORD -f \”E:\\JOBS\\SE_DATA_CHECK.scp\” -o \”E:\\JOBS\\SE_DATA_CHECK.out\””;

//Kaynak sistemden bize akan verilerden günlük satış sipariş verilerini alıyoruz.
DataTable DEGER = GetDataTable(“SELECT ISNULL(SUM(ISNULL(Net_Sales, 0)) / 1000,0) AS SALES_DEGER,ISNULL(SUM(ISNULL(Order_Amount, 0)) / 1000,0) AS ORDER_DEGER FROM SATSIP_DAILY WHERE Calendar_Day_DESC='” + bir_gun_onceki_tarih + “‘”);

//Bugün içinde oluşan log kayıtlarının sayısını öğreniyoruz. Eğer 8 kayıt oluşmuşsa başarılı demektir.
//8’in altında bir kayıt varsa job patlamıştır.
DataTable LOG = GetDataTable(“SELECT COUNT(*) AS LOG_DEGER FROM DW_LOG WHERE CONVERT(VARCHAR,LOG_DATE,104)='” + bugunku_log_tarih + “‘”);

//Bu kısım cmdmgr.exe (MicroStrategy Commang Manager) uygulamasını Command Prompt üzerinde çalıştırmak için gereklidir.
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = “cmdmgr.exe”;
startInfo.Arguments = cmd;
process.StartInfo = startInfo;

//Ham verilerin olduğu tablolardan sorguladığımız satış ve sipariş değerlerini double veri tipine,
//log sayısını ise int veri tipine çeviriyoruz.
double SALES_DEGER = Convert.ToDouble(DEGER.Rows[0][“SALES_DEGER”]);
double ORDER_DEGER = Convert.ToDouble(DEGER.Rows[0][“ORDER_DEGER”]);
int LOG_DEGER = Convert.ToInt32(LOG.Rows[0][“LOG_DEGER”]);

//Pazartesi dışındaki günlerde BW verileri ve MSTR log kayıtları beraber kontrol ediliyor.
if (gun != “Monday”)
{
//Eğer gün içinde oluşan log sayısı 8’den küçükse veya satış değeri 0 ile 1 arasındaysa
//veya sipariş değeri 0 ile 1 arasındaysa veya satış değeri 0’dan küçükse veya sipariş değeri 0’dan küçükse;
//MSTR küplerinin baktığı FACT_SATSIP_DAILY tablosundaki verileri sil ve MSTR scriptini process.Start() ile çalıştır.
//Script MSTR’da tanımlı trigger’ları tetikleyecek ve bu trigger’a bağlı MSTR küpleri de FACT_SATSIP_DAILY tablosu ile boş güncellenecek.
//Ardından ilgili sistem yöneticilerine bilgilendirme maili gönderilecek.
//Uygulamayı sonlandır.
if ((LOG_DEGER < 8) || (SALES_DEGER >= 0 && SALES_DEGER <= 1) || (ORDER_DEGER >= 0 && ORDER_DEGER <= 1) || (SALES_DEGER < 0) || (ORDER_DEGER < 0)) { SqlCommand TruncateCommand = new SqlCommand("TRUNCATE TABLE FACT_SATSIP_DAILY", Connection()); TruncateCommand.ExecuteNonQuery(); process.Start(); SendMail("YOUR_MAIL_ADDRESS", "YOUR_MAIL_ADDRESS", "YOUR_SUBJECT", "YOUR_MESSAGE"); Environment.Exit(0); } } //Pazartesi günlerinde sadece MSTR log kayıtları kontrol ediliyor. else { //Eğer gün içinde oluşan log sayısı 8'den küçükse; //MSTR küplerinin baktığı FACT_SATSIP_DAILY tablosundaki verileri sil ve MSTR scriptini process.Start() ile çalıştır. //Script MSTR'da tanımlı trigger'ları tetikleyecek ve bu trigger'a bağlı MSTR küpleri de FACT_SATSIP_DAILY tablosu ile boş güncellenecek. //Ardından ilgili sistem yöneticilerine bilgilendirme maili gönderilecek. //Uygulamayı sonlandır. if (LOG_DEGER < 8) { SqlCommand TruncateCommand = new SqlCommand("TRUNCATE TABLE FACT_SATSIP_DAILY", Connection()); TruncateCommand.ExecuteNonQuery(); process.Start(); SendMail("YOUR_MAIL_ADDRESS", "YOUR_MAIL_ADDRESS", "YOUR_SUBJECT", "YOUR_MESSAGE"); Environment.Exit(0); } } } //Uygulamamızda herhangi bir hata oluştuğunda yetkili kişiler mail ile bilgilendirilecektir. catch (Exception ex) { SendMail("YOUR_MAIL_ADDRESS", "YOUR_MAIL_ADDRESS", "YOUR_SUBJECT", ex.Message); Environment.Exit(0); } //Uygulama başarıyla çalışsa bile yetkili kişiler mail ile bilgilendirilecektir. finally { SendMail("YOUR_MAIL_ADDRESS", "YOUR_MAIL_ADDRESS", "YOUR_SUBJECT", "YOUR_MESSAGE"); Environment.Exit(0); } } //SQL Server tanımlarımızı burada yapıyoruz. //Bu fonksiyon bizi ilgili SQL Server sunucusuna bağlayacak ve erişim izni sağlayacaktır. public static SqlConnection Connection() { SqlConnection con = new SqlConnection(@"Server=SQL_ADDRESS; Database=DB_NAME; User ID=SQL_USERNAME; Password=SQL_PASSWORD; Connection Timeout=0; Max Pool Size=500"); con.Open(); return con; } //GetDataTable fonksiyonumuza bir sql query yolladığımızda sonucu bize datatable olarak dönüyor. //Sonrasında datatable'dan aldığımız sonuçla istediğimiz gibi oynayabiliriz. public static DataTable GetDataTable(string sql) { DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter(sql, Connection()); da.Fill(dt); Connection().Close(); da.Dispose(); return dt; } //Mail göndermek için aşağıdaki SendMail fonksiyonunu kullanıyoruz. //Bu fonksiyonun aldığı değerler kimden,kime,konu,mesaj. //Eğer kendi ağınızda kullanacaksınız SMTP adresini girmeniz yeterli olacaktır. //Mail göndermeye yetkiniz yoksa IT ekibinizden yetki almanız gerekebilir. public static void SendMail(string from, string to, string subject, string message) { MailMessage mail = new MailMessage(); mail.From = new MailAddress(from); mail.To.Add(to); mail.Subject = subject; string link = @"“;
mail.Body = @”;Sayın Yetkili,

” + message + ”

Bilginize,

” + link + ”

 

Bu kodla hem sql’e sorgu atabilecek hem de gelen sonuçlara göre belli koşullarda MicroStrategy Command Manager scriptlerinizi çalıştırabileceksiniz.

Siz burada if koşullarını istediğiniz gibi kendinize göre özelleştirebilirsiniz.

Bu kodu T-SQL ile de yazabilirdik ancak SQL Server ile MicroStrategy Command Manager aynı sunucu üzerinde bulunmak zorunda olduklarından böyle yapmadık.

Bu senaryoda SQL Server ve MicroStrategy farklı sunucularda olduğundan C# Console uygulaması yazmayı tercih ettik.

Console Uygulaması & MicroStrategy Script

Kodunuzu Visual Studio’da hatasız bir şekilde derledikten sonra Görev Zamanlayıcı’sında günlük görevler oluşturabilirsiniz.

Görev Zamanlayıcısı

Görev Zamanlayıcısı

Özetle yukarıdaki koşullarınıza göre herhangi bir sorun oluştuğunda MSTR küpleri boş olarak güncelleyecek ve üst yönetime mail göndermeyecektir.

 

Yazan: Onur YURTSEVER (Eczacıbaşı Bilişim)