화면은 위와 같다.
출력은 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(6TYPE 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.


AND