SQL Sorgulama !!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

SQL Sorgulama !!

Mesaj gönderen ozcank »

Arkadaşlar SQL d bir sorgu yaptım fakat iki tarih arası DBGrid1 e rapor aldığımda Genel Toplam satırını toplatıp Label3 e aktarmak istiyorum yardım edebilirmsiniz?

SQL String e yazıyorum ;

SELECT * FROM ROKAYIT
WHERE ROMONTAJTAR >=:ROFILKTAR AND ROMONTAJTAR<=:ROFSONTAR

Button1 e de ;
procedure TForm28.Button1Click(Sender: TObject);
Begin
Query1.close;
Query1.Params[0].AsDateTime:=DateTimePicker1.DateTime;
Query1.Params[1].AsDateTime:=DateTimePicker2.DateTime;
Query1.Open;
Query1.refresh;
end;

yazıyorum

ROGENELTOPL alanını toplatıp Label3 e nasıl aktarabilirim?
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Şu kodu bir denermisin.Sanırım aql kodlarında bir hata yoksa ve sonuç döndürüyorsa bu kod çalışır.Çalışmazsa yine bakarız.Kolay gelsin.

Kod: Tümünü seç

procedure TForm28.Button1Click(Sender: TObject); 
  
var Toplam:Double;  
begin
  Toplam:=0;
//===================================================
  Query1.close; 
  Query1.Params[0].AsDateTime:=DateTimePicker1.DateTime; 
  Query1.Params[1].AsDateTime:=DateTimePicker2.DateTime; 
  Query1.Open; 
//===================================================
  Query1.DisableControls;
  Query1.First;
  while (not (Query1.Eof)) do
  begin
    Toplam:=Toplam+Query1ROGENELTOPL.value;
  end;
  Query1.EnableControls;
  Label3.caption:=FloatToStr(Toplam);
end;
Yanlız Query1 in içine tüm fieldsleri field editörden dahil etmediysen

Kod: Tümünü seç

Query1ROGENELTOPL.value;
yerine

Kod: Tümünü seç

Query1.FieldByName('ROGENELTOPL').value; 
şeklinde kullanmalısın..
assoft

Mesaj gönderen assoft »

Eğer toplam işlemi yapıyorsan SUM fonksiyonunu kullanmalısın...

Kod: Tümünü seç

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.ADD('SELECT SUM(ALAN) FROM TABLO');
Query1.SQL.ADD(WHERE TARIH BETWEEN'''+DateToStr(DateTimePicker1.Date)+'''AND'''+DateToStr(DateTimePicker2.Date)+'''');
Query1.Open;
Label3.Caption := IntToStr(Query1.Fields[0].Asinteger);
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

Bu şekilde liste alıyor ama toplam almıyor şu hatayı veriyor ;

'Invalid Variant type Conversion'


procedure TForm28.Button1Click(Sender: TObject);
var Toplam:Double;
Begin
Toplam:=0;
Query1.close;
Query1.Params[0].AsDateTime:=DateTimePicker1.DateTime;
Query1.Params[1].AsDateTime:=DateTimePicker2.DateTime;
Query1.Open;
Query1.refresh;
Query1.DisableControls;
Query1.First;
while (not (Query1.Eof)) do
begin
Toplam:=Toplam+Query1.FieldByName('ROGENELTOPL').value;
end;
Query1.EnableControls;
Label3.caption:=FloatToStr(Toplam);
end;

Bu satırı ;
Toplam:=Toplam+Query1ROGENELTOPL.value;
kullandığım zaman döngüde takılıyor ve kilitleniyor Run dan Resetlemek
zorunda kalıyorum.
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Hata mesajı tip dönüşümünde hata oluştuğunu söylüyor.
Toplam değişkeni ile senin databasede tuttuğun değerlerini toplamak istediğn alanların fieldi birbirini tutmuyor.Ben doğal olarak senin o alanının tipinin ne olduğunu bilemediğimden sen kendine göre değiştirirsin diye double tanımladım.Veritabanındaki ROGENELTOPL alanının tipi ne ise Toplam değişkeninide o tipte tanımla.Mesela Currency ise
Var Toplam:Currency; gibi.
o zaman çalışacaktır.Kolay gelsin.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

SQL Strings e bu şekildemi yazmam gerekiyor?


SELECT * FROM ROKAYIT
WHERE ROMONTAJTAR >=:ROFILKTAR AND ROMONTAJTAR<=:ROFSONTAR AND
SUM(ROGENELTOPL) TOPLAML
assoft

Mesaj gönderen assoft »

Siz veritabanınızın ne olduğunu ve tablo yapınızın DDL (SQL Kodunu) yazarsanız daha güzel olur çünkü sizin toplama yapmak istediğiniz alanın veritabanı tarafında hangi tipde tanımladığınızı bilmiyoruz.

Kod: Tümünü seç

'Invalid Variant type Conversion' 
Bu hata tip dönüşümlerinde oluşan istisna sebebi ile size gösterilir. ve burada aklıma gelen şey ise toplamını almak istediğiniz alanın string tipte olmasıdır...
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

numeric ama yapamadım işte
assoft

Mesaj gönderen assoft »

İyide ozcank kardeşim sen hangi veritabanını kullanıyorsun? (interbase, firebird, access, mysql, mssql)

Normal şartlarda bu kodun çalıştığı test edilmiştir...

Kod: Tümünü seç

Alanımız (KALAN) Veritabanı tarafında Double Precision olarak tanımlanmıştır.

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT SUM(KALAN)FROM CARIBORC WHERE ISLEM_TARIHI BETWEEN'''+Tarih1.Text+'''AND'''+Tarih2.Text+'''');
Query1.Open;

ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

assoft kardeşim ben db kullanıyorum ve şu şekildede tanımlama yaptım;
Button1 e ;
Query1.Close;
Query1.SQL.Clear;
Query1.Params[0].AsDateTime:=DateTimePicker1.DateTime;
Query1.Params[1].AsDateTime:=DateTimePicker2.DateTime;
Query1.Open;
Query1.refresh;

bunları yazdım.

SQL Strings Kısmınada;
SELECT * FROM ROKAYIT
WHERE ROMONTAJTAR >=:ROFILKTAR AND ROMONTAJTAR<=:ROFSONTAR AND
bunlar yazılı ve bu şekilde çalışıyor bu kısıma SUM da eklemek istiyorum alanım ROGENELTOPL bu alanı toplatıp Label3 e yazdırmak istiyorum hepsi bu kadar.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Mesaj gönderen ozcank »

List index out of bounds (0) hatası alıyorum arkadaşlar ne yapabilirim?

SQL Strings de ;
SELECT ROMUSKODU,ROMUSADI,ROMUSSOY,RO5MICRON,RO5ADET,RO5FIYATI,RO5TUTAR,
ROILKKARBON,ROILKADET,ROILKFIYATI,ROILKTUTAR,RO1MICRON,RO1ADET,
RO1FIYATI,RO1TUTAR,ROMEMBRAN,ROMEMADET,ROMEMFIYATI,ROMEMTUTAR,
ROSONKARBON,ROSONADET,ROSONFIYATI,ROSONTUTAR,ROGENELTOPL,
ROSERVELADSOY,(SELECT SUM(ROGENELTOPL) FROM ROKAYIT
WHERE ROMONTAJTAR BETWEEN :RO1TARIHI AND :RO2TARIHI) AS ROGENELT
FROM ROKAYIT
WHERE ROMONTAJTAR BETWEEN :RO1TARIHI AND :RO2TARIHI

bunları yazıyorum ve Button1 de ise ;
procedure TForm28.Button1Click(Sender: TObject);
Begin
Query1.Close;
Query1.SQL.Clear;
Query1.Params[0].AsDate:=DateTimePicker1.DateTime;
Query1.Params[1].AsDate:=DateTimePicker2.DateTime;
Query1.Open;
Label3.Caption:=FormatCurr('##,###,###,###',StrToFloat(Query1ROGENELT.AsString));
Query1.refresh;
end;
Yardım ederseniz çok sevinirim.
sako
Üye
Mesajlar: 477
Kayıt: 11 Haz 2003 02:40
Konum: ERZURUM

Mesaj gönderen sako »

GELIRQ.close;
GELIRQ.sql.clear;
GELIRQ.SQL.Add('SELECT SUM(Miktar)FROM kasa_gelir WHERE tarih BETWEEN'''+Tarih1.Text+'''AND'''+Tarih2.Text+'''');
GELIRQ.open;

Yukardaki kodu yazıyorum şöyle bi mesaj çıkıyor.

gelirg:field miktar not found

ama query de böyle bi alanım var. Miktar alanının toplamını alcam ben..

kolay gelsin...
DOĞUNUN SINIR TAŞI ERZURUM'UN DADAŞ'I
EFE'Sİ VAR İZMİR'İN EĞİLMEZ TÜRK' ÜN BAŞI
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Selamlar.
Select cümlenizdeki alanlarda bulamadığım dediği alan yok yani select etmiyorsunuz o alanı, hatayı almanız gayet doğal.
Kolay gele..
sako
Üye
Mesajlar: 477
Kayıt: 11 Haz 2003 02:40
Konum: ERZURUM

Mesaj gönderen sako »

Banim billdiğim bu komutun kullanılışı budur eksik olan nedir yada eklenecek olaln nedir bilmiyorum.
DOĞUNUN SINIR TAŞI ERZURUM'UN DADAŞ'I
EFE'Sİ VAR İZMİR'İN EĞİLMEZ TÜRK' ÜN BAŞI
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Pardon, yanlış okumuşum ama hata mantık olarak aynı.Sum(Miktar) dediğinizde alan adı Sum olacaktır.Sum(Miktar) as Miktar.. şeklinde deneyebilirsiniz..
Kolay gelsin.
Cevapla