Sorgu tamam ama yanlış değer dönüyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
kuntay
Üye
Mesajlar: 86
Kayıt: 08 Tem 2003 09:41
Konum: İçel
İletişim:

Sorgu tamam ama yanlış değer dönüyor

Mesaj gönderen kuntay »

veri tabanı paradox
tarih alanı : date
saat alanı : time
olarak veritabanında ayarlı

Kod: Tümünü seç

var
ILKTAR, SONTAR : TDate;
ILKSAAT, SONSAAT : TTime;
   begin
Try
Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('SELECT * FROM data Where Tarih >= :ILKTAR and Tarih <= :SONTAR and Saat >= :ILKSAAT and Saat <= :SONSAAT');
Query2.Params[0].AsDateTime:=StrToDate(MaskEdit1.Text);
Query2.Params[1].AsDateTime:=StrToDate(MaskEdit2.Text);
Query2.Params[2].AsDateTime:=StrToTime(maskedit3.Text);
Query2.Params[3].AsDateTime:=StrToTime(maskedit4.Text);
Query2.Open;
Except
   On Exception do raise;
end;
   end;
bu kodlarla başlangıç tarihi ile saatini belirtip ve bitiş tarihi ile bitiş saatini belirtip
sorgu çekmek istiyorum
sadece tarih olarak ayarlayıp çekersem bir sorun yok ama saatleride işin içine katınca
şöyle bir hata veriyor ‘type mismatch in expression’ diye bir hata alıyorum


birde forumda aşağıdaki gibi bir mesaj buldum ama ben bunu nasıl kodlara dahil edeceğimi yapamadım.

Kod: Tümünü seç

Adoquery1.ParamByName('TARIH1').AsDateTime := Int(DP1.Date) + Frac(TP1.Time); 
Adoquery1.ParamByName('TARIH2').AsDateTime := Int(DP2.Date) + Frac(TP2.Time); 
Adoquery1.Active := True; 

bu kod isini gorur ancak sunu belirteyim dp1,dp2,tp1,tp2 datapicker dp1 ve dp2 tarih tp1 ve tp2 ise time olarak ayarlarsan hem saate hemde tarihe gore sorgu yaparsin yani saat degistiginde farkli sonuc alabilirsin kolay gelsin
En son kuntay tarafından 01 Ara 2006 10:34 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Ol deyince olduran Gönüllerimizi imanla dolduran
Yüce Allahın doksandokuz ismi ile.. Selamın Aleyküm
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

var bloğunda tanımlı tarih ve saat değişkenlerini kaldır dene... onlara gerek yok...

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

Mesaj gönderen rsimsek »

Kod: Tümünü seç

...
Query2.Params[2].AsDateTime:=StrToTime(maskedit3.Text);
Query2.Params[3].AsDateTime:=StrToTime(maskedit4.Text); 
yerine

Kod: Tümünü seç

...
Query2.ParamByName('ILKSAAT').AsTime := StrToTime(maskedit3.Text);
Query2.ParamByName('SONSAAT').AsTime := StrToTime(maskedit4.Text); 
şeklinde dene.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
kuntay
Üye
Mesajlar: 86
Kayıt: 08 Tem 2003 09:41
Konum: İçel
İletişim:

Tarih ve Saat arası sorgu tam 20 gündür çözemedim

Mesaj gönderen kuntay »

Kod: Tümünü seç

begin 
Try 
Query2.Close; 
Query2.SQL.Clear; 
Query2.SQL.Add('SELECT * FROM data Where Tarih >= :ILKTAR and Tarih <= :SONTAR and Saat >= :ILKSAAT and Saat <= :SONSAAT'); 
Query2.Params[0].AsDateTime:=StrToDate(MaskEdit1.Text); 
Query2.Params[1].AsDateTime:=StrToDate(MaskEdit2.Text); 
Query2.ParamByName('ILKSAAT').AsTime := StrToTime(maskedit3.Text); 
Query2.ParamByName('SONSAAT').AsTime := StrToTime(maskedit4.Text);
Query2.Open; 
Except 
   On Exception do raise; 
end; 
   
Yukarda verdiğim kod çalışıyor ama benim istediğim gibi çalışmıyor.
yukardaki kod şu şekilde çalışıyor.
önce iki tarih arasını süzüyor sonra gelen kayıtlarda da saat aralığına göre bir süzme daha yapıyor bu da sonuçları etkiliyor.

şu şekilde olması lazımdı bir senaryo hemen :

Kod: Tümünü seç

Mesela 01.01.2006 tarihinde saat 12:00 da başlamış taki 05.01.2006 saat 23:50 ye kadar devam eden bir rapor 

Diyelimki Tablomuzda şu kayıtlar Var
01.01.2006 10:00  belge 4
01.01.2006 12:30  belge 5 
02.01.2006 10:30  belge 6
03.01.2006 07:00  belge 7 
04.01.2006 21:30  belge 8

şimdi bu raporda sonuç şu olur
01.01.2006 12:30  belge 5 
02.01.2006 10:30  belge 6
03.01.2006 07:00  belge 7 
04.01.2006 21:30  belge 8

ama yukardaki mantıkda ne olur şu olur ozaman da
01.01.2006 12:30  belge 5 
04.01.2006 21:30  belge 8

Yani arkadaşlar forumda çok arama yaptım ama bu konuda tek bir bilgi bile yok nerdeyse
iki tarih arası var iki saat arası var ama bu yok.
Ol deyince olduran Gönüllerimizi imanla dolduran
Yüce Allahın doksandokuz ismi ile.. Selamın Aleyküm
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
arkadaşım tablonun yapısında başlangıç tarihi, başlangıç saati, bitiş tarihi, bitiş saati alanların varmı.
çünü örnek olarak gönderdiğin kayıtlarda bu alanları göremedim.
hem başlangıç hemde bitiş olarak aynı alanları almışsın.
tablonun yapısını örnek kayıtları ve parametreleri gönderirsen iyi olur..
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
kuntay
Üye
Mesajlar: 86
Kayıt: 08 Tem 2003 09:41
Konum: İçel
İletişim:

Mesaj gönderen kuntay »

Ozaman şöyle anlatayim:

Bu sitede bir program buldum printer çıktılarının bilgisini tutan yani kaçtane çıktı alındığını anlamak için

bende bunu kendime göre düzenledim ve paradox bir veritabanına kaydediyorum.

tablo şu şekilde:

Kod: Tümünü seç

No     çıktı_alınma_tarihi      çıktı_alınma_saati     belge_adı      basılan_sayfa  
şimdi diğelim ki sürekli printerden alınan çıktılar tabloya kaydediliyor
ve benim bir rapor almam gerekti raporun kriterleri şöyle olacak:

Kod: Tümünü seç

01.01.2007 tarihinin saat 12 den başlayıp 05.01.2007 tarihinin saat 20:00 ına kadar olan çıktıların listesi alınacak.

yani bunu şu şekildede açıklarız
patron dediki bana 01.01.2007 tarihinde öğlen saat 12 den itibaren 05.01.2007 tarihinin akşam saat 8 ine karar bilgisayardan alınmış çıktıların bana listesini getir dedi.
Yani daha fazlada nasıl anlatılır bilmiyorum ki .

bir örnek daha verim başka bir konuyla :
mesela patron dediki bana (01.01.2007) öğlen 12 den cuma 05.01.2007 gününün akşam saat 8 ine kadar kesilmiş faturaları raporunu getir dedi

01.01.2007 12 den önce kesilmiş faturalar ve 05.01.2007 saat 20:00 dan sonra kesilmiş faturalar listede olmaması durumu yani

bunun sorgusu nasıl olur faturanın kesildiği tarih ve saat var sadece elimizde.
Ol deyince olduran Gönüllerimizi imanla dolduran
Yüce Allahın doksandokuz ismi ile.. Selamın Aleyküm
iqprog

hadi iyisin al sana çözüm yakala bakalım.

Mesaj gönderen iqprog »

hadi iyisin al sana çözüm yakala bakalım.

SELECT * FROM data
Where (Tarih = :ILKTAR and Saat >= :ILKSAAT)
or (Tarih = :SONTAR and Saat <= :SONSAAT)
or (Tarih > :ILKTAR and Tarih < :SONTAR)
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
şimdi oldu. :wink:
where kısmının şöyle bişey olması gerekiyor sanırsam

Kod: Tümünü seç

(tarih>:ilktarih and tarih<:sontarih)
or
(tarih=:ilktarih and saat>=:ilksaat)
or
(tairh=:sontarih and saat<=:sonsaat)
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
iqprog

Mesaj gönderen iqprog »

:lol:
aslangeri 22 dakika ile kaçırdın.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

tüh be... :shock:
:cry:
ne yapalım birdahakine artık. :lol:
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

Bu konu soruma uygundu yeni konu açmadım dünden beri çabalıyorum ama yapamadım. Parametreli de yaptım olmadı yapmam gereken izin tablosundaki kayıtlar arasında bir personele ait izin kaydını çekmek. izin tablosunda baslangictar,bitistar,id ve birkaç alan daha var. baslangictar ve bitistar tipi smalldatetime. yapmam gereken örnek olarak 01.02.2007 tarihini izin kayıtlarında ilgili personelin bir izni içerinde olup olmadığını bulmak

Kod: Tümünü seç

id             baslangictar            bitistar
2036           15.01.2007              20.02.2007




SELECT     *
FROM         Izin
WHERE     (Id = 2036) AND (BaslangicTar <= '01.02.2007') AND (BitisTar> = '01.02.2007')
Yani elimde iki tarih verisi olsa vt deki bir tarihin bu iki tarih arasında olup olmadığını bulmak kolay, ama elimde tek tarih var ve kayıtta bulunan iki field la karşılaştırma yapmaya çalışıyorum ve çözümü bulamadım.

Not:vt MSSQL
iqprog

Mesaj gönderen iqprog »

id baslangictar bitistar
2036 15.01.2007 20.02.2007




SELECT *
FROM Izin
WHERE (Id = 2036) AND '01.02.2007' between BaslangicTar and BitisTar
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

iqprog yazdı:id baslangictar bitistar
2036 15.01.2007 20.02.2007




SELECT *
FROM Izin
WHERE (Id = 2036) AND '01.02.2007' between BaslangicTar and BitisTar



bu sorguyu daha önce denedim sonuç çıkmadı diye vazgeçtim. ki sizin kodda işe yaramadı yani sonuç gelmedi. en son tesadüfen anladım ki sorgu doğru ama parametre yanlış gönderiliyor. şöyleki ben dd.mm.yyyy olarak yolluyordum tesadüfen mm.dd.yyyy yolladım ve sorgu sonuç döndürdü. anlayacağınız tarihi 01.02.2007 yerine 02.01.2007 olarak yollamak gerekiyormuş. yardım için teşekkür ederim saygılar.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

BDEAdmin.exe den Paradoks un tarih ayarlarını değiştirebilirsin :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla