iki tarih arasındaki çalışma gün sayısı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
iki tarih arasındaki çalışma gün sayısı
İki tarih arasındaki çalışma gün sayısını bulmak istiyorum. Resmi tatiler(Dini ve Milli) ve haftasonuna göre kontrol edecek aradaki çalışma gün sayısını döndürecek kodlara ihtiyacım var. Nasıl bir yol izlemeliyim. dini tatiller her sene farklı günlere denk geldiğinden bunun için form üzerinden mi tarih aralığını vermek mi mantıklı veya bunun için fonksiyonlar var mı.Yardımlarınıza ihtiyacım var.
İyi çalışmalar;
İyi çalışmalar;
- White Rose
- Üye
- Mesajlar: 726
- Kayıt: 06 Tem 2005 09:41
- Konum: Güneyden
- İletişim:
Re: iki tarih arasındaki çalışma gün sayısı
Dini tatiller için Alperen Namaz Vakitleri programına ait dll dosyası var googleden aratırsanız bulursunuz sanırım. O dll dosyasını kullanarak dini günleri bulabilirsiniz. Belki bu formdada olabilri arama yaptırın.
yada aşağıdaki linkten programı indirin onun içinde dll dosyası var.
http://rapidshare.com/files/18381507/Ez ... z.rar.html
yada aşağıdaki linkten programı indirin onun içinde dll dosyası var.
http://rapidshare.com/files/18381507/Ez ... z.rar.html
Re: iki tarih arasındaki çalışma gün sayısı
Teşekkür ederim dini tatil günlerini formdan giriş yapmak yerine dll dosyasından almak daha doğru olacak. Çalışma gün sayısını hesaplatabileceğim kodlara ihtiyacım var.
Re: iki tarih arasındaki çalışma gün sayısı
Bakanlar kurulu karar alarak calisma gununu tatil edebiliyor. Sizde biliyorsunuz ki bazen bayramlara gun ekleniyor. Bu nedenle kesin bir kurali yok. Veri tabaninda tutarak kullanicilarin yeni tatil ekleyebilmesini saglayabilirsiniz.
- White Rose
- Üye
- Mesajlar: 726
- Kayıt: 06 Tem 2005 09:41
- Konum: Güneyden
- İletişim:
Re: iki tarih arasındaki çalışma gün sayısı
öncelikle standart tatil günlerini gireceğiniz ve üzerinde değişiklik yapabileceğiniz bir dosyanız olmalı.
sonra belirlediğiniz başlama tarihinden yine belirlediğiniz bitiş tarihine kadar for döngüsü ile günü bir artırarak
tek tek günlerin tatil gününe denk gelip gelmediğini kontrol ettirerek yapabilirsiniz.
//uses kısmına dateutils eklemeyi unutmayın...
procedure Tform1.button1click(sender.tobject);
var
t1,t2:Tdate;
Gun,I:Integer;
begin
t1:=datetimepicker1.Date;
t2:=datetimepicker2.Date;
Gun:=daysbetween(t2,t1); // iki tarih arası gün farkı
Lbl_Fark.Caption:=inttostr(Gun);
FOR I:=1 To Gun do begin
if t1=tatiltarihi then begin
// yapacağınız işlemler...
end;
IncDay(t1); tarihi bir gün artır
end;
sonra belirlediğiniz başlama tarihinden yine belirlediğiniz bitiş tarihine kadar for döngüsü ile günü bir artırarak
tek tek günlerin tatil gününe denk gelip gelmediğini kontrol ettirerek yapabilirsiniz.
//uses kısmına dateutils eklemeyi unutmayın...
procedure Tform1.button1click(sender.tobject);
var
t1,t2:Tdate;
Gun,I:Integer;
begin
t1:=datetimepicker1.Date;
t2:=datetimepicker2.Date;
Gun:=daysbetween(t2,t1); // iki tarih arası gün farkı
Lbl_Fark.Caption:=inttostr(Gun);
FOR I:=1 To Gun do begin
if t1=tatiltarihi then begin
// yapacağınız işlemler...
end;
IncDay(t1); tarihi bir gün artır
end;
Re: iki tarih arasındaki çalışma gün sayısı
Zannediyorum bu kodları yine bu forumda bulmuştum, oldukçada kullanışlı. c++ versionu bendeki ama forumda delphi kodlamasıda (herhalde) vardı.
bool Tatilmi(TDateTime Tarih)
{
AnsiString Tatil[5]={"01.01","23.04","19.05","30.08","29.10"};
int i;
if(Tarih.DayOfWeek()==1 || Tarih.DayOfWeek()==7) return true;
for(i=0;i<5;i++)
if(Tarih==StrToDate( Tatil+FormatDateTime(".YYYY",Date()) )) return true;
return false;
}
//---------------------------------------------------------------------------
TDateTime IsGunuEkle(TDateTime Tarih,int Gun)
{
int i;
i=0;
while(i<Gun)
{
Tarih=Tarih+1;
if(!Tatilmi(Tarih)) i++;
}
return Tarih;
}
bool Tatilmi(TDateTime Tarih)
{
AnsiString Tatil[5]={"01.01","23.04","19.05","30.08","29.10"};
int i;
if(Tarih.DayOfWeek()==1 || Tarih.DayOfWeek()==7) return true;
for(i=0;i<5;i++)
if(Tarih==StrToDate( Tatil+FormatDateTime(".YYYY",Date()) )) return true;
return false;
}
//---------------------------------------------------------------------------
TDateTime IsGunuEkle(TDateTime Tarih,int Gun)
{
int i;
i=0;
while(i<Gun)
{
Tarih=Tarih+1;
if(!Tatilmi(Tarih)) i++;
}
return Tarih;
}
Re: iki tarih arasındaki çalışma gün sayısı
Kod: Tümünü seç
procedure TForm6.Query1CalcFields(DataSet: TDataSet);
var
t1,t2:Tdate;
Gun,I,calisma:Integer;
begin
t1:=query1otarih.AsDateTime; // 02.02.2010 onay tarihi
t2:=query1btarih.AsDateTime; //24.02.2010 bitiş tarihi
Gun:=daysbetween(t2,t1); // iki tarih arası gün farkı
calisma:=0;
FOR I:=1 To gun do // 22
begin
if (dayofweek(t1)<>1) or (dayofweek(t1)<>7) then
begin
calisma:=calisma+1;
end;
IncDay(t1);
end;
query1gun.value:=calisma;
end;
end.
Re: iki tarih arasındaki çalışma gün sayısı
if (dayofweek(t1)<>1) or (dayofweek(t1)<>7) then
yerine
if (dayofweek(t1)<>1) and (dayofweek(t1)<>7) then
yazmanız gerekiyor.
yerine
if (dayofweek(t1)<>1) and (dayofweek(t1)<>7) then
yazmanız gerekiyor.
Re: iki tarih arasındaki çalışma gün sayısı
if (dayofweek(t1)<>1) and (dayofweek(t1)<>7) then
t1 tarihi iki şartı birden sağlamaz. ya cumartesiye denk gelir veya pazara. kodda t2 ile t1 arası gün farkını alıp t1 den sonra o fark kadar tarihi artırıyor. bu arada haftasonuna gelen tarihleri saymamasını gerekiyor. Birde buraya resmi tatilleri veri tabanından kontrol eden döngü bloğu eklemem lazım resmi tatillere gelen günleri de saymamısı lazım.(query2.eof) bu bloğu nereye eklemem lazım. For döngüsünün içinde her bir tarih için hem haftasonuna denk geliyormu hemde resmi tatillere denk geliyormu kontrol ettirmem lazım.
While not query2.eof do ile denedim fakat başarılı olamadım.
Kodlara bide siz göz atarmısınız.
t1 tarihi iki şartı birden sağlamaz. ya cumartesiye denk gelir veya pazara. kodda t2 ile t1 arası gün farkını alıp t1 den sonra o fark kadar tarihi artırıyor. bu arada haftasonuna gelen tarihleri saymamasını gerekiyor. Birde buraya resmi tatilleri veri tabanından kontrol eden döngü bloğu eklemem lazım resmi tatillere gelen günleri de saymamısı lazım.(query2.eof) bu bloğu nereye eklemem lazım. For döngüsünün içinde her bir tarih için hem haftasonuna denk geliyormu hemde resmi tatillere denk geliyormu kontrol ettirmem lazım.
While not query2.eof do ile denedim fakat başarılı olamadım.
Kodlara bide siz göz atarmısınız.
Kod: Tümünü seç
procedure TForm6.Query1CalcFields(DataSet: TDataSet);
var
t1,t2:Tdate;
Gun,I,calisma:Integer;
begin
t1:=query1otarih.AsDateTime; // 02.02.2010 onay tarihi
t2:=query1btarih.AsDateTime; //24.02.2010 bitiş tarihi
Gun:=daysbetween(t2,t1); // iki tarih arası gün farkı
calisma:=0;
FOR I:=1 To gun do // 22
begin
if (dayofweek(t1)<>1) or (dayofweek(t1)<>7) then
begin
calisma:=calisma+1;
end;
IncDay(t1);
end;
query1gun.value:=calisma;
end;
end.
Re: iki tarih arasındaki çalışma gün sayısı
s.a.
öncelikle bir fonksiyon hazırla tarih tipinde bir parametresi olan, geriye true yada false döndüren
daha sonra hazırladığın döngünün içinde bu fonksiyonu çağır.
geriye tatilgünümü metodunun içeriğini doldurmak kalıyor ki onu yapacağına eminim.
kolay gelsin.
öncelikle bir fonksiyon hazırla tarih tipinde bir parametresi olan, geriye true yada false döndüren
Kod: Tümünü seç
Function TatilGunumu(aTarih:TDate):Boolean
Begin
//.... buraya kontrol kriterlerini koy tatilgünü ise true değilse false dönder
End;
Kod: Tümünü seç
FOR I:=1 To gun do // 22
begin
if TatilGunumu(t1)=False then
begin
calisma:=calisma+1;
end;
IncDay(t1);
end;
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Re: iki tarih arasındaki çalışma gün sayısı
Kod: Tümünü seç
if (dayofweek(t1)<>1) or (dayofweek(t1)<>7) then
or dan dolayı cumartesi olabilir ama pazar değil ki diyip gene true döndürecektir.
keza pazar olsa dahi bugün pazar olabilir ama sonuşöta cumartesi değil diyip gene true döndürür.
haliyle haftanın 7 gününü de sayar
fakat
Kod: Tümünü seç
if (dayofweek(t1)<>1) and (dayofweek(t1)<>7) then
kodu denediniz mi


neyse
aşağıdaki kodu şimdi yazdım ilerde bana da lazım olur diye.
Kod: Tümünü seç
{ DayOfWeek returns the day of the week of the given date. The result is an
integer between 1 and 7, corresponding to Sunday through Saturday.
This function is not ISO 8601 compliant, for that see the DateUtils unit. }
Function CalismaGunleriSayisi (Baslangic,Bitis : TDateTime;
OzelGunler:Array of TDateTime):Integer;
const
Gunler : array[1..7] of Integer = (7,1,2,3,4,5,6);
var
tmpTarih : TDateTime;
iTemp : Integer;
inDate : Boolean;
Begin
Result :=0;
tmpTarih:=Min(Baslangic,Bitis);
while tmpTarih<=Max(Baslangic,Bitis) do
Begin
if not (Gunler[DayOfWeek(tmpTarih)] in [DaySaturday,DaySunday]) then
Begin
if Length(OzelGunler)=0 then Inc(Result)
else
Begin
inDate := False;
for iTemp := Low(OzelGunler) to High(OzelGunler) do
Begin
if tmpTarih=OzelGunler[iTemp] then
Begin
inDate:=True;
Break;
End;
End;
if not inDate then inc(Result);
End;
End;
tmpTarih := IncDay(tmpTarih,1);
End;
End;
Kod: Tümünü seç
ShowMessage(
InttoStr(
CalismaGunleriSayisi(StrToDate('01.04.2010'),StrToDate('30.04.2010'),[])
)
);
Özel Günle kullanımı "23 Nisan"
Kod: Tümünü seç
ShowMessage(
InttoStr(
CalismaGunleriSayisi(StrToDate('01.04.2010'),StrToDate('30.04.2010'),
[StrToDate('23.04.2010')])
)
);
ve bu da bu yılki çalışma günü
Kod: Tümünü seç
ShowMessage
(
InttoStr
(
CalismaGunleriSayisi(StrToDate('01.01.2010'),StrToDate('31.12.2010'),
[
StrToDate('23.04.2010'),
StrToDate('01.01.2010'),
StrToDate('23.04.2010'),
StrToDate('01.05.2010'),
StrToDate('19.05.2010'),
StrToDate('30.08.2010'),
StrToDate('09.09.2010'),
StrToDate('10.09.2010'),
StrToDate('11.09.2010'),
StrToDate('29.10.2010'),
StrToDate('16.11.2010'),
StrToDate('17.11.2010'),
StrToDate('18.11.2010'),
StrToDate('19.11.2010')
])
)
);
Re: iki tarih arasındaki çalışma gün sayısı
s.a.
özel günler için oluşturduğunuz dizide yılalrı belirtmeden sadece ay ve günleri belirtip yılı aktif yıldan kontrol ettirerek kodu hersene güncelleme zahmetinden kurtulabilirsiniz.
kolay gelsin.
özel günler için oluşturduğunuz dizide yılalrı belirtmeden sadece ay ve günleri belirtip yılı aktif yıldan kontrol ettirerek kodu hersene güncelleme zahmetinden kurtulabilirsiniz.

kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Re: iki tarih arasındaki çalışma gün sayısı
StrToDate('23.04.2010') İki kere verilmiş.
bayramlar değişiyor. ayrıca kodu incelemedim ama resmi tatil hafta sonuna geliyor ise değerlendirmiyordur sanırım.

bayramlar değişiyor. ayrıca kodu incelemedim ama resmi tatil hafta sonuna geliyor ise değerlendirmiyordur sanırım.
Bir kelimenin anlamını öğretsen bile yeter..



Re: iki tarih arasındaki çalışma gün sayısı
a.s. 03.10.2010 ile 07.03.2011 için düşünün.aslangeri yazdı:s.a.
özel günler için oluşturduğunuz dizide yılalrı belirtmeden sadece ay ve günleri belirtip yılı aktif yıldan kontrol ettirerek kodu hersene güncelleme zahmetinden kurtulabilirsiniz.
![]()
kolay gelsin.

farketmiyor 15 tane 23 Nisan koysak ve hepsi cumartesiye gelse eksiltme değil şartları karşılayınca arttırma yapptığı için değilşen birşey olmuyor.conari yazdı: StrToDate('23.04.2010') İki kere verilmiş.
bayramlar değişiyor. ayrıca kodu incelemedim ama resmi tatil hafta sonuna geliyor ise değerlendirmiyordur sanırım.
Not: Yarım günler eklenmedi tabi

Re: iki tarih arasındaki çalışma gün sayısı
bu arada delphinin kodlarını kurcalarken farkettim.
sysutils deki DayOfWeek de ilk gün 7 son gn 6 yani 7,1,2,3,4,5,6
dateutils deki DayOfTheWeek de ilk gün 1 son gün 7 yani 1,2,3,4,5,6,7
yani verdiğim koddaki DayOfWeek yerine DayOfTheWeek kullanırsak gunler isimli diziye gerek kalmayacak
fonksiyonun sağında {ISO 8601} açıklaması bulunan fonksiynlarda ilk gün 1 olarak belirlenmiş. diğerlerinde ise 7
gene dateutils deki
Const değerler ex:(DaySaturday,DaySunday,DayMonday) gibi değerler de ISO 8601 'e göre değerlenmiş.
yani ilk gün 1. son gün 7 olarak.
vesaire vesaire.
sysutils deki DayOfWeek de ilk gün 7 son gn 6 yani 7,1,2,3,4,5,6
dateutils deki DayOfTheWeek de ilk gün 1 son gün 7 yani 1,2,3,4,5,6,7
yani verdiğim koddaki DayOfWeek yerine DayOfTheWeek kullanırsak gunler isimli diziye gerek kalmayacak

fonksiyonun sağında {ISO 8601} açıklaması bulunan fonksiynlarda ilk gün 1 olarak belirlenmiş. diğerlerinde ise 7
gene dateutils deki
Const değerler ex:(DaySaturday,DaySunday,DayMonday) gibi değerler de ISO 8601 'e göre değerlenmiş.
yani ilk gün 1. son gün 7 olarak.
vesaire vesaire.