Tablo Sahaları ile İşlemler

Makale dizimizin  bu bölümünde Tablo sahaları ile işlemlerin nasıl yapılacağı hakkında bilgi vereceğiz. DBNavigator kullanmadan tablonun kayıtları arasında dolaşmak,tabloda bir kayıt aramak yakın kayıtları bulmak ve onların üzerinde konumlanmak hakkında bilgi vereceğiz. Ayrıca kayıtları bookkmark ile işaretlemek ve o kayıda tekrar ulaşamayı da anlatacağız. Bu bölümü tüm Delphi programcılarının bir kez daha gözden geçirmelerini tavsiye ederim.
Tablo Kayıtlarında gezinmek:
tablenav.gif (4959 bytes)

Bir tabloda kayıtlar arasında gezinmek eğer DBGrid kullanıyorsanız çok kolaydır. Fakat Eğer DBEdit vb. tek bir sahayı düzenleyen kontroller kullanıyorsanız bu pekte kolay olmayabilir. Bunun için DBNavigator kullanmak bir zorunluluktur ama eğer DBNavigator kullanmak istemiyorsanız buna Table nesnesinin yordamları ile kolayca erişebilirsiniz ve sahalarda kolayca gezinebilirsiniz.
Aşağıdaki örnekte bunun nasıl yapılacağı anlatılmıştır.

procedure TForm1.FormShow(Sender: TObject);
begin
    if Table1.RecordCount<2 then //Eğer ikiden az kaydı varsa tüm buttonlar pasif olacak
        begin
            bitbtn1.Enabled:=False;
            bitbtn2.Enabled:=False;
            bitbtn3.Enabled:=False;
            bitbtn4.Enabled:=False;
        end
    else
        begin
            if Table1.Bof then
                begin
                    bitbtn1.Enabled:=False;
                    bitbtn2.Enabled:=False;
                    bitbtn3.Enabled:=True;
                    bitbtn4.Enabled:=True;
                end
            else
                begin
                    if Table1.Eof then
                        begin
                            bitbtn3.Enabled:=False;
                            bitbtn4.Enabled:=False;
                            bitbtn1.Enabled:=True;
                            bitbtn2.Enabled:=True;
                        end
                    else
                        begin
                            bitbtn1.Enabled:=True;
                            bitbtn2.Enabled:=True;
                            bitbtn3.Enabled:=True;
                            bitbtn4.Enabled:=True;
                end;
        end;
    end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    table1.First;
    bitbtn1.Enabled:=False;
    bitbtn2.Enabled:=False;
    bitbtn3.Enabled:=True;
    bitbtn4.Enabled:=True;
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
    table1.Last;
    bitbtn3.Enabled:=False;
    bitbtn4.Enabled:=False;
    bitbtn1.Enabled:=True;
    bitbtn2.Enabled:=True;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
    table1.Next;
    if Table1.Eof then
        begin
            bitbtn3.Enabled:=False;
            bitbtn4.Enabled:=False;
            bitbtn1.Enabled:=True;
            bitbtn2.Enabled:=True;
        end
    else
        begin
            bitbtn1.Enabled:=True;
            bitbtn2.Enabled:=True;
            bitbtn3.Enabled:=True;
            bitbtn4.Enabled:=True;
        end;

end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
    table1.Prior;
    if Table1.Bof then
        begin
            bitbtn1.Enabled:=False;
            bitbtn2.Enabled:=False;
            bitbtn3.Enabled:=True;
            bitbtn4.Enabled:=True;
        end
    else
        begin
            bitbtn1.Enabled:=True;
            bitbtn2.Enabled:=True;
            bitbtn3.Enabled:=True;
            bitbtn4.Enabled:=True;
        end;
end;


Yukarıdaki örnekte gördüğünüz gibi Table1.Next Yordamı birsonraki kayda gitmesini Table1.Prior Bir önceki kayda gitmesini Table1.First İlk kayda gitmesini Table1.Last ise son kayda gitmesini sağlar.
BOF(Begin OFile) eğer tablonun ilk kaydında ise TRUE değerini alır. EOF(End OFile)   Eğer tablonun son kaydında ise TRUE değerini alır.
Tablonun Sahalarını Aramak:
Bir tabloda gezinmemizin sebebi muhtemelen bir kayda ulaşmak olacaktır.Bu iş ise Onbinlerce kaydın bulunduğu bir tabloda tam bir işkence haline dönüşebilir. Bunun için Table nesnesi aradığınız kayıtta yada aradığınıza yakın bir kayıtta konumlanmak için yordamlar içerir.Fakat bunların kullanımı tek bir yordamın yazılması ile olmaz. Bu yordamın çalışması için yordamını kullanımından önce bir iki satırın daha yazılması gerekir.
tablegoto.gif (6039 bytes)Eğer bir kaydı tablonuzda aramak istiyorsanız GotoKey fonksiyonundan yararlanmalısınız. GotoKey fonksiyonu kullanıldığında eğer aradığınız sahaya uygun bir kayıt bulursa o kaydın üzerinde konumlanır.Eğer bulamazsa FALSE değeri üretir.
Eğer aradığınız kayda yakın bir kayıt arıyorsanız GotoNearest yordamından yararlanmalısınız. GotoNearest yordamı kullanıldığında eğer aradığınız sahaya yakın bir kayıt bulursa o kaydın üzerinde konumlanır.
Aşağıdaki örneğe yukarıdaki örneğimize ek olarak iki BitBtn ve bir metin kutusu daha ekledim.Edit1'e yazılan değerin aynısını tabloda bulup üzerinde konumlanmak için   Kayda Git düğmesine; yakın bir kayda konumlanmak için En Yakınını Buldüğmesine basacağız.
Tabi ki yukarıdaki örneğimizde birde yapısal değişiklik yapacağız.Bu yapısal değişiklik sayesinde her butonda ktablo kaydının durumunu ayrı ayrı kontrol etmeyeceğiz.

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    table1.First;
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
    table1.Last;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
    table1.Next;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
    table1.Prior;
end;

procedure TForm1.BitBtn6Click(Sender: TObject);
begin
    Table1.Setkey;
    Table1.FieldByName('Custno').AsInteger:=strtoint(Edit1.text);
    Table1.GotoNearest;
end;

procedure TForm1.BitBtn5Click(Sender: TObject);
begin
    Table1.Setkey;
    Table1.FieldByName('Custno').AsInteger:=strtoint(Edit1.text);
    if not table1.GotoKey then
        begin
            Application.MessageBox('Müşteri Numarası Bulunamadı','Saha Arama Hatası',48+0);
        end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    if not (key in ['0'..'9']) then key:=#0;
end;

procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
    if Table1.RecordCount<2 then //Eğer ikiden az kaydı varsa tüm buttonlar pasif olacak
        begin
            bitbtn1.Enabled:=False;
            bitbtn2.Enabled:=False;
            bitbtn3.Enabled:=False;
            bitbtn4.Enabled:=False;
        end
    else
        begin
            if (Table1.Bof)or (Table1.RecNo=1)  then
                begin
                    bitbtn1.Enabled:=False;
                    bitbtn2.Enabled:=False;
                    bitbtn3.Enabled:=True;
                    bitbtn4.Enabled:=True;
                end
            else
                begin
                    if (Table1.Eof) or (Table1.RecNo=Table1.RecordCount) then
                        begin
                            bitbtn3.Enabled:=False;
                            bitbtn4.Enabled:=False;
                            bitbtn1.Enabled:=True;
                            bitbtn2.Enabled:=True;
                        end
                    else
                        begin
                            bitbtn1.Enabled:=True;
                            bitbtn2.Enabled:=True;
                            bitbtn3.Enabled:=True;
                            bitbtn4.Enabled:=True;
                end;
        end;
    end;
end;

Setkey:Setkey yordamı field öğesine bir arama yapılacağını belirtir. dsSetKey bölümünüe bir veri setini yerleştirmek ve aktif  key bufferinin içeriğini temizlemek içim kullanılır.Bu yordam kullanıldıktan sonra field öğesine yazacağınız değer GotoKey GotoNearest  yordamları ile aratılır.
Eğer bir sahaya konumlanmak istemiyorsanız sadece bulmak istiyorsanız FindKey ve FindNearest yordamlarını kullanmalısınız.Bu yordamların kullanılması Goto yordamlarının kullanılmasına benzer. Nearest yakın olanını Key ise var olanı bulmaya çalışır. Aşağıda bu yordamların kullanımına örnekler verilmiştir.

Table1.FindNearest([Edit1.text]);
//-------------------------------//
if Table1.Findkey([Edit1.text]) then
begin
Application.MessageBox('Kayıt Bulunamadı','Arama Hatası',48+0);
end;

Yukarıdaki örnekte find yöntemleri bir anahtarlar dizisi kullanır.Bu dizi elementi indekslenmiş bir alana işaret eder. Eğer indeksinizde 3 adet saha varsa Table1.FindNearest([Edit1.text,Edit2.text,Edit3.text]); gibi yazılmalıdır.
BookMark:Bir tabloda eğer rasgele kayıtlar arasında dolaşmıyorsanız, bir önceki kayda dönmek için Table1.Prior yordamı yeterli olmayacaktır. Bunu yerine eğer tabloda bulunduğunuz yere bir bookmark koyarsanız ve daha sonra gideceğiniz bir sonraki kayda giderseniz, daha önceki kayda ulaşmanız daha kolay olacaktır.Bu tıpkı Internet Exporer'daki geri butonu gibi kullanılabilir.
Eğer bir bookmark tanımlamak istiyorsanız bir kaç işlem takip etmelisiniz.Bunlar yeni bir bookmark'ın tanımlanması ve bu bookmark'a tablonun o kaydının atanmasıdır.Aşağıdaki örnekte bookmarkın nasıl atanacağı anlatılmıştır.

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
    bookmarkprior:TBookMark;
begin
    bookmarkprior:=Table1.GetBookmark;
end;

Bookmark ilk önce TBookMark cinsinden bir değişken tanımlanmalıdır. Daha sonra Bookmark değişkenine Getbookmark fonksiyonu ile atanarak işlem tamamlanır.
Eğer bookmark atanan kayda geri dönmek istiyorsanız.
Table1.GotoBookmark(bookmarkprior);
Eğer bookmarkı temizlemek istiyorsanız Table1.FreeBookmark(bookmarkprior); kullanmalısınız.

xxxxxx