Q&A

  • CalField가 이상해 졌어요!!!!
다들 건강 하시죠?

오늘 날씨가 좀 쌀쌀 하네요.. 감기조심하시고....



정말 이상한 일이 벌어져 고수님들께 도움을 청하옵니다.



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;



길고도 지루한 문장 읽어주셔서 감사드립니다.

항상 행복하시고 즐거운 나날 되시길 바랍니다.



2  COMMENTS
  • Profile
    아기코알라 2001.05.17 02:02
    아기코알라 wrote:

    > 다들 건강 하시죠?

    > 오늘 날씨가 좀 쌀쌀 하네요.. 감기조심하시고....

    >

    > 정말 이상한 일이 벌어져 고수님들께 도움을 청하옵니다.

    >

    > 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에서 계산을 하지 않게 만들어 줍니다.

    참 괜찮은 생각이라 듭니다.

    제 같은 경우는 구입년, 구입가격, 감가년한 세가지 중 한가지라도 입력되지 않게

    되면 계산을 하지 않게 만들었읍니다.



    다시 한번더 블랙봉님께 감사드립니다.

    항상 행복하시고 즐거운 나날 되시길 바랍니다.

    >

  • Profile
    블랙봉 2001.05.15 19:37
    아기코알라 wrote:

    > 다들 건강 하시죠?

    > 오늘 날씨가 좀 쌀쌀 하네요.. 감기조심하시고....

    >

    > 정말 이상한 일이 벌어져 고수님들께 도움을 청하옵니다.

    >

    > 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;

    >

    > 길고도 지루한 문장 읽어주셔서 감사드립니다.

    > 항상 행복하시고 즐거운 나날 되시길 바랍니다.

    >



    CurDate1 := Query1.FieldByName('D').value; //구입년

    위 부분이 문제가 있을 것 같네요. Value는 Variant로 넘겨주기 때문에 구입년을 입력하지 않으면 NULL이 되어 Datetime 변수에 넣을 수가 없죠.

    문제가 발생하지 않도록 하실려면 AsDateTime으로 하시던지....

    아예 구입년이 입력되지 않았으면 루틴을 돌지 않고 빠져나가게 하는 게 어떨지...