Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi Date - Sql Datetime
#1
Selamlar Arkadaşlar. İlk Konumu Açıyorum. Tüm Paylaşımlarınız için teşekkür ederim .

 qryRapor.Parameters.ParamByName('TTITARHBAS').Value := TTbaslangic.Date;
    qryRapor.Parameters.ParamByName('TTITARHBIT').Value := TTBitis.Date;

şeklinde iki tarih parametresini SP de karşılığı DateTIME olan iki alana gönderiyorum.
SET @SQL = @SQL + ' T.TTI_TARIH >= ''' + 
  CONVERT(NVARCHAR(8),@TTITARHBAS,112) +
 ''' AND T.TTI_TARIH < ''' +
 CONVERT(NVARCHAR(8),DATEADD(DAY,1,@TTITARHBIT),112)+''''
diye bir filtreleme yaparken eger datetime compenentinden boş gönderirsem " invalid character value for cast specification" 
hatası alıyorum.

delphi de debug ettiğimde datetime eger boş ise value "-700000" olarak gidiyor SQL serverda bu durumu yakalayamıyorum.
 Eger boş ise bu filtrelemeyi yapma şeklinde bir kontrolde yapamıyorum sql server neye ceviriyor yakalamadım . byardımcı olabilir misiniz ?
Cevapla
#2
@HuseyinF Bu işlemleri yapmanın bir çok yöntemi var fikir oluşturması açısından aklıma gelen bir kaçtnesini paylaşayım
1. Delphi tarafında TTbaslangic.Date'i kontrol edersin boşsa SP'ye null geçersin

2. SP içerisinde gelen parametreleri kontrol edersin ve local bir değişken yapıp atamam yaparak bu değişkenleri SP içerisinde kullanabilrsin böylece sana senin istediğin dışında birşey gelse bile sen istediğin gibi kullanmış olursun 
Örneğin
Procedure SPXXXX
....
@pBasTar DATETIME,
@pBitTar DATETIME
As
BEGIN
   DECLARE @BasTar DATETIME,
       @BitTar DATETIME
IF @pBasTar IS NULL BEGIN SET @BasTar = '19000101' else Set @BasTar = @pBasTar end
IF @pBitTar IS NULL BEGIN SET @BasTar = '21001231' else Set @BitTar = @pBitTar end
........
.....
    Select *  From  TableX
Where  (Tarih >= @BasTar AND Tarih <= @BitTar)
.......
.....
end
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#3
(18-07-2019, Saat: 09:31)HuseyinF Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Selamlar Arkadaşlar. İlk Konumu Açıyorum. Tüm Paylaşımlarınız için teşekkür ederim .

 qryRapor.Parameters.ParamByName('TTITARHBAS').Value := TTbaslangic.Date;
    qryRapor.Parameters.ParamByName('TTITARHBIT').Value := TTBitis.Date;

şeklinde iki tarih parametresini SP de karşılığı DateTIME olan iki alana gönderiyorum.

SET @SQL = @SQL + ' T.TTI_TARIH >= ''' + 
  CONVERT(NVARCHAR(8),@TTITARHBAS,112) +
  ''' AND T.TTI_TARIH < ''' +
  CONVERT(NVARCHAR(8),DATEADD(DAY,1,@TTITARHBIT),112)+''''


diye bir filtreleme yaparken eger datetime compenentinden boş gönderirsem " invalid character value for cast specification" 
hatası alıyorum.

delphi de debug ettiğimde datetime eger boş ise value "-700000" olarak gidiyor SQL serverda bu durumu yakalayamıyorum.
 Eger boş ise bu filtrelemeyi yapma şeklinde bir kontrolde yapamıyorum sql server neye ceviriyor yakalamadım . byardımcı olabilir misiniz ?

Merhabalar,

Öncelikle hoş geldiniz.

1) Delphide TDate parametre gönderirken kontrol edin. Eğer boş ise siz otomatik bir tarih aralığı gönderin. veya kullanıcıya tarih boş geçilemez uyarısı verdirin.
veya
2) SQL Server da Stored Procedure' de; eğer gelen değerler NULL ise boş gelen tarihleri SET ederek yine kendiniz bir tarih atayın ve rapora ulaşın.


Where kısmında >= ve <= yerine
Between
komutunu kullanabilirsiniz.

Where T.TTI_TARIH Between :tarih1 and :tarih2 

Kolay gelsin.
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#4
(18-07-2019, Saat: 09:53)adelphiforumz Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.@HuseyinF Bu işlemleri yapmanın bir çok yöntemi var fikir oluşturması açısından aklıma gelen bir kaçtnesini paylaşayım
1. Delphi tarafında TTbaslangic.Date'i kontrol edersin boşsa SP'ye null geçersin

2. SP içerisinde gelen parametreleri kontrol edersin ve local bir değişken yapıp atamam yaparak bu değişkenleri SP içerisinde kullanabilrsin böylece sana senin istediğin dışında birşey gelse bile sen istediğin gibi kullanmış olursun 
Örneğin
Procedure SPXXXX
....
@pBasTar DATETIME,
@pBitTar DATETIME
As
BEGIN
   DECLARE @BasTar DATETIME,
       @BitTar DATETIME
IF @pBasTar IS NULL BEGIN SET @BasTar = '19000101' else Set @BasTar = @pBasTar end
IF @pBitTar IS NULL BEGIN SET @BasTar = '21001231' else Set @BitTar = @pBitTar end
........
.....
    Select *  From  TableX
Where  (Tarih >= @BasTar AND Tarih <= @BitTar)
.......
.....
end

Çok teşekkürler . TcxDateEditten tarih boş gidince SQL tarafında IS NULL ile kontrol edemiyorum. Sanırım SQL de DATETIME alana NULL Gönderme olayı baştan yani tanımdan patlıyor. Bir bakacam tekrar teşekkür ederim

(18-07-2019, Saat: 09:53)hi_selamlar Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(18-07-2019, Saat: 09:31)HuseyinF Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Selamlar Arkadaşlar. İlk Konumu Açıyorum. Tüm Paylaşımlarınız için teşekkür ederim .

 qryRapor.Parameters.ParamByName('TTITARHBAS').Value := TTbaslangic.Date;
    qryRapor.Parameters.ParamByName('TTITARHBIT').Value := TTBitis.Date;

şeklinde iki tarih parametresini SP de karşılığı DateTIME olan iki alana gönderiyorum.

SET @SQL = @SQL + ' T.TTI_TARIH >= ''' + 
  CONVERT(NVARCHAR(8),@TTITARHBAS,112) +
  ''' AND T.TTI_TARIH < ''' +
  CONVERT(NVARCHAR(8),DATEADD(DAY,1,@TTITARHBIT),112)+''''


diye bir filtreleme yaparken eger datetime compenentinden boş gönderirsem " invalid character value for cast specification" 
hatası alıyorum.

delphi de debug ettiğimde datetime eger boş ise value "-700000" olarak gidiyor SQL serverda bu durumu yakalayamıyorum.
 Eger boş ise bu filtrelemeyi yapma şeklinde bir kontrolde yapamıyorum sql server neye ceviriyor yakalamadım . byardımcı olabilir misiniz ?

Merhabalar,

Öncelikle hoş geldiniz.

1) Delphide TDate parametre gönderirken kontrol edin. Eğer boş ise siz otomatik bir tarih aralığı gönderin. veya kullanıcıya tarih boş geçilemez uyarısı verdirin.
veya
2) SQL Server da Stored Procedure' de; eğer gelen değerler NULL ise boş gelen tarihleri SET ederek yine kendiniz bir tarih atayın ve rapora ulaşın.


Where kısmında >= ve <= yerine
Between
komutunu kullanabilirsiniz.

Where T.TTI_TARIH Between :tarih1 and :tarih2 

Kolay gelsin.

durumu SQL tarafında yönetemessem 1. yazdıgınızı yapacagım çok teşekkürler
Cevapla
#5
@HuseyinF TcxDateEdit nesnesinin cxDateEdit1.EditValue değerini alırsan null değerini kullanabilirsin
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#6
(18-07-2019, Saat: 15:11)adelphiforumz Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.@HuseyinF TcxDateEdit nesnesinin cxDateEdit1.EditValue değerini alırsan null değerini kullanabilirsin

Çok teşekkürler . Şöyle Halletim bir tane bool alan tanımladım SP de  ve dateedit null ise 0 gonderdim . Bu şekilde sp tarafında kontrol edebildim.
Cevapla
#7
@HuseyinF Direkt EditValue değerini parametreye basabilirsin böylece kontrol etmene gerek kalmaz
....
XTable.Close;
XTable.Sql.Text := .'Exec  SPXXXXXX BasTar BitTar'
XTable.Parameters.Parambyname('BasTar').Value := cxBasTar.EditValue;
XTable.Parameters.Parambyname(''BitTar).Value := cxBitTar.EditValue;
XTable.Open
...
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi Örnek Login Ekranı mehmetalpgozbasi 8 1.170 1 saat önce
Son Yorum: tcoder34
  Delphi ile Webserverlar icin cache server yapimi TheEAK 0 68 12-09-2019, Saat: 16:36
Son Yorum: TheEAK
  [ÇÖZÜLDÜ]Server İşletim Sisteminde Çalışan Windows Servis te is not a valid date Hata theSinan 9 232 28-08-2019, Saat: 10:05
Son Yorum: adelphiforumz
  Delphi 10.3 Community Edition IBX seti yok KUNTAY 7 397 27-07-2019, Saat: 16:51
Son Yorum: KUNTAY
  Delphi Test Otomasyonu baslaner 4 385 19-07-2019, Saat: 09:35
Son Yorum: SimaWB



Konuyu Okuyanlar: 1 Ziyaretçi