안녕하세요 고수님
마음은 급하고 일은 안되고 정말 머리가 터질것 같습니다.
왜 계산이 안되는지 좀 보아 주시면 그 은혜 잊지않겠나이다......
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;
너무 길죠/..
항상 행복하시고 즐거운 나날 되십시요....