| |||||||||
| |
Üyelerimiz görüşlerini önceden onay olmadan anında yazabilmektedir, bu yazılardan dolayı doğabilecek her türlü sorumluluk yazan kullanıcılara aittir, (Bütün kullanıcıların IP adresleri tutulmaktadır) misafir.net yöneticileri itina ile icerik kontrolleri yapmaktadır, yine de misafir.net'te yasalara aykırı unsurlar bulursanız MSN: Private@misafir.net adresinden bizlere ulaşabilirsiniz, gereği yapılacaktır.
|
| |||||||
| Programlama C,C++,Visual C, Flash vb. programlama ile ilgili herşey.. |
| Tags |
basic, bulabilirsiniz, herseyi, ile, ilgili, visual ![]() |
| ||
![]() |
| | LinkBack | Seçenekler |
| | #12 (permalink) |
| aLkoLSüZ!!! ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() REP Gücü : 100 REP Puanı : 704162779 REP Seviyesi : ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Program çalıştırıldığında aşağıdaki ekran görüntüsü belirecektir. DBCombo nesnesinin üç farklı biçimi vardır. Bunlar; Dropdown combo Metin kutusu ve listeden oluşur. Metin kutusuna listede olmayan elemanlar girilebilir. Yandaki ok düğmesine basıldığında aşağı doğru bir liste açılır. Simple combo Listesi aşağı doğru açılan türden değildir. Listede olmayan elemanlar girilebilir. Dropdown list Aşağı doğru açılan bir listesi vardır. Listede olmayan elemanlar metin kutusuna girilemez. Örnek : İki Data Control nesnesinin aynı anda kullanımı ve DBCombo kontrol nesnesinin önemi. DBCombo nesnesinin önemi birden fazla tablo ile işlem yapmak gerektiğinde daha da açık bir şekilde kendisini gösterecektir. Bir veritabanında iki ayrı tablo olduğunu düşünelim. Bunlardan 1. Tablodaki bir alan 2. Tablodaki bir alanı referans olarak gösteriyorsa, 1. Tabloya veri girileceği zaman referans gösteren alana girilecek veri 2. Tabloda olmak zorundadır. Bu bilginin var olup olmadığının kontrol edilmesi veya var olan bir bilginin girilmesi için bir listeye ihtiyaç duyulur. Bu durumu örneklemek için daha önce de kullandığımız BIBLIO.MDB veritabanındaki iki tabloyu göz önüne alalım. Bu tablolar, Titles (kitaplar) ve Publishers (Yayıncılar) tablolarıdır. Kitap bilgilerinin tutulduğu Titles tablosunda yayıncılar tablosu olan Publishers tablosuna referans gösteren PubId (Yayıncı numarası) adlı bir alan mevcuttur. Bu alana girilecek olan değer var olmayan bir yayıncının numarası olamayacağından önce varlığı kontrol edilmelidir. Bu durumu daha açık hale getirmek için yeni bir proje başlatın ve aşağıdaki nesneleri projeye ekleyin. Formun genel görünümü ileride verilmiştir. Nesnelerin yerleşim planı için ilerideki form görünümünü kullanın. Form Caption Kitap Adları Name frmKitaplar DataControl Name datYEvi Connect Access Databasename BIBLIO.MDB RecordsetType 2-Snopshot Recordsource Select PubID,Name From Publishers Visible False CommandButton Name cmdKapat Caption &Kapat CommandButton Name cmdDegistir Caption &Değiştir CommandButton Name cmdYenile Caption &Yenile CommandButton Name cmdSil Caption &Sil CommandButton Name cmdEkle Caption &Ekle DataControl Name datKitap Align 2- AlignBottom Connect Access Databasename BIBLIO.MDB Readonly False RecordsetType 1-Dynaset RecordSource Titles DBCombo Name dbcYEvi DataField PubID DataSource datKitap ListField Name BoundColumn PubID Text Yayinevleri RowSource datYEvi Style 2- Dropdown list TextBox Name txtKAd DataField Title DataSource datKitap TextBox Name txtYil DataField Year Published DataSource datKitap TextBox Name txtISBN DataField ISBN DataSource datKitap TextBox Name txtTanim DataField De******ion DataSource datKitap TextBox Name txtNotlar DataField Notes DataSource datKitap TextBox Name txtKonu DataField Subject DataSource datKitap TextBox Name txtYorumlar DataField Comments DataSource datKitap Multiline 1-True ScrollBar 2-Vertical Bunlardan başka 8 tane de Label yerleştirin ve başlıklarını ileride verilecek olan form görüntüsünden yararlanarak değiştirin. Şimdi aşağıdaki kodu frmKitaplar formuna ekleyin. Private Sub cmdDegistir_Click() datKitap.UpdateRecord datKitap.Recordset.Bookmark = datKitap.Recordset.LastModifie d End Sub Private Sub cmdEkle_Click() datKitap.Recordset.AddNew End Sub Private Sub cmdKapat_Click() Unload Me End Sub Private Sub cmdSil_Click() datKitap.Recordset.Delete datKitap.Recordset.MoveNext End Sub Private Sub cmdYenile_Click() datKitap.Refresh End Sub Private Sub datKitap_Error(DataErr As Integer, Response As Integer) MsgBox "Hata: " & Error$(DataErr) Response = 0 End Sub Private Sub datKitap_Reposition() Screen.MousePointer = vbDefault On Error Resume Next datKitap.Caption = (datKitap.Recordset.AbsolutePo sition + 1) _ & ". TUTANAK" End Sub Programı çalıştırın. Aşağıdaki ekran görüntüsü çıkacaktır. Şimdi, DBCombo kontrol nesnesinin özelliklerini tekrar inceleyelim DBCombo Name dbcYEvi DataField PubID DataSource datKitap ListField Name BoundColumn PubID Text Yayinevleri RowSource datYEvi Style 2- Dropdown list DataSource özelliği Varlığı kontrol edilecek verilerin alınacağı DataControl nesnesini belirler. Burada Kitaplar tablosu. RowSource özelliği Listeye konacak olan verilerin alınacağı DataControl nesnesini belirler. Burada Yayıcılar tablosundan seçilen kısım. ListField özelliği Listelenecek alanı belirler. Burada Yaınevinin adı. BoundColumn özelliği Referans gösterilen tablo alanını belirler. Burada Yayıncılar tablosundan Yayıncı numarası. DataField özelliği Karşılaştırılacak olan alanı belirler. Burada Kitaplar tablosundan Yayıncı numarası. Tablolardan görüleceği gibi, Kitaplar tablosunda Yayıncı adı alanı bulunmamaktadır. Yayıncı adına erişmek için buradaki, Yayıncı numarası (PubID) alanından faydalanılmaktadır. Bu numaranın Yayıncılar tablosunda gösterdiği yayıncının adı alınıp listeye konmaktadır. Yeni bir kayıt eklenirken Yayıncı adını listeden seçmek, eklenecek olan kayda yayıncı numarası vermekle eşdeğerdir. Yayıncı numarası otomatik olarak kayda eklenecektir. Örnek : Data Bound Grid kontrol nesnesinin kullanımı. Data Bound Grid kontrol nesnesi, verilerin çizelgeler halinde gösterilebilmesini ve değiştirilebilmesini sağlar. Data Control nesnesi ile doğrudan bağlanabilir. Bu özellik tablo içeriğinin doğrudan çizelgeye aktarılmasını sağlar. Kullanımı en basit Data Bound Control nesnelerinden biridir. Çalışır duruma gelmesi için sadece yapılması gereken DataSource özelliğinin değiştirilmesi yeterlidir. ADIM 1 : Yeni bir proje yaratın. Aşağıdaki nesneleri formun üzerine ekleyin. Form Caption Data Bound Grid Name frmGrid DataControl Connect Access Databasename BIBLIO.MDB Name datKitap RecordSetType 1-Dynaset RecordSource Titles Visible False Data Bound Grid DataSource datKitap Name dbgKitap ADIM 2 : Bir önceki örnekte kullanılan CommandButton nesnelerinin aynısını tekrar formun üzerine yerleştirin ve bunlara ait kodları da bir önceki örnekteki gibi yazın. Bu kodun yanısıra aşağıdaki kodu da forma ekleyin. Private Sub datKitap_Error(DataErr As Integer, Response As Integer) MsgBox "Hata: " & Error$(DataErr) Response = 0 End Sub Private Sub dbgKitap_HeadClick(ByVal ColIndex As Integer) datKitap.RecordSource = "Select * From Titles Order By [" & _ dbgKitap.Columns(ColIndex).Dat aField & "]" datKitap.Refresh End Sub Burada ilk yordam herhangi bir hata oluştuğunda hatanın pas geçilmesini, ikinci yordam ise çizelgedeki sütunlardan birine basıldığında çizelge içeriğinin o sütuna göre sıralı olmasını sağlar. Bunun için bir SQL sorgusu kullanılmaktadır. Sıralamayı sağlayan kısım SQL sorgusundaki Order By ile başlayan kısımdır. Programın çalışması aşağıdaki gibi olacaktır. Buradaki çizelge Kitap ismine göre sıralıdır. Bu Kitap adı(Title) yazan yere mouse ile basılarak sağlanmıştır. Örnek : MSFlexGrid Control nesnesinin kullanımı. Bu kontrol nesnesi Data Bound Grid nesnesinin sağladığı özelliklerin hepsini sağlar. Farklı bir özelliği, üzerinde değişiklik yapılamamasıdır. Bu nesne verilerin gösterilmesinde, gruplanmasında ve yönetiminde çok büyük avantajlar sağlar. Bu örnekte MsFlexGrid nesnesinin bazı özelliklerinin ve metotlarının kullanımı konu edilecektir. Yeni bir proje çalıştırın. Aşağıdaki nesneleri bu projedeki formun üstüne yerleştirin. Nesneleri yerleştirirken ileride verilecek olan form görüntüsünü referans olarak kullanabilirsiniz. Form Caption Flex Grid Name frmFlexGrid DataControl Connect Access Databasename BIBLIO.MDB Name datYazar RecordSource Authors Visible False MsFlexGrid Name MsFlexGrid1 DataSource datAuthors AllowBigSelection False GridLines 0-flexGridNone GridLinesFixed 0-flexGridNone AllowUserResizing 1-flexResultsColumns Bunlardan başka 5 tane de CommandButton yerleştirin ve Caption özelliklerini sırasıyla; Grid Lines, Grid Lines Fixed, ForeColor, Font ve BackColor olarak değiştirin. Aşağıdaki kodu frmFlexGrid formuna ekleyin. Private Sub Command1_Click() If MSFlexGrid1.GridLines < flexGridRaised Then MSFlexGrid1.GridLines = MSFlexGrid1.GridLines + 1 Else MSFlexGrid1.GridLines = flexGridFlat End If End Sub Private Sub Command2_Click() If MSFlexGrid1.GridLinesFixed < flexGridRaised Then MSFlexGrid1.GridLinesFixed = MSFlexGrid1.GridLinesFixed + 1 Else MSFlexGrid1.GridLinesFixed = flexGridFlat End If End Sub Private Sub Command3_Click() Static iClicks As Integer Select Case iClicks Case 0: MSFlexGrid1.CellForeColor = &HFF& Case 1: MSFlexGrid1.CellForeColor = &HFF00& Case 2: MSFlexGrid1.CellForeColor = &HFF0000 Case 3: MSFlexGrid1.CellForeColor = 1: iClicks = -1 End Select iClicks = iClicks + 1 End Sub Private Sub Command4_Click() Static iClicks As Integer Select Case iClicks Case 0: MSFlexGrid1.CellFontBold = 1 Case 1: MSFlexGrid1.CellFontItalic = 1 Case 2: MSFlexGrid1.CellFontBold = 0 Case 3: MSFlexGrid1.CellFontItalic = 0: iClicks = -1 End Select iClicks = iClicks + 1 End Sub Private Sub Command5_Click() Static iClicks As Integer Select Case iClicks Case 0: MSFlexGrid1.CellBackColor = &HFF& Case 1: MSFlexGrid1.CellBackColor = &HFF00& Case 2: MSFlexGrid1.CellBackColor = &HFF0000 Case 3: MSFlexGrid1.CellBackColor = &HFFFFFF: iClicks = -1 End Select iClicks = iClicks + 1 End Sub Burada ilk iki yordam çizgi biçimini basıldıkça döngü halinde değiştirir. Diğer yordamlar da sırasıyla aktif olan hücrenin yazı rengini, font biçimini ve geri plan rengini yine döngü halinde değiştirir. Programın çalışma sırasındaki görünüş örneği aşağıdadır. Örnek: Şimdi yukarıdaki örnek üzerinde biraz değişiklik yapıp MSFlexGrid kontrol nesnesinin bir özelliğini daha görelim. ADIM 1 : Yukarıdaki formu sağa doğru biraz genişletip ileride gösterilen biçime getirin. Bu forma bir CheckBox yerleştirin ve Caption özelliğini Merge Cells olarak değiştirin. Bu hücreleri birleştirmek için kullanılacak olan işaret kutusudur. ADIM 2 : datYazar Data Control nesnesinin aşağıdaki özelliklerini değiştirin. Name datTKitap RecordSource All Titles ADIM 3 : Aşağıdaki kodu frmFlexGrid formunun sonuna ekleyin. Private Sub Init() Dim i As Integer MSFlexGrid1.Row = 0 For i = 0 To MSFlexGrid1.Cols - 1 MSFlexGrid1.Col = i MSFlexGrid1.CellFontSize = 8 MSFlexGrid1.CellAlignment = 1 MSFlexGrid1.MergeCol(i) = True Next i MSFlexGrid1.MergeCells = 0 End Sub Private Sub Check1_Click() MSFlexGrid1.MergeCells = Check1 End Sub Burada init diye adlandırılan yordam MSFlexGrid nesnesinin sütunlarının birleşmeye uygun hale getirilmesini ve görünümünün düzgün olmasını sağlar. Bu yordam Form_Load olay yordamında çağrılmalıdır. Programın bu yeni haliyle çalışması aşağıdaki gibidir. Görüleceği gibi aynı olan değerler birleştirilmiş ve tek bir hücre haline getirilmiştir. Bu özelliklerinden başka MSFlexGrid yapısında hücrelere resim yerleştirmek de mümkündür. MSFlexGrid yapısı DataControl nesnesi kullanılmadan da kullanılabilir. Bu durumda hücreleri doldurmak için AddItem metodu kullanılır. 3. VERİ ERİŞİM NESNELERİNİN KULLANIMI 3.1. Giriş Bu bölümde Microsoft Jet veritabanı motoru ve onun programlama modeli olan DAO (Data Access Objects – Veri Erişim Nesneleri) konu edilecektir. Bunun için ilişkisel veritabanı tasarımı, yaratılması, bakımı ve değiştirilmesi konu edilecektir. Bu bölümde DAO metotları kullanılarak; • Veritabanı tanımlama • Alan tanımlama • İndeks (Dizin) tanımlama • Tablolar arasında ilişki tanımlama • Veritabanlarının yapısında değişiklik yapma • Var olan bir veritabanı üzerinde işlem yapma konularına açıklık getirilecektir. Microsoft Jet Veritabanı Motoru Visual Basic programlama dilindeki veri erişim olanağı, Microsoft Access yazılımının da temel olarak kullandığı Microsoft Jet veritabanı motoruna dayanmaktadır. Jet motoru, verilerin saklanması, geri getirilmesi ve değiştirilmesi için bir mekanizmanın yanısıra güçlü DAO nesne tabanlı arabirimini de kullanıcıya sağlar. Bir veri tabanı uygulaması üç kesimden oluşur. Bunlar; • Kullanıcı arabirimi • Veritabanı motoru • Verilerin tutulduğu fiziksel ortam kesimleridir. Veritabanı motoru, yazılım ile fiziksel veritabanı dosyaları arasında iletişimi sağlar. Bu kullanıcıyı veritabanı dosyalarından soyutlar ve hareket serbestliği sağlar. Kullanıcı artık veritabanının türü ile ilgilenmek durumunda değildir. Bütün veritabanı biçimleri için aynı tür erişimler veritabanı motoru tarafından sağlanmaktadır. Kullanıcı arabirimi, kullanıcının karşı karşıya kaldığı programın dış yüzüdür. Bu kesim, kullanıcının verileri görmesine, değiştirmesine ve veri eklemesine yardımcı olan, formlardan oluşan kesimdir. Bu formların yaptığı işlerle ilgilenen kesim ise uygulama yazılımının kodudur. Bu kod kullanıcının görsel olarak belirttiği işlemleri veritabanı motoruna iletmekle yükümlüdür. Jet veritabanı motoru bir takım DLL kütüphaneleri halinde Visual Basic aracılığıyla kullanılır. Jet motoru veritabanı üzerindeki işlemler dışında ayrıca bir sorgu işleyici de barındırır. Bu sorgu işleyici SQL sorgularını veritabanı üzerinde çalıştırır ve sorgu sonuçlarını döndürür. Veritabanı fiziksel ortamda dosyalar halinde tutulur. Bu dosyalar sadece verileri tutmakla yükümlüdür. Uygulama yazılımları bu dosyaların sadece adı ile muhatap olur. Bu dosyalarda verilerin nasıl tutulduğu veritabanı motorunu ilgilendirir. Burada bahsedilen üç kesim değişik biçimlerde bölünebilir. Bu üç kesimin bir bilgisayar üzerinde tek bir kullanıcı tarafından kullanılması sözkonusu olabileceği gibi, birbirine ağ yapısı ile bağlı farklı bilgisayarlar üzerinde de bulunmaları mümkündür. Örneğin veritabanı bir ana bilgisayarın üzerinde bulunabilir, kullanıcılar ise bu veritabanına bir ağ üzerinden ulaşabilirler. Kullanıcının veritabanından uzak (farklı bir bilgisayarda) olduğu durumda iki ayrı yapı sözkonusudur. • Uzak veri tabanı sistemi (Remote Database) • İstemci/Sunucu veritabanı sistemi (Client/Server Database) Bunlardan birincisinde veritabanı motoru kullanıcı ile aynı bilgisayarda, ikincisinde ise veritabanı motoru veritabanı ile aynı bilgisayar üzerinde bulunur. Veritabanı motoru aynı anda birden fazla kullanıcıdan istek alır ve istedikleri kayıtları veritabanı üzerinde işlem yaparak geri döndürür. Jet veritabanı motoru Client/Server bir yapıya sahip değildir. Yerel bir veritabanı motorudur. Uygulama ile aynı bilgisayarda bulunur. İşlevleri bir DLL halinde bulunur. Eğer bir uygulama programının farklı bilgisayarlar üzerinde kopyaları varsa herbirinin kendi Jet veritabanı motoru DLL dosyalarına sahip olması gerekir. Visual Basic kullanarak Client/Server veritabanları ile çalışmak da mümkündür. Bunun için ODBC standardı kullanılarak sorgular doğrudan ODBC server olarak adlandırılan veritabanı sunucusuna gönderilebilir. Veri erişim nesnesi modeli Jet veritabanı motorunun veritabanı motorudur. Bu model aşağıdaki çizimdeki sıradüzensel yapı ile ifade edilmektedir. Bu yapıdaki elemanların herbiri aslında bir sınıfı temsil etmektedir. Bu sınıfın bir nesnesini yaratmak için ise, örneğin; Dim MyWs as Workspace gibi bir komut kullanmak gerekir. Yukarıdaki şemada DBEngine dışındaki elemanlar hem küme(Collection) hem de nesne olarak kullanılabilirler. Kümelerin elemanlarına sıfırdan başlayan bir dizinli yapı ile erişmek mümkündür. Bu erişim için aşağıdaki gösterim bir örnek olarak verilebilir. DBEngine.Workspaces(0).Databas es(0).TableDefs(0).Fields("Müş teriNo") Şu ana kadar veritabanı kavramlarına genel bir giriş yapılmış oldu. Veritabanları üzerinde işlem yapılırken iki tür dilden bahsedilir. Bunlar; • DDL (Data Definition Language – Veri tanımlama dili) • DML (Data Manipulation Language – Veri işleme dili) Bu sözkonusu olan farklı iki dil olduğu anlamına gelmez. Bu sadece verilerle işlem yapılırken kullanılırken yapılan bir gruplamadır. Veri Tanımlama(DDL), bir veritabanının tanımlaması ve yaratılması için gerekli özellikleri ve metotları içerir. Veritabanının yaratılması bir defaya mahsus yapılan bir işlemdir. Bir defa veritabanı yaratıldıktan sonra, onu açmak tüm yapısına erişmek anlamına gelir. Veri İşleme(DML), varolan veritabanlarına erişebilen ve onların üzerinde işlem yapabilen uygulama yazılımları yazmak için gerekli özellikleri ve metotları içerir. Bu veritabanını sorgulama, tabloları üzerinde dolaşma, tutanaklar üzerinde değişiklik, ekleme, silme gibi işlemler yapmayı içerir. Var olan veritabanlarını kullanmak için sadece DML yeterlidir. Fakat DDL metotlarını ve özelliklerini anlamak veritabanının yapısını daha iyi kavrama ve veritabanı üzerinde daha rahat işlem yapabilme olanağı sağlar. 3.2. Recordset Yapısı İle Çalışmak Recordset yapısı veritabanına erişimi sağlayan bir nesne yapısıdır. Bir Recordset nesnesi, bir tablodaki tutanakları veya bir sorgunun sonucunda döndürülen tutanak kümelerini temsil eder. Beş farklı Recordset nesnesi vardır. Bunların herbiri farklı özellikler gösterir. Bunlar, Table , Dynaset , Snapshot , Dynamic ve Forward-only nesneleridir. Table (Tablo) Kullanılan veritabanı üzerindeki bir tabloyu belirtir. Bu türden bir Recordset yaratıldığında, veritabanı motoru veritabanındaki bir tabloyu açar ve işlemler onun üzerinde gerçekleştirilir. Bir tablo türündeki Recordset ilişkilendirildiği veritabanı tablosunun indeks yapısını kullanabilir. Bu durum, hızlı arama yapabilme olanağı sağlar. Dynaset Kullanılan veritabanı üzerinde yerel olarak var olan veya bu veritabanına bağlı olan tablolar ile bir sorgu sonucunda oluşturulan tabloları da temsil edebilir. Genelde bir veya birden fazla tablonun tutanaklarına referans kümeleri içerir. Bu yapı veritabanı üzerinde çok esnek bir erişim sağlar, farklı türden veritabanları üzerinde aynı Recordset yapısı kullanarak işlem yapmaya olanak sağlar. Bu avantajının yanısıra birden fazla tabloya çok sayıda bağ içerdiğinden dolayı çalışma esnasında yavaş olduğu görülür. Snapshot Yaratıldığı anda ilişkilendirildiği verilerin sabit bir kopyasını barındırır. Jet veritabanı motoru tarafından kullanılan snapshot yapısında değişiklik yapılamaz. Ancak ODBC veritabanları sunucunun olanaklarına göre snapshot yapısı kullanarak değişiklik yapmaya izin verebilir. Snapshot işlem miktarını azalttığı için daha hızlı bir yapıdır. Bir sorgu sonucu bu yapı ile çok hızlı bir şekilde elde edilebilir. Forward-only Forward-scrolling snapshot veya forward-only snapshot olarak adlandırıldığı da olur. Snapshot yapısının sağladığı olanakların bir alt kümesini sunar. En az işlevselliği olan Recordset yapısıdır, bu yüzden en hızlı işlem yapan yapıdır. Bu yapıda da snapshot yapısında olduğu gibi değiştirme yapılamaz. Bunun yanısıra bir kısıtlama daha vardır, bu da sadece ileriye doğru hareket edebilme özelliğidir. Dynamic Bir veya birden fazla tabloyu içeren bir sorgu sonucunu tutmak için kullanılır. Bu yapıda ekleme, silme değiştirme gibi özellikler de sağlanır. Kullanıldığı sırada tablolardaki değişiklik de hemen bu yapıya yansır. Bu yapı ODBC veritabanılarındaki Dynamic Cursor yapısını temsil eder. Recordset türleri kullanılırken dikkat edilmesi gereken bir unsur, Snapshot yapısı kullanılırken verilerin tümünün bir kopyasının alındığıdır. Bu haliyle bazen bir Dynaset yapısı, Snapshot yapısından daha hızlı olabilir. Genel olarak eğer Table türü bir Recordset kullanmak mümkünse öncelikli olarak bu yapı tercih edilmelidir. Veritabanına erişim için Recordset yapısının kullanımını örneklemeden önce veritabanının nasıl tasarlandığını ve yaratıldığını bir örnekle açıklayalım. 3.2.1 Veritabanı Tasarımı ve Yaratılması Veritabanı tasarlama ve yaratma konusu işlenirken bir veritabanının tasarlanması şarttır. Bunun için aşağıdaki kısıtlı olarak tasarlanmış PERSONEL veritabanını kullanalım. Bu veritabanı bir kurumda çalışan personel ile ilgili birtakım bilgileri saklamak için kullanılıyor varsayalım. PERSONEL veritabanı Bu veritabanında aşağıdaki tabloların bulunduğunu düşünelim. 1. PERSONEL_BIL(SICNO, AD_SOYAD, DTAR, DYER) SICNO: Sicil numarası, anahtar AD_SOYAD: Personelin adı ve soyadı DTAR: Doğum tarihi DYER: Doğum yeri 2. PERSONEL_GOREV(SICNO, CYIL, GNO, DERECE, MNO) SICNO: Sicil numarası, anahtar CYIL: Kurumda çalıştığı yıl sayısı GNO: Görev numarası DERECE: Personelin kadro derecesi MNO: Meslek numarası 3. MESLEKLER(MNO, MADI, ACIKLAMA) MNO: Meslek numarası, anahtar MADI: Meslek adı ACIKLAMA: Meslekle ilgili açıklama 4. GOREVLER(GNO, GADI) GNO: Görev numarası GADI: Görev numarası Bu veritabanını yaratmak için Standart EXE türünde bir proje yaratın. Üzerine iki tane CommandButton yerleştirin. Caption özelliklerini sırasıyla Yarat ve CIKIŞ olarak değiştirin ve aşağıdaki kodu forma ekleyin. Option Explicit Private Sub Command1_Click() Dim ws As Workspace Dim db As Database Dim tdf As TableDef Dim fld As Field Set ws = DBEngine.Workspaces(0) Set db = ws.CreateDatabase(App.Path & _ "\PERSONEL.MDB", dbLangTurkish) 'PERSONEL_BIL tablosu Set tdf = db.CreateTableDef("personel_bi l") Set fld = tdf.CreateField("sicno", dbText, 10) tdf.Fields.Append fld Set fld = tdf.CreateField("ad_soyad", dbText, 30) tdf.Fields.Append fld Set fld = tdf.CreateField("dtar", dbDate) tdf.Fields.Append fld Set fld = tdf.CreateField("dyer", dbText, 15) tdf.Fields.Append fld db.TableDefs.Append tdf 'PERSONEL_GOREV tablosu Set tdf = db.CreateTableDef("personel_go rev") Set fld = tdf.CreateField("sicno", dbText, 10) tdf.Fields.Append fld Set fld = tdf.CreateField("CYIL", dbInteger) tdf.Fields.Append fld Set fld = tdf.CreateField("gno", dbInteger) tdf.Fields.Append fld Set fld = tdf.CreateField("derece", dbInteger) tdf.Fields.Append fld Set fld = tdf.CreateField("mno", dbInteger) tdf.Fields.Append fld db.TableDefs.Append tdf 'MESLEKLER tablosu Set tdf = db.CreateTableDef("gorevler") Set fld = tdf.CreateField("mno", dbInteger) tdf.Fields.Append fld Set fld = tdf.CreateField("MADI", dbText, 40) tdf.Fields.Append fld db.TableDefs.Append tdf 'GOREVLER tablosu Set tdf = db.CreateTableDef("meslekler") Set fld = tdf.CreateField("gno", dbInteger) tdf.Fields.Append fld Set fld = tdf.CreateField("GADI", dbText, 40) tdf.Fields.Append fld db.TableDefs.Append tdf db.Close Label1.Caption = "PERSONEL VERİTABANI YARATILDI" Command1.Enabled = False End Sub Private Sub Command2_Click() End End Sub Program çalıştırıldıktan sonra aşağıdaki form görüntüsü ekrana çıkar, fakat üstteki yazı yoktur. Yarat düğmesine basıldıktan sonra üstteki yazı belirir. Daha sonra yapılması gereken ÇIKIŞ düğmesine basarak programdan çıkmaktır. Programdan çıktıktan sonra programla aynı dizinde PERSONEL.MDB adlı bir veritabanı kütüğü yaratılmış olur. Bu veritabanının alanlarını görmek için Visual Basic dizinindeki Visdata.exe programı kullanılabilir. İndeks Yaratma. Veritabanını yarattıktan sonra sıra indeks ekleme işlemine geldi. İndeksler veritabanı üzerinde arama yapılırken hızlı ve kolay erişim sağlayan veritabanı öğeleridir. Yukarıdaki projenin Command1_Click olay yordamını kaldırın ve form üzerindeki Yarat butonunun Caption özelliğini İndex Yarat olarak değiştirin ve aşağıdaki kodu Command1_Click olayına ekleyin. Private Sub Command1_Click() Dim ws As Workspace Dim db As Database Dim tdf As TableDef Dim fld As Field Dim idx As Index Set ws = DBEngine.Workspaces(0) Set db = ws.OpenDatabase(App.Path & "\PERSONEL.MDB") 'PERSONEL_BIL tablosu için indeks yaratma Set tdf = db.TableDefs("personel_bil") Set idx = tdf.CreateIndex("ind_sicno") Set fld = idx.CreateField("sicno") idx.Fields.Append fld Set fld = Nothing idx.Primary = True idx.Unique = True tdf.Indexes.Append idx 'PERSONLE_GOREV tablosu için indeks yaratma Set tdf = db.TableDefs("personel_gorev") Set idx = tdf.CreateIndex("ind_sicno") Set fld = idx.CreateField("sicno") idx.Fields.Append fld Set fld = Nothing idx.Primary = True idx.Unique = True tdf.Indexes.Append idx 'MESLEKLER tablosu için indeks yaratma Set tdf = db.TableDefs("meslekler") Set idx = tdf.CreateIndex("ind_mno") Set fld = idx.CreateField("mno") idx.Fields.Append fld Set fld = Nothing idx.Primary = True idx.Unique = True tdf.Indexes.Append idx 'GOREVLER tablosu için indeks yaratma Set tdf = db.TableDefs("gorevler") Set idx = tdf.CreateIndex("ind_gno") Set fld = idx.CreateField("gno") idx.Fields.Append fld Set fld = Nothing idx.Primary = True idx.Unique = True tdf.Indexes.Append idx db.Close Label1.Caption = "TABLO İNDEKSLERİ YARATILDI" Command1.Enabled = False End Sub Program çalıştırıldıktan sonra aşağıdaki form görüntüsü ekrana çıkar, fakat üstteki yazı yoktur. İndeks yarat düğmesine basıldıktan sonra üstteki yazı belirir. Daha sonra yapılması gereken ÇIKIŞ düğmesine basarak programdan çıkmaktır. Programdan çıktıktan sonra Visual Basic dizinindeki Visdata.exe programı kullanılarak indekslerin yaratılıp yaratılmadığı kontrol edilebilir. İlişki Yaratma. İki farklı tabloda aynı olan alanların tutarlılığını denetlemek için bu tablolar arasında bağ kurma işlemine ilişki yaratma denir. Yukarıdaki veritabanı için konuşacak olursak, PERSONEL_BIL tablosunda olmayan bir personel, PERSONEL_GOREV tablosunda da olmamalıdır. Bunu sağlamak için iki tablo arasında bir ilişki tanımlamak şarttır. Jet veritabanı motoru ilişki tanımlamak için Relation diye bir nesne sağlar. Bir veritabanına ilişki eklemek için: 1. Database nesnesinin CreateRelation metodunu kullanarak bir ilişki nesnesi yaratın. 2. İlişkinin dayandığı alanları belirlemek için Relation nesnesinin CreateField metodunu kullanarak bir alan yaratın. 3. Yaratılan bu alanı yaratılmış 1. Adımda yaratılan ilişki nesnesine ekleyin. Sonra bu ilişkiyi veritabanına ekleyin. Bu adımların uygulanmış hali olan aşağıdaki kodu, yukarıdaki formun Command1_Click olay yordamını silerek yerine yazın. Private Sub Command1_Click() Dim ws As Workspace Dim db As Database Dim fld As Field Dim rel As Relation Set ws = DBEngine.Workspaces(0) Set db = ws.OpenDatabase(App.Path & "\PERSONEL.MDB") 'PERSONEL_BIL ile PERSONEL_GOREV tablosu arasında 'p_gorevi (personelin görevi) ilişkisi yaratma Set tdf = db.CreateRelation("p_gorevi") rel.Table = "personel_bil" rel.ForeignTable = "personel_gorev" Set fld = rel.CreateField("sicno") fld.ForeignName = "sicno" rel.Fields.Append fld db.Relations.Append rel 'PERSONEL_GOREV ile GOREVLER tablosu arasında 'g_ad (görev adı) ilişkisi yaratma Set tdf = db.CreateRelation("g_ad") rel.Table = "gorevler" rel.ForeignTable = "personel_gorev" Set fld = rel.CreateField("gno") fld.ForeignName = "gno" rel.Fields.Append fld db.Relations.Append rel 'PERSONEL_GOREV ile MESLEKLER tablosu arasında 'm_ad (meslek adı) ilişkisi yaratma Set tdf = db.CreateRelation("m_ad") rel.Table = "meslekler" rel.ForeignTable = "personel_gorev" Set fld = rel.CreateField("mno") fld.ForeignName = "mno" rel.Fields.Append fld db.Relations.Append rel db.Close Label1.Caption = "İLİŞKİLER YARATILDI" Command1.Enabled = False End Sub Program yine yukarıdakilere benzer bir biçimde çalışacak ve belirtilen üç ilişkiyi yaratacaktır. Bu ilişkilerin veritabanına eklendiği yine VISDATA programı kullanılarak test edilebilir. Bu ilişkiler şunlardır. 1.PERSONEL_GOREV ile GOREVLER tablosu arasında g_ad (görev adı) ilişkisi. 2.PERSONEL_GOREV ile GOREVLER tablosu arasında 'g_ad (görev adı) ilişkisi. 3.PERSONEL_GOREV ile MESLEKLER tablosu arasında m_ad (meslek adı) ilişkisi. VISDATA ile bakıldığında bu ilişkilerin PERSONEL_GOREV tablosuna birer indeks olarak eklendiği görülecektir. Bu ilişkiler veritabanının tutarlılığını devam ettirmesine yardımcı olur. Örneğin bir personelin GOREVLER tablosunda olmayan bir görevi olamaz. 3.2.2. Veritabanına Erişim Veritabanı üzerinde DataControl nesnesi kullanmadan da dolaşmak mümkündür. Bunun için veritabanı ile kontrol nesneleri arasındaki ilişki elle kurulmalıdır. Bunu örneklemek için aşağıdaki proje verilebilir. 1. Formun üstüne aşağıdaki nesneleri ileride verilecek olan form nesnesini referans alarak yerleştirin. Form Name frmDolas Caption Veritabanini Dolasma CommandButton Name Command1 (Control dizisi, 4 elemanlı, Caption özellikleri: |<, <, >, >| TextBox Name Text1 (Control dizisi, 4 elemanlı) CommandButton Name cmdKaydet Caption &Kaydet 2. Projeye bir Class Module ekleyin ve clsDolas.bas olarak kaydedin. Daha sonra aşağıdaki kodu bu Class Module içine ekleyin. Private db As Database Private rs As Recordset Private degisti As Boolean Private mmad As String Private myil As String Private mISBN As String Private mbno As String Public Enum hareket ilk = 1 son = 2 birsonraki = 3 bironceki = 4 End Enum Public Enum hata yhareket = vbObjectError + 1000 + 11 tutanakyok = vbObjectError + 1000 + 12 End Enum Private Sub class_Initialize() Dim dosyaAdi As String dosyaAdi = "c:\devstudio\vb\biblio.md b" Set db = DBEngine.Workspaces(0).OpenDat abase(dosyaAdi) Set rs = db.OpenRecordset("Title", dbOpenDynaset, _ dbSeeChanges, dbOptimistic) If rs.BOF Then HataVer yhareket TutanakOku End Sub Private Sub Class_Terminate() rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub Private Sub HataVer(hatano As hata) Dim tanim As String Dim aciklama As String Select Case hatano Case yhareket: tanim = "YANLIS HAREKET" Case tutanakyok: tanim = "TUTANAK kitaplar tablosunda yok" Case Else: tanim = "TANIMSIZ HATA" End Select aciklama = App.EXEName & ".clsDolas" End Sub Private Sub TutanakOku() mISBN = rs![ISBN] & " " mad = rs![Title] & " " myil = rs![Year Published] & " " mbno = rs![PubID] & " " End Sub Private Sub TutanakGunle() On Error GoTo pHata rs.Edit rs![ISBN] = mISBN rs![Title] = mad rs![Year Published] = myil rs![PubID] = mbno rs.Update degisti = False Exit Sub pHata: rs.MovePrevious rs.MoveNext Err.Raise Err.Number, Err.Source, Err.De******ion, _ Err.HelpFile, Err.HelpContext End Sub Public Property Get ad() As String ad = mad End Property Public Property Let ad(sad As String) mad = sad degisti = True End Property Public Property Get yil() As String yil = myil End Property Public Property Let yil(syil As String) myil = syil degisti = True End Property Public Property Get ISBN() As String ISBN = mISBN End Property Public Property Let ISBN(sISBN As String) mISBN = sISBN degisti = True End Property Public Property Get bno() As String bno = mbno End Property Public Property Let bno(sbno As String) mbno = sbno degisti = True End Property Public Property Get degistimi() As Boolean degistimi = degisti End Property Public Sub git(htur As hareket) On Error GoTo phata: Select Case htur Case ilk: rs.MoveFirst Case son: rs.MoveLast Case birsonraki: rs.MoveNext Case bironceki: rs.MovePrevious Case Else: HataVer yhareket End Select TutanakOku phata: If rs.EOF Or rs.BOF Then HataVer yhareket End Sub Public Sub kaydet() If degisti Then TutanakGunle End Sub Bu kodu biraz inceleyecek olursak, Class_Initialize olayında veritabanı açılıyor, Class_Terminate olayında ise veritabanı kapatılıyor. Daha sonra tutanak okuma, günleme yordamları yer almaktadır. Burada kullanılan veritabanı BIBLIO.MDB veritabanıdır. Recordset olarak da bu veritabanının Titles (Kitaplar) tablosu kullanılmaktadır. Kodun geri kalan kesiminde Recordset yapısının her bir alanı için bir Property tanımlandığı görülebilir. Property Let yordamlarında aktif tutanakta değişiklik yapıldığını belirten degisti adlı bir değişkene True değeri aktarılmaktadır. degistimi adlı Property aktif tutanakta değişiklik yapılıp yapılmadığı bilgisini döndüren sadece okunabilir bir özeliktir. Yukarıdaki kodda görülebileceği gibi veritabanına erişimi destekleyen yordamların yanısıra hata durumlarını ele alan ve hatalı bir duruma girildiğinde hata veren yordamlar da bulunmaktadır. Bu yordamlar kendi hata mesajlarımızı yazmak ve hatalı durumalara gelindiğinde bu mesajları kullanmak amacıyla yazılmıştır. Bu erişim sınıfını tanımladıktan sonra, şimdi de frmDolas formunda yapılması gereken işlemlere dönelim. Aşağıdaki kodu frmDolas formuna ekleyin. Private Kitaplar As clsDolas Private okunuyor As Boolean Private Sub Form_Load() On Error GoTo phata Set Kitaplar = New clsDolas VeriAl pcik: Exit Sub phata: MsgBox Err.De******ion, vbExclamation Unload Me Resume pcik End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) On Error GoTo phata Kitaplar.kaydet pcik: Exit Sub phata: If MsgBox("Olusan hata:" & vbCrLf & Err.De******ion & vbCrLf & _ "devam ederseniz, yaptiginiz degisiklikler kaybolur" & vbCrLf & _ "Devam etmek istiyor musunuz?", vbQuestion Or vbYesNo Or _ vbDefaultButton2) = vbNo Then Cancel = True Resume pcik End Sub Private Sub cmdKaydet_Click() On Error GoTo phata Kitaplar.kaydet VeriAl pcik: Exit Sub phata: MsgBox Err.De******ion, vbExclamation Resume pcik End Sub Private Sub Command1_Click(Index As Integer) On Error GoTo phata Kitaplar.kaydet Select Case Index Case 0: Kitaplar.git ilk Case 1: Kitaplar.git bironceki Case 2: Kitaplar.git birsonraki Case 3: Kitaplar.git son End Select pcik: Exit Sub phata: MsgBox Err.De******ion, vbExclamation Resume pcik End Sub Private Sub Text1_Change(Index As Integer) On Error GoTo phata If Not okunuyor Then Select Case Index Case 0: Kitaplar.ad = Text1(Index).Text Case 1: Kitaplar.yil = Text1(Index).Text Case 2: Kitaplar.bno = Text1(Index).Text Case 3: Kitaplar.ISBN = Text1(Index).Text End Select End If pcik: Exit Sub phata: MsgBox Err.De******ion, vbExclamation Resume pcik End Sub Private Sub VeriAl() okunuyor = True Text1(0).Text = Kitaplar.ad Text1(1).Text = Kitaplar.yil Text1(2).Text = Kitaplar.bno Text1(3).Text = Kitaplar.ISBN okunuyor = False End Sub Burada görüleceği gibi veritabanı üzerinde doğrudan hiç bir işlem yapılmamaktadır. Veritabanı erişimleri formun kodu içinde yapmaktansa sınıfın içinde yapıp bunu formun kodundan saklamak kod yazımında önemli bir kolaylık ve esneklik sağlamaktadır. Bu nesneye yönelik yaklaşımın sağladığı avantajlara bir örnek olarak verilebilir. Formun kodunda yapılan işlemleri sırayla açıklayacak olursak; • Form yüklenirken clsDolas sınıfından bir nesne yaratılmakta ve içine veriler okunmaktadır. • Daha sonra form bellekten silinirken değişiklikler kaydedilmekte ve hata durumunda ne yapılacağı bilgisi kullanıcıya bırakılmaktadır.
__________________ ...FazLamız ERZURUM'LU oLmamız... ...Bir Yar Sevdim... Bin Sekiz Yüz eLLi boyLu!!! ...Bir Yar Sevdim... PALANDÖKEN huyLu!!! ![]() |
| İP: 88.226.105.36 | |












