Transcript for:
Current Time Status Tables

Merhaba arkadaşlar bu videoda Valid Time State Tables veya diğer adıyla Devlet Effective Data özelliğinden bahsedeceğim. Kısaca Türkçeleştirmek gerekirse tarih kontrolü tablo diyebiliriz. Tarih kontrolünden kasıt şu otomatik olarak Start Date End Date yani başlangıç ve bitiş tarihi olan ve bu başlangıç bitiş tarihini framework'ün yönettiği sizin Her seferinde işte bu tarih şu olsun öteki bu olsun gibi update'ler veyahut da güncellemeler yapmak zorunda kalmadığınız framework'ın size birçok kolaylık sağladığı tarih özelliği. Nasıl bir tabloyu ValidTimeStateTable haline getiririz ve potta nasıl kullanırız hızlıca örnek yaparak açıklamaya çalışacağım. Şöyle geçelim.

Şimdi bir tane ValidTimeState DMR Valid Time State adında bir tablon var. Bu tablonun özelliklerinde bakın şöyle geliyorum. Özelliklerinde Valid Time State Field Type var. Burayı ben Date olarak seçmişim. Default'ta burası None oluyor.

Date yaparsanız Start Date End Date koyacak. Yüteci Date Time yaparsanız da Start Date Time End Date Time koyacak. Yani aksıda Biliyorsunuz bir tarih var. Bir de saatle birlikte tarih var. İkisini de kullanabilirsiniz.

Biz burada date yaptık. Burayı date yaptığınız zaman otomatik olarak field'larına valid from ve valid to alanı ekleniyor. Ben de bu tabloya daha önce date id ve name alanı eklemiştim. Date id 10 karakterlik bir string. Name alanı da 60 karakterlik bir string.

Bu iki alan otomatik olarak eklendi. Daha sonra yap... Yapmanız gereken öncelikle ne yaptık? ValidTimeStateFieldType'ını belirledik.

İkinci olarak yapmanız gereken indeks tanımlamak. Bir tane DateIDX diye bir indeks tanımladım. DateID'yi koydum. Çünkü zaten bu tablonun ID'si Date olacak. Böyle bir tasarım yapmıştık.

ValidTo ve ValidFrom'a ekledim. Daha sonra bu indeksin özelliklerinde mutlaka Elove'da... no olmak zorunda yani mutlaka unique bir indeks olmak zorunda bu. Birden çok alanlı bir unique indeks de olabilir.

Alternative key'ini yes olarak işaretlemeniz gerekiyor. Aynı zamanda valid time state key olduğunu belirtmek için valid time state key'i de yes yapmanız gerekiyor. Valid time state mod'da ise gap ve no gap var.

Gap ve no gap de şöyle. Mesela Bir sözleşme olduğunu düşünün. Sözleşmenin başlangıç tarihi ve bitiş tarihi var.

O arada tekrar sözleşmeyi yapamadınız, yenileyemediniz. Bir sene sonra tekrardan yeniliyorsunuz. Arada bir gap yani boşluk oluştu. Eğer arada boşluk oluşabiliyorsa, aynı date idlerle arada boşluk oluşabiliyorsa burayı gap seçmelisiniz. Ama bazı durumlarda da gap oluşmasını istemezsiniz.

Birinin bir kaydın başlangıç tarihi var, bir kaydın bitiş tarihi var. Bitiş tarihi girdiğim anda o bitiş tarihi bir sonraki kaydın başlangıç tarihi otomatik olsun isteriz. Bunu da employment yani çalışma kaydında düşünebilirsiniz.

Bir kişi işten çıkmadığı sürece şirket içinde farklı çalışmalarda olabilir. Örneğin IT pozisyonunda IT'de yazılım uzmanı olarak çalışıyordu. Ama 2018'in birinci ayının birinde... İşte yazılım müdürlüğüne atandıysa oranın bitiş tarihini bu tarih o tarihinde aynısı diğer kaydı. Yani yeni pozisyonun start date'ine yazması gerekiyor.

O zaman da no gap kullanıyorsunuz. Gap ve no gap'i bu özellikten yani indeksin valid time state modundan ayarlıyorsunuz. Biz burada gap'li oluşturalım diye düşündük.

Daha sonra bir tane... Auto Identification diye bir field grup oluşturuyoruz. O field gruba da yine Date, Valid To ve Valid From'u koyuyoruz. Bunu yaptıktan sonra tablomuzun özelliklerine gidiyoruz. Gördüğünüz gibi burada Primary Index ve Cluster Index'i Surrogate Key kalmış durumda.

Oraya dokunmuyoruz. Bizim işimiz Replacement Key'de. Burada Replacement Key'de Valid Time State tipinde oluşturduğumuz Alternative Key olan Date ID X'i Bunları yaptıktan sonra aslında bizim tablomuz hazır. Tablomuz Valid Time State'li hale gelmiş oldu. Bu tabloya hızlıca bir tane form yaptım.

Bu formda datasource'una validtime state'li tablomu ekledim. Hiçbir özelliğini değiştirmedim. Daha sonra bir tane grid yaptım.

Grid'e de dateid ve validfrom validto'yu ekledim. Gördüğünüz gibi burada validtime state auto query date range olarak geliyor. As of date de diyebilirdim. Date range ve as of date... kayıtten kasıt şu bakın data sorsun üzerindeyim otoku yani kuyruğu ezof date yani bugün için geçerli olan kayıtları mı getirsin yoksa bir de it range olarak mı getirsin bunu ben formda belirleyebiliyorum şimdi tablomuza Ben bir iki tane kayıt girmiştim şöyle kayıtları açalım bakın s birden üç tane kayıt var ve bitiş tarihi yok.

ve arasında ve 12.07'de bitmiş. Gördüğünüz gibi şu anda aslında günümüzde devam eden 2 tane kayıt var. S1 ve S2'nin şu 2 kaydı günümüzde hala Valid2'su Never olduğu için devam ediyor. Formu açalım. Bakın formda Range olarak seçtiğim için bütün kayıtlar gözüküyor.

Burayı değiştirsem orası da değişecek. Şöyle yapalım. Mesela S2 için gördüğünüz gibi yeni bir kayıt oluşturayım. S002 ve bunu nereden başlatalım? Mesela 23.03'den başlatalım.

Gördüğünüz gibi kaydettiğim anda bir önceki kaydı 22.03.2019'da bitirdi. Benim kaydımın başlangıç tarihini de benim elle girdiğim yere yaptı. Ve expiration yani bitiş tarihine de never yazdı.

Ben bunun için hiçbir şey yapmadım. Tamamen framework, valid time state tanımlarından dolayı otomatik olarak bunu yaptı. Çünkü şu... aynı data id ile iki tane aktif kayıt olamaz diye kendisi otomatik bir önceki kaydı bitirdi bir sonraki kaydı da kendisi ayarlamış oldu. Gördüğünüz gibi veri girişini gayet kolaylaştırıyor.

İşlemleri de gayet kolaylaştırıyor. Normalde biz bunlar için bir sürü update işte kendimiz kodla bu kayıt böyle olduysa diğer kayıtta kaydı şunu yap bunu yap gibi bir sürü kod yazmamız gerekiyordu. Hiçbir kod yazmadan tamamen framework bizim için bunları yapmış oluyor.

Şimdi bu form tarafı bu şekilde. Peki kodda nasıl işlemler yapabiliyoruz? Onun için de şu caplarımızı açalım.

Öncelikle birinci cabımız. Eğer bir tablo valid time state'li ise direkt while select'le veya select'le o tabloya o tablodan kayıt çekemiyorsunuz. Mutlaka ne yapmalısınız? Şu valid time state belirtmeniz gerekiyor.

Why select? Why time state? Demişim. Burada mesela start date dedik veyahut da bir start date de olabilirdi bu.

Yani şu tarihte system date gitti. Bugünün tarihini veriyoruz. Bugün tarihinde aktif olanları versin diyoruz. Burada date id vermişiz ama date id vermeyelim. Şöyle yapalım.

Şimdi çalıştırırsam bakın bugünün tarihiyle geçerli olan Kayıtlar bunlardı. Zaten bunlar da bizim için doğru kayıtlar gördüğünüz gibi. Çünkü bugünün tarihi bugünün tarihiyle bu kayıtların gelmesi bizim için doğru.

Peki bunu range haline getirebilir miyim? Yani şu iki tarih arasındaki diyebilir miyim? Evet.

Onun için de ikinci cevabımıza gidelim. Yine Valid Time State'de işte bugünle. Start date'i 0101 2018 arasında olanlar diye çekebiliyorum. O zaman da start date end date diye range verebiliyorum.

Bakın şurada zaten çıkmadı. Aslında bu valid time state 2 tane farklı şey değişken alabiliyor. Yani sadece tek tarihte alabiliyor.

Veyahut da 2 tarih range şeklinde alabiliyor. Yani bu tarihten büyük bu tarihten küçük olan kayıtları gösterecek. Gördüğünüz gibi yine aynı kayıtları benim için verdi. Bu yaptığımız yselect'in aynısını query'de de yapabiliyoruz.

Query bizim bildiğiniz gibi Object Oriented Select yazma altyapımız AXE'daki. Biz normalde bir query oluşturup o query'e data source ekleyip ona range verebiliyoruz. Gördüğünüz gibi S1'i burada normal range ile vermiş. Şuradaki kullandığımız time state'i şurada pardon. Query'e ekliyoruz.

DataSource'a değil. Query'e ValidTimeState AsOfDate veyahut da ValidTimeState AsOfDateTime gibi farklı şeylerimiz var. Aslında şurada gösterelim.

Bakın. ValidTimeState AsOfDate AsOfDateTime StartDateRange StartDateTime StateDateTimeRange Yani burada ne var? Aslında bir önceki normal select ifadesinde şuraya start date end date yazarak kullandığım ve tipini değiştirmediğim fonksiyonu query'de 4 tane farklı fonksiyonla, metotla kullanabiliyorum.

Burada neyi kullanmışız? While time state as of date'i kullanmışız. Yani bu tarih itibariyle. Yorum sıfırı olanları da silelim. Bu tarih itibariyle S1 tipindeki olanları getirsin diyoruz.

Bu bana bir diyalog açıyor. Burada filtresi var. Çünkü prompt etmişim.

Ve bastığımda gördüğünüz gibi kaydı getirdi. O diyaloğu açmasının sebebi şu querydeki prompttu. Query framework'ünü böyle bir seri halinde birkaç videoda uzun uzun anlatmaya çalışacağım.

Orada çok konuşulacak konu var. Ama valid time state... Tipindeki bir tablonun nasıl select edilebildiği ile ilgili söz geldiği için burada da bahsettim. Bu şekilde Valid Time State'i kullanabilirsiniz. Ayrıca Valid Time State tablonlar için çok güzel kaynaklar var.

Bir tane white paper var. Linkini aşağıda vereceğim. O white paper da çok ayrıntılı bir şekilde bütün özelliklerini anlatıyor. İhtiyacınız olduğunda mutlaka bu...

Yapıyı kullanmanızda fayda var. Özellikle aksın içinde ik tablolarında çok fazla kullanılıyor. Mesela hcm employment Hatırladıklarımdan birisi Gördüğünüz gibi bakın burada valid Valid to valid from var Hatta bu date time tipinde Şuradan göreceksiniz Ütc date time tipinde Mesela bu tabloya sorgu çekerken mutlaka valid time state key'ini kullanmak zorundasınız. İndeksinde de gördüğünüz gibi bakın gap'li ve yes tipinde hatta burada level entity ve worker var. Yani iki alan üzerinden unique'liği sağlamış ve valid time state key'i alternative key olarak burada atamış.

Evet, framework'ın 2012 ile gelen Sonraki versiyonlarında devam eden yeni versiyonda da devam ediyor bu özellik. Çok güzel bir özellik. İhtiyacınız olduğunda yani start date end date'li bir yapı kurmaya ihtiyacınız olduğu her durumda bunu kullanmanızı tavsiye ederim.

Umarım faydalı bir video olmuştur. İyi seyirler.