2 Mart 2014 Pazar

Delphi XE5 - Veritabanını Komple ARRAY 'in İçine Almak ve Arama Bulma Yapımı


    ARRAY 'ler bize hem matematiksel işlemlerde hemde veri depolama çağırmada çok yardımcı bir öğedir. Bir veriyi peki neden bir ARRAY' lere aktarmalıyız? Bu sizin veriyi nasıl kullandığınızla alakalıdır. Eğer kullandığınız bileşen bazı şeyleri size hazır olarak vermiyorsa sizde bazı şeyleri kendiniz yapmalısınız. Örneğin isim arama yada sütunun ortalaması yada daha karmaşık işlemler olabilir.


   Bu yazıda veritabanını ARRAY 'e atıp bu yazının devamında ise ARRAY 'e atılan veri içinde arama nasıl yapılacağını anlatacağım. Burada amacım zamandan tasarruf etmek. Daha önceki yazılarımda baktıysanız arama işlemini ya for ya da while ile veritabanının içinde yapıyordum. Bu da bana küçük verilerde olmasada devasa verilerde uzun bir zaman kaybına neden oluyordu. Burada ise arama işlemini ARRAY ' de yaparak sadece ilgili verinin veritabanındaki kaydına gideceğim.

  Bunun için küçük bir uygulama yaptım.

  Öncelikle iki tane ClientDataSet oluşturdum ve birine kaydettiğim verileri ARRAY' alarak diğer ClientDataSete aktaracağım.Verilerim id, name, surname ve age den oluşmakta. Bu verileri ARRAY' e aktarmak için record tipi bir type belirleyecek ve bu tipi de bir ARRAY' in içinde kullanacağım.

Verileri kaydetmek için bir type belirleyelim.

type
  TVeriSeti = packed record
    id : integer;
    name : string;
    surname : string;
    age : integer;
  end;

 Şimdi bilgileri bu recordu kullanarak ARRAY' in içine gömebilirim.

var
Form1: TForm1;
VeriBank : array[1..10000] of TVeriSeti;

 Artık ARRAY' im hazır. Şimdi bu ARRAY' e verisetimizdeki bilgileri aktaralım. Ben şu an örnekleri ClientDataSet üzerin veriyorum ama başka veritabanı programlarında da aynı işlemi yapmak mümkün.

 From kurulurken eğer veritabanım da veri varsa bunu direkt ARRAY' imin içine alacağım.

procedure TForm4.FormCreate(Sender: TObject);
var
 i : integer;
begin
ClientDataSet1.FileName:=ExtractFilePath(Application.ExeName  )+'arrayveriseti.cds';
ClientDataSet1.Active:=true;
ClientDataSet2.FileName:=ExtractFilePath(Application.ExeName  )+'arrayeaktar.cds';
ClientDataSet2.Active:=true;

for i  := 1 to 10000 do
 veribank[i].id :=0 ;
 veribank[i].name := ' ';
 veribank[i].surname := ' ';
 veribank[i].age := 0;
for i := 1 to ClientDataSet1.RecordCount do
  begin
  veribank[i].id := ClientDataSet1.FieldByName('id').Value;
  veribank[i].name := ClientDataSet1.FieldByName('name').Value;
  veribank[i].surname := ClientDataSet1.FieldByName('surname').Value;
  veribank[i].age := ClientDataSet1.FieldByName('age').Value;
  ClientDataSet1.Next;
  end;

end;

 Görüldüğü gibi artık veritabanında olan veriler form kurulurken ARRAY'in içine aktarılıyor. Form kurulduktan sonra veri ekledik ve tekrar ARRAY' e aktarmak için ise bir buton koyup

procedure TForm4.Button1Click(Sender: TObject);
var
 i : integer;
begin
ClientDataSet1.First;
for i := 1 to ClientDataSet1.RecordCount do
  begin
  veribank[i].id := ClientDataSet1.FieldByName('id').Value;
  veribank[i].name := ClientDataSet1.FieldByName('name').Value;
  veribank[i].surname := ClientDataSet1.FieldByName('surname').Value;
  veribank[i].age := ClientDataSet1.FieldByName('age').Value;
  ClientDataSet1.Next;
  end;
end;

yapabiliriz. Peki veri eklendiği anda yapsak olmaz mı? Bunun içinde ClientDataSet' in AfterPost olayını kullanarak:

procedure TForm4.ClientDataSet1AfterPost(DataSet: TDataSet);
  var
 i:integer;
begin
  veribank[ClientDataSet1.RecordCount].id := ClientDataSet1.FieldByName('id').Value;
  veribank[ClientDataSet1.RecordCount].name := ClientDataSet1.FieldByName('name').Value;
  veribank[ClientDataSet1.RecordCount].surname := ClientDataSet1.FieldByName('surname').Value;
  veribank[ClientDataSet1.RecordCount].age := ClientDataSet1.FieldByName('age').Value;
end;

yapabiliriz. ARRAY' deki verileride başka tabloya aktarmak içinde eklemenin tam tersini yaparak:

procedure TForm4.Button2Click(Sender: TObject);
var
i : integer;
begin
for i := 1 to ClientDataSet1.RecordCount do
  begin
  ClientDataSet2.Insert;
  ClientDataSet2.FieldByName('id').Value := veribank[i].id  ;
  ClientDataSet2.FieldByName('name').Value := veribank[i].name  ;
  ClientDataSet2.FieldByName('surname').Value := veribank[i].surname  ;
  ClientDataSet2.FieldByName('age').Value := veribank[i].age  ;
  ClientDataSet2.Next;
  end;
end;

yapabiliriz. Farklı bir yaklaşım olarak ta arama bulma işlemini ARRAY' de yaparak bulunan verinin
RecNo suna gidebiliriz. Bunun içinde basit bir mantıkla:

procedure TForm4.Button4Click(Sender: TObject);
var
  i : integer;
begin
i := 1;
while veribank[i].name <> Edit1.Text do
  i := i+1;
ClientDataSet1.RecNo := i;
 end;

Tabiki bu yöntem her zaman için düzgün çalışmayacaktır. Eğer veritabanınıza yeni veri eklerseniz dizideki kaydın yeri ile veritanındaki verinin yeri aynı olmayacaktır ve sorun oluşacaktır. Ama uniq bir değeriniz var benim için bu uygulamada id sıralı arttığı ve aynısından bir tane daha olmadığı için düzgün çalışmaktadır. Eğer aynı değerden iki tane eklerseniz bulma işlemi düzgün çalışmayacaktır. Fakat bu yöntem diğer yöntemlere göre daha çok daha hızlıdır.

Okuduğunuz İçin Teşekkür Ederim
Hakan UÇAR
İstatistikçi ve Amatör Programcı
İçerikler Tamamen Ücretsiz Olup Özgün Anlatımdır Paylaşırken Kaynak Belirtiniz Lütfen.

Uygulamayı Yandex Diskimden indirebilirsiniz.



Yandex Disk Benim Linkimle Her Üye olana 1 GB Size 0,5 GB Bana Extra Alan Vermekte Aşağdıdaki Resmi Tıklayıp Üye Olursanız Sevinirim.

                                           Bumerang - Yazarkafe

0 yorum:

Yorum Gönder