Veri tabanının yaratmak için gerekli kodlar

Burada, açıklama satırlarını da dikkatle okuyunuz. Kolay olması açısından açıklama satırlarının başına " ‘ " işaretini veya Rem deyimini girmiyorum. Açıklama kod satırının üstünde yer alacak. Uzun açıklamalar ise kod satırlarının veya yordamların dışında ayrı bir paragraf olarak yer alacak.

Form ya da modülün General-Declarations bölümü
Option Explicit
Option Base 0

Public WS as WorkSpace
Public DB as Database

Aşağıdaki GONDERME adlı yordam, programcının belirlediği bir olaydan veya
main yordamından açğrılır. Bu yordam sırası ile veritabanını oluşturacak alt
yordamalara akışı yöneltir.

Public Sub GONDERME()
DOSYAYARAT
MUSTERILERTABLOYARAT
MALHIZMETTABLOYARAT
MALHAREKETTABLOYARAT
PARAHAREKETTABLOYARAT
ILISKIYARAT
End Sub

Public Sub DOSYAYARAT()
on error goto hata
Set WS=DbEngine.WorkSpaces(0) ‘Workspace nesnesi set ediliyor.
Set DB=WS.CreateDatebase(App.Path & _ "\Büro.mdb,dbLangTurkisch,
dbVersion30)
exit sub
hata:
select case err.number
case 3024:
msgbox "Büro.mdb dosyası zaten var!" _
& "Createdatabase yöntemi kullanılamaz!",64
Set DB=WS.OpenDataBase(app.path & _
"\Büro.mdb", true, false)
case else
msgbox err.number & "-" & err.description
end select
End Sub

DOSYAYARAT yordamında WS nesnesine DbEngine nesnesinin WorkSpaces koleksiyonundan bir nesne set edilmektedir. Daha sonra WS nesnesinin
CreateDatabase metodu ile Büro.mdb dosyası oluşturumaktadır.

CreateDatabase yöntemi şu şekilde kulanılır:

Set database = workspace.CreateDatabase (databasename, locale [, options])

burada database, veritabanı için tanımlanan değişkendir.Workspace WorkSpace için anımlanan değişkendir.

Databasename, yaratılacak dosyanın yol bilgisini de içeren adıdır. Yol belirtilmezse aktif dizinde yaratılır. Aktif dizin genellikle programın kurulu olduğu dizin olacaktır. Fakat yine de app.path & "\" eklentisinin yapılarak programın kurulu olduğu dizini göstermekte yarar vardır.

Locale paramatresi, bölgese ayarları belirtir. Sıralama gibi durumlarda hangi dilin esas alınacağını belirtir. DbLangGeneral, genel ingilizceyi,dbLangTurkisch Türkçeyi baz alır.

Options parametresi, seçimlik opsiyonları ifade eder. Alabileceği değerler;
dbEcrypt - şifrelenmiş bir veritabanı yaratır.
DbVersion10, DbVersion11, DbVersion25, DbVersion30, DbVersion35 ise jet
engineenin hangi sürümüne uygun bir veritabanı yaratılacağını gösterir.

Eğer DAO 3.0 referans alınmışsa DbVersion30, DAO 3.5 referans alınmışsa
DbEngine35 değerini kullanınız.
Eğer var olan bir veritabanı createdatabase yöntemi ile tekrar oluturulmaya
kalkışılırsa 3024 numaralı hata oluşur. Bu halde, veritabanı opendatabase
yöntemi ile açılır. Bu şekilde tabloların oluşturumasına devam edilebilir.

Opendatabase yöntemi şu şekilde kullanılır;

set database=workspace.OpenDatabase(dbname[, exclusive[, read-only[,
source]]])

dbname, açılacak dosyanın yol bilgisini de içeren adıdır. Yol belirtilmezse aktif dizinde aranır. Eğer belirtilen dizinde dosya bulunamazsa 70 numaralı hata döner.

Exclusive dosyanın çok kullanıcılı açılabilip açılamayacağını belirler. True verilmesi halinde tek kullanıcılı açılır, fase verilmesi halinde çok
kullanıcılı açılır. Veri tabanı üzerinde tasarım değişikliği yapılacağı içintek kullanıcılı açılması gereklidir.

Public Sub MUSTERILERTABLOYARAT()
dim tablo as tabedef, alan(6) as field, idx as index, s as integer
on error goto hata
‘tabloyu set et
set tablo=DB.CreateTabledef("Müşteriler")
‘alanları set et
set alan(0)=tablo.CreateField("Müşteri No", dbText,10)
set alan(1)=tablo.CreateField("Müşteri Adı Unvanı", dbText,50)
set alan(2)=tablo.CreateField("Telefon", dbText,20)
set alan(3)=tablo.CreateField("Adres", dbText,75)
set alan(4)=tablo.CreateField("İlçe", dbText,20)
set alan(5)=tablo.CreateField("İl", dbText,20)
set alan(6)=tablo.CreateField("Notlar", dbMemo)
‘alanların gereklilik ve sıfır uzunuk özelliklerini belire
for s=0 to 1
with alan(s)
..required=true : .allowzerolength=false
end with
next
for s=2 to 6
with alan(s)
..required=false : .allowzerolength=true
end with
next
‘alanları tabloya ekle
for s=0 to 6 : tablo.fields.append alan(s) : next
‘indexi set et
set idx=tablo.createindex("MüşteriNoIndexi)
‘index özelliklerini belirle
With idx
..Fields = "Müşteri No"
..Primary = True
..Unique = True
End With
‘indexi tabloya ekle
tablo.Indexes.Append idx
‘tabloyu veritabanına ekle
DB.Tabledefs.append tablo
exit sub
hata:
select case err.number
case 3010
msgbox "Müşteriler tablosu zaten var!",64
case else
msgbox err.number & "-" & err.description
end select
end sub

MUSTERITABLOYARAT yordamının açıklaması:

1-Önce tablo değişkenine database nesnesinin createtabledef yöntemi ile bir
tablo set ediliyor. CreateTabledef yöntemi şu şekilde kulanılır:
set tabledef=database.createtabledef(tabloadı)

2-Sonra tablo nesnesinin createfield komutu ile alanar set ediliyor.
Createfield yöntemi şu şekilde kullanılır:
set alan=tabledef.createfield(alan adı, veri tipi [,veri uzunluğu])
veri uzunluğu sadece text tipi alanlar için kullanılır. Fakat zorunlu
değildir. Text tipi alanda kullanılmaması halinde 255 karakter kabul edilir.

3-Sonra alanların gereklilik (required) özellikleri belireniyor. True bilgi
girilmesi gerekli, false bilgi girilmesi zorunlu değil. Text ve memo tipi
alanlar için sıfır uzunluk izni (alowzerolength) yani "" hiç karakter
içermeyen değer girişi olabilir mi özelliği belireniyor, true sıfır uzunluk
izni var, false sıfır uzunluk izni yok.

4-Tabledef nesnesinin append metodu ile alanlar tabloya ekleniyor.

5-Tablo nesnesinin createindex yöntemi ile idx nesnesi set ediliyor.
Createındex yöntemi index luşturur, kullanımı;
set index=tabledef.createindex(index adı) şeklindedir.

6-İndexin hangi alan olacağı (field) belirleniyor.

7-İndexin birincil (primary) index olup olmayacağı belireniyor. True
birincil, False birincil değil.

8-İndexi oluşturan alana aynı kayıttan birden fazla girişin olanaklı olup
olmayacağı (unique) beirleniyor. True aynı kayıttan girilemez, false
girilebilir. Primary (birincil) indexlerde unique özelliği true olmak
zorundadır.

9-Append metodu ile index tabloya ekeniyor.
Append metodu : Bir DAO nesnesi koleksiyonlarına, yeni bir eleman ekler.
Database için tabledef, relation, tabledef için field, index, relation için
field eklemeleri append metodu ile yapılır.
Kullanımı :
Nesneadı.Koleksiyonadı.Apppend KoleksiyonElemanı

10- Database nesnesinin append metodu ile tablo veritabanına ekleniyor.

11-Bu tablo zaten veritabanında varsa 3010 numaralı hata oluşur.

12-İstenirse başkaca alanlar için birincil olmayan index yaratılabilir. Bir
tabloda bir tane brincil index bulunur.

Diğer tablolar da aynı şekilde oluşturulacaklardır.

Public sub MALHIZMETTABLOYARAT()
dim tablo as tabedef, alan(6) as field, idx(1) as index, s as integer
on error goto hata
‘Tabloyu set et
set tablo=DB.Createtabledef("Mal Ve Hizmetler)
‘alanları set et
set alan(0)=tablo.createfield("Mal Hizmet No",dbText,6)
set alan(1)=tablo.createfield("Mal Hizmet Adı",dbText,25)
set alan(2)=tablo.createfield("Mal Hizmet Birimi",dbText,10)
set alan(3)=tablo.createfield("Miktar",dbinteger)
set alan(4)=tablo.createfield("Toptan Fiyat",dbcurrency)
set alan(5)=tablo.createfield("Parekende Fiyat",dbcurrency)
set alan(6)=tablo.createfield("Notlar",dbmemo)
‘alan özellikleri
for s=0 to 2
with alan(s)
..required=true : .allowzerolength=false
end with
next
for s=3 to 5 : alan(s).required=false : next
with alan(6) : .required = false : .allowzerolength = true : end with
‘alanları tabloya ekle
for s= 0 to 6 : tablo.fields.append alan(s) : next
‘birincil index yarat
set idx(0)=tablo.createindex("MalNoIndex")
with idx(0)
..fields="Mal Hizmet No"
..primary =true
..unique = true
end with
‘aynı maldan ikinci kez girişi önlemek için ad alanını ikincil index yap.
set idx(1)=tablo.createindex("MalAdIndex")
with idx(1):
..fields="Mal Hizmet Adı"
..primary = false
..unique = true
end with
‘indexleri tabloya ekle
for s= 0 to 1 : tablo.indexes.append idx(s) : next
‘tabloyu veritabanına ekle
DB.tabledefs.append tablo
exit sub
hata:
select case err.number
case 3010
msgbox "Mal Ve Hizmetler tablosu zaten var!",64
case else
msgbox err.number & "-" & err.description
end select
end sub

Public Sub MALHAREKETTABLOYARAT()
dim tablo as tabledef, alan(5) as field, idx(2) as index, s as integer
on error goto hata
‘tabloyu set et
set tablo=DB.createtabledef("Mal Hareketleri")
‘alanları set et
set alan(0)=tablo.createfield("Mal Hareket No",dblong)
‘alanı otomatk sayaç yap
alan(0).attributes=dbAutoIncrField
set alan(1)=tablo.createfield("Mal Hizmet No",dbtext,6)
set alan(2)=tablo.createfield("Müşteri No",dbtext,10)
set alan(3)=tablo.createfield("Hareket Yönü",dbtext,5))
set alan(4)=tablo.createfield("Tarih",dbdate)
set alan(5)=tablo.createfield("Miktar",dbinteger)
‘alan özellikleri
for s=1 to 5 : alan(s).required=true : next
for s= 1 to 3 : alan(s).allowzerolength=false : next
‘Burada otomatik sayaç alanı zaten gerekli alan olduğu için, required
özelliğini atamaya ‘gerek yoktur.
‘alanları tabloya ekle
for s= 0 to 5 : tablo.fields.append alan(s) : next
‘index yarat
‘Otomatik sayaç alanına göre sıralama yapmak istenirse, burası birincil
index yapılabilir. ‘Fakat burada yapılmamıştır. Önce mal numarasına, sonra
müşteri numarasına, en son da ‘tarihe göre bir sıralama düzeni oluşturmak
için bu üç alan index yapılacaktır. Fakat her üç ‘alanda da benzer kayıtlar
bulunması olanaklı olduğu için her üç alan da birincil olmayan ve ‘benzer
kayda olanak veren index olacaktır.
Set idx(0)=tablo.createindex("MalNoIndexi")
idx(0).fields="Mal Hizmet No"
Set idx(1)=tablo.createindex("MüşteriNoIndexi")
idx(1).fields="Müşteri No"
Set idx(2)=tablo.createindex("TarihIndexi")
idx(2).fields="Tarih"
for s=0 t0 2
with idx(s) : .primary=false : .unique=false : end with
next
‘indexleri tabloya ekle
for s=0 t0 2 : tablo.indexes.append idx(s) : next
‘tabloyu veritabanına ekle
DB.tabledefs.append tablo
exit sub
hata:
select case err.number
case 3010
msgbox "Mal Hareketleri tablosu zate var!",64
case else
msgbox err.number & "-" & err.description
end select
end sub

Public Sub PARAHAREKETTABLOYARAT()
dim tablo as tabledef, alan(5) as field, idx(2) as index, s as integer
on error goto hata
‘tabloyu set et
set tablo=DB.createtabledef("Mal Hareketleri")
‘alanları set et
set alan(0)=tablo.createfield("Kayıt No",dblong)
‘alanı otomatk sayaç yap
alan(0).attributes=dbAutoIncrField
set alan(1)=tablo.createfield("Mal Hareket No",dblong)
set alan(2)=tablo.createfield("Hareket Yönü",dbtext,8))
set alan(3)=tablo.createfield("Miktar",dbcurrency)
set alan(4)=tablo.createfield("Tarih",dbdate)
set alan(5)=tablo.createfield("Notlar",dbmemo)
‘alan özellikleri
for s=1 to 4 : alan(s).required=true : next
alan(2).allowzerolength=false
alan(5).allowzerolength=true
‘Burada otomatik sayaç alanı zaten gerekli alan olduğu için, required
özelliğini atamaya ‘gerek yoktur.
‘alanları tabloya ekle
for s= 0 to 5 : tablo.fields.append alan(s) : next
‘index yarat
‘Otomatik sayaç alanına göre sıralama yapmak istenirse, burası birincil
index yapılabilir. ‘Fakat burada yapılmamıştır. Burada sadece tarih alanına
göre bir sıralama yapılacaktır. ‘Fakat bu alanda benzer kayıtlar bulunması
olanaklı olduğu için birincil olmayan ve ‘benzer ‘kayda olanak veren index
olacaktır.
Set idx=tablo.createindex("TarihIndexi")
with idx : .fields="Tarih" : .primary=false : .unique=false : end with
‘indexi tabloya ekle
tablo.indexes.append idx
‘tabloyu veritabanına ekle
DB.tabledefs.append tablo
exit sub
hata:
select case err.number
case 3010
msgbox "Para Hareketleri tablosu zate var!",64
case else
msgbox err.number & "-" & err.description
end select
end sub

Public Sub ILISKIYARAT()
Dim rlt(2) As Relation, RltAlan(2) As Field, s as integer
On Error GoTo hata
'Müşteriler-Mal Hareketleri tabloları arasında Müşteri No alanı üzerinden
ilişki
Set rlt(0) = DB.CreateRelation("MüşteriBag") ‘ilişki adı
‘Database nesnesinin createrelaton metodu ile relation nesnesi için
tanımlanan değişken ‘set ediliyor. Kullanımı:
‘set relation=database.createrelation([name[, table[, foreigntable[,
attributes]]]]) şeklindedir
‘kısaca set relation=database.createrelation(name) şeklinde kullanılıp,
table, foreigntable, ‘attributes özellikleri sonradan da verilebilir. Bu
ikinci kullanım şekli daha anlaşılır olduğu için ‘bunu tercih ettim. Name
ilişkinin adını, table, ilişkinin başladığı tabloyu, foreigntable ilişkinin
‘kurulduğu tabloyu, attributes ise ilişkinin yürüteceği bir kısım işlevleri
de belirten özellikleri ‘ifade eder. Bunlar aynı zamanda ilişkinin
özelliklerindendir (property).

rlt(0).table = "Müşteriler" ‘ilişkinin başlangıç tablosu
rlt(0).ForeignTable = "Mal Hareketleri" ‘ilişki kurulan tablo

‘ilişkinin özelliği

‘dbRelationUpdateCascade - ilişkinin başladığı tablodaki güncelleme, ilişki
kurulan tablodaki ‘kayıtlara yansır
‘dbRelationDeleteCascade - ilişkinin başladığı tablodaki silinen kayıtla
bağlantılı olan ilişkinin ‘kurulduğu tablodaki kayıtlar silinir.
‘Her iki özelik birlikte olacaksa OR bağlacı ile bağlanarak birlikte
verilir.
‘dbRelationDeleteCascade özelliği genellikle pek tavsiye edilmez. Çünkü,
örneğin artık iş ‘yapılmayan bir müşteri silindi diye, onunla ilgili yapılan
daha önceki ticari işlemleri niye ‘silelim ki, değil mi? Fakat burada
kullanımın gösterilmesi bakımından her iki özellik de ‘verilmiştir.

rlt(0).Attributes = dbRelationUpdateCascade Or _
dbRelationDeleteCascade
Set RltAlan(0) = rlt(0).CreateField("Müşteri No") ‘İlişki için oluşturulan
alan. Bu alan, her iki ‘tabloda da var olan alanlardan farklı işlevlere
sahiptir.
RltAlan(0).ForeignName = "Müşteri No" ‘ilişkinin kurulduğu alan, ilişki
kurulurken ker ‘iki tabloda da aynı adı taşımalıdır. Sonradan
değiştirilebilir.
rlt(0).Fields.Append RltAlan(0) ‘ilişki için oluşturulan alanı, ilişkinin
alanlar koleksiyonuna ‘ekle
‘ilk ilişkimiz hazır, bunu veritabanına daha sonra ekleyeceğiz.

'Mal Ve Hizmetler-Mal Hareketleri tabloları arasında Mal Hizmet No alanı
üzerinden ilişki
Set rlt(1) = DB.CreateRelation("MalBag")
rlt(1).table = "Mal Ve Hizmetler"
rlt(1).ForeignTable = "Mal Hareketleri"
rlt(1).Attributes = dbRelationUpdateCascade Or _
dbRelationDeleteCascade
Set RltAlan(1) = rlt(1).CreateField("Mal Hizmet No")
RltAlan(1).ForeignName = "Mal Hizmet No"
rlt(1).Fields.Append RltAlan(1)

'Mal Hareketleri-Para Hareketleri tabloları arasında Mal Hareket No alanı
üzerinden ilişki
Set rlt(2) = DB.CreateRelation("MalBag")
rlt(2).table = "Mal Ve Hizmetler"
rlt(2).ForeignTable = "Mal Hareketleri"
rlt(2).Attributes = dbRelationUpdateCascade Or _
dbRelationDeleteCascade
Set RltAlan(2) = rlt(2).CreateField("Mal Hizmet No")
RltAlan(2).ForeignName = "Mal Hizmet No"
rlt(2).Fields.Append RltAlan(2)

İlişkileri veritabanına ekle
for s= 0 to 2 : DB.Relations.append rlt(s) : next
exit sub
hata:
‘İlişki kurulabilmesi için gerekli şartlar olmadığı veya var olan bir ilişki
yeniden oluşturlumaya ‘çalışıldığında dönecek hatalar
msgbox err.number & "-" & err.description
End Sub