BDC (3) - 소스코딩

SAP ABAP 2009. 2. 1. 23:03

어렵고 이해하기 힘들다...
천천히 살펴보자..

  REPORT  zdh_test_10day_3 MESSAGE-ID zpabap06_message.
*테이블선언
TABLES : rlgrap.
*alv를 위한 타입풀스 선언
TYPE-POOLS : slis.
*필드카테고리
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 : gs_repid LIKE sy-repid,
          gs_variant LIKE disvariant,
          gs_evts TYPE slis_t_event.

CONSTANTS : pf_status_set TYPE slis_alv_event-name
                  VALUE 'PF_STATUS_SET',
                  top_of_page TYPE slis_formname
                  VALUE 'TOP_OF_PAGE',
                  user_command TYPE slis_alv_event-name
                  VALUE 'USER_COMMAND'.

DATA : col_pos TYPE i.

*엑셀업로딩을 위한 스트럭쳐 선언
DATA : it_xls LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE.
*bdc선언
CONSTANTS : c_tcode(10TYPE c VALUE 'ZDH_BDC'.

DATA : it_bdc LIKE bdcdata OCCURS 0 WITH HEADER LINE ,
       gs_param LIKE ctu_params, //CALL TRANSACTION USING... 실행시간에 대한 매개변수 문자열
       g_message LIKE cfgnl-msglin. //일반 SAP-EIS 필드 문자열
*인터널 테이블 선언
DATA : BEGIN OF it_upload OCCURS 0 ,
           name(50),
          post(50),
          erdat(50),
          pay(50),
          waers(50),
          fee(50),
        END OF it_upload.

*alv에 뿌릴 인터널테이블
DATA : BEGIN OF it_list OCCURS 0,
         name LIKE ztrecord_11-name,
        post LIKE ztrecord_11-post,
        erdat LIKE ztrecord_11-erdat,
        pay LIKE ztrecord_11-pay,
        waers LIKE ztrecord_11-waers,
        fee LIKE ztrecord_11-fee,
        END OF it_list.

*SELECTION-SCREEN 엑셀 파일을 받는 셀렉션 스크린
PARAMETERS : p_file LIKE rlgrap-filename OBLIGATORY,
                        p_mode LIKE ctu_params-dismode DEFAULT 'N'.


*이 파일명을 선택했을때 어떻게 할 것인가
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    EXPORTING
      program_name  = sy-repid "시스템내부적으로 가지고 있는 프로그램 네임
      dynpro_number = sy-dynnr "화면 넘버
      field_name    = 'p_file'
      static        = ' X '
      mask          = ' *.xls , *.*' "파일형식
    CHANGING
      file_name     = p_file
    EXCEPTIONS
      mask_too_long = 1
      OTHERS        = 2.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

START-OF-SELECTION.
  CLEAR : it_upload , it_upload[] ,
          it_list , it_list[] .
  CLEAR : it_xls, it_xls[].

*  엑셀 업로드
  FIELD-SYMBOLS : <ls>.
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 100
      i_end_row               = 65536
    TABLES
      intern                  = it_xls "위에서 만들었던 스트럭쳐 it_xls에 집어 넣는다.
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  SORT it_xls BY row col .
  LOOP AT it_xls.
    AT NEW row.
      CLEAR it_upload.
    ENDAT.

    ASSIGN COMPONENT it_xls-col OF STRUCTURE it_upload TO <ls>.
    IF sy-subrc = 0.
      <ls> = it_xls-value.
    ENDIF.

    AT END OF row.
      APPEND it_upload.
    ENDAT.
  ENDLOOP.

  LOOP AT it_upload.
    MOVE-CORRESPONDING it_upload TO it_list.
    APPEND it_list.
    CLEAR it_list.
  ENDLOOP.

END-OF-SELECTION.
  PERFORM build_fcat.
  PERFORM alv_display.
*&---------------------------------------------------------------------*
*&      Form  build_fcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_fcat .

  ADD 1 TO col_pos.
  fieldcat_ln-fieldname = 'NAME'.
  fieldcat_ln-reptext_ddic = '성명'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  ADD 1 TO col_pos.
  fieldcat_ln-fieldname = 'POST'.
  fieldcat_ln-reptext_ddic = '부서'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  ADD 1 TO col_pos.
  fieldcat_ln-fieldname = 'PAY'.
  fieldcat_ln-reptext_ddic = '연봉'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  ADD 1 TO col_pos.
  fieldcat_ln-fieldname = 'WAERS'.
  fieldcat_ln-reptext_ddic = '통화'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  ADD 1 TO col_pos.
  fieldcat_ln-fieldname = 'ERDAT'.
  fieldcat_ln-reptext_ddic = '입사일'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

  ADD 1 TO col_pos.
  fieldcat_ln-fieldname = 'FEE'.
  fieldcat_ln-reptext_ddic = '인상률'.
  APPEND fieldcat_ln TO fieldcat.
  CLEAR fieldcat_ln.

ENDFORM.                    " build_fcat
*&---------------------------------------------------------------------*
*&      Form  alv_display
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM alv_display .

  ls_layout-colwidth_optimize = 'X'.
  ls_layout-zebra = 'X'.

  gs_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = gs_repid
      i_callback_pf_status_set = 'PF_STATUS_SET'
      i_callback_user_command  = 'USER_COMMAND'
      is_layout                = ls_layout
      it_fieldcat              = fieldcat
      it_sort                  = sortcat
      i_save                   = 'A'
      is_variant               = gs_variant
      it_events                = gs_evts
    TABLES
      t_outtab                 = it_list
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.


ENDFORM.                    " alv_display

*&---------------------------------------------------------------------*
*&      Form  PF_STATUS_SET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'TEST_CDH' EXCLUDING rt_extab.
ENDFORM.                    "PF_STATUS_SET
*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_UCOMM    text
*      -->P_SELFIELD text
*----------------------------------------------------------------------*
FORM user_command USING p_ucomm TYPE sy-ucomm
                     p_selfield TYPE slis_selfield.

  CASE p_ucomm.
    WHEN 'BDCF'"GUI에 정의되어 있는 이름
      PERFORM run_bdc.
  ENDCASE.
ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  run_bdc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM run_bdc .

  DATA : i_pay(13).
*  bdc모드 설정
  gs_param-dismode = p_mode.
  gs_param-updmode = 'S'.
  gs_param-cattmode = ' '.
  gs_param-defsize = ' '.
  gs_param-racommit = 'X'.
  gs_param-nobinpt = 'X'.
  gs_param-nobiend = ' '.

  LOOP AT  it_list.
    CLEAR : i_pay , it_bdc , it_bdc[].
    WRITE it_list-pay TO i_pay LEFT-JUSTIFIED CURRENCY it_list-waers.

    PERFORM dynpro USING :
*                 시작아이디           프로그램명            화면/필드값
                      'X'         'ZDH_TEST_10DAY_2'        '1000' ,
                       ' '        'BDC_OKCODE'               '=ONLI',
                       ' '        'P_NAME'                   it_list-name,
                       ' '        'P_POST'                   it_list-post,
                       ' '        'P_ERDAT'                  it_list-erdat,
                       ' '        'P_PAY'                    i_pay,
                       ' '        'P_WAERS'                  it_list-waers,
                       ' '        'P_FEE'                    it_list-fee.
PERFORM bdc_call_trans TABLES it_bdc USING g_message c_tcode.
  ENDLOOP.
ENDFORM.                    " run_bdc
*&---------------------------------------------------------------------*
*&      Form  dynpro
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0504   text
*      -->P_0505   text
*      -->P_0506   text
*----------------------------------------------------------------------*
FORM dynpro  USING  p_dynbegin p_name p_value. "파라미터 세 개를 받는다.

  IF p_dynbegin = 'X'.
    MOVE : p_name TO it_bdc-program,
                p_value TO it_bdc-dynpro,
                p_dynbegin TO it_bdc-dynbegin.
  ELSE.
    MOVE : p_name TO it_bdc-fnam,
            p_value TO it_bdc-fval.
  ENDIF.

  APPEND it_bdc.
  CLEAR it_bdc.

ENDFORM.                    " dynpro

form bdc_call_trans TABLES t_data STRUCTURE bdcdata
                            USING p_msg STRUCTURE cfgnl
                                        p_tcode.

  data : lt_message type TABLE OF bdcmsgcoll WITH HEADER LINE.
  data : l_subrc like sy-subrc.

  call TRANSACTION p_tcode USING t_data
                           options from gs_param
                           messages into lt_message.

  CALL FUNCTION 'RKC_MSG_STRING'
    EXPORTING
     ID            = sy-msgid
      mtype         = sy-msgty
      number        = sy-msgno
     PAR1          = sy-msgv1
     PAR2          = sy-msgv2
     PAR3          = sy-msgv3
     PAR4          = sy-msgv4
   IMPORTING
     MSG_LIN       = p_msg.
  ENDFORM.
AND