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