Delphi Can
Son id - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Son id (/showthread.php?tid=1654)



Son id - Dostk - 11-12-2017

Merhaba; Aşağıdaki kodlarla databasedeki en son kaydedilen id numarasını alabiliyorum, ancak databaseye hiç kayıt yapılmamışsa hata veriyor bu durumu nasıl çözebilirim?


 
        Close;
            SQL.Clear;
            SQL.Add('Select MAX(PLID) AS PLID From SIRAPIS');
            Prepared := True;
            Open;
            SonId := FieldByName('PLID').AsInteger + 1;



Cvp: Son id - Abdullah ILGAZ - 11-12-2017

(11-12-2017, Saat: 13:05)Dostk Adlı Kullanıcıdan Alıntı: Merhaba; Aşağıdaki kodlarla databasedeki en son kaydedilen id numarasını alabiliyorum, ancak databaseye hiç kayıt yapılmamışsa hata veriyor bu durumu nasıl çözebilirim?


 
        Close;
            SQL.Clear;
            SQL.Add('Select MAX(PLID) AS PLID From SIRAPIS');
            Prepared := True;
            Open;
            SonId := FieldByName('PLID').AsInteger + 1;

Select count(*), PLID from SIPARIS group by PLID  işinizi görür mü? (Satır yoksa 0 gelir)


Cvp: Son id - meko - 11-12-2017

coalesce fonksiyonu ile dener misiniz?

 
       Close;
           SQL.Clear;
           SQL.Add('Select coalesce(MAX(PLID),0) AS PLID From SIRAPIS');
           Prepared := True;
           Open;
           SonId := FieldByName('PLID').AsInteger + 1;



Cvp: Son id - Fesih ARSLAN - 11-12-2017

Merhaba,
Alternatif bir çözüm yolu;
  if VarIsNull(FieldByName('PLID').Value) then
    SonId := 0 + 1
 else
   SonId := FieldByName('PLID').AsInteger + 1;



Son id - Abdullah ILGAZ - 11-12-2017

Bonus: Eğer Pascal tarafında işlem yapılacaksa RecordCount kontrolü sağlanabilir.


Son id - mcuyan - 11-12-2017

open dan sonra recordcount>0 kontrolü yaparsanız sorun çözülür..


Cvp: Son id - Dostk - 12-12-2017

Cevaplar için teşekkürler,
 
bir çok kodu test ettim (coalesce) şimdilik sorun çıkmadı


Son id - adelphiforumz - 12-12-2017

create Function [dbo].[fnx_Get_MaxID] ()
      Returns int As
Begin  
Declare @SonNo int

Select @SonNo = Max(ID) From Satis

If @SonNo = 0 Or @SonNo Is Null 
Set @SonNo = 1
Else
Set @SonNo = @SonNo + 1
    
Return @SonNo
End



Cvp: Son id - uparlayan - 16-12-2017

(12-12-2017, Saat: 18:54)adelphiforumz Adlı Kullanıcıdan Alıntı:
create Function [dbo].[fnx_Get_MaxID] ()
      Returns int As
Begin  
Declare @SonNo int

Select @SonNo = Max(ID) From Satis

If @SonNo = 0 Or @SonNo Is Null 
Set @SonNo = 1
Else
Set @SonNo = @SonNo + 1
    
Return @SonNo
End

Merhaba,

Bir UDF'nin içinde SELECT ile tablodan veri çekmek performans açısından çok sakıncalı. Bunun yerine aşağıdaki fonksiyonu doğrudan kullanmak performans açısından darboğaza düşmenize engel olur;

SELECT IDENT_CURRENT ( 'SIRAPIS' ) as ID

Eğer Tablo veritabanında varsa hiç bir zaman NULL değeri üretmez. Dolayısıyla ISNULL gibi uğraşılara girmenize gerek kalmaz. Bunu aşağıdaki şekilde Delphi üzerinde şöyle de kullanabilirsiniz;

       Close;
       SQL.Clear;
       SQL.Add('SELECT IDENT_CURRENT ( ''SIRAPIS'' ) as ID');
       //Prepared := True;
       Open;
       SonId := FieldByName( 'ID' ).AsInteger + 1;



Son id - dilo - 17-12-2017

Bence gözden kaçan mantık hatası var, dbye yeni bir kayıt ekledin sonra bu kayıtı sildin, bu kodlarda en son idnin numarasını alabilirsin.
dbye yeni bir kayıt eklesen bile asla silinen idnin numarası verilmeyeceğinden paylaşılan bu kodlarla bir sonraki idnin numarasını hiç bir zaman doğruyu göstermez.