adet tablon varmış. Sana referans olsun diye bunlardan ilk üçü için bir kurgu hazırladım.
- Veritabanı içinde tablolardan hangisi veya hangileri yoksa onları da oluşturur.
- Tablo tanımında örneğin 50 olan text uzunluğunu 100 yaptınız diyelim, bunu otomatik olarak anlar ve düzeltir.
- Mevcut verilere zarar gelmeden dinamik bir şekilde işlem yürür.
- Kabul etmek gerek kolay bir oluşum değildir. Sistemi herkes anlamayabilir. Bunu saygıyla karşılarız. Diğer yandan kavrayacak durumda olanlar için bu başlığı okuyanlardan bu konu artık iyice pekişecektir diye değerlendiriyorum. Tekrar ediyorum
..
- Tanımını ekleyeceğin her tablonun adını şu satıra eklemen gerekiyor.
- Tanımını eklediğin tablonun Trafikte yer alması için ARRAY'a eklediğin sıradaki CASE satırına da yani aşağıdaki yere de eklemen gerekiyor.
- Gerisini bu komutlar otomatik halledecektir. Yani tablo yoksa oluştur, varsa alanları sına ve eksikleri tamamla vs.
Kod: Tümünü seç
Uses ComObj;
Const
xBaglanti = 'Provider=Microsoft.Jet.OLEDB.4.0;'
+ 'Data Source=%s;'
+ 'Jet OLEDB:Database Password=%s;';
Password = 'error';
const
Tablolar: array[1..3] of string = ('Avukatlar', 'Borclar', 'Borclar_Default');
const
FieldTanimiPriKey = '%s %s(%d) CONSTRAINT idxUYAP PRIMARY KEY,';
FieldTanimiPriKeyDate = '%s %s CONSTRAINT idxUYAP PRIMARY KEY,';
FieldTanimi = '%s %s(%d),';
FieldTanimiDate = '%s %s,';
Var
xDBDosya : TFileName;
// Motor fonksiyonlarımızın başlangıcı .......
//-----------------------------------------------------------------------------
//--- Veritabanı (.mdb) oluşturma ---
Procedure VeritabaniOlustur( Hedef:String );
var
cat : OleVariant;
begin
cat := CreateOleObject('ADOX.Catalog'); // Uses ComObj
If FileExists(Hedef) Then DeleteFile(Hedef);
cat.Create(Format(xBaglanti, [Hedef, Password]));
cat := Unassigned; // Uses Variants
end;
Procedure Struc_Avukatlar( Liste:TStrings );
begin
With Liste do begin
Clear;
Add('CREATE TABLE Avukatlar (');
Add(Format(FieldTanimiPriKeyDate, ['AID', 'AutoIncrement']));
Add(Format(FieldTanimi, ['AAd', 'Text', 50]));
Add(Format(FieldTanimi, ['ASoyad', 'Text', 50]));
Add(Format(FieldTanimi, ['AKimlikNo', 'Text', 20]));
Add(Format(FieldTanimi, ['ACinsiyet', 'Text', 10]));
Add(Format(FieldTanimi, ['ASicilNo', 'Text', 20]));
Add(Format(FieldTanimi, ['ABaroNo', 'Text', 50]));
Add(Format(FieldTanimi, ['AVergiDairesi', 'Text', 150]));
Add(Format(FieldTanimi, ['AVergiNo', 'Text', 20]));
Add(Format(FieldTanimi, ['AVTipi', 'Text', 10]));
Add(Format(FieldTanimi, ['ATBBNo', 'Text', 20]));
Add(Format(FieldTanimi, ['AAdres', 'Text', 250]));
Add(Format(FieldTanimi, ['AIl', 'Text', 20]));
Add(Format(FieldTanimi, ['AIlce', 'Text', 20]));
Add(Format(FieldTanimiDate, ['AKurumAvukati', 'Logical', 0]));
Add(Format(FieldTanimiDate, ['ASigortali', 'Logical', 0]));
Add(Format(FieldTanimiDate, ['ABorcluVekili', 'Logical', 0]));
// Son virgülü silmek lazım,
Liste[Liste.Count - 1] := Copy(Liste[Liste.Count - 1], 1, Length(Liste[Liste.Count - 1]) - 1);
Add(')');
end;
end;
Procedure Struc_Borclar( Liste:TStrings );
begin
With Liste do begin
Clear;
Add('CREATE TABLE Borclar (');
Add(Format(FieldTanimiPriKeyDate, ['BID', 'AutoIncrement']));
Add(Format(FieldTanimiDate, ['BTakipID', 'Integer', 0 ]));
Add(Format(FieldTanimi, ['BSebep', 'Text', 50 ]));
Add(Format(FieldTanimiDate, ['BVadeTarih', 'Date', 0 ]));
Add(Format(FieldTanimiDate, ['BGercekTutar', 'Currency',0 ]));
Add(Format(FieldTanimiDate, ['BTutar', 'Currency',0 ]));
Add(Format(FieldTanimi, ['BTutarTip', 'Text', 20 ]));
Add(Format(FieldTanimi, ['BFaiz1', 'Text', 50 ]));
Add(Format(FieldTanimi, ['BFaiz2', 'Text', 50 ]));
Add(Format(FieldTanimiDate, ['BOran1', 'Currency',0 ]));
Add(Format(FieldTanimiDate, ['BOran2', 'Currency',0 ]));
Add(Format(FieldTanimiDate, ['BOran3', 'Currency',0 ]));
Add(Format(FieldTanimiDate, ['BOran4', 'Currency',0 ]));
Add(Format(FieldTanimiDate, ['BOran5', 'Currency',0 ]));
Add(Format(FieldTanimiDate, ['BOran6', 'Currency',0 ]));
Add(Format(FieldTanimiDate, ['BSabit', 'Currency',0 ]));
Add(Format(FieldTanimiDate, ['BAciklama', 'Memo', 0 ]));
Add(Format(FieldTanimi, ['BVeri1', 'Text', 50 ]));
Add(Format(FieldTanimi, ['BVeri2', 'Text', 50 ]));
Add(Format(FieldTanimi, ['BVeri3', 'Text', 50 ]));
Add(Format(FieldTanimi, ['BVeri4', 'Text', 50 ]));
Add(Format(FieldTanimi, ['BVeri5', 'Text', 50 ]));
Add(Format(FieldTanimi, ['BVeri6', 'Text', 50 ]));
Add(Format(FieldTanimi, ['BOtomatik', 'Text', 2 ]));
// Son virgülü silmek lazım,
Liste[Liste.Count - 1] := Copy(Liste[Liste.Count - 1], 1, Length(Liste[Liste.Count - 1]) - 1);
Add(')');
end;
end;
Procedure Struc_BorclarDefault( Liste:TStrings );
begin
With Liste do begin
Clear;
Add('CREATE TABLE Borclar_Default (');
Add(Format(FieldTanimiPriKeyDate, ['BID', 'AutoIncrement']));
Add(Format(FieldTanimi, ['BT1', 'Text', 50 ]));
Add(Format(FieldTanimi, ['BT2', 'Text', 50 ]));
Add(Format(FieldTanimi, ['BSebep', 'Text', 50 ]));
Add(Format(FieldTanimiDate, ['BVadeTarih', 'Date', 0 ]));
Add(Format(FieldTanimiDate, ['BTutar', 'Currency',0 ]));
Add(Format(FieldTanimi, ['BTutarTip', 'Text', 20 ]));
Add(Format(FieldTanimi, ['BFaiz1', 'Text', 50 ]));
Add(Format(FieldTanimi, ['BFaiz2', 'Text', 50 ]));
Add(Format(FieldTanimiDate, ['BAciklama', 'Memo', 0 ]));
// Son virgülü silmek lazım,
Liste[Liste.Count - 1] := Copy(Liste[Liste.Count - 1], 1, Length(Liste[Liste.Count - 1]) - 1);
Add(')');
end;
end;
//-----------------------------------------------------------------------------
// Trafik Kontrolü...
//-----------------------------------------------------------------------------
procedure StrucTrafik(Tablo: string; KomutListesi: TStrings);
var
Sayac,
idx: Integer;
begin
KomutListesi.Clear;
idx := -1;
for Sayac := 1 to High(Tablolar) do
if Tablolar[Sayac] = Tablo then begin
idx := Sayac;
Break;
end;
case idx of
01: // 'Avukatlar'
Struc_Avukatlar(KomutListesi);
02: // 'Borclar'
Struc_Borclar(KomutListesi);
03: // 'Borclar_Default'
Struc_BorclarDefault(KomutListesi);
end; // Case
end;
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
procedure TForm1.BitBtn1Click(Sender: TObject);
Var
Dizin : String;
begin
With TOpenDialog.Create(Nil) do begin
Filter := 'MDB veritabanı *.mdb|*.mdb';
If Execute then begin
// elle giriş yapılırsa uzantısı girilmezse veya hatalı girilirse...
// garantiye almak için uzantıyı (.mdb) olarak değiştirdik...
xDBDosya := ChangeFileExt(FileName, '.mdb');
Dizin := ExtractFilePath(xDBDosya);
If Length(Dizin) > 40 then Dizin := Format('%s..\..\..%s\', [
Copy(Dizin, 1, 20),
Copy(Dizin, Length(Dizin)-21, 20) ]);
Edit1.Text := Dizin + ExtractFileName(xDBDosya);
end;
Free;
end;
end;
Procedure TabloKontrol( DBDosya:TFileName; AdoQuery1, AdoQuery2 : TAdoQuery );
// -----------------------------------------------------------------------------
// Tablo varsa eksik veya değişiklik varsa tamamla, yoksa yenisini oluştur...
// İki adet TAdoQuery (AdoQuery1 ve AdoQuery2) ihtiyaç duyulur...
// Birisi kontrol diğeri uygulama içindir...
// AdoQuery1 EXECSQL için kullanılacak
// AdoQuery2 sadece Tablo Alan listesini elde ederek kontrol için.
// -----------------------------------------------------------------------------
Const // komut seti için hazırladığım format tanımlarım
FieldSil = 'ALTER TABLE %s DROP %s';
FieldEkle = 'ALTER TABLE %s ADD %s %s(%d)';
FieldEkleDate = 'ALTER TABLE %s ADD %s %s';
FieldDegis = 'ALTER TABLE %s ALTER COLUMN %s %s(%d)';
FieldDegisDate = 'ALTER TABLE %s ALTER COLUMN %s %s';
Var
TabloListe,
Liste : TStringList;
//TabloAdi : String;
i, j : Integer;
Alan, Tip : String;
Uz : Integer;
Gecici : String;
begin
If DBDosya = '' then begin
MessageDlg('Veritabanı henüz seçilmemiş...', mtError, [mbAbort], 0);
Exit;
end;
// 1. Aşama : Veritabanı (katalog dosya) fiziksel olarak Yoksa !!!
// Yeni bir tane (.mdb) katalog create edilir...
//----------------------------------------------------------------------------
If NOT FileExists(DBDosya) then VeritabaniOlustur(DBDosya);
// 2.Aşama : Tablolar tek tek kontrol edilecek.
// Olmayan varsa yenisi oluşturulacak...
//----------------------------------------------------------------------------
If NOT AdoQuery1.Connection.Connected then begin
AdoQuery1.Connection.ConnectionString := Format(xBaglanti, [DBDosya, Password]);
AdoQuery1.Connection.LoginPrompt := False;
end;
Liste := TStringList.Create;
TabloListe := TStringList.Create;
// var olan Tablo listesini alıyoruz...
AdoQuery1.Connection.GetTableNames( TabloListe, False );
For i := 1 to High(Tablolar) do begin
StrucTrafik( Tablolar[i], Liste );
If TabloListe.IndexOf( Tablolar[i] ) < 0 then
begin // Bu tablo veritabanında yok, yenisini oluşturucaz...
// Yani "Create Table" olayı işleyecek...
// Sayac sıradaki tablo için "Create Table" SQL text'ini Liste'ye alıyoruz.
AdoQuery1.SQL.Text := Liste.Text;
AdoQuery1.ExecSQL;
end else begin // Tablo var ancak alan isimleri doğru mu ? Eksik gedik var mı ?
Liste.Delete(0); // ilk satırı sildik. Hani Create table olanı.
Liste.Delete(Liste.Count-1); // son satırı sildik. Hani parantez olanı.
Liste[Liste.Count-1] := Liste[Liste.Count-1] + ','; // son satıra virgül ekliyoruz.
// Bu eklenen virgül tüm satırlar tutarlı olsun diye. Çünkü parse edicez
// ederken de satır sonundaki virgülden kerteriz alıcaz...
// Artık elimizde alan isim ve tipleri var.
// Yapılacak işlem bu satırlar String Parse edilerek
// ------------------------
// 1. Eksik alan varsa eklenir.
// 2. Uzunluk değişikliği yapılmışsa güncellendir.
// 3. Tip değişikliği yapılmışsa ( Böyle bir durum henüz yok )
// Field Listesi için var olan Tablo boş olarak açılıyor...
// AlanListe stringlist'ine aktarılıyor...
AdoQuery2.SQL.Text := 'SELECT * FROM '+ Tablolar[i] +' WHERE 1=0';
AdoQuery2.Active := True;
// Kontrol edilecek alanlar Liste stringlist'inden sırayla kontrol edilecek.
For j := 0 to Liste.Count-1 do begin
Gecici := Trim( Liste[j] );
// İlk boşluğa kadar olan kısım Alan Adı oluyor...
Alan := Copy(Gecici, 1, Pos(' ', Gecici)-1);
System.Delete( Gecici, 1, Length(Alan) );
Gecici := Trim(Gecici);
// Parantez varsa parantezin önündeki, yoksa son virgülün önündeki Tip oluyor....
Tip := Gecici;
If Copy( Tip, 1, Pos('(', Tip)-1 ) <> ''
then Tip := Copy( Tip, 1, Pos('(', Tip)-1 )
else Tip := Copy( Tip, 1, Pos(',', Tip)-1 );
System.Delete( Gecici, 1, Length(Tip) );
Gecici := Trim(Gecici);
// Parantez varsa parantez içeriği Uzunluk, yoksa uzunluk 0 oluyor....
If ( Gecici <> '' ) AND ( Gecici[1] = '(' )
then Uz := StrToInt(Copy(Gecici, 2, Pos(')', Gecici)-2))
else Uz := 0;
// Bulduğumuz alan adını Tablodan kontrol ediyoruz...
If AdoQuery2.FieldList.IndexOf(Alan) < 0 then begin
// Alan yok ekliyoruz...
If Uz = 0
then AdoQuery1.SQL.Text := Format(FieldEkleDate, [Tablolar[i], Alan, Tip ])
else AdoQuery1.SQL.Text := Format(FieldEkle, [Tablolar[i], Alan, Tip, Uz ]);
AdoQuery1.ExecSQL;
end else begin
// Alan var ancak Uzunluk aynı mı ? kontrol ediyoruz.
If (AdoQuery2.FieldByName(Alan).Size <> Uz) then begin
If (Tip <> 'Currency') then begin
// Özel bir durum var. AUTOINC bir alan olacaksa o zaman eski alanı silip
// yeniden oluşturucaz yoksa sadece düzelticez..
If (UpperCase(Tip) = 'AUTOINCREMENT') then begin
// Alan düşürülür, AutoInc alan baştan eklenir...
// Alanı silme
AdoQuery1.SQL.Text := Format(FieldSil, [Tablolar[i], Alan]);
AdoQuery1.ExecSQL;
// Yenisini ekleme..
If Uz = 0
then AdoQuery1.SQL.Text := Format(FieldEkleDate, [Tablolar[i], Alan, Tip ])
else AdoQuery1.SQL.Text := Format(FieldEkle, [Tablolar[i], Alan, Tip, Uz ]);
AdoQuery1.ExecSQL;
end else begin
// Sadece Düzeltme
If Uz = 0
then AdoQuery1.SQL.Text := Format(FieldDegisDate, [Tablolar[i], Alan, Tip ])
else AdoQuery1.SQL.Text := Format(FieldDegis, [Tablolar[i], Alan, Tip, Uz ]);
AdoQuery1.ExecSQL;
end;
end; // Currency ise zaten 4 olacaktır.
end; // Alan Uzunluk değişiklik kontrolü
end; // Alan kontrolü bloğu
end; // Alan isimleri için çalışan For döngüsü
end;
end;
TabloListe.Free;
Liste.Free;
end;
- Burada da uygulaması görülüyor... Bir forma iki tane TButon bir de TEdit koydum.