Q&A

  • 감가상각계산 오류인데요 1주일째 머리 쥐어뜯고 있읍니다...
안녕하세요 고수님



마음은 급하고 일은 안되고 정말 머리가 터질것 같습니다.



왜 계산이 안되는지 좀 보아 주시면 그 은혜 잊지않겠나이다......



DB : paradox

콤포넌트 : Query, DataSource, UpdateSQL, DBGrid 등등





감가상각 계산을 하고 합계를 낼려고 합니다.



그런데 합계에서 자꾸만 오류가 생기네요



합계 하나는 감가상각액, 다른 하나는 잔존가액 입니다.



잔존가액 합계(CalSum)는 잘 되는데 감가상각액 합계(Calsum1)는 왜 이상한지



1주일째 씨름하고 있는데



정말 뭐가 잘못되었는지 모르겠읍니다. 꼭 좀 봐 주십시요....



이상한점 : 감가상각액 합계(Calsum1)에 계산도 안되고 꼭 20원이 추가되어 나옴..



예) 감가상각액 레코드값 : 2,500, 1,000, 5,000, 3,000, 1,500, 2,000

정상합계액은 15000원이 출력이 되어야 하는데

현재는 63,020원이 출력됩니다..





// 감가상각 계산(정액법)

procedure TEMain.Query1CalcFields(DataSet: TDataSet);

var CurDate, curDateO, N_O : TDateTime; // 금일 , 납품일, 금일-납품일

Year, Month, Day, YearO,MonthO,DayO : Word;

calsum, calsum1 : integer;

Begin

// 현재날짜 입력

CurDate := now;

DecodeDate(CurDate, Year, Month, Day);



// 납품일이 입력되지 않으면 Cal 계산을 하지 않게 한다.

if (Query1.FieldByName('DateOffer').Value = null) or

(Query1.FieldByName('Price').Value = null) or

(Query1.FieldByName('Equipvalue').Value = null) then

exit;



// 납품일

CurDateO := Query1.FieldByName('DateOffer').AsDateTime;

DecodeDate(CurDateO, YearO, MonthO, DayO);



// 현재년 – 납품년

N_O := Year-YearO;



// 현재년-납품년과 감가상각 년한 과의 비교

if N_O <= Query1.FieldByName('EquipValue').AsInteger then

Begin



// 상반기 구입품과 감가상각 년한 과의 비교

if MonthO<= 6 then

Begin

with Query1 do begin



// 잔존가액 계산

FieldByName('Cal2').Value := FieldByName('Price').Value *

(FieldByName('EquipValue').value - N_O)/

FieldByname('EquipValue').value;



// 감가상각액 계산

FieldByName('Cal1').Value := (FieldByname('Price').Value * N_O) /

FieldByName('Equipvalue').Value;

end;

End



// 하반기 구입품의 감가상각 계산식

else begin

with Query1 do begin



// 잔존가액 계산

FieldByName('Cal2').Value := FieldByName('Price').Value *

(FieldByName('EquipValue').Value-N_O+0.5)/

FieldByName('EquipValue').Value;



// 감가상각액 계산

FieldByName('Cal1').Value := (FieldByname('Price').Value * (N_O + 0.5)) /

FieldByName('Equipvalue').Value;

end;

end;

End



else begin



// 감가항각년한이 지난 물품에 대해서 0원으로 처리(-가격 출력 금지)

Query1.FieldByname('Cal2').Value :=0;



// 감가항각년한이 지난 물품에 대해서 취득가액으로 처리

Query1.FieldByName('Cal1').value := Query1.FieldByName('Price').value;



// 잔존가액 및 감가상각액 합계 초기값을 0원으로 삽입

calsum := 0; // 잔존가액 합계

Calsum1 := 0; // 감가상각액 합계

end;



// 레코드 수를 에디트에 표시

with Query7 do begin

Close;

SQL.Clear;

SQL.Add('Select count(*), sum(Price) Price from ETable');

Open;

end;



// Edit창에 표시

Edit1.text := Query7.Fields[0].AsString;

Edit2.Text := Query7.FieldByName('Price').AsString;



// 3자리 마다 콤마 삽입하기....

Edit1.text := formatfloat('#,##0',Query7.Fields[0].AsFloat);

Edit2.text := FormatFloat('#,##0',Query7.FieldByName('Price').AsFloat);



// 지금부터 잔존 가액 및 감가상각액 합계 구하기

with Query2 do begin

Close;

SQL.Clear;

SQL.Add('Select * from ETable');

Open;

end;



// 3개 필드중 하나라도 입력안되면 계산을 못하도록...

while not Query2.eof do begin

if(Query2.FieldByName('DateOffer').value = null) or

(Query2.FieldByName('Price').value = null) or

(Query2.FieldByName('Equipvalue').value = null) then

Query2.next

else begin

CurDate := Query2.FieldByName('DateOffer').Asdatetime;// 취득년

DecodeDate(Curdate, YearO, MonthO, DayO);

N_O := Year - YearO;



// 물품 구입이 감가상각년한을 초과 했는지 판단...

if N_O <= Query2.FieldByName('Equipvalue').AsInteger then begin



// 상반기 구입했을 경우 잔존가액 계산

if MonthO <=6 then begin



// 잔존가액 합계( 상반기 구입 시)

calsum := calsum + Query2.FieldByName('Price').value*

(Query2.FieldByName('Equipvalue').value-N_O)/

Query2.FieldByName('Equipvalue').value;



// 감가상각액 합계 (상반기 구입 시)

calsum1 := calsum1 + (Query2.FieldByname('Price').Value * N_O /

Query2.FieldByName('Equipvalue').Value);

end

else begin

// 하반기 구입했을 경우 잔존가액 계산

with Query2 do begin



// 잔존가액 합계 (하반기 구입시)

calsum := calsum + Query2.FieldByName('Price').value*

(Query2.FieldByName('Equipvalue').value-N_O+0.5)/

Query2.FieldByName('Equipvalue').value;



// 감가상각액 합계 (하반기 구입시)

calsum1 := calsum1 + ((Query2.FieldByname('Price').Value * (N_O + 0.5)) /

Query2.FieldByName('Equipvalue').Value);

end;

end;

end else



// 감가상각년한이 지난 잔존가액은 "0원"으로 처리

calsum := calsum + 0;



// 감가상각년한이 지난 감가상각액은 "취득가격"으로 처리

calsum1 := calsum1 + Query2.FieldByName('Price').value;

end;

Query2.next;

end;

Edit4.text := IntToStr(calsum);

Edit4.text := formatfloat('#,##0',calsum); // 숫자에 3자리 마다 콤마삽입

Edit3.text := Inttostr(calsum1);

Edit3.text := FormatFloat('#,##0',calsum1); // 숫자에 3자리 마다 콤마삽입

end;





너무 길죠/..



항상 행복하시고 즐거운 나날 되십시요....

0  COMMENTS