5 Haziran 2014 Perşembe

Oracle da bir kaydın kendinden sonraki kayıtla eşleşmesi


Merhaba,

Bu yazımda Oracle ile kod geliştirirken bazı durumlarda bir kaydın belirli bir düzen içerisinde kendinden sonraki kayıtla eşleşmesi gereken durumlarda bu işi PL/SQL dilinde nasıl yapacağımızı anlatacağım. Bu işlemin birden fazla yolu olabilir fakat ben bu yazının konusu olarak PL/SQL'de kullanılan RANK fonksiyonu basitce anlatmak ve bu fonksiyonu kullanarak neler yapılabileceğinin yolunu çizmek istiyorum.

Diyelimki bir firmanın araçlarının her çıkışını kaydettiğimiz bir tablomuz olsun. Tablonun şu şekilde olduğunu varsayalım : 
Tablo Adı : ARAC_CIKIS_KAYIT PLAKA KM TARIH ------- ---- ---------- 34ABC15 102546 10.04.2012 34ABC15 103542 12.04.2012 34ABC15 110321 17.04.2012 34DD435 101223 08.02.2011 34DD435 110321 15.02.2011
Her çıkışta araçların kaç km. yol katettiklerini bulmak istiyoruz diyelim.
SELECT t.*, RANK() OVER(PARTITION BY t.plaka ORDER BY t.tarih DESC) ranking FROM ARAC_CIKIS_KAYIT t;
Yukarıdaki sorguda gördüğüz gibi RANK fonsiyonunu kullanarak yeni bir sütun daha oluşturduk. Bu kodu daha da açıklayayım. OVER() kod parçası yapılacak olan ranking (sıralama,numaralama) işleminin hangi kriterlerde yapılacağının belirtildiği kısımdır. Bu kodda PARTITION BY t.plaka kodu tabloyu PLAKA sütununa göre grupla ve ORDER BY t.tarih DESC kodu ise bu gruplamanın TARIH sütununa göre numaralandırmanın tersten (DESC) yapılması gerektiğini bildirir.
PLAKA KM TARIH RANKING ------- ------ ---------- ------- 34ABC15 110321 17.04.2012 1 34ABC15 103542 12.04.2012 2 34ABC15 102546 10.04.2012 3 34DD435 110321 15.02.2011 1 34DD435 101223 08.02.2011 2
Sorgu sonucu görüldüğü gibi kayıtları Plaka alanı bazında gruplandırıp Tarih alanına göre tersten sıralandırmış olduk. Sorgumuzu aşağıdaki şekilde modifiye ediyoruz ve çalıştırıyoruz.
SELECT * FROM (SELECT t.*, RANK() OVER(PARTITION BY t.plaka ORDER BY t.tarih DESC)+1 ranking FROM ARAC_CIKIS_KAYIT t) A, (SELECT t.*, RANK() OVER(PARTITION BY t.plaka ORDER BY t.tarih DESC) ranking FROM ARAC_CIKIS_KAYIT t) B WHERE a.plaka=b.plaka AND a.ranking=b.ranking;
Burada ilk sorgumuzu sanki 2 ayrı tabloya erişir gibi birinin aliası(takma ismi) "A" diğerininki de "B" olacak şekilde ayarlayıp bir tablonun Ranking değerini "1" artırıyoruz. Böylece bir kayıt aslında diğer tabloda kendinden sonraki kayıta eşitleniyor. Sorgu sonucuna bakacak olursak aşağıdaki çıktı kendinden bir sonraki kayıtla eşleşmiş kayıtların listesi şeklinde görüntüleniyor.
PLAKA KM TARIH RANKING PLAKA KM TARIH RANKING ------- ------ ---------- ------- ------- ------ ---------- ------- 34ABC15 110321 17.04.2012 2 34ABC15 103542 12.04.2012 2 34ABC15 103542 12.04.2012 3 34ABC15 102546 10.04.2012 3 34DD435 110321 15.02.2011 2 34DD435 101223 08.02.2011 2
Sorgumuzu artık KM alanlarının farkını bulacak şekilde modifiye edebiliriz.
SELECT a.plaka, a.km-b.km yapilan_km FROM (SELECT t.*, RANK() OVER(PARTITION BY t.plaka ORDER BY t.tarih DESC)+1 ranking FROM ARAC_CIKIS_KAYIT t) A, (SELECT t.*, RANK() OVER(PARTITION BY t.plaka ORDER BY t.tarih DESC) ranking FROM ARAC_CIKIS_KAYIT t) B WHERE a.plaka=b.plaka AND a.ranking=b.ranking;
Sonuç her aracın yolculuk başına kaç km yol katettiğini gösterir
PLAKA YAPILAN_KM ------- ---------- 34ABC15 6779 34ABC15 996 34DD435 9098

3 Haziran 2014 Salı

Excel ile IMDB'den film bilgileri almak


Merhaba,

Bunun için Brian Fritz tarfından geliştirilmiş olan ve IMDB bilgilerini basitce bir web sayfası mantığıyla sunan www.omdbapi.com sitesinden faydalanacağız. Siteye girdiğinizde çeşitli arama kriterlerinin nasıl kullanıldığını anlatan bir ana sayfa ile karşılacaksınız. Bu yazımda bu kriterleri uzun uzun anlatmayacağım zira yazının konusu bu sayfanın kullanımı değil, bu sayfaya sorgu ve bu sorgu sonucunun alınma işinin Excel ile nasıl yapılacağıdır.
  • Öncelikle boş bir excel dosyası yaratıyoruz. Şayet Excel'de Developer Tab'ınız görünmüyor ise açmak için şu linki inceleyiniz : Show the Developer tab
  • Excel'de bu işlem için XMLHttpRequest nesnesini kullanmamız gerekiyor. 
  • Excel dosyamızın şu şekilde olduğunu varsayalım (Ben basitlik için bu kadar bilgiyi çekeceğim, gelebilecek diğer bilgileri inceleyerek çekebilirsiniz)


  • Kullanımı şu şekilde olacak : A1 hücresine filmin adını yazdıktan sonra "Bul" butonuna basıp kodumuzun film bilgilerini getirmesini bekleyeceğiz. Film bilgileri getirildiğinde Filmin orijinal adı B1, Yapım Yılı C1, IMDB puanı D1 ve Filmin tipi ise E1 hücresine yazılmış olacak. 
  • Bunun için Excel'de şu fonksiyonu kullanabiliriz :
Public Function filmBilgisiGetir(p_film_adi As String) Dim URL As String Dim xml As Object Set xml = CreateObject("MSXML2.XMLHTTP") URL = "http://www.omdbapi.com/?t=" & p_film_adi xml.Open "GET", URL, False xml.Send filmBilgisiGetir = xml.responseText End Function
  • Yukarıda görününen kod bloğunda bir fonksiyon bulunuyor. Bu fonksiyon parametre olarak film adını alıp XMLHttpRequest nesnesi yaratıp verilen URL'ye GET methodu ile bir istekte buluyor. Daha sonra sunucunun vereceği cevabı dinleyip cevabı döndürüyor.  xml.Open "GET", URL, False satırında "GET" sayfaya yapılacak olan isteğin tipi belirtiyor. İki tip istek çeşidi mevcut fakat detaylarına deyinmeyeceğim("GET","POST"). URL ise adından da anlaşılacağı üzere hangi adrese istek yapılacağını belirtmekte. Sonda belirtilen False parametresi ise yapılacak olan isteğin senkron mu asenkronmu olduğunu belirtiyor. Biz burada False yani senkron tipini kullandık. Bu da kodumuzun sayfaya yapılacak olan isteğin cevabını beklemesi gerektiği cevaptan sonra programın ilerlemesini belirtiyor.
Private Sub CommandButton1_Click() filmBul End Sub Public Function filmBilgisiGetir(p_film_adi As String) Dim URL As String Dim xml As Object Set xml = CreateObject("MSXML2.XMLHTTP") URL = "http://www.omdbapi.com/?t=" & p_film_adi xml.Open "GET", URL, False xml.Send filmBilgisiGetir = xml.responseText End Function Public Sub filmBul() For i = 2 To 65535 If Range("A" & i).Value = "" Then Exit For End If parseText i, filmBilgisiGetir(Range("A" & i).Value) Next i End Sub Public Function cleanStr(a) Dim b As String b = Replace(a, "}", "") b = Replace(b, "{", "") b = Replace(b, """", "") cleanStr = b End Function Sub parseText(i, text) infoCouple = Split(text, """,") For k = 0 To UBound(infoCouple) - 1 info = Split(infoCouple(k), ":") infoKey = cleanStr(info(0)) infoValue = cleanStr(info(1)) If infoKey = "Title" Then Range("B" & i).Value = infoValue ElseIf infoKey = "Year" Then Range("C" & i).Value = infoValue ElseIf infoKey = "imdbRating" Then Range("D" & i).Value = infoValue ElseIf infoKey = "Genre" Then Range("E" & i).Value = infoValue End If Next k End Sub
  • Üstteki koddan ve ekran görüntüsünden de anlaşılacağı üzere gerekli bilgileri alıp gerekli hücrelerin içerisinde yazdırıyoruz. Ben bir döngü yardımıyla 65536 adet satırın içerisinde boş kayıt bulana kadar döndürüp birden fazla filmin özelliklerine çekmek için kodu düzenledim. Siz de kendinize göre istediğiniz şekilde kodu değiştirip taklalar attırabilirsiniz.
  • Dosyanın tam haline ulaşmak için tıklayın.

Ruhsat muayene yaprağında yer kalmamışsa...


Merhabalar,

Bloguma bu gün tecrübe ettiğim, Ankara'da yaşayan ve araç ruhsatında muayene yeri kalmamış araç sahiplerinin de merakını giderebilecek ruhsat yenileme işlemlerini anlatarak başlayacağım.

Bildiğiniz üzere Türkiye'de yeni araç alımlarında muayene süresi 3 yıl, sonrasında ise her 2 yılda bir muayene yaptırmak zorunluluğu var. Benim de aracım 2005 model olduğundan, ilk muayenesi 2008'de ve sonraki muayeneleri de sırayla 2010-2012 de yapıldığından 2014'de yeni yapılacak muayene için ruhsatta yer kalmamıştı.

  • İlk olarak aracın muayenesini TÜVTÜRK istasyonlarında yaptırırken görevliye ruhsatta muayene kısmının dolduğunu bildirin (Oradaki görevlinin gözünden kaçma ihtimaline karşın). 
  • Muayene işlemi bittikten sonra, Muayene sonucunu gösterir bilginin yanında, normalde ruhsata yapıştırılması gereken minik hologramın yapıştırıldığı ve araç muayenesinin tamamlandığını bildiren bir bilgisayar çıktısını size veriyorlar. 
  • Emniyete gitmeden önce bu işlem için sadece bir dilekçe doldurmanız gerekiyor. Başka bir belgeye gerek yok. Ben bunu bilmediğin için Ankara Emniyet Müdürlüğü'nün yanındaki sigortacılardan yarım A4 kağıdına matbu olarak basılmış bir dilekçe için 10 TL ücret ödedim ve bu ücret bu işlem için çok çok fazla. (Dilekçe örneği
  • Bundan sonrası biraz tuhaf. Kendi başımdan geçenleri anlayayım. Muayene tamamlanıp tüm evrakları aldıktan sonra Ankara Emniyet Müdürlüğü Trafik Tescil Bürosu'nun internet sitesinden online randevu aldım. Bu randevuda, randevu saatinde 34 nolu bankoda bulunmam gerektiği yazıyordu. Randevu saatinde, Ankara Emniyet Müdürlüğü C kapısından girdim ve içeride 34 nolu bankoyu buldum. Gittiğimde 34 Nolu bakoda ruhsat teslim yazısı vardı. Ben gitmeden ve parayı ödemeden rusatımı çıkarmış olamazlar diye düşünüp oradaki numaratörden "Belge Yenileme" sıra numarası aldım. Fakat burada sıra alan kişilerin online randevu sisteminden sıra aldıklarını hiç sanmıyorum. Sıram geldikten sonra evrakları teslim edip 92,5 TL'yi oradaki görevliye verdim. Ertesi gün öğleden sonra 34 numaralı bankodan ruhsatımı alabileceğim bilgisini de edindikten sonra binadan ayrıldım.