Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Filter property cannot be used for detail tables, Delphi 7 [ÇÖZÜLDÜ]
#1
Bug 
Arkadaşlar merhaba,

Delphi 7 'de AdoDataSet bileşenini kullanarak Master/Detail yapımı oluşturuyorum; ancak detail olan tabloda filtreleme yapmaya çalıştığımda "Filter property cannot be used for detail tables" uyarısını alıyorum ve bir türlü bu sorunun üstesinden gelemedim.

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. 


Yukarıdaki linkte benzer sorunu yaşayan birine yanıt sanıyorum ki Borland yetkilisi tarafından verilmiş. Önce bunun bir bug olduğu ifade edilmiş ve ardından sorun çözülmüş. Aynı şeyleri yapmama rağmen bendeki sorun çözülmedi.

Ayrıca yine bu konu delphiturkiye.com adlı sitede de sorulmuş, fakat tatmin edici bir cevap yok.

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Sizce bu sorun neden kaynaklanıyor olabilir ?

Blush
Cevapla
#2
@SenayAkgun eğer yanlış bilmiyorsam master/Detail ilişkili tablolarda Detail yapısı bazı koşullara tabiydi
bunları kontrol etmeniz gerekebilir örneğin
detail kayıt kayıt sayısı 0 dan büyük olmalı
Filtre edilecek değer boş olmamalı '' veya null gibi
ve son olarakta master kayır boş olmamalı
bunları sağladıktan sonra detail filtreleme yapılabilr diye hatırlıyorum.
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#3
Ben master/detail yerine her zaman kendim elle yapıyorum. Daha hakim oluyorsun ve birkaç satır daha fazla yazmak dışında külfeti de yok.

Senin örneğin içinse hem alt tablo koşulunu, hem de filtreyi tek seferde yapman mümkün.
Cevapla
#4
adelphiforumz,

Tüm şartları kontrol ettim, olumlu olmasına rağmen yine de olmadı.

ssahinoglu,

Ben de manuel olarak gerçekleştiriyordum; ancak hiç de hızlı değildi. Bu yapı çok hızlı bunu da ben beceremedim.
Cevapla
#5
@SenayAkgun test ettim aşağıdaki şekilde çalışıyor tekrar bir yaptıklarınızı aşağıdakiine göre kontrol etmenizde fayda var

procedure TForm1.AdoTDetailFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
 if (cxbFiltre.Checked) then
     Accept := ( (DataSet.FieldByName('miktar').AsInteger >= StrToInt(Edit1.Text))
             and (DataSet.FieldByName('miktar').AsInteger <= StrToInt(Edit2.Text)) );
end;
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#6
(05-02-2019, Saat: 11:35)adelphiforumz Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.@SenayAkgun test ettim aşağıdaki şekilde çalışıyor tekrar bir yaptıklarınızı aşağıdakiine göre kontrol etmenizde fayda var

procedure TForm1.AdoTDetailFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
 if (cxbFiltre.Checked) then
     Accept := ( (DataSet.FieldByName('miktar').AsInteger >= StrToInt(Edit1.Text))
             and (DataSet.FieldByName('miktar').AsInteger <= StrToInt(Edit2.Text)) );
end;

Dün ben bu yöntemi denediğimde bir sürü problem oluştu ve vazgeçtim.  Huh

Örnek uygulamayı foruma eklemeniz mümkün mü nerede yanlış yaptığımı görmek için.

Hatta sorunu şöyle izah edeyim. Ben bu filtreleme şeklini uyguladığımda master/detail yapısı kaybolup master tablodan bağımsız olarak detail tablodaki tüm filtre uygulanmış kayıtları gösteriyor.

Basitleştirmek adına; örneğin birden fazla carimiz olsun ve her carimiz de maya, yağ, şeker vs. alsın. Master tablom cari, detail tablom urun olsun. Ben herhangi bir cariye odaklanmış iken o cariye ait kaç adet maya satıldığını görmek istediğim zaman,

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADODataSet.Filtered := True;
end;

procedure TDataModule.ADODataSetFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
   Accept := DataSet.FieldByName('urun_adi').AsString='MAYA'
end;

Ürünlere ait DBGrid 'de tüm carilere satılmış olan mayaları listeliyor. Carilere ait gridde dolanmaya başladığımda bu sorun düzeliyor, ancak ilk seferde hep bu hata oluyor yani tüm mayaları listeliyor.
Cevapla
#7
Örnek uyfulamanın DFM ve PASları 

DFM
object Form1: TForm1
  Left = 0
 Top = 0
 Caption = 'Form1'
 ClientHeight = 535
 ClientWidth = 870
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'Tahoma'
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Label1: TLabel
   Left = 224
   Top = 4
   Width = 48
   Height = 13
   Caption = 'Min Miktar'
 end
 object Label2: TLabel
   Left = 306
   Top = 5
   Width = 52
   Height = 13
   Caption = 'Max Miktar'
 end
 object DBGrid1: TDBGrid
   Left = 32
   Top = 70
   Width = 817
   Height = 159
   DataSource = DSMaster
   TabOrder = 0
   TitleFont.Charset = DEFAULT_CHARSET
   TitleFont.Color = clWindowText
   TitleFont.Height = -11
   TitleFont.Name = 'Tahoma'
   TitleFont.Style = []
 end
 object DBGrid2: TDBGrid
   Left = 32
   Top = 240
   Width = 817
   Height = 205
   DataSource = DSDetail
   TabOrder = 1
   TitleFont.Charset = DEFAULT_CHARSET
   TitleFont.Color = clWindowText
   TitleFont.Height = -11
   TitleFont.Name = 'Tahoma'
   TitleFont.Style = []
 end
 object Edit1: TEdit
   Left = 224
   Top = 23
   Width = 61
   Height = 21
   TabOrder = 2
   Text = '10'
 end
 object Edit2: TEdit
   Left = 306
   Top = 23
   Width = 61
   Height = 21
   TabOrder = 3
   Text = '20'
 end
 object cxbFiltre: TCheckBox
   Left = 388
   Top = 20
   Width = 97
   Height = 17
   Caption = 'Filtre Uygula'
   TabOrder = 4
 end
 object ADOC: TADOConnection
   LoginPrompt = False
   Provider = 'SQLOLEDB.1'
   Left = 96
   Top = 22
 end
 object AdoQMaster: TADOQuery
   Connection = ADOC
   CursorType = ctStatic
   Parameters = <>
   SQL.Strings = (
     
       'Select IdAlis, FaturaNo, FaturaTarihi, NetTutar, Aciklama From d' +
       'bo.Alis')
   Left = 70
   Top = 94
 end
 object DSMaster: TDataSource
   DataSet = AdoQMaster
   Left = 72
   Top = 154
 end
 object DSDetail: TDataSource
   DataSet = AdoTDetail
   Left = 156
   Top = 150
 end
 object AdoTDetail: TADOTable
   Connection = ADOC
   CursorType = ctStatic
   Filtered = True
   OnFilterRecord = AdoTDetailFilterRecord
   IndexFieldNames = 'IdAlis'
   MasterFields = 'IdAlis'
   MasterSource = DSMaster
   TableName = 'AlisDetay'
   Left = 154
   Top = 94
   object AdoTDetailIdAlisDetay: TAutoIncField
     DisplayWidth = 12
     FieldName = 'IdAlisDetay'
     ReadOnly = True
   end
   object AdoTDetailIdAlis: TIntegerField
     DisplayWidth = 12
     FieldName = 'IdAlis'
   end
   object AdoTDetailBarkod: TWideStringField
     DisplayWidth = 16
     FieldName = 'Barkod'
     Size = 13
   end
   object AdoTDetailMiktar: TSmallintField
     DisplayWidth = 12
     FieldName = 'Miktar'
   end
   object AdoTDetailBirimFiyat: TFloatField
     DisplayWidth = 12
     FieldName = 'BirimFiyat'
   end
   object AdoTDetailDepocuFiyati: TFloatField
     DisplayWidth = 13
     FieldName = 'DepocuFiyati'
   end
   object AdoTDetailKdvOrani: TFloatField
     DisplayWidth = 12
     FieldName = 'KdvOrani'
   end
   object AdoTDetailEczaciKarOrani: TFloatField
     DisplayWidth = 14
     FieldName = 'EczaciKarOrani'
   end
   object AdoTDetailIskontoTutari: TBCDField
     DisplayWidth = 18
     FieldName = 'IskontoTutari'
     Precision = 19
   end
   object AdoTDetailNetFiyat: TBCDField
     DisplayWidth = 13
     FieldName = 'NetFiyat'
     Precision = 19
   end
 end
end


PAS
unit Unit1;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, Data.Win.ADODB;

type
 TForm1 = class(TForm)
   ADOC: TADOConnection;
   AdoQMaster: TADOQuery;
   DSMaster: TDataSource;
   DSDetail: TDataSource;
   AdoTDetail: TADOTable;
   DBGrid1: TDBGrid;
   DBGrid2: TDBGrid;
   AdoTDetailIdAlisDetay: TAutoIncField;
   AdoTDetailIdAlis: TIntegerField;
   AdoTDetailBarkod: TWideStringField;
   AdoTDetailMiktar: TSmallintField;
   AdoTDetailBirimFiyat: TFloatField;
   AdoTDetailDepocuFiyati: TFloatField;
   AdoTDetailKdvOrani: TFloatField;
   AdoTDetailEczaciKarOrani: TFloatField;
   AdoTDetailIskontoTutari: TBCDField;
   AdoTDetailNetFiyat: TBCDField;
   Edit1: TEdit;
   Edit2: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   cxbFiltre: TCheckBox;
   procedure AdoTDetailFilterRecord(DataSet: TDataSet; var Accept: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AdoTDetailFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
 if (cxbFiltre.Checked) then
     Accept := ( (DataSet.FieldByName('miktar').AsInteger >= StrToInt(Edit1.Text))
             and (DataSet.FieldByName('miktar').AsInteger <= StrToInt(Edit2.Text)) );
end;

end.

(05-02-2019, Saat: 15:05)SenayAkgun Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(05-02-2019, Saat: 11:35)adelphiforumz Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.@SenayAkgun test ettim aşağıdaki şekilde çalışıyor tekrar bir yaptıklarınızı aşağıdakiine göre kontrol etmenizde fayda var

procedure TForm1.AdoTDetailFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
 if (cxbFiltre.Checked) then
     Accept := ( (DataSet.FieldByName('miktar').AsInteger >= StrToInt(Edit1.Text))
             and (DataSet.FieldByName('miktar').AsInteger <= StrToInt(Edit2.Text)) );
end;

Dün ben bu yöntemi denediğimde bir sürü problem oluştu ve vazgeçtim.  Huh

Örnek uygulamayı foruma eklemeniz mümkün mü nerede yanlış yaptığımı görmek için.

Hatta sorunu şöyle izah edeyim. Ben bu filtreleme şeklini uyguladığımda master/detail yapısı kaybolup master tablodan bağımsız olarak detail tablodaki tüm filtre uygulanmış kayıtları gösteriyor.

Basitleştirmek adına; örneğin birden fazla carimiz olsun ve her carimiz de maya, yağ, şeker vs. alsın. Master tablom cari, detail tablom urun olsun. Ben herhangi bir cariye odaklanmış iken o cariye ait kaç adet maya satıldığını görmek istediğim zaman,

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADODataSet.Filtered := True;
end;

procedure TDataModule.ADODataSetFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
   Accept := DataSet.FieldByName('urun_adi').AsString='MAYA'
end;

Ürünlere ait DBGrid 'de tüm carilere satılmış olan mayaları listeliyor. Carilere ait gridde dolanmaya başladığımda bu sorun düzeliyor, ancak ilk seferde hep bu hata oluyor yani tüm mayaları listeliyor.


Dikkat etmeniz gereken yerler 
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#8
adelphiforumz,

Çok teşekkürler.

Resimdeki gibi tasarım anında Filtered özelliğini TRUE olara değiştirince sorun düzeldi. Ben çalışma anında yapıyordum ve çok kötü bir sonuç ortaya çıkıyordu.
Cevapla
#9
(05-02-2019, Saat: 17:11)SenayAkgun Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.adelphiforumz,

Çok teşekkürler.

Resimdeki gibi tasarım anında Filtered özelliğini TRUE olara değiştirince sorun düzeldi. Ben çalışma anında yapıyordum ve çok kötü bir sonuç ortaya çıkıyordu.

Çalışma Anındada aynı şekilde kullanabilrsiniz ekrandaki gidip gelmeleri engellemek adına işlemin başına Table.DisabledControl ve İşlemin sonunda Table.EnabledControl demeniz yetecektir.
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#10
(06-02-2019, Saat: 11:13)adelphiforumz Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(05-02-2019, Saat: 17:11)SenayAkgun Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.adelphiforumz,

Çok teşekkürler.

Resimdeki gibi tasarım anında Filtered özelliğini TRUE olara değiştirince sorun düzeldi. Ben çalışma anında yapıyordum ve çok kötü bir sonuç ortaya çıkıyordu.

Çalışma Anındada aynı şekilde kullanabilrsiniz ekrandaki gidip gelmeleri engellemek adına işlemin başına Table.DisabledControl ve İşlemin sonunda Table.EnabledControl demeniz yetecektir.

Bunu da beğendim, teşekkürler.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Tek Seferde İlişkili Tüm Tablolarda Güncelleme Sorunu [ÇÖZÜLDÜ] SenayAkgun 15 1.009 22-02-2019, Saat: 21:14
Son Yorum: adelphiforumz
  Delphi 7 ile ACCDB Dosyalarına Compact İşlemi [Çözüldü] SenayAkgun 11 1.222 22-02-2019, Saat: 20:43
Son Yorum: muratcelik64
  Delphi'de Veritabanı İle Kullanıcı Giriş Ekranı Halil Han Badem 3 2.180 10-10-2017, Saat: 08:19
Son Yorum: tgural



Konuyu Okuyanlar: 2 Ziyaretçi