BCD와 BAPI ( su01 사용자 등록하기)

j_wisdom_h·2025년 3월 27일
0

SAP

목록 보기
8/8
*&---------------------------------------------------------------------*
*& Report ZBDC
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*

REPORT ZBDC.
DATA : gs_opt TYPE ctu_params.

DATA : BEGIN OF itab OCCURS 0, " WITH HEADER LINE. 구조. 행과 테이블이 생성된다.
         bname(12)      TYPE c,
         title_medi(30) TYPE c,
         name_last(40)  TYPE c,
         name_first(40) TYPE c,
         langu(2)       TYPE c,
         mob_number(30) TYPE c,
         ustyp(1)       TYPE c,
         password(40)   TYPE c,
         password2(40)  TYPE c,
       END OF itab.


DATA: bdctab LIKE TABLE OF bdcdata WITH HEADER LINE."=>> SM35 에서 녹화뜬 구조를 쌓아줄 부분

DATA: wa LIKE LINE OF itab.

* 엑셀 업로드하려고 무슨구조가 들어올지 모르니까 필드심볼 선언
FIELD-SYMBOLS : <gt_data>  TYPE standard table.

DATA: lt_return   TYPE TABLE OF BAPIRET2,
      ls_logondata TYPE BAPILOGOND,
      ls_address   TYPE BAPIADDR3,
      lv_username  TYPE BAPIBNAME-BAPIBNAME,
      lv_password TYPE BAPIPWD.



SELECTION-SCREEN BEGIN OF BLOCK BL01 WITH FRAME TITLE TEXT-001.
    PARAMETERS: P_FILE TYPE RLGRAP-FILENAME DEFAULT 'C:\' OBLIGATORY.
    PARAMETERS: DISOPT TYPE ctu_params-dismode DEFAULT 'A' OBLIGATORY.
    SELECTION-SCREEN : COMMENT 40(20) gv_butxt. " 텍스트 엘리먼트 없이 텍스트 입력 40만큼 띄우고 20개 입력
SELECTION-SCREEN COMMENT /1(50) comm1. " / : 행바꿈. 1(50) 1에서 50만큼 출력
SELECTION-SCREEN ULINE. " 전체 밑줄
SELECTION-SCREEN SKIP.  " 한 줄 띄우기
SELECTION-SCREEN COMMENT /1(70) comm2. " 행바꿈. 1(50) 1에서 70만큼 출력
SELECTION-SCREEN ULINE /1(50). "행바꿈. 1-50만큼 밑줄
SELECTION-SCREEN END OF BLOCK BL01.

AT SELECTION-SCREEN OUTPUT. "=>> 이벤트명 initialization처럼 조회화면 시작할때 구성되는 부분  =>> 조회화면 전에 실행된다.
  gv_butxt = 'BDC'.
  comm1 = 'BDC모드'.
  comm2 = 'A: 모든화면 조회, E: 오류 조회, N: 백그라운드처리'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  PERFORM GET_FILE_PATH.


START-OF-SELECTION.

PERFORM UPLOAD_FROM_EXCEL.
*CLEAR itab.
*REFRESH itab.
*
*itab-bname = 'EDU30'.
*itab-title_medi = '0001'.
*itab-name_last = 'KIM'.
*itab-name_first = 'MINH'.
*itab-langu = 'KO'.
*itab-mob_number = '01064572349'.
*itab-ustyp = 'A'.
*itab-password = 'Down1oad'.
*itab-password2 = 'Down1oad'.
*APPEND itab.

*BDC 처리모드(dismode)
* A : 모든화면 조회
* E : 오류 조회
* N : 백그라운드 처리
* P : 백그라운드 처리: 디버깅 가능



*BDC Transcation Mode(updmode)
*L : 로컬
*S : 동기
*A : 비동기

*gs_opt-dismode = 'A'. Display all screens
gs_opt-dismode = DISOPT.
gs_opt-updmode = 'S'. " Synchronous
*gs_opt-defsize = 'X'.



*PERFORM BCD.
PERFORM BAPI.


FORM BAPI.
  LOOP AT itab.

    CLEAR: lv_username, ls_logondata, lv_password, ls_address, lt_return.

    " Populate the username
    lv_username = itab-bname.
    lv_password = itab-password.

    " Populate address data
    ls_address-TITLE = itab-title_medi.
    ls_address-LASTNAME = itab-name_last.
    ls_address-FIRSTNAME = itab-name_first.
    ls_address-LANGUP_ISO = itab-langu.
    ls_address-TEL1_NUMBR = itab-mob_number.

    " Populate logon data
    ls_logondata-ustyp = itab-ustyp.
    ls_logondata-PASSCODE = itab-password.
    ls_logondata-PWDSALTEDHASH = itab-password2.



    " Call the BAPI to create the user
    CALL FUNCTION 'BAPI_USER_CREATE'
      EXPORTING
        username     = lv_username
        logondata    = ls_logondata
        address      = ls_address
        password     = lv_password
      TABLES
        return       = lt_return.
  ENDLOOP.
ENDFORM.



FORM BCD.
  LOOP AT itab.
*    == LOOP ITAB AT ITAB
    REFRESH BDCTAB.
    PERFORM bdc_dynpro USING 'SAPLSUID_MAINTENANCE' '1050'.

*    PERFORM bdc_field USING 'BDC_CURSOR' 'SUID_ST_BNAME-BNAME'.
*   어디를 클릭했다. 필드이름과 값만 있다면 굳이 안써도 된다. 알아서 들어간다.
    PERFORM bdc_field USING 'BDC_OKCODE' '=CREA'.
*   이 버튼이 먼저 눌리는건 아니다. 다 선택후 마직막에 눌린다.
*   녹화시에 맨처음이라고 인식된다.
    PERFORM bdc_field USING 'SUID_ST_BNAME-BNAME'  itab-bname.


    PERFORM bdc_dynpro USING 'SAPLSUID_MAINTENANCE' '1100'.
    PERFORM bdc_field USING 'BDC_OKCODE' '=LOGO'.
    PERFORM bdc_field USING 'SUID_ST_NODE_PERSON_NAME_EXT-TITLE_MEDI' itab-title_medi.
    PERFORM bdc_field USING 'SUID_ST_NODE_PERSON_NAME-NAME_LAST'     itab-name_last.
    PERFORM bdc_field USING 'SUID_ST_NODE_PERSON_NAME-NAME_FIRST'    itab-name_first.
    PERFORM bdc_field USING 'SUID_ST_NODE_PERSON_NAME-LANGU'    itab-langu.
*    PERFORM bdc_field USING 'BDC_CURSOR' 'SUID_ST_NODE_COMM_DATA-MOB_NUMBER'.
    PERFORM bdc_field USING 'SUID_ST_NODE_COMM_DATA-MOB_NUMBER'    itab-mob_number.



    PERFORM bdc_dynpro USING 'SAPLSUID_MAINTENANCE' '1100'.

    PERFORM bdc_field USING 'BDC_OKCODE'    '=UPD'.

    PERFORM bdc_field USING 'SUID_ST_NODE_LOGONDATA-USTYP'    itab-ustyp.
    PERFORM bdc_field USING 'SUID_ST_NODE_PASSWORD_EXT-PASSWORD'    itab-password.
    PERFORM bdc_field USING 'BDC_CURSOR'    'SUID_ST_NODE_PASSWORD_EXT-PASSWORD2'.
    PERFORM bdc_field USING 'SUID_ST_NODE_PASSWORD_EXT-PASSWORD2'    itab-password2.


*   CALL TRANSACTION 'SU01' USING bdctab MODE 'A' UPDATE 'S'.
    CALL TRANSACTION 'SU01' USING bdctab OPTIONS FROM gs_opt.
*    CALL TRANSACTION 'SU01' USING bdctab OPTIONS FROM MODE 'A' UPDATE 'S'.
  ENDLOOP.
  ENDFORM.

*---------------------------------------------------------------------*
*       FORM bdc_dynpro                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  P_PROGRAM                                                     *
*  -->  P_DYNPRO                                                      *
*---------------------------------------------------------------------*
FORM bdc_dynpro USING p_program
p_dynpro.

  bdctab-program = p_program.
  bdctab-dynpro = p_dynpro.
  bdctab-dynbegin = 'X'.
  APPEND bdctab. " == APPEND bdctab TO  bdctab
  CLEAR bdctab.

ENDFORM. " bdc_dynpro


*---------------------------------------------------------------------*
*       FORM bdc_field                                                *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  P_FNAM                                                        *
*  -->  P_FVAL                                                        *
*---------------------------------------------------------------------*
FORM bdc_field USING p_fnam
p_fval.

  bdctab-fnam = p_fnam.
  bdctab-fval = p_fval.
  APPEND bdctab.
  CLEAR bdctab.

ENDFORM. " bdc_field
*&---------------------------------------------------------------------*
*& Form GET_FILE_PATH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_file_path .
* 선택된 파일의 주소를 P_FILE 입력칸에 할당
* METHOD 사용
  DATA : LT_FILE TYPE FILETABLE,
         LS_FILE TYPE FILE_TABLE,
         LV_RC   TYPE I.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    CHANGING
      FILE_TABLE = LT_FILE
      RC         = LV_RC.

  READ TABLE LT_FILE INTO LS_FILE INDEX 1.
  IF SY-SUBRC = 0.
    P_FILE = LS_FILE.
  ENDIF.

* FUNCTION 사용시: CALL FUNCTION 'F4_FILENAME'
ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_FROM_EXCEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM upload_from_excel .
 DATA : lv_filename      TYPE string,
         lt_records       TYPE solix_tab,
         lv_headerxstring TYPE xstring,
         lv_filelength    TYPE i.

  lv_filename = p_file.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = lv_filename
      filetype                = 'BIN'
    IMPORTING
      filelength              = lv_filelength
      header                  = lv_headerxstring
    TABLES
      data_tab                = lt_records
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.

  "convert binary data to xstring
  "if you are using cl_fdt_xl_spreadsheet in odata then skips this step
  "as excel file will already be in xstring
  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = lv_filelength
    IMPORTING
      buffer       = lv_headerxstring
    TABLES
      binary_tab   = lt_records
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.

  IF sy-subrc <> 0.
    "Implement suitable error handling here
  ENDIF.

  DATA : lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet .

  TRY .
      lo_excel_ref = NEW cl_fdt_xl_spreadsheet(
                              document_name = lv_filename
                              xdocument     = lv_headerxstring ) .
    CATCH cx_fdt_excel_core.
      "Implement suitable error handling here
  ENDTRY .

  "Get List of Worksheets
  lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
    IMPORTING
      worksheet_names = DATA(lt_worksheets) ).

  IF NOT lt_worksheets IS INITIAL.
    READ TABLE lt_worksheets INTO DATA(lv_woksheetname) INDEX 1.

    DATA(lo_data_ref) = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
                                             lv_woksheetname ).
    "now you have excel work sheet data in dyanmic internal table
    ASSIGN lo_data_ref->* TO <gt_data>.
  ENDIF.          .

  DATA : lv_numberofcolumns   TYPE i,
         lv_date_string       TYPE string,
         lv_target_date_field TYPE datum.


  FIELD-SYMBOLS : <ls_data>  TYPE any,
                  <lv_field> TYPE any.

  "you could find out number of columns dynamically from table <gt_data>
  lv_numberofcolumns = 9 .

  LOOP AT <gt_data> ASSIGNING <ls_data>.

*    "processing columns
    DO lv_numberofcolumns TIMES.
      ASSIGN COMPONENT sy-index OF STRUCTURE <ls_data> TO <lv_field> .
      IF sy-subrc = 0 .
        CASE sy-index .
          when 1 .
            wa-bname = <lv_field>.
          when 2 .
            wa-title_medi = <lv_field>.
          when 3 .
            wa-name_last = <lv_field>.
          when 4 .
            wa-name_first = <lv_field>.
          when 5 .
            wa-langu = <lv_field>.
          when 6 .
            wa-mob_number = <lv_field>.
          when 7 .
            wa-ustyp = <lv_field>.
          when 8 .
            wa-password = <lv_field>.
          when 9 .
            wa-password2 = <lv_field>.

*          WHEN 10 .
*            lv_date_string = <lv_field> .
*            PERFORM date_convert USING lv_date_string CHANGING lv_target_date_field .
*            WRITE lv_target_date_field .
          WHEN OTHERS.
*            WRITE : <lv_field> .
        ENDCASE .

      ENDIF.
    ENDDO .
    APPEND wa TO itab.
    CLEAR wa.
*    NEW-LINE .
  ENDLOOP .


** TAB으로 구분된 내용을 잘라서 ITAB에 APPEND 한다.
*  LOOP AT lt_intern.
*    SPLIT lt_intern
*    AT cl_abap_char_utilities=>horizontal_tab
*    INTO gs_EXCEL-CARRID gs_EXCEL-CARRNAME gs_EXCEL-CURRCODE gs_EXCEL-URL.
*    gs_EXCEL-MANDT = '001'.
*    APPEND gs_EXCEL TO gt_EXCEL.
*    CLEAR gs_EXCEL.
*  ENDLOOP.
*
**HEADER LINE 삭제
*  IF gt_excel IS NOT INITIAL.
*    DELETE gt_excel INDEX 1. "상단에 적힌 필드명을 삭제시켜줌
*  ELSE.
*    MESSAGE '데이터가 존재하지 않습니다' TYPE 'E'.
*  ENDIF.

ENDFORM.
profile
뚜잇뚜잇

0개의 댓글