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ı: 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ı: @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ı:
(18-07-2019, Saat: 09:31)HuseyinF Adlı Kullanıcıdan Alıntı: 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ı: @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 10.1 Berlin, FireDac, SQLite, .s3db Gürcan 2 240 28-07-2020, Saat: 10:57
Son Yorum: Gürcan
Heart Delphi Edge Web Tarayıcı ahmmetdelphi 9 489 26-07-2020, Saat: 09:12
Son Yorum: ahmmetdelphi
  Delphi 10.3.3 Fast Report MEDCEZİR 2 333 20-07-2020, Saat: 11:57
Son Yorum: kaplanalpay0
  Delphi'de RTF Editor boreas 4 376 07-07-2020, Saat: 23:08
Son Yorum: boreas
  Delphi Socket io KarahanMesut 2 293 07-07-2020, Saat: 14:15
Son Yorum: Halil Han Badem



Konuyu Okuyanlar: 1 Ziyaretçi