[9기 SAP방] 챗GPT로 질문해서 엑셀업로드 프로그램 ABAP소스코드로 작성하기

위 와 같은 방식으로 모르는 부분을 GPT에 계속 물어보았습니다.

내용이 많아서 링크 공유드립니다.

https://chat.openai.com/share/58f8523c-84aa-4b78-a69e-5600a332d45f

위 링크는 ABAP소스코드에 대해서 내용설명과 소스코드 오류나는부분 수정한내용입니다.

참조부탁드립니다.


우선 엑셀업로드 프로그램 만드는 순서를 말씀드리자면

  1. z로 만든 펑션모듈을 ABAPGIT으로 업로드하기

  2. ZGPTER_T_2 이름의 테이블 만들기

  3. ABAP 소스코드 복사해서 붙여넣기

  4. SCREEN 100을 만들고 OK_CODE및 스크린페인터에서 CONT0100 컨테이너테이블생성

  5. 엑셀파일 데이터입력하기

  6. 엑셀업로드 실행해보기


  1. ABAPGIT으로 업로드해보겠습니다.
    (안되시는분 개인적으로 연락하면 도와드리겠습니다)

SE38에서 ‘ZABAPGIT_STANDAALONE’ 이름으로 프로그램을 생성합니다.

그리고 TXT파일에 있는 소스코드를 붙여넣기 합니다.

ZABAPGIT_STANDALONE.txt

https://www.gpters.org/language/post/sap-abap-program-can-b7kyLzfUjF9M3eO

import하는 글 작성한것 참조부탁드립니다.


  1. ZGPTER_T_2 이름의 테이블 만들기

https://www.gpters.org/language/post/creating-table-recorded-videos-IG4QqMWoxw7kmWb

테이블만드는법 사례글 참조부탁드립니다.

  1. ABAP 소스코드 복사해서 붙여넣기

토요일에 실습시 너무 복잡해서 단순하게 주석처리한부분 다 지우고

중복되거나 불필요한 부분 다 삭제하였습니다.

*&---------------------------------------------------------------------*
*& Report  ZGPTERS_09_UP_01
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZGPTERS_09_UP_01.

"z00co 패키지 type 을 라이브러리로 사용하기위해 선언함
TYPE-POOLS z00co.

* Tables을 스크린필드 기능을 사용하기위해 선언함
TABLES: sscrfields.

* Internal Tables & Structure
DATA: gt_z00cos0021 TYPE TABLE OF ZGPTER_T_2,
      gs_z00cos0021 TYPE ZGPTER_T_2.

data: gt_fldcat     TYPE lvc_t_fcat, "gt_fact
      gs_fldcat     TYPE lvc_s_fcat.

DATA: ok_code TYPE syucomm,
      g_exit  TYPE xfeld,
      gr_cont0100 TYPE REF TO cl_gui_custom_container, "go_con    con1
      gr_tabl0100 TYPE REF TO cl_salv_table.

* Field Symbols 엑셀업로드한 데이터를 담기위해 선언함
FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE.

"alv, data 조회하기 위해 선언함
DATA : GO_ALV TYPE REF TO CL_GUI_ALV_GRID, "g_grid
           GO_CON TYPE REF TO CL_GUI_CUSTOM_CONTAINER, "gr_cont0100   cont0100
           GO_CONtainer TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
           go_docking TYPE REF TO cl_gui_docking_container, "g_docking
           go_splitter TYPE REF TO cl_gui_splitter_container,
           go_top type REF TO cl_gui_container,
           go_bottom type REF TO cl_gui_container,

           "alv optionally alv조회하면 옵션 기능을 사용하기위해서 선언함
           gs_layout type lvc_s_layo,
           gs_variant type disvariant.

data : g_grid TYPE REF TO cl_gui_alv_grid. "go_alv

  DATA: lt_z00cos0021 TYPE TABLE OF ZGPTER_T_2,
      ls_z00cos0021 TYPE          ZGPTER_T_2.

"lt_table 선언이 안되있어서, 실행이 안되었습니다.
  DATA: lt_table like TABLE OF ZGPTER_T_2 .
  DATA : LS_TABLE TYPE ZGPTER_T_2.
*
*  DATA: l_struct TYPE        strukname,
*        lr_itab  TYPE REF TO data.



*---------------------------------------------------------------------*
* Selection Screen Definition
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-s01.
PARAMETERS:

            pa_fname TYPE cffile-filename ."MORY ID z00cofname.
SELECTION-SCREEN SKIP.
PARAMETERS: pa_rad01 TYPE c DEFAULT 'X' RADIOBUTTON GROUP grp1 USER-COMMAND rad1,

            pa_rad03 TYPE c RADIOBUTTON GROUP grp1." USER-COMMAND rad1.

SELECTION-SCREEN END   OF BLOCK b1.


*  *----------------------------------------------------------------------*
* AT SELECTION-SCREEN ON VALUE-REQUEST FOR
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_fname.
  PERFORM get_filename.


*----------------------------------------------------------------------*
* START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.
CASE 'X'.
    WHEN pa_rad01.   " SET TITLEBAR 'TTL0100' WITH text-021.

  PERFORM select_data.

    WHEN pa_rad03.   " SET TITLEBAR 'TTL0100' WITH text-022.

CALL SCREEN 0100.
  ENDCASE.


*----------------------------------------------------------------------*
* END-OF-SELECTION
*----------------------------------------------------------------------*
END-OF-SELECTION.

  CASE 'X'.
    WHEN pa_rad01.
*          SET TITLEBAR 'TTL0100' WITH text-021.
        IF g_exit EQ 'X'.
    LEAVE PROGRAM.
*ENDIF.
*  ELSE.
*
*    IF <fs_table> IS INITIAL.
**      MESSAGE s017 DISPLAY LIKE 'E'.
    ELSE.
*     IF <fs_table> IS NOT INITIAL.
        CALL SCREEN 0100.
*     ELSE.
*       LEAVE PROGRAM.
*      ENDIF.
*    ENDIF.
  ENDIF.
    WHEN pa_rad03.
        IF g_exit EQ 'X'.
           CALL SCREEN 0100.
*        ELSE.
*           CALL SCREEN 0100.
       ENDIF.

  ENDCASE.



*&---------------------------------------------------------------------*
*&      Form  GET_FILENAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_FILENAME .

  DATA: l_inifn LIKE pa_fname.

  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename = l_inifn
*     DEF_PATH     = ' '
      mask         = ',*.*,*.*.'
      mode         = 'O'
      title        = text-001
    IMPORTING
      filename     = pa_fname
    EXCEPTIONS
      OTHERS       = 0.

ENDFORM.                    " GET_FILENAME
*&---------------------------------------------------------------------*
*&      Form  SELECT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SELECT_DATA .

  DATA: l_struct TYPE        strukname,
        lr_itab  TYPE REF TO data.



  CASE 'X'.
    WHEN pa_rad01." OR pa_rad02.
      l_struct = 'ZGPTER_T_2'.


  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = l_struct
    CHANGING
      ct_fieldcat      = gt_fldcat.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog  = gt_fldcat
      i_length_in_byte = 'X'

    IMPORTING
      ep_table         = lr_itab.
  ASSIGN lr_itab->* TO <fs_table>.

  CALL FUNCTION 'Z00FCM_EXCEL_UPLOAD'
    EXPORTING
      i_structure         = l_struct
      i_with_head         = 'X'
      i_fname             = pa_fname
    IMPORTING
      e_canc              = g_exit
    TABLES
      t_outtab            = <fs_table>
    EXCEPTIONS
      conversion_failed   = 1
      amount_convert_fail = 2
      OTHERS              = 3.
    WHEN pa_rad03 ."OR pa_rad04 OR pa_rad06.


  ENDCASE.
  IF sy-subrc <> 0.
*    MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
*          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    " SELECT_DATA
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'STS0100'.
  SET TITLEBAR 'TTL0100'.
ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  PBO_SCR_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PBO_SCR_0100 OUTPUT.

    IF gr_cont0100 IS INITIAL.  "GO_ALV
CASE 'X'.
    WHEN pa_rad01.   " SET TITLEBAR 'TTL0100' WITH text-021.

    PERFORM dispaly_tabl0100.
    WHEN pa_rad03.   " SET TITLEBAR 'TTL0100' WITH text-022.
    PERFORM dispaly_tabl0200.
  ENDCASE.
  ENDIF.

ENDMODULE.                 " PBO_SCR_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  DISPALY_TABL0100
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DISPALY_TABL0100 .

  DATA: lr_columns   TYPE REF TO cl_salv_columns_table,
        lr_column    TYPE REF TO cl_salv_column_table,
        lr_functions TYPE REF TO cl_salv_functions_list.


  CREATE OBJECT gr_cont0100    "go_container
    EXPORTING
      container_name = 'CONT0100'.     "'con1'

IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.


  TRY.
      cl_salv_table=>factory(
        EXPORTING
          r_container  = gr_cont0100
        IMPORTING
          r_salv_table = gr_tabl0100
        CHANGING
          t_table      = <fs_table> ).
    CATCH cx_salv_msg.                                  "#EC NO_HANDLER
  ENDTRY.

  lr_columns = gr_tabl0100->get_columns( ).
  lr_columns->set_optimize( abap_true ).

  LOOP AT gt_fldcat INTO gs_fldcat WHERE cfieldname IS NOT INITIAL.
    TRY.
        lr_column ?= lr_columns->get_column( gs_fldcat-fieldname ).
        lr_column->set_currency_column( gs_fldcat-cfieldname ).
      CATCH cx_salv_not_found.                          "#EC NO_HANDLER
    ENDTRY.
  ENDLOOP.

  lr_functions = gr_tabl0100->get_functions( ).
  lr_functions->set_default( abap_true ).

  gr_tabl0100->display( ).

ENDFORM.                    " DISPALY_TABL0100
*&---------------------------------------------------------------------*
*&      Form  DISPALY_TABL0200
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DISPALY_TABL0200 .

  data :      gt_fldcat     TYPE lvc_t_fcat, "gt_fact
      gs_fldcat     TYPE lvc_s_fcat.


select * from ZGPTER_T_2 into CORRESPONDING FIELDS OF table lt_table[].



IF go_alv is INITIAL.

* 필드명을 변경하지 않았더니 실행되었습니다.
*gs_fldcat-fieldname = 'ZS_PLANETYE3' .
*gs_fldcat-coltext = 'ZNAME'.
**gs_fldcat-just = 'L'.
**gs_fldcat-key = 'X'.
**gs_fldcat-outputlen = '2'.
*APPEND gs_fldcat TO gt_fldcat.
*
*gs_fldcat-fieldname = 'ZS_PLANETYE2' .
*gs_fldcat-coltext = 'ZNUMBER'.


  CREATE OBJECT gr_cont0100    "go_container
    EXPORTING
      container_name = 'CONT0100'.     "'con1'
  CREATE OBJECT go_alv  "g_grid
    EXPORTING
      i_parent = gr_cont0100.

  gs_layout-sel_mode = 'A'.
  gs_layout-cwidth_opt = 'X'.
  gs_variant-report = sy-repid.
  gs_variant-username = sy-uname.
  gs_variant-handle = 1.



CALL METHOD GO_ALV->SET_TABLE_FOR_FIRST_DISPLAY
  EXPORTING

    I_STRUCTURE_NAME              = 'ZGPTER_T_2'

    IS_VARIANT                    = gs_variant
    I_SAVE                        = 'A'
*    I_DEFAULT                     = 'X'
    IS_LAYOUT                     = GS_LAYOUT

  CHANGING
    IT_OUTTAB                     = LT_TABLE[]

    IT_FIELDCATALOG               = gt_fldcat

        .
ELSE.
  DATA : LS_STABLE type lvc_s_stbl value 'X'.

  CALL METHOD GO_ALV->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE      = LS_STABLE.

          .


  IF SY-SUBRC <> 0.
*   Implement suitable error handling here
  ENDIF.

ENDIF.



ENDFORM.                    " DISPALY_TABL0200
*&---------------------------------------------------------------------*
*&      Module  EXIT  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE EXIT INPUT.

  CASE sy-ucomm.
    WHEN 'BACK' OR 'CANC'.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.

ENDMODULE.                 " EXIT  INPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  ok_code = sy-ucomm.
  CLEAR sy-ucomm.
  CASE 'X'.
    WHEN pa_rad01.
      CASE ok_code.
        WHEN z00co_save.    PERFORM proc_save_scr_0100.
      ENDCASE.
    WHEN pa_rad03.

  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Form  PROC_SAVE_SCR_0100
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PROC_SAVE_SCR_0100 .

  DATA: l_answer.

  z00clcm_common=>popup_to_confirm( EXPORTING i_title  = text-031
                                              i_text1  = text-032
                                    IMPORTING e_answer = l_answer ).
  CHECK l_answer EQ 'J'.
  CASE 'X'.
    WHEN pa_rad01 ."OR pa_rad02.
      PERFORM proc_bapi_by_period.
    WHEN pa_rad03 ."OR pa_rad04 OR pa_rad06.
*      PERFORM proc_bapi_by_year.
  ENDCASE.

ENDFORM.                    " PROC_SAVE_SCR_0100
*&---------------------------------------------------------------------*
*&      Form  PROC_BAPI_BY_PERIOD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PROC_BAPI_BY_PERIOD .

TABLES ZGPTER_T_2 .

  DATA: lt_z00cos0021 TYPE TABLE OF ZGPTER_T_2,

        ls_z00cos0021 TYPE          ZGPTER_T_2,

        l_tabix       TYPE          sytabix,
        l_amount      TYPE          c LENGTH 25,

        l_avlamt      TYPE          Z00COE0020,
        l_error.

  DATA: lt_table like TABLE OF ZGPTER_T_2 .

*  CLEAR: gs_header.
*  REFRESH: gt_plnatv, gt_prmobj, gt_prmval, gt_prmtot, gt_contrl,
*           gt_return.

  gt_z00cos0021[] = <fs_table>.

  DELETE FROM ZGPTER_T_2.
* 테이블을 초기화합니다.

  SORT gt_z00cos0021.
  LOOP AT gt_z00cos0021 INTO gs_z00cos0021.
    APPEND gs_z00cos0021 TO lt_table.
  ENDLOOP.


*  새로업로드한 excel file로 수정
  modify ZGPTER_T_2 from table lt_table. " INTO z00cos0021_T2 .

ENDFORM.                    " PROC_BAPI_BY_PERIOD


4.SCREEN 100을 만들고 OK_CODE및 스크린페인터에서 CONT0100 컨테이너테이블생성




5.엑셀파일 데이터 다운받기

707.xlsx

6.엑셀업로드 실행해보기


이렇게 엑셀 업로드하는것을 해보았습니다.

필드명 , 버튼이름 , 메세지 박스 등 부족한게 많습니다.

차후 보완하도록 하겠습니다.

이상입니다.


#9기 SAP방

2
2개의 답글

👉 이 게시글도 읽어보세요