안녕하세요? 질문이 있어서 이렇게 글을 올리게 되었습니다.^^
제가 지금 짜고 있는 리포트 프로그램이 아래와 같습니다.
원하는 기간을 입력하면 그 기간안에 있는 data들이 조회가 되어 리스트로 출력이 됩니다.
문제는 출력된 리스트중에서 금액에 대해서만 일자별 소계와 전체합계를 내어야 하는데
이 부분을 잘 몰라서 질문을 드립니다.
어떻게 하면 소계와 합계를 구할 수 있는지 답변 부탁드립니다.^^
참고로 제 소스코드와 이미지를 첨부하겠습니다.
REPORT TRTM_RI_065 NO STANDARD PAGE HEADING
LINE-SIZE 255
MESSAGE-ID ZTM.
INCLUDE <ICON>.
TABLES: ZTRTM_SCHEDULE.
DATA: BEGIN OF WA_LIST,
TRDAT TYPE ZTRTM_SCHEDULE-TRDAT, " 일자
KOSTL TYPE ZTRTM_SCHEDULE-KOSTL, " 부서
KOSTLN(10) TYPE C, " 부서명
TR_GBN TYPE ZTRTM_SCHEDULE-TR_GBN, " 구분
TR_GBNN(10) TYPE C, " 구분명
REMARK TYPE ZTRTM_SCHEDULE-REMARK, " 적요
AMT TYPE ZTRTM_SCHEDULE-AMT, " 금액
PERNR TYPE ZTRTM_SCHEDULE-PERNR, " 담당자
PERNRR(10) TYPE C, " 담당자명
PHONE TYPE ZTRTM_SCHEDULE-PHONE, " 전화번호
NOTE TYPE ZTRTM_SCHEDULE-NOTE, " 비고
END OF WA_LIST.
DATA : BEGIN OF WA_DOWN,
TRDAT(8),
KOSTLN(10),
TR_GBN(1),
TR_GBNN(10),
REMARK(60),
AMT(15),
PERNR(8),
PERNRR(8),
PHONE(14),
NOTE(50),
END OF WA_DOWN.
*화면 분기용
DATA : IT_LIST LIKE TABLE OF WA_LIST,
IT_DOWN LIKE TABLE OF WA_DOWN.
DATA : LAST_DATE LIKE SY-DATUM.
DATA : ILIN TYPE I.
*-- SELECTION SCREEN
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS : S_DATE FOR ZTRTM_SCHEDULE-TRDAT NO-EXTENSION.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN END OF BLOCK BLK1.
*-- INITIALIZATION
INITIALIZATION.
PERFORM SET_DATE.
*-- TOP OF PAGE
TOP-OF-PAGE.
PERFORM TOP_OF_PAGE.
*-- START OF SELECTION
START-OF-SELECTION.
PERFORM SET_MENU_TOOLBAR.
PERFORM GET_DATA.
DESCRIBE TABLE IT_LIST LINES ILIN.
IF ILIN > 0.
MESSAGE S223 WITH ILIN.
ELSE.
MESSAGE S222.
LEAVE LIST-PROCESSING.
ENDIF.
PERFORM WRITE_DATA.
END-OF-SELECTION.
*&---------------------------------------------------------------------
*
*& Form SET_DATE
*&---------------------------------------------------------------------
*
* 조회일자를 초기화한다. 해당달의 1일 ~ 마지막날
*----------------------------------------------------------------------
*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------
*
FORM SET_DATE.
CONCATENATE SY-DATUM+0(6) '01' INTO S_DATE-LOW.
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
EXPORTING
DAY_IN = SY-DATUM "기준이 되는 임의의 일자
IMPORTING
LAST_DAY_OF_MONTH = LAST_DATE "해당월의 마지막 일자
EXCEPTIONS
DAY_IN_NO_DATE = 1
OTHERS = 2.
S_DATE-HIGH = LAST_DATE.
APPEND S_DATE.
ENDFORM. " SET_DATE
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* LIST DATA를 DB에서 가져온다.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GET_DATA.
*--조회기간에 해당하는 예상자금내역을 조회
SELECT *
INTO CORRESPONDING FIELDS OF WA_LIST
FROM ZTRTM_SCHEDULE
WHERE TRDAT IN S_DATE.
*--부서명 조회
SELECT SINGLE KTEXT
INTO WA_LIST-KOSTLN
FROM CSKT
WHERE SPRAS = SY-LANGU
AND KOKRS = 'S100'
AND KOSTL = WA_LIST-KOSTL.
*--구분명 조회
SELECT SINGLE DDTEXT
INTO WA_LIST-TR_GBNN
FROM DD07T
WHERE DOMNAME = 'ZTR_GBN'
AND DDLANGUAGE = SY-LANGU
AND AS4LOCAL = 'A'
AND DOMVALUE_L = WA_LIST-TR_GBN.
*--사원명 조회
SELECT SINGLE ENAME
INTO WA_LIST-PERNRR
FROM PA0001
WHERE PERNR = WA_LIST-PERNR.
APPEND WA_LIST TO IT_LIST.
CLEAR WA_LIST.
ENDSELECT.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form WRITE_DATA
*&---------------------------------------------------------------------*
* LIST DATA를 출력 처리한다.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM WRITE_DATA.
LOOP AT IT_LIST INTO WA_LIST.
WRITE : /1 SY-VLINE,
(4) SY-TABIX RIGHT-JUSTIFIED NO-GAP,
SY-VLINE NO-GAP,
(10) WA_LIST-TRDAT USING EDIT MASK '____/__/__' NO-GAP,
SY-VLINE NO-GAP,
(8) WA_LIST-KOSTLN NO-GAP,
SY-VLINE NO-GAP,
(8) WA_LIST-TR_GBN NO-GAP,
SY-VLINE NO-GAP,
(8) WA_LIST-TR_GBNN CENTERED NO-GAP,
SY-VLINE NO-GAP,
(20) WA_LIST-REMARK NO-GAP,
SY-VLINE NO-GAP,
(15) WA_LIST-AMT CENTERED NO-GAP,
SY-VLINE NO-GAP,
(10) WA_LIST-PERNR CENTERED NO-GAP,
SY-VLINE NO-GAP,
(10) WA_LIST-PERNRR CENTERED NO-GAP,
SY-VLINE NO-GAP,
(13) WA_LIST-PHONE,
SY-VLINE NO-GAP,
(30) WA_LIST-NOTE NO-GAP,
SY-VLINE NO-GAP.
WRITE: /1 SY-ULINE(150).
ENDLOOP.
ENDFORM. " WRITE_DATA
*&---------------------------------------------------------------------*
*& Form TOP_OF_PAGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM TOP_OF_PAGE.
WRITE: /1(150) '< 자금지불요청 >' CENTERED.
SKIP.
WRITE: /1 SY-ULINE(150).
WRITE: /1 SY-VLINE.
FORMAT COLOR COL_HEADING INTENSIFIED ON.
WRITE: (4) 'H' CENTERED NO-GAP,
SY-VLINE NO-GAP, (10) '일자' CENTERED NO-GAP,
SY-VLINE NO-GAP, (8) '부서명' CENTERED NO-GAP,
SY-VLINE NO-GAP, (8) '구분' CENTERED NO-GAP,
SY-VLINE NO-GAP, (8) '구분종류' CENTERED NO-GAP,
SY-VLINE NO-GAP, (20) '적요' CENTERED NO-GAP,
SY-VLINE NO-GAP, (15) '금액' CENTERED NO-GAP,
SY-VLINE NO-GAP, (10) '담당자' CENTERED NO-GAP,
SY-VLINE NO-GAP, (10) '담당자명' CENTERED NO-GAP,
SY-VLINE NO-GAP, (14) '전화번호' CENTERED NO-GAP,
SY-VLINE NO-GAP, (30) '비고' CENTERED NO-GAP,
SY-VLINE NO-GAP.
WRITE: /1 SY-ULINE(150).
ENDFORM. " TOP_OF_PAGE
댓글 6
-
storyroom.net™
2008.11.12 19:30
-
왕초보
2008.11.12 22:54
출력을 반드시 write로 해야하나요?? 아니면 ALV를 이용해보심이 어떨지~~
-
튀밥
2008.11.12 23:36
지금 막 배우고 있는 단계라서 아직 WRITE 밖에 몰라요~ㅜㅜ
-
SkyDream
2008.11.13 01:56
일단, 일자별 DATA를 출력한 후 일자별 소계와 총계를 출력하기 위해서는
LOOP 문장 안의 개별항목을 출력한 아랫 부분에 아래의 로직을 넣어서 처리하시면 됩니다.
아래 로직에서 SUM을 하게되면 1에서는 일자별 금액이 합쳐져서 헤더의 해당 금액필드에 들어갑니다.
2에서는 총계금액이 헤더의 해당 필드에 들어가구요.
SUM을 할 경우 숫자필드 이외의 필드는 비정상적인 값이 들어가니 사용하시면 안되구요..
'....'으로 표시한 부분에 WRITE문을 넣어 주시면 되겠습니다. 금액필드외의 것들은 공백으로 출력하시면 되구요.
참! 중요한거 한가지!!!
SUM을 사용하기 위해서는 위의 INTERNAL TABLE 선언방법을 좀 바꿔야 됩니다.
*DATA : IT_LIST LIKE TABLE OF WA_LIST.
DATA: IT_LIST LIKE WA_LIST OCCURS 0 WITH HEADER LINE.
SUM 문장을 사용하려면 헤더가 있는 INTERNAL TABLE이어야 하고, 숫자필드 합계가 헤더의 해당 필드로 들어가기때문에...
자세한 정보는 AT END OF ... 나 SUM 에 커서 놓고 F1눌러서 도움말 참고하세요.
1. AT END OF TRDAT. => 일자별 소계 출력
SUM.
....
ENDAT.
2. AT LAST. => 총계 출력
SUM.
....
ENDAT.
-
현준탱
2008.11.13 02:05
wa_list 를 써서 at end of 가 안될것 같은데요...
만약에 헤더가 있는 인터널 테이블 이라면...
DATA: BEGIN OF sum_trdat,
trdat TYPE ztrtm_schedule-trdat, " 일자
amt TYPE ztrtm_schedule-amt, " 금액
END OF sum_trdat.
DATA: BEGIN OF sum_tot,
amt TYPE ztrtm_schedule-amt, " 금액
END OF sum_tot.
SORT it_list BY trdat.
LOOP AT it_list.
WRITE : /1 sy-vline,
(4) sy-tabix RIGHT-JUSTIFIED NO-GAP,
sy-vline NO-GAP,
(10) it_list-trdat USING EDIT MASK '____/__/__' NO-GAP,
sy-vline NO-GAP,
(8) it_list-kostln NO-GAP,
sy-vline NO-GAP,
(8) it_list-tr_gbn NO-GAP,
sy-vline NO-GAP,
(8) it_list-tr_gbnn CENTERED NO-GAP,
sy-vline NO-GAP,
(20) it_list-remark NO-GAP,
sy-vline NO-GAP,
(15) it_list-amt CENTERED NO-GAP,
sy-vline NO-GAP,
(10) it_list-pernr CENTERED NO-GAP,
sy-vline NO-GAP,
(10) it_list-pernrr CENTERED NO-GAP,
sy-vline NO-GAP,
(13) it_list-phone,
sy-vline NO-GAP,
(30) it_list-note NO-GAP,
sy-vline NO-GAP.
MOVE-CORRESPONDING it_list TO sum_trdat.
MOVE-CORRESPONDING it_list TO sum_tot.
COLLECT: sum_trdat, sum_tot.
CLEAR : sum_trdat, sum_tot.
AT END OF trdat. "소계
LOOP AT sum_trdat.
WRITE :.....
ENDLOOP.
ENDAT.
AT LAST. "총계
LOOP AT sum_tot.
WRITE: sum_tot....
ENDLOOP.
ENDAT.
WRITE: /1 sy-uline(150).
ENDLOOP.
currency 가 여러개 일 경우에는 이런식으로 구현하시면 될것 같습니다. 참고하세요^^;
-
튀밥
2008.11.13 20:30
여러분들의 정성어린 답변 감사합니다. 말씀해주신 것들을 바탕으로 해보겠습니다.^^
WRITE_DATA FORM에서 LOOP를 돌릴때 AT NEW TRDAT를 한번 해보세요..
AT NEW 와 관련된 예제는 검색해보시면 많이 나옵니다...
LOOP AT ~~
AT NEW TRDAT.
소계를 여기서 찍으세요~~
ENDAT.
ENDLOOP.