본문 바로가기
ABAP

생산계획 엑셀업로드+BDC 프로그램 2

by clode 2023. 2. 20.
728x90
반응형

실행 화면

첫 화면은 템플릿다운로드 버튼과 CBO TABLE 버튼, 파일경로, 처리방식(라디오버튼)으로 구성한다.

  • 템플릿 다운로드 버튼 클릭시 템플릿 양식을 사용자 PC에 다운로드 받을 수 있다.
  • 처리방식(라디오버튼) 엑셀 선택 시 로컬의 엑셀파일을 선택하여 업로드하여 BDC 수행, CBO테이블 선택 시 DB테이블에 저장된 데이터를 읽어 BDC 수행
  • CBO 테이블 버튼 눌렀을 경우 유지보수뷰 화면으로 연결한다.

템플릿 다운로드 버튼 클릭시

CBO 테이블 버튼 클릭시


Program source

1. 초기화면 구성

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-000. "파일경로
PARAMETERS : p_file TYPE localfile.    


SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(30) TEXT-c00. "처리방식
PARAMETERS : p_alsm RADIOBUTTON GROUP rd1 DEFAULT 'X'. 
SELECTION-SCREEN COMMENT 38(30) TEXT-c01. "엑셀

PARAMETERS : p_cbo RADIOBUTTON GROUP rd1.     
SELECTION-SCREEN COMMENT 78(30) TEXT-c02. "cbo테이블
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b2.

2. 버튼 생성

펑션키를 사용해 버튼을 만들어준다.

SELECTION-SCREEN : FUNCTION KEY 1.
SELECTION-SCREEN : FUNCTION KEY 2.

펑션키에 들어갈 데이터를 담을 변수를 선언해준다.

TABLES: sscrfields.
DATA : g_function_key TYPE smp_dyntxt.
DATA : g_function_key2 TYPE smp_dyntxt.

버튼의 초기값을 설정해준다. 키의 이름이나 아이콘이 들어간다. 초기값이니 Initialization에 입력한다.

  g_function_key-icon_id = icon_xls.
  g_function_key-icon_text = TEXT-001. "템플릿 다운로드
  g_function_key-text = TEXT-001.
  sscrfields-functxt_01 = g_function_key.

  g_function_key2-icon_id = icon_table_settings.
  g_function_key2-icon_text = TEXT-002. "cbo테이블
  g_function_key2-text = TEXT-002.
  sscrfields-functxt_02 = g_function_key2.

버튼을 눌렀을때 실행될 이벤트 로직을 입력해준다. 템플릿다운로드 클릭시 swm0 트랜잭션에서 등록한 템플릿 양식을 다운받도록 한다. cbo테이블 클릭시 이전에 생성한 뷰를 불러온다.

AT SELECTION-SCREEN.

DATA: ls_wwwdata_item TYPE wwwdatatab.

  CASE sscrfields-ucomm.
    WHEN 'FC01'. "템플릿 다운로드 버튼 
     SELECT SINGLE * FROM wwwdata
     INTO CORRESPONDING FIELDS OF ls_wwwdata_item
     WHERE objid = 'ZEXCEL11'.

    IF sy-subrc NE 0.
     MESSAGE s000 DISPLAY LIKE 'E' WITH '에러'.
     EXIT.
    ENDIF.

  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key = ls_wwwdata_item.


    WHEN 'FC02'. "cbo테이블 버튼
      CALL TRANSACTION 'ZS1D11'.
  ENDCASE.

뷰는 트랜잭션 코드를 만들어 call transaction 한다.


3. 엑셀 업로드

<엑셀 업로드 관련 데이터 선언>

TABLES: ZS1TAB_11.

DATA: BEGIN OF itab,
        berid  TYPE berid,
        werks  TYPE zs1tab_11-werks,
        matnr  TYPE zs1tab_11-matnr,
        dtvon  TYPE zs1tab_11-dtvon,
        dtbis  TYPE zs1tab_11-dtbis,
        fld001 TYPE zs1tab_11-fld001,
        fld002 TYPE zs1tab_11-fld002,
        fld003 TYPE zs1tab_11-fld003,
        fld004 TYPE zs1tab_11-fld004,
        fld005 TYPE zs1tab_11-fld005,
      END OF itab.

DATA : gv_rc      TYPE i,
       gv_file    TYPE localfile,
       gt_file    TYPE filetable,
       gv_data    TYPE truxs_t_text_data,
       g_frontend TYPE REF TO cl_gui_frontend_services.     "업로드용 파일 선택창

DATA : gs_itab  LIKE itab,
       gt_itab  LIKE TABLE OF itab,
       gs_excel TYPE alsmex_tabline,      "엑셀 업로드 데이터 담을 work area
       gt_excel TYPE TABLE OF alsmex_tabline.     "엑셀 업로드 데이터 담을 인터널 테이블

CONSTANTS : c_filter TYPE string VALUE
            'EXCEL FILES (*.XLSX)|*.XLSX|EXCEL FILES (*.XLS)|*.XLS|'.

FIELD-SYMBOLS <fs>.

<프로그램 SOURCE>

INITIALIZATION.
  CREATE OBJECT g_frontend.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM get_filepath.  

<FORM>

FORM get_filepath .
  CLEAR : gv_rc, gt_file[].
  CALL METHOD g_frontend->file_open_dialog
    EXPORTING
      file_filter       = c_filter
      initial_directory = 'C:'
      default_filename  = space
    CHANGING
      file_table        = gt_file
      rc                = gv_rc
    EXCEPTIONS
      OTHERS            = 1.

  CLEAR p_file.
  READ TABLE gt_file INTO p_file INDEX 1.

ENDFORM.  

4. 라디오 버튼

엑셀을 선택 시 로컬의 엑셀파일을 선택하여 업로드하여 BDC 수행하고 CBO테이블 선택 시 DB테이블에 저장된 데이터를 읽어 BDC 수행한다.

<프로그램 SOURCE>

START-OF-SELECTION.

  IF p_file IS NOT INITIAL.
    CASE 'X'.
        WHEN p_alsm.
          PERFORM call_func1.

      WHEN p_cbo.
        PERFORM call_func2.
    ENDCASE.

  ELSE.
    PERFORM call_func2.
  ENDIF.

<FORM>

엑셀 방식 선택시..

FORM call_func1 .
  CLEAR gt_excel[].
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 10
      i_end_row               = 10000
    TABLES
      intern                  = gt_excel[]
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

  " 업로드된 엑셀을 LINE/COL 별로 MOVE
  IF gt_excel[] IS NOT INITIAL.
    CLEAR gt_itab[].
    LOOP AT gt_excel INTO gs_excel.
      UNASSIGN <fs>.
      ASSIGN COMPONENT gs_excel-col OF STRUCTURE gs_itab TO <fs>.

      IF <fs> IS ASSIGNED.
        <fs> = gs_excel-value.
      ENDIF.

      AT END OF row.
        APPEND gs_itab TO gt_itab.
        CLEAR gs_itab.
      ENDAT.
    ENDLOOP.
  ENDIF.
ENDFORM.                    " CALL_FUNC1

cbo테이블 방식 선택시..

FORM call_func2 .
  SELECT * FROM ZS1TAB_11
    INTO CORRESPONDING FIELDS OF TABLE GT_ITAB.
ENDFORM.   

5. BDC

<BDC 관련 데이터 선언>

DATA: gt_bdc TYPE TABLE OF bdcdata,  "레코딩 담을 int
      gs_bdc TYPE bdcdata, "레코딩 데이터 입력 위한 wa
      gt_msg TYPE TABLE OF bdcmsgcoll, "처리결과 담을 int
      gs_msg TYPE bdcmsgcoll. "처리 결과 메세지 입력 위한 wa

DATA: gs_opt     TYPE ctu_params, "call transaction 옵션을 넣어줄 wa
      gv_move    LIKE ctu_params-dismode VALUE 'N',     "display 메세지 옵션,메세지 옵션 주려고
      gv_message LIKE bapireturn-message.          "실질적으로 메세지 담기는 변수

<프로그램 SOURCE>

END-OF-SELECTION.

  CHECK gt_itab[] IS NOT INITIAL.

  LOOP AT gt_itab INTO gs_itab.
    PERFORM bdc_run. "uSING gs_itab-matnr gs_itab-maktx.
  ENDLOOP.

<FORM>

레코딩을 참조한다. 레코딩짜는 티코드는 SHDB

FORM bdc_run .
  DATA: lv_index TYPE sy-index.  "카운트를 위한 변수, 레코드가 몇건인지 확인할수 있는 변수
  CLEAR: gs_bdc, gt_bdc, gs_opt, gt_msg, gs_msg.      "찌거기 데이터를 제거하기 위해 데이터 오브젝트 클리어

*옵션 설정
  gs_opt-dismode = 'E'.     "E 에러가 발생할 때 화면 표시, A는 전체
  gs_opt-updmode = 'A'.     "비동기
  gs_opt-defsize = 'X'.      "기본 윈도우

*bdc 프로세스 시작
  PERFORM bdc_data USING:
          'X' 'SAPMM61R'           '0220',
          ' ' 'RM61R-BERID'        gs_itab-werks, "BERID(MRP 영역),
          ' ' 'RM61R-WERKS'        gs_itab-werks,  "WERKS (플랜트),
          ' ' 'RM61R-MATKZ'        'X',
          ' ' 'RM61R-MATNR'        gs_itab-matnr,  "(자재번호),
          ' ' 'RM61R-DTVON'        gs_itab-dtvon, "(조사기간 시작일),
          ' ' 'RM61R-DTBIS'        gs_itab-dtbis,  "(조사기간 종료일,
          ' ' 'RM61R-PERIO'        'T',
          ' ' 'BDC_OKCODE'         '/00'.

  PERFORM bdc_data USING:
       'X' 'SAPMM61R'           '0220',
       ' ' 'BDC_CURSOR'        'RM61R-BERID',
       ' ' 'BDC_OKCODE'         '=RMPT'.

  PERFORM bdc_data USING:
       'X' 'SAPLMCPA'           '0706',
       ' ' 'BDC_CURSOR'        'RMCP4-FLD002(04)',
       ' ' 'BDC_OKCODE'         '/00',
       ' ' 'RMCP4-FLD002(04)'   gs_itab-fld002, "(수량),
       ' ' 'RMCP4-FLD003(04)'   gs_itab-fld003, "(수량),
       ' ' 'RMCP4-FLD004(04)'   gs_itab-fld004, "(수량),
       ' ' 'RMCP4-FLD005(04)'   gs_itab-fld005. "(수량),
*         ' ' 'RMCP4-FLD006(04)'   gs_itab-FLD006, "(수량).

  PERFORM bdc_data USING:
       'X' 'SAPLMCPA'           '0706',
       ' ' 'BDC_CURSOR'        'RMCP4-FLD004(03)',
       ' ' 'BDC_OKCODE'         '=POS7'.

  "트랜잭션 호출
  CALL TRANSACTION 'MF50'
          USING gt_bdc "BDC레코딩 데이터
          OPTIONS FROM gs_opt "옵션
          MESSAGES INTO gt_msg. "처리결과 메세지

* 메세지INT 마지막 라인 읽기
  CLEAR: lv_index.
  DESCRIBE TABLE gt_msg LINES lv_index. "INT 라인수
  READ TABLE gt_msg INTO gs_msg INDEX lv_index. "마지막 라인의 값 읽기

  CHECK sy-subrc = 0.
*  메세지 생성 펑션
  CALL FUNCTION 'MESSAGE_TEXT_BUILD'
    EXPORTING
      msgid               = gs_msg-msgid
      msgnr               = gs_msg-msgnr
      msgv1               = gs_msg-msgv1
      msgv2               = gs_msg-msgv2
      msgv3               = gs_msg-msgv3
      msgv4               = gs_msg-msgv4
    IMPORTING
      message_text_output = gv_message. "처리결과 메세지

ENDFORM.

FORM bdc_data  USING pv_check pv_name pv_value. "using : perform using 상수값 메모리 같이씀

  CLEAR: gs_bdc.      "work area 클리어
  IF pv_check EQ 'X'.     "bdc 시작 체크
    gs_bdc-program = pv_name.     "프로그램 명
    gs_bdc-dynpro = pv_value.     "화면 번호
    gs_bdc-dynbegin = pv_check.     "시작
  ELSE.
    gs_bdc-fnam = pv_name.     "입력 필드 이름
    gs_bdc-fval = pv_value.     "입력 값
  ENDIF.

  APPEND gs_bdc TO gt_bdc.      "bdc 인터널 테이블 append
ENDFORM.
728x90
반응형

'ABAP' 카테고리의 다른 글

Selection-screen 라디오 버튼 제어  (0) 2023.02.20
Number range  (0) 2023.02.20
생산계획 엑셀업로드+BDC 프로그램 1  (0) 2023.02.20
레포트 프로그램 생성해보기  (0) 2023.02.20
온라인 프로그램 생성해보기  (0) 2023.02.20

댓글