Saat Toplama İşlemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Saat Toplama İşlemi

Mesaj gönderen ertline »

Merhaba arkadaşlar,

puantaj girişlerinin takibi için bir çalışma yapıyorum.

personelin giriş ve çıkış saatlerini sisteme işliyorum, erken yada geç giriş çıkışa göre personele mesai yada kesin saati hesabını yapıyorum.

burada mesai ve kesin saatlerinin toplamlarını almam gerekiyor, bir türlü yapamadım. sql sum fonksiyonu alan integer olmadığı için hata veriyor.

mesai kesinti
00:15:00
01:30:00
00:30:00
00:15:00
00:45:00

toplam :02:15:00 01:00:00

gibi bir toplam almak istiyorum, yardımcı olabilir misiniz
"Bilginin Doruğuna Hep Birlikte..."
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Saat Toplama İşlemi

Mesaj gönderen ertank »

Merhaba,

Verdiğiniz bilgiler ile yardımcı olmak mümkün değil.
1- Kullandığınız veritabanı nedir?
2- İlgili tablo/tabloların kolon yapısı nedir?
3- Örnek olarak verdiğiniz veriye ait toplama işleminde bize bildirmediğiniz kolonlar ile ilgili bilgi vermemişsiniz. Hangi koşullara göre filtreleme yapıyorsunuz?
4- Giriş hareketini belirleyen bir kolon var mı? Giriş/çıkış değerleri nedir?
5- Fazla mesai nasıl tespit ediliyor?
6- Başka tablolar ile birleştirme yapılması gerekiyor mu? Evet ise birleştirilen tablo örnek verilerini paylaşabilir misiniz?

En azından bu bilgileri temin etmeniz gerekir ki yardımcı olmak isteyen arkadaşların test edip doğru SQL komutunu çıkarmalarına yardımcı olacak doneler olsun.
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Re: Saat Toplama İşlemi

Mesaj gönderen ertline »

merhaba Ertan hocam,
1.firebird veri tabanı
2.mesai ve kesinti time veri türünde
3. Örneğin 01.06.2021 ile 04.06.2021 tarihleri arasıda fitreleme yapıldı. bu tarih aralığında hesaplanan mesai ve kesinti saatlerinin toplamını almak istiyorum.
tarih mesai kesinti
01.06.2021 00:30 00:00
02.06.2021 00:00 01:00
03.06.2021 00:15 00:45
04.06.2021 00:45 00:10
Toplam 01:30 01:55 şeklinde toplam aldırmak istiyorum.

4. giriş hareketini sabit bir değerden normal mesai başlangıç saati ve bitiş saati referans olarak günlük bazda ise_giris_saati ve isten_cikis_saati ne göre hesaplayarak mesai yada kesinti saatlerini getiriyorum. takıldığımda 3. numarada belirttiğim mesai ve kesinti saatlerinin toplamını sum ile alamam.
5. fazla mesai mesai başlangıç ve bitiş saati referans alınarak, erken saatte giriş yapıldıysa o kadar süre mesai geç geldiyse de o kadar kesinti hesaplanıyor. Çıkış içinde erken çıkılırsa kesinti, geç çıkılırsa mesai saati hesaplanıyor.
6.Başka tablolarla birleşme yapılmayacak.

ilginiz için teşekkür ederim
"Bilginin Doruğuna Hep Birlikte..."
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Saat Toplama İşlemi

Mesaj gönderen ertank »

Verdiğiniz yanıtlardan anlayabildiğim kadarıyla;

Standard FirebirdSQL içinde zaman toplama imkanı direk olarak yok. Tahminimce en yakın aşağıdaki şekilde yapabilirsiniz. Örneklerin doğru çalıştığı FirebirdSQL 2.5 üzerinde test edilmiştir.

Örnek tablo ve veri oluşturma SQLleri

Kod: Tümünü seç

create table test (
tarih date,
mesai time,
kesinti time
);

commit;

insert into test values('2021-06-01', '00:30', '00:00');
insert into test values('2021-06-02', '00:00', '01:00');
insert into test values('2021-06-03', '00:15', '00:45');
insert into test values('2021-06-04', '00:45', '00:10');
Alternatif çözüm 1:

Kod: Tümünü seç

select
  sum(extract(hour from mesai)) as mesaisaat,
  sum(extract(minute from mesai)) as mesaidakika,
  sum(extract(hour from kesinti)) as kesintisaat,
  sum(extract(minute from kesinti)) as kesintidakika
from
  test
Sonuç aşağıdaki gibi olacaktır

Kod: Tümünü seç

      MESAISAAT|    MESAIDAKIKA|    KESINTISAAT|  KESINTIDAKIKA|
         BIGINT|         BIGINT|         BIGINT|         BIGINT|
----------------------------------------------------------------
              0|             90|              1|             55|
Alternatif çözüm 2:

Kod: Tümünü seç

select
  (sum(extract(hour from mesai)) * 60) + sum(extract(minute from mesai)) as mesaidakika,
  (sum(extract(hour from kesinti)) * 60) + sum(extract(minute from kesinti)) as kesintidakika
from
  test
Sonuç aşağıdaki gibi olacaktır

Kod: Tümünü seç

    MESAIDAKIKA|  KESINTIDAKIKA|
         BIGINT|         BIGINT|
--------------------------------
             90|            115|
Yukarıdaki sonuçları alıp uygulama içinde gün, saat ve dakika cinsinden hesaplayıp gösterebilirsiniz.

Bu sizin için uygun değil ise UDF olarak istediğiniz sonucu üreten bir fonksiyon yazıp FirebirdSQL'e tanımını yapıp SQL içinde bu fonksiyonu kullanabilirsiniz.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Saat Toplama İşlemi

Mesaj gönderen freeman35 »

ertank yazdı: 06 Haz 2021 09:39 Standard FirebirdSQL içinde zaman toplama imkanı direk olarak yok.....
https://firebirdsql.org/refdocs/langref ... teadd.html
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Saat Toplama İşlemi

Mesaj gönderen ertank »

freeman35 yazdı: 07 Haz 2021 08:40
ertank yazdı: 06 Haz 2021 09:39 Standard FirebirdSQL içinde zaman toplama imkanı direk olarak yok.....
https://firebirdsql.org/refdocs/langref ... teadd.html
Doğru ifade de eksiklik var. "Aggregate fonksiyonlar (sum gibi) ile time kolonu toplama işlemi yapamazsınız." daha doğru olurdu.
ertline
Üye
Mesajlar: 137
Kayıt: 23 Nis 2005 09:15
Konum: Bartın
İletişim:

Re: Saat Toplama İşlemi

Mesaj gönderen ertline »

merhaba Ertan hocam

aşağıdaki kodu yazınca 00:00:00 değeri veriyor.

var
m,i:Ttime;


form4.puantaj_sum.Close;
form4.puantaj_sum.UnPrepare;
form4.puantaj_sum.SQL.Clear;
form4.puantaj_sum.SQL.Add('select (sum(extract(hour from mesai)) * 60) + sum(extract(minute from mesai)) as MESAI from PUANTAJ_DETAIL WHERE DNO=:KNO');
form4.puantaj_sum.Prepare;
form4.puantaj_sum.Open;

m:=form4.puantaj_sum.fields[0].asfloat;

showmessage(timetostr(m));

form1.IBDataSet1.Edit;
form1.IBDataSet1.FieldByName('MESAI_TOP').AsDateTime:=m;
//form1.IBDataSet3.FieldByName('KESINTI_TOP').AsDateTime:=i;
//form1.IBDataSet3.FieldByName('KALAN_TOP').AsDateTime:=m-i;
form1.IBDataSet1.Post;
"Bilginin Doruğuna Hep Birlikte..."
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Saat Toplama İşlemi

Mesaj gönderen freeman35 »

ertank yazdı: 07 Haz 2021 11:52 Doğru ifade de eksiklik var. "Aggregate fonksiyonlar (sum gibi) ile time kolonu toplama işlemi yapamazsınız." daha doğru olurdu.
Mesajımın, Tenkit olarak değil de, "hatırlatma" mahiyetinde olduğunu bildirmek isterim.
Vaktim yok, ve ben kod yazmaktansa anlatmayı tercih ediyorum. Bir function yazılabilir, procedure olabilir, execute block olabilir vs vs, çok olasılık var.
kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Saat Toplama İşlemi

Mesaj gönderen ertank »

ertline yazdı: 07 Haz 2021 11:56 merhaba Ertan hocam

aşağıdaki kodu yazınca 00:00:00 değeri veriyor.

var
m,i:Ttime;


form4.puantaj_sum.Close;
form4.puantaj_sum.UnPrepare;
form4.puantaj_sum.SQL.Clear;
form4.puantaj_sum.SQL.Add('select (sum(extract(hour from mesai)) * 60) + sum(extract(minute from mesai)) as MESAI from PUANTAJ_DETAIL WHERE DNO=:KNO');
form4.puantaj_sum.Prepare;
form4.puantaj_sum.Open;

m:=form4.puantaj_sum.fields[0].asfloat;

showmessage(timetostr(m));

form1.IBDataSet1.Edit;
form1.IBDataSet1.FieldByName('MESAI_TOP').AsDateTime:=m;
//form1.IBDataSet3.FieldByName('KESINTI_TOP').AsDateTime:=i;
//form1.IBDataSet3.FieldByName('KALAN_TOP').AsDateTime:=m-i;
form1.IBDataSet1.Post;
Merhaba,

Soru sorar iken gerekli detay bilgi vermeyi unutmayın.

1- Sorgu sonucunda aldığınız değer nedir?
2- Sorgu sonucu toplam dakika ifade eder. TTime değeri değildir. Dolayısıyla sizin 115 gibi bir dakika değerini '1:55' gibi bir string değere çevirmeniz gerekir.
3- Birden fazla defa çalıştıracağınız sorgular için "Prepare" kullanılması tavsiye edilir. Rapor mahiyetinde arada çalıştırılacak sorgular için Prepare kullanmasanız da olur.
Cevapla