다들 건강 하시죠?
오늘 날씨가 좀 쌀쌀 하네요.. 감기조심하시고....
정말 이상한 일이 벌어져 고수님들께 도움을 청하옵니다.
Database : Paradox7
컴포넌트 : Query, DBGrid, UpdateSQL, DataSource, 등등
CalField가 이상해진 일....
Query를 더블 클릭하면 Fields Edits가 나오지 않습니까?
그곳에 DBGrid의 필드명과 Cal이라는 필드를 생성시켰죠
(참고 필드명 : Cal, Type : Currency, Field Type : Calculated)
그리고 Query의 OnCalcfield에서 감가상각 계산 코딩을 했죠..
그런데 DBGrid에 출력은 잘 됩니다. 연도나 구입가격, 감가상각년한 등을 변화시키면
계산도 그 자리에서 해서 출력해줍니다.
(참고 : 관리번호, 구입가격,감가상각년한,구입년 그리고 Cal이라는 필드가 있읍니다.)
1. 이상한 점은 레코드를 추가로 입력할때 "구입년"을 제외한 다른 필드부터 입력을하면
"Invalid variant type conversion."이라는 에러가 발생합니다.
2. 그런데 "구입년" 부터 입력하면 추가할 때 아무 문제도 발생 되지 않읍니다.
3. Query의 Fields Edit에서 Cal이라는 항목을 삭제하면 전혀 문제가 없습니다.
어제 밤 늦게 까지 고민했지만 제가 찾아낸 것은 고작 위와 같은 현상뿐입니다.
아기 코알라에서 어른 코알라가 되도록 고수님의 따뜻한 조언 부탁드립니다.
참고로 On CalcFields의 코딩 내용 입니다.
// 감가상각 계산 식(정액법)
procedure TForm1.Query1CalcFields(DataSet: TDataSet);
var CurDate, CurDate1 : TDateTime;
Year, Month, day, Year1, Month1, Day1 : Word;
Y_A : TDateTime;
begin
CurDate := now;
DecodeDate(CurDate, Year, Month, Day);
CurDate1 := Query1.FieldByName('D').value; //구입년
DecodeDate(Curdate1, Year1, Month1, Day1);
Y_A := Year-Year1; // 현재년 - 구입년
if Y_A <= Query1.FieldByName('P1').Asinteger then// 감가년한 이전인 경우계산
begin
if Month1 <= 6 then // 6월 이전 구입 경우 계산
begin
with Query1 do begin
FieldByName('Cal').value :=
FieldByName('P').value *
(FieldByName('P1').value - Y_A)/
FieldByName('P1').value;
end;
end
else begin // 7월 이후 구입 경우 계산
with Query1 do begin
FieldByName('Cal').value :=
FieldByName('P').value *
(FieldByName('P1').value - Y_A + 0.5)/
FieldByName('P1').value;
end;
end;
end
else begin
// 감가상각년한이 지난 경우 0원으로 처리
Query1.FieldByName('Cal').value := 0;
end;
end;
// 삭제버턴 프로시져
procedure TForm1.Button2Click(Sender: TObject);
begin
Query1.delete;
end;
// 저장버턴 프로서져
procedure TForm1.Button1Click(Sender: TObject);
begin
with Query1 do begin
ApplyUpdates;
CommitUpdates;
Close;
Open;
end;
end;
길고도 지루한 문장 읽어주셔서 감사드립니다.
항상 행복하시고 즐거운 나날 되시길 바랍니다.
> 다들 건강 하시죠?
> 오늘 날씨가 좀 쌀쌀 하네요.. 감기조심하시고....
>
> 정말 이상한 일이 벌어져 고수님들께 도움을 청하옵니다.
>
> Database : Paradox7
> 컴포넌트 : Query, DBGrid, UpdateSQL, DataSource, 등등
>
> CalField가 이상해진 일....
>
> Query를 더블 클릭하면 Fields Edits가 나오지 않습니까?
>
> 그곳에 DBGrid의 필드명과 Cal이라는 필드를 생성시켰죠
> (참고 필드명 : Cal, Type : Currency, Field Type : Calculated)
>
> 그리고 Query의 OnCalcfield에서 감가상각 계산 코딩을 했죠..
>
> 그런데 DBGrid에 출력은 잘 됩니다. 연도나 구입가격, 감가상각년한 등을 변화시키면
> 계산도 그 자리에서 해서 출력해줍니다.
> (참고 : 관리번호, 구입가격,감가상각년한,구입년 그리고 Cal이라는 필드가 있읍니다.)
>
> 1. 이상한 점은 레코드를 추가로 입력할때 "구입년"을 제외한 다른 필드부터 입력을하면
> "Invalid variant type conversion."이라는 에러가 발생합니다.
>
> 2. 그런데 "구입년" 부터 입력하면 추가할 때 아무 문제도 발생 되지 않읍니다.
>
> 3. Query의 Fields Edit에서 Cal이라는 항목을 삭제하면 전혀 문제가 없습니다.
>
> 어제 밤 늦게 까지 고민했지만 제가 찾아낸 것은 고작 위와 같은 현상뿐입니다.
> 아기 코알라에서 어른 코알라가 되도록 고수님의 따뜻한 조언 부탁드립니다.
>
> 참고로 On CalcFields의 코딩 내용 입니다.
>
> // 감가상각 계산 식(정액법)
> procedure TForm1.Query1CalcFields(DataSet: TDataSet);
> var CurDate, CurDate1 : TDateTime;
> Year, Month, day, Year1, Month1, Day1 : Word;
> Y_A : TDateTime;
> begin
> CurDate := now;
> DecodeDate(CurDate, Year, Month, Day);
> CurDate1 := Query1.FieldByName('D').value; //구입년
> DecodeDate(Curdate1, Year1, Month1, Day1);
>
> Y_A := Year-Year1; // 현재년 - 구입년
>
> if Y_A <= Query1.FieldByName('P1').Asinteger then// 감가년한 이전인 경우계산
> begin
> if Month1 <= 6 then // 6월 이전 구입 경우 계산
> begin
> with Query1 do begin
> FieldByName('Cal').value :=
> FieldByName('P').value *
> (FieldByName('P1').value - Y_A)/
> FieldByName('P1').value;
> end;
> end
> else begin // 7월 이후 구입 경우 계산
> with Query1 do begin
> FieldByName('Cal').value :=
> FieldByName('P').value *
> (FieldByName('P1').value - Y_A + 0.5)/
> FieldByName('P1').value;
> end;
> end;
> end
> else begin
> // 감가상각년한이 지난 경우 0원으로 처리
> Query1.FieldByName('Cal').value := 0;
> end;
> end;
>
> // 삭제버턴 프로시져
> procedure TForm1.Button2Click(Sender: TObject);
> begin
> Query1.delete;
> end;
>
> // 저장버턴 프로서져
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> with Query1 do begin
> ApplyUpdates;
> CommitUpdates;
> Close;
> Open;
> end;
> end;
>
> 길고도 지루한 문장 읽어주셔서 감사드립니다.
> 항상 행복하시고 즐거운 나날 되시길 바랍니다.
블랙봉님께서 루틴을 빠져 나와 계산을 하지 않게 하는 방법을 저에게 알려주셨읍니다.
혹 도움이 될까해서 제가 다시 올립니다.
OnCalcField의 맨 위에
if Query1.FieldByName('D').Value = NULL then
Exit;
위와 같이 하게되면 구입년이 입력되지 않으면 Cal에서 계산을 하지 않게 만들어 줍니다.
참 괜찮은 생각이라 듭니다.
제 같은 경우는 구입년, 구입가격, 감가년한 세가지 중 한가지라도 입력되지 않게
되면 계산을 하지 않게 만들었읍니다.
다시 한번더 블랙봉님께 감사드립니다.
항상 행복하시고 즐거운 나날 되시길 바랍니다.
>