Merkez Bankası Kurları

<< Click to Display Table of Contents >>

Navigation:  Likom Gusto Olay Yönetimi > Örnekler >

Merkez Bankası Kurları

Previous pageReturn to chapter overviewNext page

Merkez Bankası web sitesi üzerinden günlük kur bilgilerini yayımlamaktadır. http://www.tcmb.gov.tr/kurlar/today.xml adresine girdiğinizde aşağıdaki gibi kurlar görüntülenmektedir.  Web adres linkinden de anlaşılacağı gibi aslında bir XML dosyası görüntülenmektedir. sayfanın üzerinde farenin sağ tuşuna basınca çıkan menüden Sayfa Kaynağını Görüntüle / View Source menüsüne tıklayınca aşağıdaki gibi XML dosyasını görebiliriz.  XML dosyasının HTML sayfası şeklinde görüntülenmesini transform dosyası (isokur.xsl) sağlamaktadır. Fakat bizim ilgi alanımız olmadığından bu kısım üzerinde durulmayacaktır.  Merak edenler http://en.wikipedia.org/wiki/Xsl linkini inceleyebilir.

 

Bizim amacımız yazılım kodu aracılığı ile bu xml dosyasını okuyup günlük olarak kullanıcılara kurları e-posta olarak göndermek olacaktır. Veriler okunduktan sonra istenen herşey yapılabilir. Örneğin bu verileri Gusto 'ya aktararak kendi döviz aktarımımızı gerçekleştirebiliriz.

clip0001

Kurların Görüntüsü

<?xml version="1.0" encoding="iso-8859-9"?>

<?xml-stylesheet type="text/xsl" href="isokur.xsl"?>

<Tarih_Date Tarih="03.12.2012" Date="12/03/2012">

 <Currency Kod="USD" CurrencyCode="USD">

   <Unit>1</Unit>

   <Isim>AMERİKAN DOLARI</Isim>

   <CurrencyName>US DOLLAR</CurrencyName>

   <ForexBuying>1.7791</ForexBuying>

   <ForexSelling>1.7877</ForexSelling>

   <BanknoteBuying>1.7779</BanknoteBuying>

   <BanknoteSelling>1.7904</BanknoteSelling>

   <CrossRateUSD>1</CrossRateUSD>

   <CrossRateOther></CrossRateOther>

 </Currency>

 <Currency Kod="CAD" CurrencyCode="CAD">

   <Unit>1</Unit>

   <Isim>KANADA DOLARI</Isim>

   <CurrencyName>CANADIAN DOLLAR</CurrencyName>

   <ForexBuying>1.7927</ForexBuying>

   <ForexSelling>1.8008</ForexSelling>

   <BanknoteBuying>1.7861</BanknoteBuying>

   <BanknoteSelling>1.8076</BanknoteSelling>

   <CrossRateUSD>0.9927</CrossRateUSD>

   <CrossRateOther></CrossRateOther>

 </Currency>

 <Currency Kod="XDR" CurrencyCode="XDR">

   <Unit>1</Unit>

   <Isim>ÖZEL ÇEKME HAKLARI</Isim>

   <CurrencyName>SPECIAL D.RIGHT</CurrencyName>

   <ForexBuying>2.7477</ForexBuying>

   <ForexSelling></ForexSelling>

   <BanknoteBuying></BanknoteBuying>

   <BanknoteSelling></BanknoteSelling>

   <CrossRateUSD></CrossRateUSD>

   <CrossRateOther>1.537</CrossRateOther>

 </Currency>

 <Currency Kod="DKK" CurrencyCode="DKK">

   <Unit>1</Unit>

   <Isim>DANİMARKA KRONU</Isim>

   <CurrencyName>DANISH KRONE</CurrencyName>

   <ForexBuying>0.31092</ForexBuying>

   <ForexSelling>0.31245</ForexSelling>

   <BanknoteBuying>0.3107</BanknoteBuying>

   <BanknoteSelling>0.31317</BanknoteSelling>

   <CrossRateUSD>5.7216</CrossRateUSD>

   <CrossRateOther></CrossRateOther>

 </Currency>

 ....

 ....

 ....

 

 

 

 

 

 

 

 

 

XML Kaynağı

 

http://www.tcmb.gov.tr/kurlar/today.xml  sitesi bir web servis değildir. O yüzden Web Servis olarak Olay Yönetimi'ne tanıtmadık. Yazılım kodu ile bu link için bir istek oluşturacağız. Sonucu okuyup DataSet nesnesine yükleyeceğiz.  Oluşan DataSet nesnesi içerisindeki tabloları e-posta haline getirip göndereceğiz.

 

1.İlk olarak yeni bir  olay tanımı yapmalıyız. Olay adını istediğiniz gibi belirleyin.

2.Çalışma zamanını günlük-peryodik  olarak belirleyin.

3.Koşulu Koşulsuz olarak belirleyelim.

4.Koşul sağlandığında yapılacaklar kısmına içeriği önemsiz bir eylem tanımlayın. Aslında eyleme ihtiyacımız yok. Fakat Olay Yönetimi eylemsiz bir olay tanımına izin vermemektedir. O yüzden sorgusu boş olan SQL Script eylemi yaratabilirsiniz. Koşul öncesi aşamasına atayacağımız yazılım kodu ile Merkez Bankası'ndan verileri alıp e-postamızı kendimiz yaratıp biz göndereceğiz. Olayın çalışmasını da o kısımda keseceğiz. Yani hiç bir zaman tanımladığımız eylemler çalışmayacaktır.

 

Yeni bir Koşul Öncesi yazılım kodu oluşturup aşağıdaki gibi eylemi tanımlayınız.

 

System.Net.HttpWebRequest req=null;

System.Net.WebResponse response=null;

try {

 /* Amaç Merkez bankasından günlük kurları almaktır */

 

 // Web istek oluşturuluyor

 req= (System.Net.HttpWebRequest)

System.Net.WebRequest.Create("http://www.tcmb.gov.tr/kurlar/today.xml");

 

 // yanıt alınıyor

   response= req.GetResponse();

  string sResult="";

  // yanıtı okuyacağımız reader ı oluşturuyoruz.

  // using bloğundan çıkıldığında nesnenin Dispose olduğundan emin olacağız

 using(System.IO.Stream reader= response.GetResponseStream())

 {

         System.Data.DataSet set=new System.Data.DataSet();

     set.ReadXml(reader);

       sResult=UserActionHelper.EMailSender.GenerateHtmlTableFromDataTable(set.Tables[1]);

 }

 

 //e-posta mesajı yaratılıyor

   AddEmailLib.MailMessageClass mail= UserActionHelper.EMailSender.GenerateMail(sResult,true,true,

         UserActionHelper.EMailSender.GenerateAddress("gusto@likom.com.tr"),"adresiniz@likom.com.tr");

 string sError;

 if(!UserActionHelper.EMailSender.SendMail(mail,out sError))

 {

         UserActionHelper.LogWriter.WriteLog(sError);

 }

 else

 {

         UserActionHelper.LogWriter.WriteLog("E-posta Gönderildi");

 }

 

       

 

 

}

catch(Exception ex)

{

 // hata durumunda log olarak yazılıyor

 UserActionHelper.LogWriter.WriteLog(ex.ToString());

// olayla ilişkilendirmek için

//UserActionHelper.LogWriter.WriteLog(ex.ToString(),e.Infos.EventPlanId);

}

finally {

  if (response != null)

       response.Close();

 // olayın çalışmaya devam etmesine gerek yok

   e.BreakExecution = true;

       

}

 

Gelen e-posta aşağıdaki gibi olacaktır.

clip0002

Döviz kur bilgileri

 

Gelen e-postadan da anlaşılacağı üzere kur alış-satış bilgileri, ve çapraz kur bilgilerinin tümü bu sayfada. Başlıklar bir şey ifade etmediği gibi Gereksiz alanlar da cabası. Unit değeri belirtilmiş satırlar kurlardır. Biz sadece kurları alacağımızdan Unit değerini kontrol edeceğiz. O zaman kodumuzu aşağıdaki gibi güncelleyelim. Kodun aynı kalan kısımlarını gri italik fonttadır.

 

System.Net.HttpWebRequest req=null;

System.Net.WebResponse response=null;

try {

 /* Amaç Merkez bankasından günlük kurları almaktır */

 

 // Web istek oluşturuluyor

 req= (System.Net.HttpWebRequest) 

System.Net.WebRequest.Create("http://www.tcmb.gov.tr/kurlar/today.xml");

 

 // yanıt alınıyor

   response= req.GetResponse();

    string sResult="";

    // yanıtı okuyacağımız reader ı oluşturuyoruz.

    // using bloğundan çıkıldığında nesnenin Dispose olduğundan emin olacağız

 using(System.IO.Stream reader= response.GetResponseStream())

 {

        System.Data.DataSet set=new System.Data.DataSet();

        set.ReadXml(reader);

       

        // her satırın Unit alanını kontrol edeceğiz

        for(int i=0;i<set.Tables[1].Rows.Count;i++)

         {

                 System.Data.DataRow row=set.Tables[1].Rows[i];

                if(row["Unit"]==DBNull.Value)

                 {

                         row.Delete();

                       // bir satır silindiğinden i değerinin artmaması gerekiyor

                        // çünkü silinen satırdan sonrakinin indeksi 1 azaldı

                         i--;

                 }

         }

        // silme işlemlerini uygula

         set.Tables[1].AcceptChanges();

       

      sResult=UserActionHelper.EMailSender.GenerateHtmlTableFromDataTable(set.Tables[1]);

 }

        //e-posta mesajı yaratılıyor

    AddEmailLib.MailMessageClass mail= UserActionHelper.EMailSender.GenerateMail(sResult,true,true,

        UserActionHelper.EMailSender.GenerateAddress("gusto@likom.com.tr"),"adresiniz@likom.com.tr");

 string sError;

 if(!UserActionHelper.EMailSender.SendMail(mail,out sError))

 {

        UserActionHelper.LogWriter.WriteLog(sError);

 }

 else

 {

        UserActionHelper.LogWriter.WriteLog("E-posta Gönderildi");

 }

 }

catch(Exception ex)

{

 // hata durumunda log olarak yazılıyor

 UserActionHelper.LogWriter.WriteLog(ex.ToString());

// olayla ilişkilendirmek için

//UserActionHelper.LogWriter.WriteLog(ex.ToString(),e.Infos.EventPlanId);

}

finally {

    if (response != null)

        response.Close();

 // olayın çalışmaya devam etmesine gerek yok

    e.BreakExecution = true;

       

}

Kodumuzun bu hali ile yeniden olayı çalıştırırsak aşağıdaki gibi bir e-posta alacağız.

 

clip0003

Döviz kur bilgileri güncel hali

Çapraz kur bilgileri artık gelmiyor. Gereksiz kolonları kaldırıp başlıkları da düzeltirsek bir adım daha atmış olacağız. Öncelikle başlıkların Türkçe karşılıklarını verelim

 

Kaynak

Türkçe Karşılığı

ForexBuying

Döviz Alış

ForexSelling

Döviz Satış

BanknoteBuying

Efektif Alış

BanknoteSelling

Efektif Satış

 

Görünmesini istemediğimiz alanların (Column) Caption özelliğine boş string atıyoruz. Olay Yönetimi otomatik olarak bunları göstermeyecektir. Kodumuzu aşağıdaki gibi güncelleyelim.

 

System.Net.HttpWebRequest req=null;

System.Net.WebResponse response=null;

try {

 /* Amaç Merkez bankasından günlük kurları almaktır */

 

 // Web istek oluşturuluyor

 req= (System.Net.HttpWebRequest) 

System.Net.WebRequest.Create("http://www.tcmb.gov.tr/kurlar/today.xml");

 

 // yanıt alınıyor

   response= req.GetResponse();

    string sResult="";

    // yanıtı okuyacağımız reader ı oluşturuyoruz.

    // using bloğundan çıkıldığında nesnenin Dispose olduğundan emin olacağız

 using(System.IO.Stream reader= response.GetResponseStream())

 {

        System.Data.DataSet set=new System.Data.DataSet();

        set.ReadXml(reader);

       

        // her satırın Unit alanını kontrol edeceğiz

        for(int i=0;i<set.Tables[1].Rows.Count;i++)

        {

                System.Data.DataRow row=set.Tables[1].Rows[i];

                if(row["Unit"]==DBNull.Value)

                {

                        row.Delete();

                        // bir satır silindiğinden i değerinin artmaması gerekiyor

                        // çünkü silinen satırdan sonrakinin indeksi 1 azaldı

                        i--;

                }

        }

        // silme işlemlerini uygula

         set.Tables[1].AcceptChanges();

       

        // görünmesini istediğimiz alanları belirliyoruz

       

         List<string> desiredColumns=new List<string>();

         desiredColumns.AddRange(new string[]

         {

                "Isim","ForexBuying","ForexSelling","BanknoteBuying","BanknoteSelling"}

         );

        // kolonları geziyoruz

        for(int i=0;i<set.Tables[1].Columns.Count;i++)

         {

                 System.Data.DataColumn column=set.Tables[1].Columns[i];

                // kolon adı istediklerimiz içerisinde var mı?

                if(desiredColumns.Contains(column.ColumnName)==false)

                 {

                         column.Caption="";

                 }

         }

        // alan adları değiştiriliyor

         set.Tables[1].Columns["Isim"].Caption                        ="Döviz";

         set.Tables[1].Columns["ForexBuying"].Caption                ="Alış";

         set.Tables[1].Columns["ForexSelling"].Caption        ="Satış";

         set.Tables[1].Columns["BanknoteBuying"].Caption        ="Efektif Alış";

         set.Tables[1].Columns["BanknoteSelling"].Caption        ="Efektif Satış";

       

       

      sResult=UserActionHelper.EMailSender.GenerateHtmlTableFromDataTable(set.Tables[1]);

 }

 

 //e-posta mesajı yaratılıyor

    AddEmailLib.MailMessageClass mail= UserActionHelper.EMailSender.GenerateMail(sResult,true,true,

   UserActionHelper.EMailSender.GenerateAddress("gusto@likom.com.tr"),"adresiniz@likom.com.tr");

 string sError;

 if(!UserActionHelper.EMailSender.SendMail(mail,out sError))

 {

        UserActionHelper.LogWriter.WriteLog(sError);

 }

 else

 {

        UserActionHelper.LogWriter.WriteLog("E-posta Gönderildi");

 }

 

       

 

 

}

catch(Exception ex)

{

 // hata durumunda log olarak yazılıyor

 UserActionHelper.LogWriter.WriteLog(ex.ToString());

// olayla ilişkilendirmek için

//UserActionHelper.LogWriter.WriteLog(ex.ToString(),e.Infos.EventPlanId);

}

finally {

    if (response != null)

        response.Close();

 // olayın çalışmaya devam etmesine gerek yok

    e.BreakExecution = true;

       

}

 

clip0004

Döviz kur bilgileri güncel hali

 

Son e-postada sadece istediğimiz alanlar var. Tek satır ve çift satır renlerini düzenlersek okunurluğunu arttırabiliriz. Bunun için DataTable dan html oluşturan methodun parametrelerini aşağıdaki gibi değiştirebiliriz.

Methodun parametre açıklama kodları kodda verilmiştir. Daha detaylı bilgi için API'nin ilgili kısmını inceleyebilirsiniz.

sResult=UserActionHelper.EMailSender.GenerateHtmlTableFromDataTable(set.Tables[1],

         System.Drawing.Color.Yellow, // tek satır arka plan rengi

         System.Drawing.Color.Black, // tek satır yazı rengi

         System.Drawing.Color.Pink, // çifr satır yazı rengi

         System.Drawing.Color.Black // çift satır yazı rengi

         );

 

Kodumuzun  son hali ile gelen e-postanın görüntüsü aşağıdaki gibidir.

clip0005

Döviz kur bilgileri güncel hali