ADO eoAsyncFetch ve Filtre sorunu hakkında...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

ADO eoAsyncFetch ve Filtre sorunu hakkında...

Mesaj gönderen cengaver »

Merhaba,

ADO DataSet veya ADO Query kullanırken aşağıdaki gibi bir kod çalıştırdıktan sonra;

1) DBGrid'e veriler gelmiyor (Tablo yüklendiği halde)
2) Filtreleme ile yaptığım aramalarda sonuç elde edemiyorum.

Bu forumda ve google'da genel bir arama yaptım fakat konuyla doğrudan alakalı bir sonuca ulaşamadım arkadaşlar. Bunun bir çözümü var mı?

Kod: Tümünü seç

var
  CON: TADOConnection;
  aQuery: TADOQuery;
  aProgres: TProgressBar;
....

procedure TForm1.Button1Click(Sender: TObject);
begin
  CON.Open;
  aQuery.Close;
  aQuery.ExecuteOptions := [eoAsyncFetchNonBlocking]; // veya eoAsyncFetch (her ikisinde de aynı sonuç oluşuyor.)
  aQuery.CommandType := cmdText;
  aQuery.CommandText := 'SELECT * FROM dbo.Adres';
  aQuery.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Deger: String;
begin
  Deger := 'İstanbul';
  aQuery.Filtered:=False;
  aQuery.Filter:='[Sehir] Like '+QuotedStr('%'+Deger+'%');
  aQuery.Filtered:=True;
end;

procedure TForm1.aQueryFetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  aProgres.Max := MaxProgress;
  aProgres.Position := Progress;
end;
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: ADO eoAsyncFetch ve Filtre sorunu hakkında...

Mesaj gönderen xxxjedixxx »

Bu şekilde dener misin?

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  CON.Open;
  aQuery.SQL.Text := 'SELECT * FROM dbo.Adres';
  aQuery.Active := True;
end;
Kısa bilgi;
Komut çalıştıracağın yani update, insert, delete gibi sorgular için "ExecSQL" fonksiyonu, kayıt döndürecek yani select ile başlayan sorgular için "Active" özelliği yada "Open" metodu kullanılır.
Örneğin;
aQuery.SQL.Text := 'Delete FROM dbo.Adres';
veya
aQuery.SQL.Text := 'update dbo.Adres set isim=''jedi'' where isim=''cengaver'''; //alanları atıyorum

sorgudanetkilenenkayitsayisi := aQuery.ExecSQL; // ExecSQL fonk. sorgundan etkilenen kayıt sayısını geri döndürür.

Hatam varsa düzeltin lütfen.
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: ADO eoAsyncFetch ve Filtre sorunu hakkında...

Mesaj gönderen cengaver »

Active yerine open kullanmıştım, tekrar denedim fakat herhangi bir değişiklik olmadı.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: ADO eoAsyncFetch ve Filtre sorunu hakkında...

Mesaj gönderen xxxjedixxx »

Söylediğinden sadece "open" satırını "active := True" ile değiştirdiğini anlıyorum. Ama ben SQL.Text diyorum CommandText Değil.
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: ADO eoAsyncFetch ve Filtre sorunu hakkında...

Mesaj gönderen cengaver »

Tarif ettiğin gibi yaptım ama malesef bende olmuyor, sebebini çözemiyorum;

Unit, DFM ve SQL create tablosu için tam kodları aşağıya ekliyorum, eğer inceleme fırsatın olursa bir göz atabilir misin,

Kod: Tümünü seç

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    CON: TADOConnection;
    QR: TADOQuery;
    DS: TDataSource;
    Panel: TPanel;
    Memo1: TMemo;
    aProgres: TProgressBar;
    ED_Aranan: TEdit;
    BT_Basla: TButton;
    BT_Filtrele: TButton;
    BT_GridiGoster: TButton;
    DBGrid: TDBGrid;
    procedure QRFetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    procedure BT_Klik(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BT_Klik(Sender: TObject);
var
  aAranan: String;
begin
  if (Sender = BT_Basla) then begin
      CON.Open;
      QR.Close;
      QR.ExecuteOptions := [eoAsyncFetch];
      QR.SQL.Clear;
      QR.SQL.Text := 'SELECT TOP 100 * FROM dbo.Adres';
      QR.Active := TRUE;
  end else
  if (Sender = BT_Filtrele) then begin
      aAranan := Trim(ED_Aranan.Text);
      if (aAranan > '') then begin
          QR.Filtered := FALSE;
          QR.Filter := format( 'TC_No = %s', [QuotedStr('%' + aAranan + '%')] );
          QR.Filtered := TRUE;
      end;
  end else
  if (Sender = BT_GridiGoster) then begin
      QR.DisableControls;
      DBGrid.DataSource := DS;
      QR.EnableControls;
  end;
end;

procedure TForm1.QRFetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  Memo1.Lines.Add ( DateTimeToStr (Now) );
  aProgres.Max      := MaxProgress;
  aProgres.Position := Progress;
end;

end.
DFM Kodu da şöyle; (ADOCOnnection nesnesinin connection string kısmındaki paraletreleri burada açıklayamayacağım için sildim, siz kendi sunucunuz ile ilgili uygun parametreler verirsiniz)

Kod: Tümünü seç

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 524
  ClientWidth = 904
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Panel: TPanel
    Left = 0
    Top = 0
    Width = 904
    Height = 28
    Align = alTop
    TabOrder = 0
    object BT_Basla: TButton
      AlignWithMargins = True
      Left = 4
      Top = 4
      Width = 53
      Height = 20
      Align = alLeft
      Caption = 'Ba'#351'lat'
      TabOrder = 0
      OnClick = BT_Klik
    end
    object ED_Aranan: TEdit
      AlignWithMargins = True
      Left = 63
      Top = 4
      Width = 293
      Height = 20
      Align = alLeft
      TabOrder = 1
      Text = '42532489984'
      ExplicitHeight = 21
    end
    object BT_Filtrele: TButton
      AlignWithMargins = True
      Left = 362
      Top = 4
      Width = 87
      Height = 20
      Align = alLeft
      Caption = 'Filtrele / '#199#246'z'
      TabOrder = 2
      OnClick = BT_Klik
    end
    object BT_GridiGoster: TButton
      AlignWithMargins = True
      Left = 455
      Top = 4
      Width = 144
      Height = 20
      Align = alLeft
      Caption = 'Disable/Enable Controls'
      TabOrder = 3
      OnClick = BT_Klik
    end
  end
  object Memo1: TMemo
    Left = 702
    Top = 28
    Width = 202
    Height = 496
    Align = alRight
    TabOrder = 1
  end
  object aProgres: TProgressBar
    Left = 728
    Top = 66
    Width = 150
    Height = 17
    TabOrder = 2
  end
  object DBGrid: TDBGrid
    Left = 0
    Top = 28
    Width = 702
    Height = 496
    Align = alClient
    TabOrder = 3
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
  end
  object CON: TADOConnection
    ConnectionString = 
      'Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=;Initial Catalog=;Data Source='
    LoginPrompt = False
    Provider = 'SQLOLEDB.1'
    Left = 210
    Top = 86
  end
  object DS: TDataSource
    DataSet = QR
    Left = 270
    Top = 86
  end
  object QR: TADOQuery
    Connection = CON
    OnFetchProgress = QRFetchProgress
    Parameters = <>
    Left = 240
    Top = 86
  end
end
Tablo yapısını SQL Server için şuradan oluşturabilirsin;

Kod: Tümünü seç

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Adres](
  [Ref] [int] IDENTITY(1,1) NOT NULL,
  [Kaynak_Tablo] [int] NOT NULL,
  [Kaynak_Ref] [int] NULL,
  [TC_No] [bigint] NULL,
  [Kisi] [int] NULL,
  [Il] [int] NOT NULL,
  [Ilce] [int] NULL,
  [Muhtarlik] [int] NULL,
  [Cadde] [int] NULL,
  [Bina] [varchar](10) NULL,
  [Daire] [varchar](10) NULL,
 CONSTRAINT [PK__Adres] PRIMARY KEY CLUSTERED (  [Ref] ASC ) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO
Şu SQL koduyla da örnek veriler ekleyebilirsin;

Kod: Tümünü seç

SET NOCOUNT ON;
SET XACT_ABORT ON;
GO

SET IDENTITY_INSERT [dbo].[Adres] ON;

BEGIN TRANSACTION;
INSERT INTO [dbo].[Adres]([Ref], [Kaynak_Tablo], [Kaynak_Ref], [TC_No], [Kisi], [Il], [Ilce], [Muhtarlik], [Cadde], [Bina], [Daire])
VALUES (1, 1, 1, 54265662398, 43543235, 34, 3426, 23367, 163911, N'125 -2', N'27'),
(2, 1, 2, 28502094730, 43543236, 34, 3426, 23367, 163911, N'125 -2', N'6'),
(3, 1, 3, 28508094512, 43543237, 34, 3426, 23367, 163911, N'125 -2', N'6'),
(4, 1, 4, 19984994878, 43543238, 34, 3426, 23367, 163911, N'125 1', N'25'),
(5, 1, 5, 19466692834, 43543239, 34, 3426, 23367, 163911, N'125 -2', N'24'),
(6, 1, 6, 12593141398, 43543240, 34, 3426, 23367, 163911, N'125 4', N'10'),
(7, 1, 7, 15902031090, 43543241, 34, 3426, 23367, 163911, N'125 -2', N'24'),
(8, 1, 8, 34445182540, 43543242, 34, 3426, 23367, 163911, N'125 1', N'28'),
(9, 1, 9, 18890667364, 43543243, 34, 3426, 23367, 163911, N'121', N'4'),
(10, 1, 10, 48505265500, 43543244, 34, 3426, 23367, 163911, N'125 -2', N'12')
COMMIT;
RAISERROR (N'[dbo].[Adres]: Veriler eklendi...', 10, 1) WITH NOWAIT;
GO

SET IDENTITY_INSERT [dbo].[Adres] OFF;
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: ADO eoAsyncFetch ve Filtre sorunu hakkında...

Mesaj gönderen xxxjedixxx »

Merhaba,

Sorunu yanlış anlamışım. Filter özelliğini ADOTable componentinde kullanabilirsin. AdoSQL'de hiç kullanmadım belki de çalışmıyordur. Ama ADOSql kullanacaksan filter den vazgeçip sql cümlende "Where" kullanarak filtre yapabilirisin ki bu en mantıklısı. Zaten çok kayıt tablolarla çalışırken sadece "where" kullanmadan "Select * from table" sorgusunu çalıştırmak boş yere memory tüketmekten başka bir şey olmaz.
Cevapla