Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Personel Yıllık İzin Hakediş Hesaplama Hakkında
#1
Hayırlı akşamlar aşağıdaki kodlar ile personel yıllık izin hakedişini hesaplatabiliyorum. Bunun daha kolay ve kısa bir yolu varmı acaba ?

edit1.text = işe giriş tarihi

procedure TForm1.Button1Click(Sender: TObject);
var
 tarih, tarih1,tarih2  : TDate;
 GYil, GAy, GGun       : Word;
 GYil1, GAy1, GGun1    : Word;
 GYil2, GAy2, GGun2    : Word;
begin
 tarih1  :=  Now;
 tarih2  :=  StrToDate(edit1.text);
 DecodeDate(tarih1, GYil1, GAy1, GGun1);
 DecodeDate(tarih2, GYil2, GAy2, GGun2);
 kidem       :=  GYil1 - GYil2;
 sedit4.text :=  inttostr(kidem);
 case kidem of
   1..5    : ilkkademe;
   6..15   : ikincikademe;
   16..90  : ücüncükademe;
 end;
end;

procedure TForm1.ilkkademe;
var
 tarih                       : TDate;
 GYilb,GYila, GAya, GGuna    : Word;
begin
 if (kidem >= 1) and (kidem <= 5) then
   begin
     for i := 1 to kidem do
     begin
       Memo1.Lines.Add('14');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + i;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
   end;
end;

procedure TForm1.ikincikademe;
var
 kad1 ,kad2,sayi             : Integer;
 tarih                       : TDate;
 GYilb,GYila, GAya, GGuna    : Word;
begin
 if (kidem >= 6) and (kidem <= 15) then
   begin
     for i := 6 to kidem do
     begin
       Memo1.Lines.Add('20');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + i;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
     sayi  :=  memo1.Lines.Count;
     kad1  :=  Trunc(sayi/2);
     kad2 :=  kidem - kad1;
     for k := 1 to kad2 do
     begin
       Memo1.Lines.Add('14');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + k;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
   end;
end;

procedure TForm1.ücüncükademe;
var
 kad1 ,kad2,kad3,kad4,sayi,sayi1 : Integer;
 tarih                           : TDate;
 GYilb,GYila, GAya, GGuna        : Word;
begin
 if (kidem >= 16) and (kidem <= 90) then
   begin
     for i := 16 to kidem do
     begin
       Memo1.Lines.Add('26');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + i;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
     sayi  :=  memo1.Lines.Count;
     kad1  :=  Trunc(sayi/2);
     kad2 :=  kidem - kad1;

     for k := 6 to kad2 do
     begin
       Memo1.Lines.Add('20');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + k;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
     sayi1  :=  memo1.Lines.Count;
     kad4  :=  Trunc(sayi1/2);
     kad3  :=  kidem - kad4;
     for j := 1 to kad3 do
     begin
       Memo1.Lines.Add('14');
       tarih  :=  StrToDate(edit1.text);
       DecodeDate(tarih, GYila, GAya, GGuna);
       GYilb  :=  GYila + j;
       Memo1.Lines.Add(DateToStr(EncodeDate (GYilb, GAya, GGuna)));
     end;
   end;
end;
Cevapla
#2
@bkantur 
Eğer bu yaptığın bir ödev ise çok sorun değil fakat bir şirkette çalışacak ise bir personel uzmanından destek almanı öneririm
çünkü parametre aralıkların ve kurallar yanlış en basitinden 16 yaş altı ve 50 yaş üstü kişiler izin hakkı farklıdır

Gelelim kodu daha kısa yazma konusuna
1. Her procedure içinde kidemi tekrar kontrol etmene gerek yok zaten şart oluştu ise bu procedure geliyorsun
2. her procedure edit alanlarından gelen değerleri her seferinde parçalamak yerine procedure gitmeden parçala ya parametre kullan yada ortak değişken kullan
3. her procedure içinde kullandığın ortak yapıyı farklı bir yerde ortak procedure olarak yap

daha başka şeylerde yapılabilir fakat önemli olan senin hangi kurallarla hangi sonuca ulaşmak istediğin önemli
Kolay gelsin
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#3
Bir sınıf veya bir record tanımla. Parametreleri nesneye işlerken (Setterler aracılığıyla) kurallara uygunluğunu kontrol et. Bu tarz bir nesne yapısı kurduktan sonra sonuçları okurken çoğu değer zaten sana hesaplanmış olarak geri dönecektir.
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  AES Şifreleme Hakkında tmrksmt 18 1.281 14-02-2024, Saat: 10:42
Son Yorum: tmrksmt
  TDictionary kullanımım hakkında yhackup 3 399 09-02-2024, Saat: 15:58
Son Yorum: SimaWB
  TfrxReport Rapor dizaynı hakkında yhackup 2 234 24-01-2024, Saat: 11:35
Son Yorum: yhackup
  EdgeBrowser Hakkında bydelphi 2 511 19-11-2023, Saat: 10:21
Son Yorum: bydelphi
  Webp formatı gösterimi hakkında adelphiforumz 1 477 16-03-2023, Saat: 20:52
Son Yorum: uparlayan



Konuyu Okuyanlar: 1 Ziyaretçi