Q&A

  • 질문[dbgrid에서 중간중간 합계를 내주세요]
며칠전에 올렸던 질문입니다.

JANGSEKWHAN 님이 union 명령을 권하시더군요.

질문은 아래와 같습니다.



판매관리 프로그램을 작성중입니다.



interbase db를 사용하고 있습니다.

혹시 저와 같은 일을 해보신 분이 계시면 도움좀 부탁드릴께요.



그러니까 dbgrid에 날짜가 변경될 때마다 합계를 보여 주어야 합니다. db에 까지 보관될 필요는 없고 query 명령으로 화면에만

합계란이 칸이 삽입되어 일자가 변경시 마다 보여 주여야 합니다.

그리고 맨 마지막에는 총 합계가 보여 지는 겁니다.



제가 query 명령에는 정말 초보자입니다.



제가 사용한 query 명령어를 올려볼게요.

union 명령을 찾아서 해보았는데도 잘 않되는 군요.

첫번째로는 원하는 날짜를사용자가 받아야 합니다.



입력예 2001/03/01 ~ 2001/03/08 입력을 받으면

업체별로 해달일자의 판매 상품을 보여주면서 일자별 집계를 내주고 최종적으로 총 합계를 내주어야 합니다.





업체 마스타 table : DM.CusCDS

상품판매 table : DM.geomyung3CDs



dbgrid 화면에 display 되는건

날짜 전표번호 상품명 총 수량 단가 금액

2001/03/01 1 상품1 10 300 3,000

2001/03/01 2 상품2 10 200 2,000

2001/03/01 3 상품 3 10 300 3,000

합계 8,000

2001/03/02 1 상품1 10 400 4,000

2001/03/02 2 상품2 10 200 2,000

2001/03/02 3 상품3 10 100 1,000

합계 7,000



제가 구현한 query 조건

select GEO_YMD, GEO_JUN_NO, GEO_NAME,

GEO_TSURANG, GEO_DANGA, SUM(GEO_KUMAK) AS GEO_TOTAL

from GEOMYUNG

WHERE CUS_CODE = :param1 and GEO_YMD BETWEEN :param2 AND :param3

group by

GEO_YMD, GEO_JUN_NO, GEO_NAME, GEO_TSURANG,

GEO_DANGA



union

select '합계',0, null, null, 0, 0, SUM(GEO_KUMAK)

from GEOMYUNG (너무 몰라서 테스트 식으로 넣어 두었습니다.) 이부분 도움좀

부탁드립니다.



DM.geomyung3CDs.Params.ParamValues['Param1'] := DM.CusCDS.FieldByName('CUS_CODE').asString;

DM.geomyung3CDs.Params.ParamValues['Param2']:= '2001/03/01'; DM.geomyung3CDs.Params.ParamValues['Param3']:= '2001/03/06';

DM.geomyung3CDs.Open;



시간이 너무 지연되었습니다.



아시는 분 꼭 답변좀 부탁드립니다.



감사합니다.

4  COMMENTS
  • Profile
    hobakpa 2001.03.08 21:50


    >

    > 업체 마스타 table : DM.CusCDS

    > 상품판매 table : DM.geomyung3CDs

    >

    > dbgrid 화면에 display 되는건

    > 날짜 전표번호 상품명 총 수량 단가 금액

    > 2001/03/01 1 상품1 10 300 3,000

    > 2001/03/01 2 상품2 10 200 2,000

    > 2001/03/01 3 상품 3 10 300 3,000

    > 합계 8,000

    > 2001/03/02 1 상품1 10 400 4,000

    > 2001/03/02 2 상품2 10 200 2,000

    > 2001/03/02 3 상품3 10 100 1,000

    > 합계 7,000

    >

    > 제가 구현한 query 조건

    > select GEO_YMD, GEO_JUN_NO, GEO_NAME,

    > GEO_TSURANG, GEO_DANGA, SUM(GEO_KUMAK) AS GEO_TOTAL

    > from GEOMYUNG

    > WHERE CUS_CODE = :param1 and GEO_YMD BETWEEN :param2 AND :param3

    > group by

    > GEO_YMD, GEO_JUN_NO, GEO_NAME, GEO_TSURANG,

    > GEO_DANGA

    >

    > union

    > select '합계',0, null, null, 0, 0, SUM(GEO_KUMAK)

    > from GEOMYUNG (너무 몰라서 테스트 식으로 넣어 두었습니다.) 이부분 도움좀

    > 부탁드립니다.

    >

    > DM.geomyung3CDs.Params.ParamValues['Param1'] := DM.CusCDS.FieldByName('CUS_CODE').asString;

    > DM.geomyung3CDs.Params.ParamValues['Param2']:= '2001/03/01'; DM.geomyung3CDs.Params.ParamValues['Param3']:= '2001/03/06';

    > DM.geomyung3CDs.Open;

    >



    =>>>

    union

    select '합계',0, null, null, 0, 0, SUM(GEO_KUMAK)

    from GEOMYUNG

    필드의 수를 하나 줄여보세요. 처음 부분에 select 필드의 개수(현재 6개)와 union이후 select 필드의개수(현재 7개)가 동일 해야 합니다.

    그런데요...아마 맨 마지막에만 합계가 나올거에요....아마도



    도움이 되셨으면 합니다.



    초보 hobakpa;

  • Profile
    이기주 2001.03.09 02:00
    답변주셔서 감사합니다. 필드 갯 수 맞추는건 제가 질문 올리면서 잘못 기재를 했군요.

    다시 한번 자세히 보시고 아시는 분 있으면 답변좀 부탁드립니다.

    많이 급해서요.





    hobakpa wrote:

    >

    > >

    > > 업체 마스타 table : DM.CusCDS

    > > 상품판매 table : DM.geomyung3CDs

    > >

    > > dbgrid 화면에 display 되는건

    > > 날짜 전표번호 상품명 총 수량 단가 금액

    > > 2001/03/01 1 상품1 10 300 3,000

    > > 2001/03/01 2 상품2 10 200 2,000

    > > 2001/03/01 3 상품 3 10 300 3,000

    > > 합계 8,000

    > > 2001/03/02 1 상품1 10 400 4,000

    > > 2001/03/02 2 상품2 10 200 2,000

    > > 2001/03/02 3 상품3 10 100 1,000

    > > 합계 7,000

    > >

    > > 제가 구현한 query 조건

    > > select GEO_YMD, GEO_JUN_NO, GEO_NAME,

    > > GEO_TSURANG, GEO_DANGA, SUM(GEO_KUMAK) AS GEO_TOTAL

    > > from GEOMYUNG

    > > WHERE CUS_CODE = :param1 and GEO_YMD BETWEEN :param2 AND :param3

    > > group by

    > > GEO_YMD, GEO_JUN_NO, GEO_NAME, GEO_TSURANG,

    > > GEO_DANGA

    > >

    > > union

    > > select '합계',0, null, null, 0, 0, SUM(GEO_KUMAK)

    > > from GEOMYUNG (너무 몰라서 테스트 식으로 넣어 두었습니다.) 이부분 도움좀

    > > 부탁드립니다.

    > >

    > > DM.geomyung3CDs.Params.ParamValues['Param1'] := DM.CusCDS.FieldByName('CUS_CODE').asString;

    > > DM.geomyung3CDs.Params.ParamValues['Param2']:= '2001/03/01'; DM.geomyung3CDs.Params.ParamValues['Param3']:= '2001/03/06';

    > > DM.geomyung3CDs.Open;

    > >

    >

    > =>>>

    > union

    > select '합계',0, null, null, 0, 0, SUM(GEO_KUMAK)

    > from GEOMYUNG

    > 필드의 수를 하나 줄여보세요. 처음 부분에 select 필드의 개수(현재 6개)와 union이후 select 필드의개수(현재 7개)가 동일 해야 합니다.

    > 그런데요...아마 맨 마지막에만 합계가 나올거에요....아마도

    >

    > 도움이 되셨으면 합니다.

    >

    > 초보 hobakpa;

  • Profile
    왕초보 2001.03.30 23:22
    날자로 소트했는데 중간에 합계라는 글자가 들어가야 하는게 문제겠네요.

    그럼 편법으로 처리해야죠.



    글구 합계에는 년월일을 그대로 넣고 전표번호는 99999로 놓구요.

    sql문은

    select GEO_YMD, GEO_JUN_NO, GEO_NAME,

    GEO_TSURANG, GEO_DANGA, SUM(GEO_KUMAK) AS GEO_TOTAL

    from GEOMYUNG

    WHERE CUS_CODE = :param1 and GEO_YMD BETWEEN :param2 AND :param3

    group by

    GEO_YMD, GEO_JUN_NO, GEO_NAME, GEO_TSURANG,GEO_DANGA

    union

    select GEO_YMD,'99999', null, null, 0, 0, SUM(GEO_KUMAK)

    from GEOMYUNG

    WHERE CUS_CODE = :param1 and GEO_YMD BETWEEN :param2 AND :param3

    group by GEO_YMD

    Order By 1,2;



    결과는





    날짜 전표번호 상품명 총 수량 단가 금액

    2001/03/01 1 상품1 10 300 3,000

    2001/03/01 2 상품2 10 200 2,000

    2001/03/01 3 상품 3 10 300 3,000

    2001/03/01 99999 8,000

    2001/03/02 1 상품1 10 400 4,000

    2001/03/02 2 상품2 10 200 2,000

    2001/03/02 3 상품3 10 100 1,000

    2001/03/02 99999 7,000



    글구 전표번호 99999인것은 출력할때 강제로 '합계'라고 출력하도록 하구요.별 도움이 안되서 죄송합니다.



    질문을 괭장히 많이 올렸는데 대답들을 안해 줘서 나라도 해줘야겟길래 생각나는데로 적었습니다.



    혹시 마이다스에서 마스타-디테일 구현한 소스있음 부탁드립니다....^^

    이기주 wrote:

    > 답변주셔서 감사합니다. 필드 갯 수 맞추는건 제가 질문 올리면서 잘못 기재를 했군요.

    > 다시 한번 자세히 보시고 아시는 분 있으면 답변좀 부탁드립니다.

    > 많이 급해서요.

    >

    >

    > hobakpa wrote:

    > >

    > > >

    > > > 업체 마스타 table : DM.CusCDS

    > > > 상품판매 table : DM.geomyung3CDs

    > > >

    > > > dbgrid 화면에 display 되는건

    > > > 날짜 전표번호 상품명 총 수량 단가 금액

    > > > 2001/03/01 1 상품1 10 300 3,000

    > > > 2001/03/01 2 상품2 10 200 2,000

    > > > 2001/03/01 3 상품 3 10 300 3,000

    > > > 합계 8,000

    > > > 2001/03/02 1 상품1 10 400 4,000

    > > > 2001/03/02 2 상품2 10 200 2,000

    > > > 2001/03/02 3 상품3 10 100 1,000

    > > > 합계 7,000

    > > >

    > > > 제가 구현한 query 조건

    > > > select GEO_YMD, GEO_JUN_NO, GEO_NAME,

    > > > GEO_TSURANG, GEO_DANGA, SUM(GEO_KUMAK) AS GEO_TOTAL

    > > > from GEOMYUNG

    > > > WHERE CUS_CODE = :param1 and GEO_YMD BETWEEN :param2 AND :param3

    > > > group by

    > > > GEO_YMD, GEO_JUN_NO, GEO_NAME, GEO_TSURANG,

    > > > GEO_DANGA

    > > >

    > > > union

    > > > select '합계',0, null, null, 0, 0, SUM(GEO_KUMAK)

    > > > from GEOMYUNG (너무 몰라서 테스트 식으로 넣어 두었습니다.) 이부분 도움좀

    > > > 부탁드립니다.

    > > >

    > > > DM.geomyung3CDs.Params.ParamValues['Param1'] := DM.CusCDS.FieldByName('CUS_CODE').asString;

    > > > DM.geomyung3CDs.Params.ParamValues['Param2']:= '2001/03/01'; DM.geomyung3CDs.Params.ParamValues['Param3']:= '2001/03/06';

    > > > DM.geomyung3CDs.Open;

    > > >

    > >

    > > =>>>

    > > union

    > > select '합계',0, null, null, 0, 0, SUM(GEO_KUMAK)

    > > from GEOMYUNG

    > > 필드의 수를 하나 줄여보세요. 처음 부분에 select 필드의 개수(현재 6개)와 union이후 select 필드의개수(현재 7개)가 동일 해야 합니다.

    > > 그런데요...아마 맨 마지막에만 합계가 나올거에요....아마도

    > >

    > > 도움이 되셨으면 합니다.

    > >

    > > 초보 hobakpa;

  • Profile
    이기태 2001.03.09 03:32


    일단 가장 빠른 방법은 레포팅 툴을 찾아보시는 겁니다.

    현재 델파이의 그리드로를 불가능 하거든요.



    두번째 방법은 좀 느리더라도 스트링 그리드에 일일히 뿌리시는 겁니다.

    허나 이것도 만만하지는 않네요.

    코딩으로 그룹의 조건의 체크하시다가 그룹의 마지막 다음에 합계를 그리드에 뿌리시고.

    다음 그룹으로 넘어가야 하니까요.



    세번째 방법이 있다면 SQL 문을 이용하는 것인데.

    현재 어떤 DB 를 사용하시는지 모르겠네요.

    저는 오라클이라고 생각하고 말씀을 드리겠습니다.



    컬럼은 두개만 가지고 해보겠습니다.

    나머지는 님께서 테스트 해보시고 만들어보세요.



    // 정상적인 리스트를 가져오는 SQL

    SELECT 0 SORT_KEY, DT, CODE, PAY

    FROM TEST_TABLE



    // 합계를 가져오는 SQL

    SELECT 1 SORT_KEY, DT, '합계' CODE, SUM(PAY) PAY

    FROM TEST_TABLE

    GROUP BY DT



    //이 둘을 Union 으로 연결하시면

    //컬럼의 수와 컬럼의 이름은 같도록 해주세요.

    SELECT 0 SORT_KEY, DT, CODE, PAY

    FROM TEST_TABLE

    UNION

    SELECT 1 SORT_KEY, DT, '합계' CODE, SUM(PAY) PAY

    FROM TEST_TABLE

    GROUP BY DT



    이 Union 문장이 하나의 테이블이 되는거거든요.

    그럼 합쳐서 써보겠습니다.



    SELECT DT, CODE, PAY

    FROM (SELECT 0 SORT_KEY, DT, CODE, PAY

    FROM TEST_TABLE

    UNION

    SELECT 1 SORT_KEY, DT, '합계' CODE, SUM(PAY) PAY

    FROM TEST_TABLE

    GROUP BY DT )

    ORDER BY DT, SORT_KEY, CODE



    대강 감이 오시나요 ?

    DT 에 의해 일률적으로 소트가 되는데 SORT_KEY 라는 것을 우리가 임의로 만들어 소트했기 때문에 날짜가 변경되기 전에 합계가 사이사이 끼어들어가 보이겠지요.

    0 이 먼저니까 일반 리스트가 나올테고, 합계는 SORT_KEY 가 1 이니까 그 담에 합계 나올테고.



    문제는 오라클이라면 저런 sub_query 가 가능한데요.

    다른 DB 를 사용하신다면 서브 쿼리를 사용하는 방법을 좀 찾아보시구요.

    안되면 서브 쿼리의 테이블 모양을 가지는 view 를 만들어서 사용하세요.

    속도는 떨어지더라도 해결하실 수는 있을거에요.



    합계 부분의 색을 바꾸고 싶으시다면.

    특정 레코드에 대해 셀의 색을 바꾸는 예제들이 이 게시판 어딘가에 있을테니 찾아보시구요.

    SELECT 시 SORT_KEY 도 SELECT 하셔서요 이 키가 1 인 경우에 cavas 의 색을 바꿔주는 방법으로 그 행의 색을 바꿔주시면 될거에요.



    젤 마지막에 총합계를 보이고 싶으시다면.

    저 위의 SQL 문이 서브 쿼리가 되는 또 하나의 쿼리문을 생성하시면 되겠지요...^^;



    그럼 즐코딩 하세요...