FORM KERNELI
Form Kernel Nedir ?
Form Kernel , Arama Kernel'ı , Batch Kernel ve Seçim Kernel'ı mantığıyla oluşturulmuş komplike abstract bir sınıftır.Dolayısıyla bu sınıftan farklı görevler yapan Form Kernel'lar miras yoluyla oluşturulabilir.Form Kernel'da kayıtlar oluşturabilir , oluşturduğumuz kayıtları kaydedebilir , kayıtlarımızı arayabilir , kaydettiğimiz kayıtları güncelleyebilir veya sistemden silebiliriz.Form Kernel tüm bu görevleri Batch , Arama ve Seçim Kernel'larının mekanizmalarını kullanarak yapar.satıcı_kodu ve satıcı_ismi bilgileriyle satıcı kaydının tutulduğu örneklerle Form Kernelı açıklayalım..
Form Kernel Sınıfı
Bu sınıf abstract bir sınıf olup , nesnesi oluşturulamaz.Base_Kernel_Event sınıfından türetilmiş ve Batch Kernel , Seçim Kernel ve Arama Kernel mekanizmaları bu sistemde kullanılmıştır.
Zorunlu Fonksiyonlar
Bu fonksiyonlar Form Kernel mekanizmasının temel iskeletini oluştururlar.Abstract fonksiyonlar olup , Form Kernel'ı miras alan tüm sınıflarda override edilmek zorundadırlar. Bu fonksiyonlara göz atalım.
SETUP_FORM
Form Kernel çalıştığında kayıt bilgilerinin sisteme girileceği bir arayüze ihtiyaç vardır.Dolayısıyla ihtiyaçlarımıza göre Kernel'ı oluşturmadan bir arayüz ekranı dizayn etmemiz gerekmektedir.Satıcı bilgilerini gireceğimiz ekran bu fonksiyon ile yüklenmektedir.Örneğimize göre form ekranımız ve fonksiyonumuz :
void CRM_SATICILAR::SETUP_FORM () { SET_FIRST_FOCUS_WIDGET ( m_ui->line_edit_satici_kodu ); REGISTER_BUTTONS_WIDGET ( m_ui->kernel_buttons_widget ); SET_PAGE_TITLE (tr("CRM SATICI EKRANI")); SET_SETTING_NAME ("CRM_SATICI_FORMU"); SET_HELP_PAGE ("crm_satici.html"); m_ui->line_edit_satici_kodu->setMaxLength(25); m_ui->lineEdit_satici_ismi->setMaxLength(25); m_ui->limitedTextEdit_aciklama->SET_MAX_STRING_LENGTH(50); }
- Satıcı kodu ve satıcı ismi bilgilerini gireceğimiz form ekranımız..
- Kernel , form ekranını bu akışa göre hazırlar..
NEW_RECORD
Kullanıcı yeni bir kayıt girecek şekilde , bilgilerin girileceği arayüz ekranını hazırlar.Form üzerinde önceki işlemlerden bilgiler kaldıysa temizlenir.Fonksiyonun içini boş bıraktık.Default değerlerimiz olursa burada atayabiliriz.Satıcı ekranına göre NEW_RECORD fonksiyonunun nasıl çalıştığına dair örnek :
void CRM_SATICILAR::NEW_RECORD () { }
- NEW_RECORD fonksiyonuna örnek :
|
|
CLEAR_FORM_MEMBERS
Bu fonksiyon , bir işlem sonrası otomotik olarak çağırılarak , istenilen değişkenlerin temizlenmesini sağlar.Bu fonksiyonda , form ile ilgili işlem yaptığımız değişkenlerimize default değerler atayabilir , varsa sayaçlarımızı sıfırlayabiliriz.Bu fonksiyonun içinide boş bıraktık.Çünkü Kernel zaten formekranımızı temizliyor. Onun dışında temizlemek istediğimiz bir değişken yok.
void CRM_SATICILAR::CLEAR_FORM_MEMBERS() { }
CHECK_VAR
Bu fonksiyon , Batch Kernel'daki CHECK_VAR fonksiyonudur.Kernel'ımızın çalışma mantığına göre bu fonksiyonda form ekranına kullanıcı tarafından girilen bilgiler kontrol edilir.Örneğin satıcı kayıt sisteminde satıcı kodu bilgisi içerisinde rakam ve harf dışında karakter olmamasını istiyorsak bu alanı bu fonksiyonda kontrol edebiliriz.Kullanıcı harf ve rakam dışında bir karakter girerse kullanıcıyı uyarır ve hatasını düzeltmesini isteyebiliriz.
- Satıcı örneğimizde kontrol yapmadık..O yüzden fonksiyonu boş bıraktık..
int CRM_SATICILAR::CHECK_VAR (QObject * object) { Q_UNUSED(object); return CEREN_OK; }
CHECK_EMPTY
Bu fonksiyon , form ekranında bir işlem yapma için kullanıcı tarafından dolduralan form üzerindeki kayıt bilgisi alanlarında eksikliklerin olup olmağı kontrol edilir.
- Mesela satıcı örneğimizde satıcı koduna göre arama yapmak istiyoruz.Arama işlemine geçilmeden önce satıcı kodu bilgisinin boş bırakılıp bırakılmadığını bu fonksiyonda kontrol edebilir ve boş brakıldığında kullanıcıyı uyarırır, Kernel'ı da boş bırakıldığına dair bilgilendirebiliriz. Kernel bu bilgiye göre arama işlemini satıcı kodu girmeden yaptırmaz.
int CRM_SATICILAR::CHECK_EMPTY () { if( m_ui->lineEdit_satici_ismi EQ NULL ){ MSG_ERROR("HATA : Satıcı ismi boş bırakılamaz.." , this); return CEREN_FAIL ; } if( m_ui->line_edit_satici_kodu EQ NULL ){ MSG_ERROR("HATA : Satıcı kodu boş bırakılamaz.." , this); return CEREN_FAIL ; } return CEREN_OK; }
- Kernel arama işlemine , alanlar boşken izin vermiyor.. :
|
CHECK_ADD()
Bu fonksiyon , kullanıcı form ekranına kayıt bilgisi girdikten sonra KAYDET butonuna basmasıyla Kernel tarafından çağırılır.Kernel bu fonksiyonu sisteme bir veri kaydetmeden önce veriyi kontrol etmek için çağırır.Biz bu fonksiyonda kaydedilecek veriyi kontrol etmek için kullanırız.
- Mesela satıcı örneğimizde aynı satıcı kodunda başka satıcı bulunmamasını isteyelim.Aynı satıcı kodunda başka bir satıcı kaydı olup olmadığını burada kontrol edelim.. :
int CRM_SATICILAR::CHECK_ADD () { SQL_QUERY query( DB ); query.PREPARE_SELECT( "crm_saticilar" ,"satici_kodu","satici_kodu=:satici_kodu" ); query.SET_VALUE( ":satici_kodu" , m_ui->line_edit_satici_kodu->text().toInt() ); if( query.SELECT() NE 0 ){ MSG_ERROR("HATA : Bu kodda satıcı daha önce kayıt edilmiş." , this ); return CEREN_FAIL; } return CEREN_OK; }
- Daha önce aynı kod ile eklenmiş satıcının tekrar eklenmesi engelleniyor.. :
|
ADD_RECORD()
Bu fonksiyon , form ekranına kullanıcı tarafından girilen kayıt bilgileri , Kernel tarafından CHECK_ADD kontrolünden geçtikten sonra çağırılır.Kernel bu fonksiyonu kullanıcının girdiği kayıt biligilerini sisteme kaydetmek için kullanır.
- Örneğin satıcı kayıt formunda , veri tabanına yeni bir kayıt eklemek istediğimiz de Kernel form üzerindeki bilgileri kontrol eder.Daha sonra bu fonkisyonu çağırır.Biz bu fonksiyonda form üzerindeki satıcı bilgilerini alarak veri tabanımıza kaydederiz.
int CRM_SATICILAR::ADD_RECORD () { SQL_QUERY query( DB ); query.PREPARE_INSERT("crm_saticilar", "satici_id", "satici_kodu, satici_ismi" ) ; query.SET_VALUE( ":satici_kodu" , m_ui->line_edit_satici_kodu->text() ); query.SET_VALUE( ":satici_ismi" , m_ui->lineEdit_satici_ismi->text() ); int record_id = query.INSERT(); return record_id; }
- Satıcı bilgileri kaydedilerek , form ekranı temizleniyor.. :
|
|
- Kernel kayıt ekleme işlemini bu akış sırasıyla yapmaktadır..
CHECK_UPDATE
Bu fonksiyon , form ekranında bir kayda ait bilgiler görüntüleniyorken , kullanıcı kaydın bilgilerinde değiştirmeler yapıp Kaydet butonuna basarsa Kernel , bu fonksiyonu çağırır.Bunun nedeni kullanıcının kayıtla ilgili değişikliklerini kontrol etmektir.Update öncesi kontrollerimiz bu fonksiyonda yapılır.
- Bu fonksiyonu kullanmadık.. :
int CRM_SATICILAR::CHECK_UPDATE ( int record_id ) { Q_UNUSED(record_id); return CEREN_OK; }
UPDATE_RECORD
Bu fonksiyon , Kernel bir kayıttaki güncelleme bilgilerini CHECK_UPDATE kontrolünden geçirip sonra hata kodu dışında bir cevap yani bir kayıt id'si alırsa , bu fonksiyonu aldığı kayıt id'si ile çağırır.Biz bu fonksiyonda , kayıt sistemimizde alınan kayıt id'sine ait kaydı bularak , kullanıcının değişikliklerini kayda uygula malıyız.
- Satıcı id'si ile kayıt bulunarak , satıcı bilgileri güncelleniyor.. :
void CRM_SATICILAR::UPDATE_RECORD ( int record_id ) { SQL_QUERY query(DB); query.PREPARE_UPDATE( "crm_saticilar" , "satici_id", "satici_kodu, satici_ismi" , "satici_id=:satici_id" ); query.SET_VALUE( ":satici_id" , record_id ); query.SET_VALUE( ":satici_kodu" , m_ui->line_edit_satici_kodu->text() ); query.SET_VALUE( ":satici_ismi" , m_ui->lineEdit_satici_ismi->text() ); query.UPDATE(); }
- Kullanıcı 1 satıcı kodlu satıcının bilgilerini değiştiriyor.. :
|
|
- Daha sonra Kaydet butonuna basıp , güncellemeleri kaydediyor.Ve kaydın güncel haline bakılıyor.. :
|
|
- Güncelleme işleminin akış şeması diyagramlardaki gibidir..
1 ) Kaydın bilgileri değiştirildiğinde ;
2 ) Kaydet butonuna basıldığında ;
CHECK_DELETE
Bu fonksiyon , kullanıcı form ekranında bir kayıt görüntüleniyorken Kaydı Sil butonuna bastığında Kernel tarafından çağırılır. Kernel bize , kullanıcı kayıt silmek istiyor , silmeden önce kayıtla ilgili kontrollerini burada yap demektedir.Biz bu fonksiyonda , eğer özel bir kayıt ise silinmesini engelleyebilir yada kayıt silinmeden önce kayıtla ilgili silinmesi gereken başka alanlar varsa bu alanları kontrol edebiliriz. Eğer kaydın silinmesini engellemek istiyorsak hata kodu , silinmesini istiyorsak devam kodu return etmeliyiz.
- Bu fonksiyonu kullanmadık.. :
int CRM_SATICILAR::CHECK_DELETE ( int record_id ) { Q_UNUSED(record_id); return CEREN_OK ; }
DELETE_RECORD
Bu fonksiyon , Kernel tarafından kayıt CHECK_DELETE kontrolünden CEREN_OK değeri ile geçtikten sonra , kaydın silinmesi için çağrılır.Kernel bize , kullanıcı kaydın silinmesini istedi , CHECK_DELETE kullanarak kaydı kontrol ettim , kaydın silinmesi için bir sorun yok , id'ni verdiğim kaydı bu fonksiyonun içinde sil demektedir.
- id'sini aldığımız kaydı sistemimizde , id ile bularak siliyoruz.. :
void CRM_SATICILAR::DELETE_RECORD ( int record_id ) { SQL_QUERY sql_query( DB ); sql_query.PREPARE_DELETE("crm_saticilar","satici_id = :satici_id"); sql_query.SET_VALUE( ":satici_id", record_id ); sql_query.DELETE(); }
- Satıcı kaydı örneğimie göre bir kayıt silelim.. :
|
|
|
- Silme işlemine ait akış şeması diyagramdaki gibidir.
FIND_RECORD
Bu fonksiyon , kullanıcı form ekranında Getir butonuna bastığında Kernel tarafından çalıştırılır.Fonksiyon kullanıcının form ekranına girdiği kayıt bilgilerini alır ve kaydı sistemde arar. Kayıt bulunursa kaydın id'si , bulunamazsa -1 return edilir.
- Satıcı örneğimize göre bu fonksiyonda , line editten girilen satıcı kodu alınarak kayıt veri tabanında aranıyor..Bulunursa kaydın id'si , bulunamazsa -1 return ediliyor.. :
int CRM_SATICILAR::FIND_RECORD() { SQL_QUERY query( DB ); query.PREPARE_SELECT( "crm_saticilar" , "satici_id" , "satici_kodu =:satici_kodu"); query.SET_VALUE( ":satici_kodu" , m_ui->line_edit_satici_kodu->text() ); if( query.SELECT() NE 0 ){ query.NEXT(); return query.VALUE(0).toInt(); } return -1 ; }
- Kullanıcı satıcı kodu girip Getir butonuna basıyor.. Bu fonksiyon ile kayıt id'si bulunduktan sonra kaydın bilgileri GET_RECORD ile forma basılıyor.. :
|
|
GET_RECORD
Bu fonksiyonda , kayıt id'si verilen kaydın bilgilerini form ekranındaki widget'lara doldururuz. satici_id'si verilen satıcının satici_kodu ve satici_ismi bilgileri line editlere basılmaktadır.
- Şimdi fonksiyonu satıcı kayıt örneğimize göre nasıl kodladığımıza ve fonksiyonun nasıl çalıştığına bakalım..
int CRM_SATICILAR::GET_RECORD ( int record_id ) { SQL_QUERY sql_query( DB ); sql_query.PREPARE_SELECT ( "crm_saticilar" ,"satici_kodu , satici_ismi ", "satici_id=:satici_id"); sql_query.SET_VALUE ( ":satici_id", record_id ); if ( sql_query.SELECT() EQ 0 ) { QString str = "HATA : Böyle bir kayıt sistemde bulunamadı "; MSG_INFO( str , this ); return CEREN_FAIL; } sql_query.NEXT(); m_ui->line_edit_satici_kodu->setText ( sql_query.VALUE(0).toString() ); m_ui->lineEdit_satici_ismi->setText ( sql_query.VALUE(1).toString() ); return CEREN_OK; }
- Getir butonuna basıldığında , satıcı koduna girilen kaydın bilgileri line editlere dolduruluyor :
|
|
- Kernel Getir işlemini yaparken bu akış şemasındaki gibi davranır..
SELECT_RECORD
Bu fonksiyon Seçim Kernel'ındaki SINGLE_SELECTED_LINE gibi çalışır.Form ekranında kullanıcı arama kriteri girip , Ara / Bul butonuna bastığında Kernel bu fonksiyonu çağırır.Bu fonksiyonda , kullanıcın girdiği arama kriteri alınarak , kritere göre kayıt aranır.Kayıt bulunursa kaydın id'si , bulunamazsa -1 return edilir.
- Satıcı örneğine göre line edit'e girilen satıcı kodu ile satıcı aranıyor.Bulunursa satıcının id'si , bulunamazsa -1 return ediliyor.. :
int CRM_SATICILAR::SELECT_RECORD() { SQL_QUERY query ( DB ); query.PREPARE_SELECT( "crm_saticilar" , "satici_id" , "satici_kodu=:satici_kodu" ); query.SET_VALUE(":satici_kodu" , m_ui->line_edit_satici_kodu->text() ); if( query.SELECT() NE 0 ){ query.NEXT(); return query.VALUE(0).toInt(); } return -1; }
- Satıcı satıcı kodu girer ve Ara/Bul butonuna basar.Çıkan ekranda Hayır butonuna basıldıktan sonra sonuçlar widget'larda gösterilir.. :
|
|
FIND_NEXT_RECORD
Bu fonksiyon , sistemimizdeki kayıtlar arasında gezmeyi sağlar.Kullanıcı Sonraki butonuna bastığında Kernel tarafından çağırılır.
Form ekranında bir kayıt bulunuyorsa , o kayıttan sonra veri tabanımıza eklenen kaydın id'sini bulur ve return eder.Eğer form ekranında kayıt bilgisi yok ise , ilk kaydın id'sini return eder.Butona basıldığında her basışta bir sonraki kaydı bulur ve id'sini return eder.
Sistemimizdeki son kayda geldiğinde daha ilerisi olmadığı için -1 return eder.Bu fonksiyondan sonra GET_RECORD fonksiyonu ile kaydın bilgileri forma yükleneceği için bu fonksiyonda kaydın bilgilerini forma yüklemiyoruz.Bu fonksiyonda kaydı bulup kaydın id'sini return ediyoruz , bulamazsak -1 return ediyoruz.
- Satıcı örneğimize göre fonksiyonu kodlayalım.. :
int CRM_SATICILAR::FIND_NEXT_RECORD () { SQL_QUERY query(DB); query.PREPARE_SELECT("crm_saticilar","satici_id", "satici_kodu > :satici_kodu"); query.SET_VALUE( ":satici_kodu", m_ui->line_edit_satici_kodu->text()); if ( query.SELECT("satici_kodu ASC",0,1) NE 0 ) { query.NEXT(); return query.VALUE(0).toInt(); } return -1; }
- Örneğimizi çalıştıralım ve Bir sonraki butonu ile fonksiyonumuzu test edelim.. :
|
|
- Sonraki kaydı bulurken kernel bu akış şemasını izler..
FIND_PREV_RECORD
Bu fonksiyon , sistemimizdeki kayıtlar arasında gezmeyi sağlar.
Kullanıcı Önceki butonuna bastığında Kernel tarafından çağırılır.Form ekranında bir kayıt bulunuyorsa , o kayıttan önce veri tabanımıza eklenen kaydın id'sini bulur ve return eder.Eğer form ekranında kayıt bilgisi yok ise , -1 return eder.Butona basıldığında her basışta bir öncek kaydı bulur ve id'sini return eder.
Bu fonksiyondan sonra GET_RECORD fonksiyonu ile kaydın bilgileri forma yükleneceği için bu fonksiyonda kaydın bilgilerini forma yüklemiyoruz.Bu fonksiyonda kaydı bulup kaydın id'sini return ediyoruz , bulamazsak -1 return ediyoruz.
- Satıcı örneğine göre fonksiyonumuzu kodlayalım.. :
int CRM_SATICILAR::FIND_PREV_RECORD () { SQL_QUERY sql_query( DB ); sql_query.PREPARE_SELECT("crm_saticilar", "satici_id ", "satici_kodu < :satici_kodu "); sql_query.SET_VALUE( ":satici_kodu", m_ui->line_edit_satici_kodu->text()); if ( sql_query.SELECT( "satici_kodu DESC",0,1) NE 0 ) { sql_query.NEXT(); return sql_query.VALUE(0).toInt(); } return -1; }
- Örneğimizi çalıştırarak fonksiyonumuzu test edelim.. :
|
|
- Kernel , önceki kaydı bu akış şemasına izleyerek getirir..
FIND_FIRST_RECORD
Bu fonksiyon , kullanıcı İlk Kayıt butonuna bastığında Kernel tarafından çağırılır.
Bu fonksiyonda sisteme ilk kaydettiğimiz kaydın id'sini bulmamız ve onu return etmemiz gerekmektedir.Kernel bu fonksiyondan sonra return değerine göre GET_RECORD fonksiyonu çağırıp id bilgilerini forma yüklemektedir.
- Satıcı örneğimize göre ilk kaydeilen satıcıyı bulmak isteyelim..Buna göre fonksiyonumuz kodlayalım.. :
int CRM_SATICILAR::FIND_FIRST_RECORD() { SQL_QUERY query(DB); query.PREPARE_SELECT("crm_saticilar" , "satici_id"); if( query.SELECT( "satici_id ASC" , 0 , 1 ) NE 0 ) { query.NEXT() ; return query.VALUE(0).toInt(); } return -1 ; }
- Örneğimizi çalıştırıp , fonksiyonumuzu test edelim.. :
|
|
- İlk kayıt bulunurken kernelın izlediği akış şeması aşağıdaki gibidir..
FIND_LAST_RECORD
Bu fonksiyon , kullanıcı Son Kayıt butonuna bastığında Kernel tarafından çağırılır.
Bu fonksiyonda sisteme en son kaydettiğimiz kaydın id'sini bulmamız ve onu return etmemiz gerekmektedir.Kernel bu fonksiyondan sonra return değerine göre GET_RECORD fonksiyonu çağırıp id bilgilerini forma yüklemektedir.
- Mesela , satıcı örneğimizde , son kaydettiğimiz satıcıyı bulmak isteyelim.. Fonksiyonumuzu buna göre kodlayalım.. :
int CRM_SATICILAR::FIND_LAST_RECORD () { SQL_QUERY query(DB); query.PREPARE_SELECT("crm_saticilar" , "satici_id"); if( query.SELECT( "satici_id DESC" , 0 , 1 ) NE 0 ) { query.NEXT() ; return query.VALUE(0).toInt(); } return -1 ; }
- Örneğimizi çalıştıralım ve fonksiyonumuzu test edelim.. :
|
|
- Kernel , bu akış şemasındaki gibi fonksiyonları çağırarak son kaydı getirir..
LOCK_RECORD
Bu fonksiyon , bir kayıt üzerinde güncelleme yapıldığında kaydı o kullancı için kilitler.
Sistemi kullanan diğer kullanıcılar , kaydı o anda değiştiremezler.Bu fonksiyon , form üzerinde bir kayıt görüntülenirken kullanıcının kayıt bilgilerini değiştir mesiyle Kernel tarafından çağırılır.
int CRM_SATICILAR::LOCK_RECORD( int record_id ) { return DB->LOCK_ROW ( "satici_id", "crm_satici", QString ( "satici_id = %1").arg ( record_id ) ); }
UNLOCK_RECORD
Bu fonksiyon , güncelleme işlemi bitince , kayıt üzerindeki kilidi açar.Kernel , sistemi kullanan herkese güncelleme yapabılabilir hale getirir.
void CRM_SATICILAR::UNLOCK_RECORD( int record_id ) { return DB->UNLOCK_ROW ( "satici_id", "crm_satici", QString ( "satici_id = %1").arg ( record_id ) ); }
Hazir Fonksiyonlar
Bu fonksiyonlar , Form Kernel'ın çalışması için hazırlanmış fonksiyonlardır.Bu fonksiyonlar vasıtasıyla kernel çalışmaya başlamadan bazı özellikleri açıp kapatabilir , otomotik olarak temizlenecek widget'lar belirlenebilir. Burada Batch Kernel'ın hazır fonksiyonlarıda kullanılmaktadır.Sadece FORM KERNEL için yazılmış ve önemli olanlar anlatılacaktır.
DISABLE_CLEAR_ON_WIDGET
Bu fonksiyon , parametre olarak gönderidiğimiz widget'ın kernel tarafından otomatik olarak temzilenmesini engeller.
SET_SINGLE_RECORD_MODE
Bu fonksiyon , Form Kernel'ı sadece bir kayıt ile çalıştırır.Yani form açıldığında sadece yenile ve kaydet butonları aktif olur.Sistem daha önceden eklenmiş bir kayıt üzerinde güncelleme yapacak şekilde çalışır.
AUTOSTART_FORM_KERNEL
Form Kernel'ı verilen form ile otomatik olarak başlatır.
FORM KERNEL Tasariminda Dikkat Edilmesi Gereken Kurallar
- Fonksiyonların akış şemasına göre görev dağılımı yapılmalıdr.
- SINGLE_RECORD_MODE'ta çalışılıyorsa database'de mutlaka bir kayıt bulunmalıdır.
- Form'da kullanılacak lineEdit'lerin ve limitedTextEdit'lerin maksimum kelime uzunlukları SETUP_FORM'da belirlenmelidir.
- TextEdit yerine LimitedTextEdit kullanılmalıdır.