First ve Skip Kullanımına Parametre Verme

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

First ve Skip Kullanımına Parametre Verme

Mesaj gönderen NewMember »

Herkese Gğnaydın.Şöyle bir sorunum var.

Kod: Tümünü seç

DM.MyDataSet.Close;
  DM.MyDataSet.SelectSQL.Clear;
  DM.MyDataSet.SelectSQL.Text := 'SELECT FIRST 50 SKIP 1000 * FROM TABLOM';
    DM.MyDataSet.SelectSQL.Text := DM.MyDataSet.SelectSQL.Text + ' ORDER BY KAYITID';
  DM.MyDataSet.Open;
Bu kod çok güzel çalılşıyor.İlk 50 kaydı dbgride dolduruyor.Scroll ilerledikçe yada next komutları işletildikçe cursor 51.kayda gelince bu sefer kendisini güncelliyor ve 51.kaydı gösteriyor.Extra bir işlem yapmaya gerek olmuyor.Bu şekilde 1000. kayda kadar gidebiliyorsunuz 50 şer kayıtlar halinde yani her daim datasette 50 kayıt oluyor.
Ama ben bunu şu şekilde yapmak istiyorum.Ben tablomdaki kayıt sayısını count ile bulup kayitsayisi adlı bir değişkene atıyorum ve burada
1000 yerine kayitsayisi değişkenini parametre olarak veriyorum ama parametre burada işe yaramıyor.Yani sorgu sonuç döndürmüyor.
Kodum aşağıda.
Acaba yanlış olan ne?

Kod: Tümünü seç

DM.MyDataSet.Close;
  DM.MyDataSet.SelectSQL.Clear;
  DM.MyDataSet.SelectSQL.Text := 'SELECT FIRST 50 SKIP :XXX * FROM TABLOM';
   DM.MyDataSet.ParamByName('XXX').AsInteger:=KayitSayisi;
    DM.MyDataSet.SelectSQL.Text := DM.MyDataSet.SelectSQL.Text + ' ORDER BY KAYITID';
  DM.MyDataSet.Open;
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen anemos »

Merhaba,

Execute Statement ile yapılabilir sanırım.

Kod: Tümünü seç

EXECUTE STATEMENT '''SELECT FIRST 50 SKIP :XXX * FROM TABLOM''';
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen NewMember »

anemos yazdı:Merhaba,

Execute Statement ile yapılabilir sanırım.

Kod: Tümünü seç

EXECUTE STATEMENT '''SELECT FIRST 50 SKIP :XXX * FROM TABLOM''';

maalesef olmadı.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen rsimsek »

Arkadaş SELECT i kod içinden oluştur demek istedi sanırım :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen NewMember »

Recep Abi onu daha baştan denedim ama o da olmadı
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen unicorn64 »

Kod: Tümünü seç

   DM.MyDataSet.SelectSQL.Text := 'SELECT FIRST 50 SKIP '+inttostr(KayitSayisi)+' * FROM TABLOM';
   ............
şeklinde sql i oluştururken değeri verseniz istediğinizi elde edersiniz sanırım...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2130
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen sadettinpolat »

yanlis hatirlamiyorsam first skip te parametre yemiyorda ama rows ta paramatre yiyordu.
rows komutunda da pageing yapabiliyorsunuz.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen Lost Soul »

Unicornun cevabı aslında yeterli ama ben de soruyu görünce bi ara gıpraşıp depreşip yazdığım bi nesne geldi aklıma
gene böyle firstli skipli. Onu da paylaşayım bari :)

Kod: Tümünü seç

unit ProgramObjects;

interface

uses
  Forms, Windows, Classes, StrUtil, StrUtils, SysUtils, Variants,
  pFIBDataSet;

type
  tFastDataSetProvider = class(TComponent)
  protected
    fSQL: AnsiString;
    fRecordLimit: Integer;
    fRecNo: Integer;
    fDataSet: TpFIBDataSet;
    fEof: Boolean;
  private

    Procedure SetSQL(Value: AnsiString);
    Procedure SetRecordLimit(Value: Integer);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    Procedure ReOpen;
    procedure First;
    Procedure Next;
    Procedure Prior;
    Procedure Open;
    PRocedure Close;
    property Eof: Boolean read fEof;
    property DataSet: TpFIBDataSet read fDataSet write fDataSet;
    property SQL: AnsiString read fSQL write SetSQL;
    property RecordLimit: Integer Read fRecordLimit write SetRecordLimit;
  end;

implementation

{ tFIBQuickDataSetProvider }
constructor tFastDataSetProvider.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fSQL := '';
  fRecordLimit := 1;
  fRecNo := 0;
  fEof := False;
end;

destructor tFastDataSetProvider.Destroy;
begin
  fDataSet := nil;
  inherited Destroy;
end;

Procedure tFastDataSetProvider.ReOpen;
begin
  with fDataSet do
  Begin
    Close;
    With SelectSQL do
    begin
      Clear;
      Add(Format('select first %d skip %d', [fRecordLimit, fRecNo]));
      Add(fSQL);
    end;
    Open;
    fEof := RecordCount <= 0;
  End;
end;

procedure tFastDataSetProvider.SetSQL;
begin
  if fSQL <> Value then
  Begin
    fSQL := Value;
    if fDataSet.Active then
      ReOpen;
  End;
end;

Procedure tFastDataSetProvider.SetRecordLimit(Value: Integer);
begin
  if fRecordLimit <> Value then
    if Value >= 0 then
    Begin
      fRecordLimit := Value;
      if fDataSet.Active then
        ReOpen;
    End;
end;

procedure tFastDataSetProvider.First;
begin
  fRecNo := 0;
  ReOpen;
end;

procedure tFastDataSetProvider.Next;
begin
  if not Eof then
  Begin
    Inc(fRecNo, 1);
    ReOpen;
  End;
end;

procedure tFastDataSetProvider.Prior;
begin
  if fRecNo >= 1 then
  Begin
    Dec(fRecNo, 1);
    ReOpen;
  End;
end;

PRocedure tFastDataSetProvider.Open;
begin
  if not fDataSet.Active then
    ReOpen;
end;

Procedure tFastDataSetProvider.Close;
begin
  if fDataSet.Active then
    fDataSet.Close;
end;

end.
Sonradan farkettim ki zaten fibplusun bunesneyi yazmamdaki amacı farklı bi şekile (fazlasıyla) karşılayan özelliği varmış.
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen anemos »

Şu şekilde de olabilir...

Kod: Tümünü seç

execute block(adet integer not null)
returns(field listesi)
as
begin
    for
     execute statement      
     'SELECT FIRST 50 SKIP ' || :adet || '   field listesi FROM TABLOM'
     do
      suspend;
end
Master43
Üye
Mesajlar: 73
Kayıt: 17 Ara 2004 12:05

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen Master43 »

Bu kod çok güzel çalılşıyor.İlk 50 kaydı dbgride dolduruyor.Scroll ilerledikçe yada next komutları işletildikçe cursor 51.kayda gelince bu sefer kendisini güncelliyor ve 51.kaydı gösteriyor.Extra bir işlem yapmaya gerek olmuyor.Bu şekilde 1000. kayda kadar gidebiliyorsunuz 50 şer kayıtlar halinde yani her daim datasette 50 kayıt oluyor.
Ben mi yanlış biliyorum,

Kod: Tümünü seç

SELECT FIRST 50 SKIP 1000 * FROM TABLOM
Bu SQL kodu ilk 1000 kaydı atla ve sonraki 50 kaydı getir demektir. Nasıl oluyorda Next yaptıkça 51. kayda gelince kendini güncelliyor pek anlayamadım :?:
Ayrıca SKIP için parametre olarak Record_Count verirseniz size nasıl kayıt dönsün. Tablodaki kayıt sayısı kadar atla sonraki 50 kaydı getir :bravo:
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen NewMember »

Master43 yazdı:
Bu kod çok güzel çalılşıyor.İlk 50 kaydı dbgride dolduruyor.Scroll ilerledikçe yada next komutları işletildikçe cursor 51.kayda gelince bu sefer kendisini güncelliyor ve 51.kaydı gösteriyor.Extra bir işlem yapmaya gerek olmuyor.Bu şekilde 1000. kayda kadar gidebiliyorsunuz 50 şer kayıtlar halinde yani her daim datasette 50 kayıt oluyor.
Ben mi yanlış biliyorum,

Kod: Tümünü seç

SELECT FIRST 50 SKIP 1000 * FROM TABLOM
Bu SQL kodu ilk 1000 kaydı atla ve sonraki 50 kaydı getir demektir. Nasıl oluyorda Next yaptıkça 51. kayda gelince kendini güncelliyor pek anlayamadım :?:
Ayrıca SKIP için parametre olarak Record_Count verirseniz size nasıl kayıt dönsün. Tablodaki kayıt sayısı kadar atla sonraki 50 kaydı getir :bravo:
Kullanım amacını yanlış yorumlamışım.aslında skip kelime anlamı çağrıştırmalıydı ama neyse.Parametre ile yaptığımda da boş kayıt döndürmesi parametre yemediğinden değil bilakis yediğinden dolayı boş sonuç döndürmesiymiş.Yani kayıt sayısı kadar kaydı es geçip ilk 50 kayıt diye bişey olmadığından döndürmüyormuş.

İroniden uzak paylaşımcı günler dileğimle....
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen NewMember »

Sonradan farkettim ki zaten fibplusun bunesneyi yazmamdaki amacı farklı bi şekile (fazlasıyla) karşılayan özelliği varmış.
@LostSoul;
Fıbplusın bahsettiğin özelliğini yazabilrimisin?
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: First ve Skip Kullanımına Parametre Verme

Mesaj gönderen Lost Soul »

NewMember yazdı:
Sonradan farkettim ki zaten fibplusun bunesneyi yazmamdaki amacı farklı bi şekile (fazlasıyla) karşılayan özelliği varmış.
@LostSoul;
Fıbplusın bahsettiğin özelliğini yazabilrimisin?
cachedupdates ve pofetchall=false özellikleri serveri yormamak adına konulan özellikler.
buradaki pofetchall=false özelliği bir bakıma yukarıdaki işleve benzer bir şekilde davranıyor.
ve lazım olan kadarını çekiyor. (cxgrid gibi bileşenlerde bu yemiyor o ayrı mesele tabi :] )
bileşende bayağı bi ince ayar var ancak çoğunu kullanmıyoruz :)
Cevapla