İki tarih arasında sum işlemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
hido
Üye
Mesajlar: 268
Kayıt: 29 Mar 2014 04:32

İki tarih arasında sum işlemi

Mesaj gönderen hido »

İyi günler...

İki tarih arasında bir satılan ürününlerin fiyatı edit içinde belirlediğim sayıyı aşmışmı, bunu nasıl yaptıra bilirim...

Kod: Tümünü seç

procedure TForm1.Button4Click(Sender: TObject);
begin
  with Form1.Urun do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT SUM (Toplam) * FROM URUNLER');
    SQL.Add('Where URUNADI Like ' + QuotedStr('%' + Edit1.Text + '%')); // aranan ürün
    SQL.Add('And TARIH BETWEEN :Tarih1 AND :Tarih2 Order By TARIH');
    ParamByName('Tarih1').AsDate := MonthCalendar1.Date;
    ParamByName('Tarih2').AsDate := MonthCalendar2.Date;
    ParamByName('Toplam').AsInteger := Edit2.Text;// iki tarih
    Prepared := True;
    Open;
    if Not IsEmpty then
    begin
     SHOWMESSAGE('Geçmiş');
    end;
  end;
end;
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: İki tarih arasında sum işlemi

Mesaj gönderen esistem »

Yanılmıyosam şöyleydi.

Kod: Tümünü seç

procedure TForm1.Button4Click(Sender: TObject);
begin
  with Form1.Urun do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT SUM (Toplam) * FROM URUNLER');
    SQL.Add('Where URUNADI Like ' + QuotedStr('%' + Edit1.Text + '%')); // aranan ürün
    SQL.Add('And TARIH BETWEEN :Tarih1 AND :Tarih2 Order By TARIH');
    SQL.Add('HAVING SUM(Toplam)>:toplam'); // sum alınan işlemlerde bu şekilde yapılıyordu sanırım siz HAVING komutunu araştırın yinede
    
    ParamByName('Tarih1').AsDate := MonthCalendar1.Date;
    ParamByName('Tarih2').AsDate := MonthCalendar2.Date;
    ParamByName('Toplam').AsInteger := strtoint(Edit2.Text);// strtoint kullanmalısınız
    Prepared := True;
    Open;
    if Not IsEmpty then
    begin
     SHOWMESSAGE('Geçmiş');
    end;
  end;
end;
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: İki tarih arasında sum işlemi

Mesaj gönderen brs »

Sayın hocam Müsaadenizle benimde bir sorum olacak; SUM komutunu time içinde kullanabilir miyiz?

ID Göre totali alıyorum, fakat aynı işlemi time göre hesaplayınca alamıyorum...


Kod: Tümünü seç

procedure TForm1.Button21Click(Sender: TObject);
begin
  with Playlist do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT SUM(YDURATION) AS MAXSURE FROM PLAYLIST');
    SQL.Add('Where ICERIK Like ' + QuotedStr('%' + 'Lansman' + '%'));
    SQL.Add('And YTARIH=:Tarih And START BETWEEN :Time1 AND :Time2');
    ParamByName('Tarih').AsDate := StrToDate(Tarih.Caption);
    ParamByName('Time1').AsTime := StrToTime('00:00:00');
    ParamByName('Time2').AsTime := StrToTime('03:00:00');
    Prepared := True;
    Open;
    if Not IsEmpty then
    begin
      Caption := TimeToStr(FieldByName('MAXSURE').AsString);
    end;
  end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
dogan
Üye
Mesajlar: 173
Kayıt: 17 Eki 2014 10:11

Re: İki tarih arasında sum işlemi

Mesaj gönderen dogan »

Sum işleminde time hesaplanmıyor diye biliyorum.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: İki tarih arasında sum işlemi

Mesaj gönderen esistem »

Selam,
Saat işlemlerinde sum toplamı almanız manasız olur zaten, mesela 00:05:00 ile 00:15:00 saatlerini toplamanızın ne manası olabilir? Ama şunuda diyebilirsiniz tabi "örneğin bir işlem 5 dakika 5 saniye sürmüş diğeri 15 dakika sürmüş toplamı 20 dakika 5 saniye yapıyor benimde bunu bulmam gerekiyor".
eğer durum buysa ve geçen süreyi yukarıdaki time şeklinde kaydetmiş iseniz bu iki zamanı saniye tipine çevirip her ikisini toplayıp çıkan sonucu yeniden saat:dakika:saniye tipine çevirmeniz gerekir. Kısaca doğrudan sum(time) işlemi yapamazsınız.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: İki tarih arasında sum işlemi

Mesaj gönderen brs »

esistem yazdı:Selam,
Saat işlemlerinde sum toplamı almanız manasız olur zaten, mesela 00:05:00 ile 00:15:00 saatlerini toplamanızın ne manası olabilir? Ama şunuda diyebilirsiniz tabi "örneğin bir işlem 5 dakika 5 saniye sürmüş diğeri 15 dakika sürmüş toplamı 20 dakika 5 saniye yapıyor benimde bunu bulmam gerekiyor".
eğer durum buysa ve geçen süreyi yukarıdaki time şeklinde kaydetmiş iseniz bu iki zamanı saniye tipine çevirip her ikisini toplayıp çıkan sonucu yeniden saat:dakika:saniye tipine çevirmeniz gerekir. Kısaca doğrudan sum(time) işlemi yapamazsınız.

Selam Hocam, kısaca anlatmaya çalışayım;

01:00:00 ile 02:00:00 saatleri arasında tv'de üç tane tanıtım girdiğini düşünün bu tanıtımlarında her birinin süre 20, 15 ve 45 saniye bu tanıtımların toplam sürelerini almam lazım...

Kafa durdu, sum yerine ne kullana bilirim toplama işlemi için...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: İki tarih arasında sum işlemi

Mesaj gönderen esistem »

Peki bu 20,15 ve 45 saniye süren tanıtımların verileri nerde saklanıyor? Veritabanında bunlar integer veri tipinde olarak kayıtlı ise sorun yok sum(tanitim_sureleri) dersin olur biter. Yok eğer veritabanında kayıtlı değilse bu süreleri nerden biliyorsun?
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: İki tarih arasında sum işlemi

Mesaj gönderen brs »

Database tutuyorum;

Hocam sonuca yaklaştım sanırım, kayıt birse sorun yok birden fazla olunca sadece birinin süresini gösteriyor

Kod: Tümünü seç

var
  S1: TDateTime;
begin
  with Playlist do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM PLAYLIST');
    SQL.Add('Where ICERIK Like ' + QuotedStr('%' + 'Tanıtım' + '%'));
    SQL.Add('And YTARIH=:Tarih And START BETWEEN :Time1 AND :Time2');
    ParamByName('Tarih').AsDate := StrToDate(Tarih.Caption);
    ParamByName('Time1').AsTime := StrToTime('06:00:00');
    ParamByName('Time2').AsTime := StrToTime('13:00:00');
    Prepared := True;
    Open;
    if Not IsEmpty then // Kayıt Varsa
    begin
      S1 := S1 + StrToTime(FieldByName('YDURATION').Value);
    end;
  end;
  Caption := (TimeToStr(S1));
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: İki tarih arasında sum işlemi

Mesaj gönderen esistem »

select * from demişsin yine, orda sanırım YDURATION alanını alıyorsun, bu alan time olarakmı kayıtlı? Sorgudan anladığım, belirli bir günde saat 6 ile 13 arasındaki içersinde tanıtım geçen içeriklerin sürelerinin toplamını almak istiyosun? doğrumudur?
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: İki tarih arasında sum işlemi

Mesaj gönderen brs »

Varchar olarak kayıtlı time olarak da denedim, bir türlü doğru sonuç çıkmıyor...


Deneme 3:

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
var
  S1: TDateTime;
begin
  with Playlist do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM PLAYLIST');
    SQL.Add('Where ICERIK Like ' + QuotedStr('%' + 'Tanıtım' + '%'));
    SQL.Add('And YTARIH=:Tarih And START BETWEEN :Time1 And :Time2');
    ParamByName('Tarih').AsDate := StrToDate(Tarih.Caption);
    ParamByName('Time1').AsTime := StrToTime('06:00:00');
    ParamByName('Time2').AsTime := StrToTime('13:00:00');
    Prepared := True;
    Open;
    if Not IsEmpty then // Kayıt Varsa
    begin
      S1 := StrToTime(FieldByName('YDURATION').Value);
      S1 := S1 + S1;
     Caption := (TimeToStr(S1));
    end;
  end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: İki tarih arasında sum işlemi

Mesaj gönderen esistem »

Eğer time olarak kayıtlı ise sana lazım olan kod

Kod: Tümünü seç

SELECT SUM ( datediff(second, time '00:00:00', YDURATION) ) AS SANIYE // Saniye cinsinden toplamı verir
SELECT SUM ( datediff(minute, time '00:00:00', YDURATION) ) AS DAKIKA // Dakika cinsinden toplamı verir
datediff iki tarih veya saat arasındaki farkı verir, YDURATION büyük ihtimalle '00:15:15' gibi bir kayıt sende, yani 15 dakika 15 saniye gibi. bizde kodda YDURATION kaydından '00:00:00' zamanını çıkartıyoruz ki toplam değerin kaç dakika yada saniye olduğunu bulalım, daha sonrada sum ile toplam işlemi alıyoruz. Eğer YDURATION varcahar olarak kayıtlı ise SQL sorgunda "time YDURATION" yazman gerek sanırım.
aşağıdaki linki incelersen yararı olur.
http://www.firebirdsql.org/refdocs/lang ... ediff.html
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: İki tarih arasında sum işlemi

Mesaj gönderen esistem »

Kodu şimdi test ettim eğer "minute" olarak datediff kullanırsan sadece dakika farkını alıyor yani '00:15:20' gibi bir değer varsa sonucu 15 olarak gösteriyor, sen second yani saniye olarak farkını alıp SQl den dönen sonucu tekrar 15 dakika 20 saniye gibi gösterebilirsin.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: İki tarih arasında sum işlemi

Mesaj gönderen brs »

esistem yazdı:Kodu şimdi test ettim eğer "minute" olarak datediff kullanırsan sadece dakika farkını alıyor yani '00:15:20' gibi bir değer varsa sonucu 15 olarak gösteriyor, sen second yani saniye olarak farkını alıp SQl den dönen sonucu tekrar 15 dakika 20 saniye gibi gösterebilirsin.

Hocam rica etsem test etiğiniz kodları paylaşır mısınız, ben time '00:00:00' kısmında hata alıyorum run gerçekleşmiyor
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: İki tarih arasında sum işlemi

Mesaj gönderen esistem »

Bendeki veritabanı Firebird sizde? birde hata nedir?
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: İki tarih arasında sum işlemi

Mesaj gönderen brs »

esistem yazdı:Bendeki veritabanı Firebird sizde? birde hata nedir?

sqlite kullanıyorum fakat daha derleme aşmasında sıkıntı oluşuyor

Resim
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Cevapla