Q&A

  • 지난 월요일부터 고민했지만 모르겠어요... ㅠ.ㅠ
음, 며칠전에도 같은 문제를 올렸었는데

아직껏 어떤분도 답이 없으시네요. ㅠ.ㅠ



그래도, 다시 올려봅니다.



테이블2개(A,B)를 join한 select문의 결과를 DBGrid에 뿌려줍니다.

(DB는 Paradox임~다)



이때, onCalcField(TotPrice)가 있는데 아래와 같은 누계입니다.



B.Amount A.Price TotPrice

1. 2 1500 3000

2. 1 2000 5000

3. 3 1000 8000

4. 5 2000 18000

5. 4 1200 22800

........



즉, TotPrice는 B.Amount * A.Price 값이긴 하되

2번 record의 TotPrice는 1번 record의 TotPrice에 B.Amount * A.Price 을 더한 값입니다.



위 field중 B.Amount와 A.Price는 실제 field이고 TotPrice는 calculated field이고요.



게시판에서 검색한대로 Query의 AfterOpen 이벤트에서

아래와 같이 코딩을 했지만 DBGrid에 값이 뿌려지지 않습니다. T.T

어떻게 해야 TotPrice값을 DBGrid에 보여줄 수 있을까요?



뉴스그룹에서 문의를 했더니 다음과 같이 Query로 답변해 주더군요.



SELECT A.productID, B.amount, A.price, SUM(D.amount * C.price) AS totprice

FROM products A, orders B, products C, orders D

WHERE (A.productID = B.productID)

AND (C.productID = D.productID)

AND (A.productID >= C.productID)

GROUP BY A.productID, B.amount, A.price



하지만 위 결과는 제가 생각하던 순차적 record의 합계가 아니라

품목별(productID) 합계라서 제가 생각한 결과가 안 나옵니다. --;;



아시는 분들께선 꼭 좀 답변해주시면 정말로 감사하겠어요.

벌써 며칠째 고민하고 있습니다. ㅠ.ㅠ





===========(게시판에서 검색한 내용대로 만든 코드)=========================================

procedure TForm1.Query1AfterOpen(DataSet: TDataSet);

var

Sumvalue: integer;

OldBookmark: TBookMark;

begin

Query1.DisableControls;

OldBookmark := Query1.GetBookmark;

if Query1.State in [dsinsert,dsedit] then Query1.Post;

Query1.Prior;

Sumvalue := Query1.Fields[6].AsInteger; //여기서는 first record의 TotPrice

repeat

if Query1.EOF then break;

Query1.Edit;

Query1.FieldByName('TotPrice').AsInteger := Sumvalue +

Query1.Fields[8].AsInteger*Query1.Fields[4].AsInteger; //B.Amount * A.Price

Sumvalue := Query1.FieldByName('TotPrice').AsInteger;

Query1.post;

Query1.Next;

until Query1.EOF;



Query1.GotoBookmark(oldbookmark);

Query1.FreeBookmark(oldbookmark);



end;

4  COMMENTS
  • Profile
    황삐옹 2001.03.23 23:16
    안녕하세요?



    제가 한 방식은 이렇습니다. 참고하세요...

    순차적 합계는 성격상 OnCalcField에 하면 안될 것 같은데요?



    1. 쿼리구문에 가상 필드를 만든다. select 0 as totprice ....

    2. 쿼리를 수정가능하게 만든다.

    requestlive = true되게 => Tupdatesql - Tquery연결한다음에 Tupdatesql에서

    insert, delete, modify SQL 구문을 모두지우면 되죠..

    3. AfterOpen event에서 님이 하신 방식으로 하면 됩니다.



    세부적인 코딩은 시간상 생략합니다.







    그럼 즐코....20000



    아라 wrote:

    > 음, 며칠전에도 같은 문제를 올렸었는데

    > 아직껏 어떤분도 답이 없으시네요. ㅠ.ㅠ

    >

    > 그래도, 다시 올려봅니다.

    >

    > 테이블2개(A,B)를 join한 select문의 결과를 DBGrid에 뿌려줍니다.

    > (DB는 Paradox임~다)

    >

    > 이때, onCalcField(TotPrice)가 있는데 아래와 같은 누계입니다.

    >

    > B.Amount A.Price TotPrice

    > 1. 2 1500 3000

    > 2. 1 2000 5000

    > 3. 3 1000 8000

    > 4. 5 2000 18000

    > 5. 4 1200 22800

    > ........

    >

    > 즉, TotPrice는 B.Amount * A.Price 값이긴 하되

    > 2번 record의 TotPrice는 1번 record의 TotPrice에 B.Amount * A.Price 을 더한 값입니다.

    >

    > 위 field중 B.Amount와 A.Price는 실제 field이고 TotPrice는 calculated field이고요.

    >

    > 게시판에서 검색한대로 Query의 AfterOpen 이벤트에서

    > 아래와 같이 코딩을 했지만 DBGrid에 값이 뿌려지지 않습니다. T.T

    > 어떻게 해야 TotPrice값을 DBGrid에 보여줄 수 있을까요?

    >

    > 뉴스그룹에서 문의를 했더니 다음과 같이 Query로 답변해 주더군요.

    >

    > SELECT A.productID, B.amount, A.price, SUM(D.amount * C.price) AS totprice

    > FROM products A, orders B, products C, orders D

    > WHERE (A.productID = B.productID)

    > AND (C.productID = D.productID)

    > AND (A.productID >= C.productID)

    > GROUP BY A.productID, B.amount, A.price

    >

    > 하지만 위 결과는 제가 생각하던 순차적 record의 합계가 아니라

    > 품목별(productID) 합계라서 제가 생각한 결과가 안 나옵니다. --;;

    >

    > 아시는 분들께선 꼭 좀 답변해주시면 정말로 감사하겠어요.

    > 벌써 며칠째 고민하고 있습니다. ㅠ.ㅠ

    >

    >

    > ===========(게시판에서 검색한 내용대로 만든 코드)=========================================

    > procedure TForm1.Query1AfterOpen(DataSet: TDataSet);

    > var

    > Sumvalue: integer;

    > OldBookmark: TBookMark;

    > begin

    > Query1.DisableControls;

    > OldBookmark := Query1.GetBookmark;

    > if Query1.State in [dsinsert,dsedit] then Query1.Post;

    > Query1.Prior;

    > Sumvalue := Query1.Fields[6].AsInteger; //여기서는 first record의 TotPrice

    > repeat

    > if Query1.EOF then break;

    > Query1.Edit;

    > Query1.FieldByName('TotPrice').AsInteger := Sumvalue +

    > Query1.Fields[8].AsInteger*Query1.Fields[4].AsInteger; //B.Amount * A.Price

    > Sumvalue := Query1.FieldByName('TotPrice').AsInteger;

    > Query1.post;

    > Query1.Next;

    > until Query1.EOF;

    >

    > Query1.GotoBookmark(oldbookmark);

    > Query1.FreeBookmark(oldbookmark);

    >

    > end;

  • Profile
    아라 2001.03.24 02:26
    황삐옹 wrote:

    > 안녕하세요?

    >

    > 제가 한 방식은 이렇습니다. 참고하세요...

    > 순차적 합계는 성격상 OnCalcField에 하면 안될 것 같은데요?

    >

    > 1. 쿼리구문에 가상 필드를 만든다. select 0 as totprice ....

    > 2. 쿼리를 수정가능하게 만든다.

    > requestlive = true되게 => Tupdatesql - Tquery연결한다음에 Tupdatesql에서

    > insert, delete, modify SQL 구문을 모두지우면 되죠..

    > 3. AfterOpen event에서 님이 하신 방식으로 하면 됩니다.

    >

    > 세부적인 코딩은 시간상 생략합니다.

    >

    >

    >

    > 그럼 즐코....20000

    >



    빠른 답변에 정말로 감사드립니다.



    님께서 답변 해주신 대로 했는데 2가지 문제가 생겨서요.



    첫째는, 에러가 납니다.



    Query1의 구문에서 가상필드(totprice)를 만든 뒤

    Query1AfterOpen 이벤트에 제가 보여 드렸던 대로 코딩을 했어요.

    물론, Query1의 RequestLive속성은 true로 하고

    UpdateSQL1을 새로 만들어서 Query1의 UpdateObject에 연결도 하고요.



    그랬는데 다음과 같은 EDBEngineError가 발생합니다



    " Trying to modify read-only field. "



    왜 그런 걸까요?

    아무래도 Query1구문이 2개의 table을 조인했기 때문에 그런 것 아닌가요?

    어디선가 봤는데 조인한 table은 edit, insert가 안되고

    browse만 된다고 들었거든요.

    시험삼아 테이블 하나로만 했더니 누계가 되더라고요.. --;



    둘째는, Query1의 field중 순차적으로 번호가 증가하는 calculate field가 있는데

    RequestLive를 true 로 하면 번호가 모두 0으로 보여요 --;;



    그래서 여전히 해결이 안되는군요. ㅠ.ㅠ

    바쁘실텐데 죄송합니다만 이 문제들은 어떻게 해결해야 하나요?

    다시 한번 부탁드리며 미리 감사드립니다. (^^)(__)(^^)

  • Profile
    황삐옹 2001.03.26 19:30
    안녕하세요?

    답변이 늦어 죄송합니다.



    첫째 requestlive := True 문제인데요..

    그건 조인시에 Tupdatesql 콤포넌트와 연결하고 Tupdatesql 콤포넌트내부에서

    insert, update, delete sql문을 지우던지 실제로 db를 변경할 수 없는 sql구문으로

    변경한후, requestlive := true로 만들어야 합니다.





    둘째는 calculate field문제는 그렇게 나오는지 조사를 해보지 않았는데....

    이상하군요...

    이왕 totprice를 구할 거라면 다시 select 구문에서 가상필드를 만들어서

    afteropen event에 코딩하면 되겠군요..



    그럼 20000.........







    아라 wrote:

    > 황삐옹 wrote:

    > > 안녕하세요?

    > >

    > > 제가 한 방식은 이렇습니다. 참고하세요...

    > > 순차적 합계는 성격상 OnCalcField에 하면 안될 것 같은데요?

    > >

    > > 1. 쿼리구문에 가상 필드를 만든다. select 0 as totprice ....

    > > 2. 쿼리를 수정가능하게 만든다.

    > > requestlive = true되게 => Tupdatesql - Tquery연결한다음에 Tupdatesql에서

    > > insert, delete, modify SQL 구문을 모두지우면 되죠..

    > > 3. AfterOpen event에서 님이 하신 방식으로 하면 됩니다.

    > >

    > > 세부적인 코딩은 시간상 생략합니다.

    > >

    > >

    > >

    > > 그럼 즐코....20000

    > >

    >

    > 빠른 답변에 정말로 감사드립니다.

    >

    > 님께서 답변 해주신 대로 했는데 2가지 문제가 생겨서요.

    >

    > 첫째는, 에러가 납니다.

    >

    > Query1의 구문에서 가상필드(totprice)를 만든 뒤

    > Query1AfterOpen 이벤트에 제가 보여 드렸던 대로 코딩을 했어요.

    > 물론, Query1의 RequestLive속성은 true로 하고

    > UpdateSQL1을 새로 만들어서 Query1의 UpdateObject에 연결도 하고요.

    >

    > 그랬는데 다음과 같은 EDBEngineError가 발생합니다

    >

    > " Trying to modify read-only field. "

    >

    > 왜 그런 걸까요?

    > 아무래도 Query1구문이 2개의 table을 조인했기 때문에 그런 것 아닌가요?

    > 어디선가 봤는데 조인한 table은 edit, insert가 안되고

    > browse만 된다고 들었거든요.

    > 시험삼아 테이블 하나로만 했더니 누계가 되더라고요.. --;

    >

    > 둘째는, Query1의 field중 순차적으로 번호가 증가하는 calculate field가 있는데

    > RequestLive를 true 로 하면 번호가 모두 0으로 보여요 --;;

    >

    > 그래서 여전히 해결이 안되는군요. ㅠ.ㅠ

    > 바쁘실텐데 죄송합니다만 이 문제들은 어떻게 해결해야 하나요?

    > 다시 한번 부탁드리며 미리 감사드립니다. (^^)(__)(^^)





  • Profile
    아라 2001.03.28 20:32
    답변 주셔서 정말로 감사해용~~ ^^;;



    하다 하다 안되어서

    기냥 TadvSpreadGrid를 써서 사용하고 있어요.



    물론 위 콤포넌트 사용할 때도 나름대로 어려움이 있었지만

    (설치가 잘 안되어서 고생쫌 했죠.. ^^;;)

    적어도 보이고자 하는 항목은 다 보이기에

    일단은 이걸 사용하려고 해요.



    담에 사용하게 되면 황삐옹님께서 가르쳐주신대로

    다시 한번 해 볼까 합니다.



    그럼, 수고하세요~~.





    황삐옹 wrote:

    > 안녕하세요?

    > 답변이 늦어 죄송합니다.

    >

    > 첫째 requestlive := True 문제인데요..

    > 그건 조인시에 Tupdatesql 콤포넌트와 연결하고 Tupdatesql 콤포넌트내부에서

    > insert, update, delete sql문을 지우던지 실제로 db를 변경할 수 없는 sql구문으로

    > 변경한후, requestlive := true로 만들어야 합니다.

    >

    >

    > 둘째는 calculate field문제는 그렇게 나오는지 조사를 해보지 않았는데....

    > 이상하군요...

    > 이왕 totprice를 구할 거라면 다시 select 구문에서 가상필드를 만들어서

    > afteropen event에 코딩하면 되겠군요..

    >

    > 그럼 20000.........

    >

    >

    >

    > 아라 wrote:

    > > 황삐옹 wrote:

    > > > 안녕하세요?

    > > >

    > > > 제가 한 방식은 이렇습니다. 참고하세요...

    > > > 순차적 합계는 성격상 OnCalcField에 하면 안될 것 같은데요?

    > > >

    > > > 1. 쿼리구문에 가상 필드를 만든다. select 0 as totprice ....

    > > > 2. 쿼리를 수정가능하게 만든다.

    > > > requestlive = true되게 => Tupdatesql - Tquery연결한다음에 Tupdatesql에서

    > > > insert, delete, modify SQL 구문을 모두지우면 되죠..

    > > > 3. AfterOpen event에서 님이 하신 방식으로 하면 됩니다.

    > > >

    > > > 세부적인 코딩은 시간상 생략합니다.

    > > >

    > > >

    > > >

    > > > 그럼 즐코....20000

    > > >

    > >

    > > 빠른 답변에 정말로 감사드립니다.

    > >

    > > 님께서 답변 해주신 대로 했는데 2가지 문제가 생겨서요.

    > >

    > > 첫째는, 에러가 납니다.

    > >

    > > Query1의 구문에서 가상필드(totprice)를 만든 뒤

    > > Query1AfterOpen 이벤트에 제가 보여 드렸던 대로 코딩을 했어요.

    > > 물론, Query1의 RequestLive속성은 true로 하고

    > > UpdateSQL1을 새로 만들어서 Query1의 UpdateObject에 연결도 하고요.

    > >

    > > 그랬는데 다음과 같은 EDBEngineError가 발생합니다

    > >

    > > " Trying to modify read-only field. "

    > >

    > > 왜 그런 걸까요?

    > > 아무래도 Query1구문이 2개의 table을 조인했기 때문에 그런 것 아닌가요?

    > > 어디선가 봤는데 조인한 table은 edit, insert가 안되고

    > > browse만 된다고 들었거든요.

    > > 시험삼아 테이블 하나로만 했더니 누계가 되더라고요.. --;

    > >

    > > 둘째는, Query1의 field중 순차적으로 번호가 증가하는 calculate field가 있는데

    > > RequestLive를 true 로 하면 번호가 모두 0으로 보여요 --;;

    > >

    > > 그래서 여전히 해결이 안되는군요. ㅠ.ㅠ

    > > 바쁘실텐데 죄송합니다만 이 문제들은 어떻게 해결해야 하나요?

    > > 다시 한번 부탁드리며 미리 감사드립니다. (^^)(__)(^^)

    >

    >