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