![]() |
Filter property cannot be used for detail tables, Delphi 7 [ÇÖZÜLDÜ] - Baskı Önizleme +- Delphi Can (http://www.delphican.com) +-- Forum: Veri Tabanı (http://www.delphican.com/forumdisplay.php?fid=4) +--- Forum: Diğer Veri Tabanları (http://www.delphican.com/forumdisplay.php?fid=18) +---- Forum: Microsoft Access (http://www.delphican.com/forumdisplay.php?fid=73) +---- Konu Başlığı: Filter property cannot be used for detail tables, Delphi 7 [ÇÖZÜLDÜ] (/showthread.php?tid=3249) |
Filter property cannot be used for detail tables, Delphi 7 [ÇÖZÜLDÜ] - SenayAkgun - 04-02-2019 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. https://groups.google.com/forum/#!topic/borland.public.delphi.database.ado/4WI-8QF8VJo 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. http://www.delphiturkiye.com/forum/viewtopic.php?t=29356 Sizce bu sorun neden kaynaklanıyor olabilir ? ![]() Filter property cannot be used for detail tables, Delphi 7 - adelphiforumz - 04-02-2019 @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. Filter property cannot be used for detail tables, Delphi 7 - ssahinoglu - 04-02-2019 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. Cvp: Filter property cannot be used for detail tables, Delphi 7 - SenayAkgun - 05-02-2019 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. Cvp: Filter property cannot be used for detail tables, Delphi 7 - adelphiforumz - 05-02-2019 @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; Cvp: Filter property cannot be used for detail tables, Delphi 7 - SenayAkgun - 05-02-2019 (05-02-2019, Saat: 11:35)adelphiforumz Adlı Kullanıcıdan Alıntı: @SenayAkgun test ettim aşağıdaki şekilde çalışıyor tekrar bir yaptıklarınızı aşağıdakiine göre kontrol etmenizde fayda var Dün ben bu yöntemi denediğimde bir sürü problem oluştu ve vazgeçtim. ![]() Ö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. Cvp: Filter property cannot be used for detail tables, Delphi 7 - adelphiforumz - 05-02-2019 Ö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ı:(05-02-2019, Saat: 11:35)adelphiforumz Adlı Kullanıcıdan Alıntı: @SenayAkgun test ettim aşağıdaki şekilde çalışıyor tekrar bir yaptıklarınızı aşağıdakiine göre kontrol etmenizde fayda var Dikkat etmeniz gereken yerler ![]() Filter property cannot be used for detail tables, Delphi 7 - SenayAkgun - 05-02-2019 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. Cvp: Filter property cannot be used for detail tables, Delphi 7 - adelphiforumz - 06-02-2019 (05-02-2019, Saat: 17:11)SenayAkgun Adlı Kullanıcıdan Alıntı: adelphiforumz, Ç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. Cvp: Filter property cannot be used for detail tables, Delphi 7 - SenayAkgun - 11-02-2019 (06-02-2019, Saat: 11:13)adelphiforumz Adlı Kullanıcıdan Alıntı:(05-02-2019, Saat: 17:11)SenayAkgun Adlı Kullanıcıdan Alıntı: adelphiforumz, Bunu da beğendim, teşekkürler. |