Birden Çok Tabloyu İlişkilendirerek Kullanmak



Makale dizimizin bu bölümünde birden çok tabloyu birbiri ile ilişkilendirerek nasıl kullanacağımızı anlatacağız.Table öğesinin MasterSource özelliğine diğer bağlayacağımız tabloyu atadıktan sonra Masterfields özelliği ile bağlanacak sahaları nasıl birbiri ile ilişkilendireceğimizi öğreneceğiz. Böylece büyük çaplı tablolarda bütüne yakın kayıtı SQL yerine Tablo kullanarak daha Hızlı listelemiş olacağız. 
Table öğesini kullanarak iki tabloyu birbiri ile kordineli olarak çalıştırabiliriz. Bunun için birbiri ile ilişkili iki tablo alarak ilişkinin çokluk tarafında bulanuan tabloya ilişkili sahayı içeren bir indeks tanımlamalıyız.Daha sonra iki adet Table ve datasource nesnesi alarak forma koymalıyız. birinci table öğesinin TableName özelliğini teklik tarafındaki tablo ikinci table öğesinin TableName özelliğini çokluk tarafındaki tablo olarak ayarlamalıyız.Sonra birinci datasource öğesinin dataset özelliğini birinci Table öğesi ikinci datasource öğesinin dataset özelliğini ikinci Table öğesi olarak ayarlamalıyız.

İkinci tabloyu birinci tablo ile ilişkilendirmek için Table öğesinin MasterSource özelliğini kullanacağız. MasterSource özelliği bir datasouceden gelen verileri tablonun MasterFields özelliği ile tanımlanmış sahası ile ilişkilendirmeyi sağlar. Bu özellik ayarlandığında tıpkı bir filitre gibi sadece ikinci tablo birinci tablodaki aktif kayıtta ilişkilendirilmiş sahayla uyuşan kayıtları gösterir. Fakat bu özelliğin kullanılabilmesi için indexname özelliğinin MasterFields özelliğininde tanımlanmış bir sahayı içeren bir indeksi işaret etmesi gerekir.
fieldlink.gif (5075 bytes)
MasterSource özelliğine indexname özelliği ile koordineli olarak verileri elle girebileceğiniz gibi bu özelliğin sağladığı editörüde kullanabilirsiniz.Yandaki resimde olduğu gibi bu editörde Available indexes bölümünde açılan kutudan bu tabloya ait olan indeksleri görebilirsiniz. Bu kutudan bir indeks seçtiğinizde sağ liste kutusuna o indekste tanımlı sahaları görebilirsiniz. Master fields sahasından ve Detail fields sahasıdan hangi sahaları eşleştirmek istiyorsanız o sahaları seçip Add düğmesine basın. Bu düğmeye bastıktan sonra alttaki liste kutusunda birbiri ile ilişkilendirilen sahaları görebilirsiniz. İlişklilendirmeyi kaldırmak için ilişkilendirdiğiniz saha tanımını joined fields liste kutusundan seçip delete düğmesine basmalısınız. OK düğmesine bastıktan sonra Object inspector'da indexname özelliğinin otomatik olarak Available index kutusundan seçilen indeks adın olduğunu göreceksiniz.
 Bu ayarları yaptıktan sonra birinci tablodan seçtiğimiz bir kayıta mükabil ikinci tablo sadece o kayıtla ilgili bilgi içeren kayıtları gösterecektir.Birden çok tabloyu birbiri ile ilişkilendirerek kullanmanın faydası büyük ebatta kayıt içeren yerel bir tabloyu  SQL komutları ile sorgulamaktan bizi kurtarır. Çünkü SQL yerel tablolarda çok yavaştır. Özelllikle büyük çapta bir tablodan tüme yakın veriyi almaya çalıştıuğında.
Aşağıda DBDEMOS ile Tabloları ilişkilendirerek kullanmak konusunda yaptığım bir örneği göreceksiniz. Bu örneğin herhangi bir PAS kodu olmadığı için PAS kodunu yayınlamıyorum.
DFM kodu
object Form1: TForm1
    Left = 254
    Top = 179
    Width = 305
    Height = 279
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object Panel1: TPanel
        Left = 0
        Top = 0
        Width = 297
        Height = 128
        Align = alClient
        TabOrder = 0
        object DBGrid1: TDBGrid
            Left = 1
            Top = 1
            Width = 295
            Height = 126
            Align = alClient
            DataSource = DataSource1
            TabOrder = 0
            TitleFont.Charset = DEFAULT_CHARSET
            TitleFont.Color = clWindowText
            TitleFont.Height = -11
            TitleFont.Name = 'MS Sans Serif'
            TitleFont.Style = []
        end
    end
    object Panel2: TPanel
        Left = 0
        Top = 128
        Width = 297
        Height = 124
        Align = alBottom
        TabOrder = 1
        object DBGrid2: TDBGrid
            Left = 1
            Top = 1
            Width = 295
            Height = 122
            Align = alClient
            DataSource = DataSource2
            TabOrder = 0
            TitleFont.Charset = DEFAULT_CHARSET
            TitleFont.Color = clWindowText
            TitleFont.Height = -11
            TitleFont.Name = 'MS Sans Serif'
            TitleFont.Style = []
        end
    end
    object Table1: TTable
        Active = True
        DatabaseName = 'DBDEMOS'
        TableName = 'customer.db'
        Left = 8
        Top = 8
    end
    object Table2: TTable
        Active = True
        DatabaseName = 'DBDEMOS'
        IndexName = 'CustNo'
        MasterFields = 'CustNo'
        MasterSource = DataSource1
        TableName = 'orders.db'
        Left = 40
        Top = 8
    end
    object DataSource1: TDataSource
        DataSet = Table1
        Left = 72
        Top = 8
    end
    object DataSource2: TDataSource
        DataSet = Table2
        Left = 104
        Top = 8
    end
end

xxxxxx