belli bir aydan sonrasını farklı hesaplama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen erdogan_ozkaya »

Arkadaşlar,

MAAS, Ocak....Aralık aylar, ORAN, ARTIS_AYI, TOPLAM die alanlarım var

personelin maaşı 1000 TL olsun ARTIS_AYI Mayıs, ORAN %5 olsun (1050 TL) mayısa kadar 5 bin TL toplasın Mayıstan sonraki aylar ise 7350 TL toplasın ve genel toplama 12350 TL Yazsın nasıl yapabilirim ?

şuan aşağıdaki gibi yapıyorum ama artış ayından sonrasını hesaplayamıyorum :(

Kod: Tümünü seç

procedure TPERSONEL.MEM_PERSONEL_LISTESICalcFields(DataSet: TDataSet);
begin 
  MEM_PERSONEL_LISTESI.Fieldbyname('TOPLAM').Value:=
  (MEM_PERSONEL_LISTESI.Fieldbyname('OCAK').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('SUBAT').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('MART').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('NISAN').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('MAYIS').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('HAZIRAN').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('TEMMUZ').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('AGUSTOS').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('EYLUL').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('MAAS').Value;
end;

teşekkürler
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen ertank »

Merhaba,

Database alanlarındaki değerlerden bir tanesi NULL ise yazdığınız kod TOPLAM alanına NULL değer atayacaktır. Bunu önlemek için

Kod: Tümünü seç

TDataSet.FieldByName('alanadi').Value
yerine

Kod: Tümünü seç

TDataSet.FieldByName('alanadi').AsFloat
//veya
TDataSet.FieldByName('alanadi').AsCurrency
kullanımını tercih etmenizde fayda var.

Sebebini anlamak için aşağıdaki örnek kodu deneyebilirsiniz. Çalışma zamanında "Could not convert variable of type (NULL) into (OleStr)" benzeri bir hata mesajı verecektir. Çünkü toplanan değerlerin bir tanesi NULL değer taşımaktadır. Bu durumda VarToplam değeri de NULL olacaktır.

Kod: Tümünü seç

var
  Var1, Var2, Var3, VarToplam: Variant;
begin
  Var1 := 2.5;
  Var2 := Null;
  Var3 := 5;
  VarToplam := Var1 + Var2 + Var3;
  ShowMessage(VarToplam);
end;
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen erdogan_ozkaya »

hocam yardımın için saol ama analayamadım :( valla
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen ertank »

Database tablosu yapısı nasıl?
- ARTIS_AYI veri türü nedir? Değeri nedir?
- ORAN veri türü nedir? Değeri nedir?
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen erdogan_ozkaya »

ay ve oran türleri numeric yani rakam giriyorum hepsine
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen freeman35 »

table'a ay bilgisini tutmak için sayı tipinde bir alan ekle (1,2,3...) table a bu alana index ekle ve buna göre aç. sonrası döngü ve if kontrolü
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 !!!
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen erdogan_ozkaya »

tablo aşağıdaki gibi. aşağıdaki kod ile oluyor ama daha kısa ve basit bir yolu olmalı :(


Resim

Kod: Tümünü seç

MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value:=
  MEM_PERSONEL_LISTESI.Fieldbyname('MAAS').Value*
  MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_YUZDESI').Value/100+MEM_PERSONEL_LISTESI.Fieldbyname('MAAS').Value;




  if MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=1
  THEN MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('OCAK').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('SUBAT').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('MART').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('NISAN').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('MAYIS').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('HAZIRAN').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('TEMMUZ').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('AGUSTOS').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('EYLUL').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;


    if MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=2
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('SUBAT').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('MART').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('NISAN').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('MAYIS').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('HAZIRAN').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('TEMMUZ').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('AGUSTOS').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('EYLUL').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;

  if  MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=3
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('MART').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('NISAN').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('MAYIS').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('HAZIRAN').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('TEMMUZ').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('AGUSTOS').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('EYLUL').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;

  if  MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=4
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('NISAN').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('MAYIS').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('HAZIRAN').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('TEMMUZ').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('AGUSTOS').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('EYLUL').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;

  if MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=5
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('MAYIS').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('HAZIRAN').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('TEMMUZ').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('AGUSTOS').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('EYLUL').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;

  if  MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=6
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('HAZIRAN').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('TEMMUZ').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('AGUSTOS').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('EYLUL').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;

  if  MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=7
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('TEMMUZ').Value +
  MEM_PERSONEL_LISTESI.Fieldbyname('AGUSTOS').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('EYLUL').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;


  if  MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=8
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('AGUSTOS').Value+
  MEM_PERSONEL_LISTESI.Fieldbyname('EYLUL').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;

  if  MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=9
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('EYLUL').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;

  if MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=10
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('EKIM').Value   +
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;


  if  MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=11
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('KASIM').Value  +
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;

  if MEM_PERSONEL_LISTESI.Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value=12
  THEN   MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_TOPLAM').Value:=(
  MEM_PERSONEL_LISTESI.Fieldbyname('ARALIK').Value ) *
  MEM_PERSONEL_LISTESI.Fieldbyname('ARTIS_MAAS').Value;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen freeman35 »

Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value>=1 ">=" ???? yaptım oldu mantığı bu. Değer sadece 1 ise çalışacağı yere 1den büyük yada eşit 12 sefer çalıştırmak demek değil mi?
"Fieldbyname('PERSONEL_UCRET_ARTIS_AYI').Value" Herzaman söylüyorum, variant kullanmayın. asInteger yada tipi neyse,
Fieldbyname('OCAK') ocak yerine field adını "1" kullan, display label a ocak yaz. Bu sayede field adını döngü içinde verebilirsin.
for I:=1to 12 do Fieldbyname( IntToStr( I ) )
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: belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen ertank »

Şahsen yapmak istediğinizi anlamadım.

Benim algıladığım şu: Zamlı ücret göz önünde bulundurularak yıllık ücret toplamını "ARTIS_TOPLAM" alanının içine kaydetmek istiyorsunuz. Görüntüsünü paylaştığınız tabloda bu hesabı yapmak için normal ücret, zam oranı ve zam yapılan ay bilgileri mevcut. Bu bilgiler yardımı ile aşağıdaki gibi bir kod kullanarak yıllık ücret toplamını hesaplamanız mümkün olabilir:

Kod: Tümünü seç

var
  YillikUcretToplami: Double;
  NormalUcret: Double;
  ZamliUcret: Double;
  ZamAyi: Double;
  i: Integer;
begin
  NormalUcret := MEM_PERSONEL_LISTESI.FieldByName('MAAS').AsFloat;
  if NormalUcret = 0 then raise Exception.Create('MAAŞ sıfır olamaz!');

  // Personel maaşına ceza olarak düşüş uygulanma ihtimali vardır. Kanuni olmasa da dolaylı yollardan bu tür uygulamalar yapılabiliyor.
  // Personel maaşına zam yapılmaması ihtimali de vardır.
  // Yukarıdaki sebeplerden dolayı PERSONEL_UCRET_ARTIS_YUZDESI değeri kontrol edilmiyor.
  ZamliUcret := NormalUcret + (NormalUcret / 100 * MEM_PERSONEL_LISTESI.FieldByName('PERSONEL_UCRET_ARTIS_YUZDESI').AsFloat);

  ZamAyi := MEM_PERSONEL_LISTESI.FieldByName('PERSONEL_UCRET_ARTIS_AYI').AsInteger;
  if (ZamAyi < 1) or (ZamAyi > 12) then raise Exception.Create('ZAM AYI bilgisi hatalı!');

  YillikUcretToplami := 0;
  for I := 1 to 12 do
  begin
    if I < ZamAyi then
    begin
      YillikToplamUcret := YillikToplamUcret + NormalUcret;
    end
    else
    begin
      YillikToplamUcret := YillikToplamUcret + ZamliUcret;
    end;
  end;

  MEM_PERSONEL_LISTESI.FieldByName('ARTIS_TOPLAM').AsFloat := YillikToplamUcret;
end;
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen erdogan_ozkaya »

hocam cevabınız için teşekkürler ama çalıştıramadım

hep 12 ayı topluyor

Kod: Tümünü seç

procedure TPERSONEL.MEM_PERSONEL_LISTESICalcFields(DataSet: TDataSet);
 var
  YillikUcretToplami: Double;
  YillikToplamUcret: Double;
  NormalUcret: Double;
  ZamliUcret: Double;
  ZamAyi: Double;
  i: Integer;
begin

  NormalUcret := MEM_PERSONEL_LISTESI.FieldByName('MAAS').AsFloat;
  if NormalUcret = 0 then raise Exception.Create('MAAŞ sıfır olamaz!');

  // Personel maaşına ceza olarak düşüş uygulanma ihtimali vardır. Kanuni olmasa da dolaylı yollardan bu tür uygulamalar yapılabiliyor.
  // Personel maaşına zam yapılmaması ihtimali de vardır.
  // Yukarıdaki sebeplerden dolayı PERSONEL_UCRET_ARTIS_YUZDESI değeri kontrol edilmiyor.
  ZamliUcret := NormalUcret + (NormalUcret / 100 * MEM_PERSONEL_LISTESI.FieldByName('PERSONEL_UCRET_ARTIS_YUZDESI').AsFloat);

  ZamAyi := MEM_PERSONEL_LISTESI.FieldByName('PERSONEL_UCRET_ARTIS_AYI').AsInteger;
  if (ZamAyi < 1) or (ZamAyi > 12) then raise Exception.Create('ZAM AYI bilgisi hatalı!');

  YillikUcretToplami := 0;
  for I := 1 to 12 do
  begin
    if I < ZamAyi then
    begin
      YillikToplamUcret := YillikToplamUcret + NormalUcret;
    end
    else
    begin
      YillikToplamUcret := YillikToplamUcret + ZamliUcret;
    end;
  end;

  MEM_PERSONEL_LISTESI.FieldByName('TOPLAM').AsFloat := YillikToplamUcret;
end;
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: belli bir aydan sonrasını farklı hesaplama

Mesaj gönderen ertank »

erdogan_ozkaya yazdı:hocam cevabınız için teşekkürler ama çalıştıramadım

hep 12 ayı topluyor
Zaten 12 ay toplaması gerekiyor idi. Kod o anlamda doğru çalışıyor. Ben sizin yapmak istediğiniz anlamamışım. Eğer cevabımı okursanız bunu açıkça belirtmiştim.

Siz yapmak istediğinizi anlaşılır cümleler ile açıklayabilir misiniz?
Cevapla