음, 며칠전에도 같은 문제를 올렸었는데
아직껏 어떤분도 답이 없으시네요. ㅠ.ㅠ
그래도, 다시 올려봅니다.
테이블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;
제가 한 방식은 이렇습니다. 참고하세요...
순차적 합계는 성격상 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;