화면은 위와 같다.
출력은 List와 ALV 선택해서 하는것인데... List는 생략하고 ALV만 해보았다. 대략 6시간정도 삽질을..ㅡ.ㅡ;;
스펙
< 검색조건 설명>
1. 회사코드(BKPF-BUKRS): 필수입력항목
2. 회계연도(BKPF-GJAHR): 필수입력항목
3. 전표번호(BKPF-BELNR): 선택항목
4. 전기일자(BKPF-BUDAT): LOW값만 필수입력항목
5. 작성자ID(BKPF-USNAM): 선택항목
<데이터 추출시 로직 설명>
1. 검색조건 화면의 전기일자가 회계연도 범위에 포함이 안될경우 오류메세지를 출력한다.
2. 상단의 선택된 조건에 따라 전표헤더(BKPF) Table에서 대상 자료를 가져온다.
가)임시전표를 포함했을 경우
*전표헤더(BKPF) Table의 전표상태(BSTAT) Field값이 정규전표(Space) 및
임시전표('V') 인자료를 가져온다.
*전표상태가 정규전표인 경우에는 전표세그먼트(BSEG) Table에서 개별항목 자료를
가져온다.
*전표상태가 임시전표인경우에는 관련된 각종 Table에서 개별항목 자료를 가져온다.
(첨부문서 관련 Table 참조요망) :
=> 자산(VBSEGA), G/L(VBSEGS), 구매처(VBSEGK), 고객(VBSEGD)
나)임시전표를 제외했을 경우
*전표헤더(BKPF) Table의 전표상태(BSTAT) Field값이 정규전표(Space) 인
자료를 가져온다.
*전표세그먼트(BSEG) Table에서 개별항목 자료를 가져온다.
3. 발행순서
가)전표번호순 선택시: 전표번호, 개별항목 순으로 발행한다.
나)전기일자순 선택시: 전기일자, 전표번호, 개별항목 순으로 발행한다.
4. 검색된 자료가 존재하지 않을경우 에러 메시지를 출력하고 프로그램을 중지한다.
5. LIST 및 ALV 라디오버튼 선택에 따라 출력화면을 다르게 가져간다.(결과화면 참조)
<검색결과 항목 설명>
1. 전기일: 전표헤더(BKPF) Table의 전기일자(BUDAT) Field값
2. 전표구분: 전표헤더(BKPF) Table의 전표상태(BSTAT) Field값에 따라 '정규전표', '임시전표'로 구분
3. 전표번호: 전표헤더(BKPF) Table의 전표번호(BELNR) Field값
4. 순번: 관련된 개별항목 Table의 개별항목(BUZEI) Field값
5. 계정과목: 관련된 개별항목 Table의 총계정원장계정(HKONT) Field값
6. 계정명: 총계정원장계정(HKONT)를 기준으로 G/L 마스터(SKAT) Table에서
G/L 계정내역(TXT20) Field값을 가져온다.
*계정텍스트(SKAT) Table의 언어키('3'), 계정과목표('1000')를 Default값으로 하여 명칭을 가져옮
7. 차변금액: 관련된 개별항목 Table의 차변/대변 지시자(SHKZG) Field값이 차변('S')인경우 금액표시
8. 대변금액: 관련된 개별항목 Table의 차변/대변 지시자(SHKZG) Field값이 대변('H')인경우 금액표시
9 적요: 관련된 개별항목 Table의 항목텍스트(SGTXT) Field값
10. 코스트센터: 관련된 개별항목 Table의 코스트센터(KOSTL) Field값
*임시전표인 경우 G/L계정개별항목(VBSEGS) Table의 값만 코스트센터 유무를 체크한다.
=>임시전표인경우 구매처(VBSEGK), 고객항목(VBSEGD) Table에는 코스트센터 Field가 없음.
11. 코스트센터명칭: 코스트센터(KOSTL)를 기준으로 코스트센터 텍스트(CSKT) Table에서
일반이름(KTEXT)을 가져온다.
*코스트센터 값이 Space인경우 별도 명칭은 출력하지 않는다.
*코스트센터 텍스트 Table의 언어키('3'), 관리회계영역('1000')을 Default값으로 하여 명칭을 가져옮
*효력만료일(DATBI) ( >= ) 전기일자(BUDAT)인 내역의 값을 가져온다.
REPORT zdh_test_8day_01.
TABLES : bkpf,skat,bseg,cskt, vbsega, vbsegs, vbsegk ,vbsegd.
TYPE-POOLS : slis.
DATA : BEGIN OF itab OCCURS 0,
bukrs LIKE bkpf-bukrs,
gjahr LIKE bkpf-gjahr,
budat LIKE bkpf-budat, "전기일
bstat LIKE bkpf-bstat, "전표구분
belnr LIKE bkpf-belnr, "전표번호
buzei TYPE bseg-buzei, "순번
hkont TYPE bseg-hkont, "계정과목
txt20 LIKE skat-txt20, "계정명
shkzg LIKE bseg-shkzg, "차변대변여
cha LIKE bseg-dmbtr, "차변금액
dar LIKE bseg-dmbtr, "대변금액
sgtxt LIKE bseg-sgtxt, "적요
kostl LIKE bseg-kostl, "코스트센터
ktext LIKE cskt-ktext, "코스트센터명칭
mark,
gubun(6) TYPE c. "전표구분
DATA : END OF itab.
* * * 필드카테고리
DATA : fieldcat TYPE slis_t_fieldcat_alv,
fieldcat_ln LIKE LINE OF fieldcat.
* *소트카테고리
DATA : sortcat TYPE slis_t_sortinfo_alv,
sortcat_ln LIKE LINE OF sortcat.
*레이아웃
DATA : ls_layout TYPE slis_layout_alv.
DATA : col_pos TYPE i.
SELECTION-SCREEN BEGIN OF BLOCK gg WITH FRAME TITLE text-111.
PARAMETERS : pa_bukrs TYPE bkpf-bukrs DEFAULT '1000' OBLIGATORY.
PARAMETERS : pa_gjahr TYPE bseg-gjahr DEFAULT '2009' OBLIGATORY.
SELECT-OPTIONS : op_belnr FOR bkpf-belnr.
SELECT-OPTIONS : op_budat FOR bkpf-budat.
SELECT-OPTIONS : op_usnam FOR bkpf-usnam NO INTERVALS.
PARAMETERS : pa_imsi AS CHECKBOX.
PARAMETERS : list RADIOBUTTON GROUP rad1.
PARAMETERS : alv RADIOBUTTON GROUP rad1.
SELECTION-SCREEN END OF BLOCK gg.
SELECTION-SCREEN BEGIN OF BLOCK pp WITH FRAME TITLE text-112.
PARAMETERS : sort_jun RADIOBUTTON GROUP rad2.
PARAMETERS : sort_day RADIOBUTTON GROUP rad2.
SELECTION-SCREEN END OF BLOCK pp.
INCLUDE zdh_test_8day_01_alvf01. //인클루드는 스타트오브셀렉션 위에 넣자.. perform은 안에 넣고..
START-OF-SELECTION.
//임시전표 체크박스를 체크하지 않을경우 - 정규전표만 가져온다.
IF pa_imsi = ' ' .
*임시전표 포함 안함
SELECT bukrs budat bstat belnr gjahr
FROM bkpf
INTO CORRESPONDING FIELDS OF TABLE itab
WHERE bukrs = pa_bukrs AND
gjahr = pa_gjahr AND
belnr IN op_belnr AND
budat IN op_budat AND
usnam IN op_usnam.
LOOP AT itab.
SELECT SINGLE buzei hkont shkzg
INTO (itab-buzei, itab-hkont, itab-shkzg)
FROM bseg
WHERE bukrs = itab-bukrs AND
gjahr = itab-gjahr AND
belnr = itab-belnr.
SELECT SINGLE txt20
INTO itab-txt20
FROM skat
WHERE saknr = itab-hkont.
MODIFY itab.
ENDLOOP.
LOOP AT itab.
IF itab-shkzg = 'S'. //차변대변지시자 값이 S일경우 차변에 금액표시
SELECT SINGLE dmbtr
INTO itab-cha
FROM bseg
WHERE bukrs = itab-bukrs AND
gjahr = itab-gjahr AND
belnr = itab-belnr.
ELSEIF itab-shkzg = 'H'. //차변대변지시자 값이 H일 경우 대변에 금액표시
SELECT SINGLE dmbtr
INTO itab-dar
FROM bseg
WHERE bukrs = itab-bukrs AND
gjahr = itab-gjahr AND
belnr = itab-belnr.
ENDIF.
SELECT SINGLE sgtxt kostl
INTO (itab-sgtxt, itab-kostl)
FROM bseg
WHERE bukrs = itab-bukrs AND
gjahr = itab-gjahr AND
belnr = itab-belnr.
SELECT SINGLE ktext
INTO itab-ktext
FROM cskt
WHERE kostl = itab-kostl.
MODIFY itab.
ENDLOOP.
//루프를 돌면서 bstat에 v라고 표시되어있는 임시전표 레코드들을 삭제하여 정규전표만 소유
LOOP AT itab.
DELETE itab WHERE bstat = 'V'.
MODIFY itab.
ENDLOOP.
//전표구분자 필드에 표시
LOOP AT itab.
IF itab-bstat = ' '.
itab-gubun = '정규전표'.
ELSEIF itab-bstat = 'V'.
itab-gubun = '임시전표'.
ENDIF.
MODIFY itab.
ENDLOOP.
//alv로 출력
PERFORM alv_field.
PERFORM alv_sort.
PERFORM alv_view.
*임시전표포함
ELSEIF pa_imsi = 'X'.
SELECT bukrs budat bstat belnr gjahr
FROM bkpf
INTO CORRESPONDING FIELDS OF TABLE itab
WHERE bukrs = pa_bukrs AND
gjahr = pa_gjahr AND
belnr IN op_belnr AND
budat IN op_budat AND
usnam IN op_usnam.
LOOP AT itab.
//임시전표와 정규전표의 데이터들을 가지고오는 테이블이 다르므로 각각 따로 구현
//정규는 위에서 작성했던 코드와 동일. 임시는 테이블 하나씩 루프하여 집어넣음
* 임시전표용 로직
IF itab-bstat = 'V'.
*vbsegk 셀렉트
SELECT SINGLE buzei hkont shkzg sgtxt
INTO (itab-buzei, itab-hkont, itab-shkzg, itab-sgtxt)
FROM vbsegk
WHERE belnr = itab-belnr.
SELECT SINGLE txt20
INTO itab-txt20
FROM skat
WHERE saknr = itab-hkont.
MODIFY itab.
IF itab-shkzg = 'S'.
SELECT SINGLE dmbtr
INTO itab-cha
FROM vbsegk
WHERE belnr = itab-belnr.
ELSEIF itab-shkzg = 'H'.
SELECT SINGLE dmbtr
INTO itab-dar
FROM vbsegk
WHERE belnr = itab-belnr.
ENDIF.
MODIFY itab.
* vbsega
SELECT SINGLE buzei hkont shkzg sgtxt kostl
INTO (itab-buzei, itab-hkont, itab-shkzg, itab-sgtxt, itab-kostl)
FROM vbsega
WHERE belnr = itab-belnr.
SELECT SINGLE txt20
INTO itab-txt20
FROM skat
WHERE saknr = itab-hkont.
MODIFY itab.
IF itab-shkzg = 'S'.
SELECT SINGLE dmbtr
INTO itab-cha
FROM vbsega
WHERE belnr = itab-belnr.
ELSEIF itab-shkzg = 'H'.
SELECT SINGLE dmbtr
INTO itab-dar
FROM vbsega
WHERE belnr = itab-belnr.
ENDIF.
SELECT SINGLE ktext
INTO itab-ktext
FROM cskt
WHERE kostl = itab-kostl.
MODIFY itab.
* vbsegs
SELECT SINGLE buzei shkzg sgtxt kostl
INTO (itab-buzei, itab-shkzg, itab-sgtxt, itab-kostl)
FROM vbsegs
WHERE belnr = itab-belnr.
SELECT SINGLE txt20
INTO itab-txt20
FROM skat
WHERE saknr = itab-hkont.
MODIFY itab.
IF itab-shkzg = 'S'.
SELECT SINGLE dmbtr
INTO itab-cha
FROM vbsega
WHERE belnr = itab-belnr.
ELSEIF itab-shkzg = 'H'.
SELECT SINGLE dmbtr
INTO itab-dar
FROM vbsega
WHERE belnr = itab-belnr.
ENDIF.
SELECT SINGLE ktext
INTO itab-ktext
FROM cskt
WHERE kostl = itab-kostl.
MODIFY itab.
* vbsegd
SELECT SINGLE buzei hkont shkzg sgtxt
INTO (itab-buzei, itab-hkont, itab-shkzg, itab-sgtxt)
FROM vbsegd
WHERE belnr = itab-belnr.
SELECT SINGLE txt20
INTO itab-txt20
FROM skat
WHERE saknr = itab-hkont.
MODIFY itab.
IF itab-shkzg = 'S'.
SELECT SINGLE dmbtr
INTO itab-cha
FROM vbsega
WHERE belnr = itab-belnr.
ELSEIF itab-shkzg = 'H'.
SELECT SINGLE dmbtr
INTO itab-dar
FROM vbsega
WHERE belnr = itab-belnr.
ENDIF.
MODIFY itab.
* *정규전표용로직
ELSEIF itab-bstat = ' '.
SELECT SINGLE buzei hkont shkzg
INTO (itab-buzei, itab-hkont, itab-shkzg)
FROM bseg
WHERE bukrs = itab-bukrs AND
gjahr = itab-gjahr AND
belnr = itab-belnr.
SELECT SINGLE txt20
INTO itab-txt20
FROM skat
WHERE saknr = itab-hkont.
MODIFY itab.
IF itab-shkzg = 'S'.
SELECT SINGLE dmbtr
INTO itab-cha
FROM bseg
WHERE bukrs = itab-bukrs AND
gjahr = itab-gjahr AND
belnr = itab-belnr.
ELSEIF itab-shkzg = 'H'.
SELECT SINGLE dmbtr
INTO itab-dar
FROM bseg
WHERE bukrs = itab-bukrs AND
gjahr = itab-gjahr AND
belnr = itab-belnr.
ENDIF.
SELECT SINGLE sgtxt kostl
INTO (itab-sgtxt , itab-kostl)
FROM bseg
WHERE bukrs = itab-bukrs AND
gjahr = itab-gjahr AND
belnr = itab-belnr.
MODIFY itab.
ENDIF.
ENDLOOP.
LOOP AT itab.
IF itab-bstat = ' '.
itab-gubun = '정규전표'.
ELSEIF itab-bstat = 'V'.
itab-gubun = '임시전표'.
ENDIF.
MODIFY itab.
ENDLOOP.
//alv로 출력
PERFORM alv_field.
PERFORM alv_sort.
PERFORM alv_view.
ENDIF.