Delphi Can

Orjinalini görmek için tıklayınız: Son id
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
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;
(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)
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;
Merhaba,
Alternatif bir çözüm yolu;
  if VarIsNull(FieldByName('PLID').Value) then
    SonId := 0 + 1
 else
   SonId := FieldByName('PLID').AsInteger + 1;
Bonus: Eğer Pascal tarafında işlem yapılacaksa RecordCount kontrolü sağlanabilir.
open dan sonra recordcount>0 kontrolü yaparsanız sorun çözülür..
Cevaplar için teşekkürler,
 
bir çok kodu test ettim (coalesce) şimdilik sorun çıkmadı
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
(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;
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.