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 |
댓글