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;
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;
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...
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.
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...
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?
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...
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?
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...
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
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.
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...