ABAP 导入Excel表示例程序

news2025/2/28 6:46:26

目录

  • ABAP 导入excel示例程序
    • 创建程序
    • 使用的结构
    • 上传下载模板

ABAP 导入excel示例程序

批量导入程序,需要使用到导入模板,首先需要创建程序,之后是需要创建excel导入模板,并且需要将excel导入模板上传到SAP系统里面,之后才可以下载下来进行导入。

创建程序

ABAP 批量导入excel,右击创建程序:
在这里插入图片描述

*&---------------------------------------------------------------------*
*& Report z_test_import_excel
*&---------------------------------------------------------------------*
*& TYPE:Report
*& Description:批量导入excel测试
*& Creator:刘洪裕
*& Created On:2024219*&---------------------------------------------------------------------*
*                           Change History
* ----------        -------------       -------------      -------------
*   Version          Date                Change By           Description
* ----------        -------------       -------------      -------------
*   N                2024.2.19           Hongyu.Liu          创建
*&---------------------------------------------------------------------*
Report z_test_import_excel NO STANDARD PAGE HEADING MESSAGE-ID zfimf01.

TABLES: sscrfields.

"定义相关变量
*TYPES: BEGIN OF ty_data,
*   werks TYPE zfi_mfwb-werks,  "工厂
*   zmj_matnr TYPE zfi_mfwb-zmj_matnr,  "模具料号
*   zcp_matnr TYPE zfi_mfwb-zcp_matnr,  "挤压产出成品料号
*   zdmczl TYPE zfi_mfwb-zdmczl,  "单套模具预计产出重量
*   zsfty TYPE zfi_mfwb-zsfty,  "是否通用
*   zwhrj TYPE zfi_mfwb-zwhrj,  "维护日期
*   zwhr TYPE zfi_mfwb-zwhr,  "维护人
*END OF ty_data.
*DATA gs_data TYPE  ty_data.  "工作区
*DATA gt_data TYPE TABLE OF ty_data.  "内表


*&---------------------------------------------------------------------*
*&  定义相关变量
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ts_output,  "展示结构
         "INCLUDE STRUCTURE zfi_mfwb.
         werks     TYPE zfi_mfwb-werks,  "工厂
         zxlh      TYPE zfi_mfwb-zxlh,  "序列号
         zmj_matnr TYPE zfi_mfwb-zmj_matnr,  "模具料号
         zcp_matnr TYPE zfi_mfwb-zcp_matnr,  "挤压产出成品料号
         "zdmczl TYPE p DECIMALS 2 ,  "单套模具预计产出重量,两位小数
         zdmczl    TYPE zfi_mfwb-zdmczl,  "单套模具预计产出重量
         "zsfty     TYPE zfi_mfwb-zsfty,  "是否通用
         zsfty     TYPE abap_bool,  "是否通用
         zwhrj     TYPE zfi_mfwb-zwhrj,  "维护日期
         zwhr      TYPE zfi_mfwb-zwhr,  "维护人
         zsfbf     TYPE zfi_mfwb-zsfbf,  "是否报废
         type      TYPE bapiret2-type,
         message   TYPE char100,   "bapiret2-message,
         icon      TYPE text20,
         slbox     TYPE c,
         celltab   TYPE  lvc_t_styl, "设置单元格编辑状态
END OF ts_output.
TYPES: BEGIN OF ty_data,"导入数据结构
         werks     TYPE zfi_mfwb-werks,  "工厂
         zxlh      TYPE zfi_mfwb-zxlh,  "序列号
         zmj_matnr TYPE zfi_mfwb-zmj_matnr,  "模具料号
         zcp_matnr TYPE zfi_mfwb-zcp_matnr,  "挤压产出成品料号
         "zdmczl TYPE p DECIMALS 2 ,  "单套模具预计产出重量,两位小数
         zdmczl    TYPE zfi_mfwb-zdmczl,  "单套模具预计产出重量
         "zdmczl    LIKE vbap-ntgew,  "单套模具预计产出重量
         zsfty     TYPE zfi_mfwb-zsfty,  "是否通用
         zwhrj     TYPE zfi_mfwb-zwhrj,  "维护日期
         zwhr      TYPE zfi_mfwb-zwhr,  "维护人
       END OF ty_data.

*DATA: is_data TYPE ty_data.   "导入结构的工作区
*DATA: it_data TYPE TABLE OF ty_data.  "导入结构的工作表
CONSTANTS:cos_template TYPE w3objid VALUE 'ZFIMFWB01',
          cos_filename TYPE string VALUE '模具分摊维护表导入模板.xlsx'.

DATA: gs_layout TYPE lvc_s_layo,
      gt_fieldcat TYPE lvc_t_fcat,
      gs_fieldcat TYPE lvc_s_fcat,
      gs_variant TYPE disvariant. "屏幕变式

DATA: gt_output TYPE STANDARD TABLE OF ts_output WITH DEFAULT KEY,
      gs_output TYPE ts_output.
"DATA: gt_input TYPE TABLE OF zfi_mfwb.  "内表结构与zfi_mfwb一致
DATA: gt_input TYPE TABLE OF ty_data.  "导入模板数据
DATA: gt_output_old TYPE STANDARD TABLE OF ts_output WITH DEFAULT KEY."被修改前的数据

DATA: gt_bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE. "用来存储屏幕字段参数值,传递录屏参数
DATA: gt_messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE. "记录执行BDC过程中产生的消息

DATA: gv_mode TYPE c VALUE 'N'.

* 用于 修改要提示,删除要提示
DATA:gv_edit_flag  TYPE c, "X 表示修改过
     gv_save_flag  TYPE c, "X 表示已经保存。
     gv_check_flag TYPE c, "X 表示已经保存。
     gv_sref_flag  TYPE c, "X 表示刷新。
     gv_line       TYPE int4. "行数

CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS:
      handle_data_changed
        FOR EVENT data_changed OF cl_gui_alv_grid
        IMPORTING er_data_changed,
      handle_data_changed_finished
        FOR EVENT data_changed_finished OF cl_gui_alv_grid
        IMPORTING
          e_modified
          et_good_cells.
  ENDCLASS.

CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_data_changed.
*    PERFORM FRM_DATA_CHANGED
*                  USING ER_DATA_CHANGED.
  ENDMETHOD.
  METHOD handle_data_changed_finished.
*    PERFORM FRM_DATA_CHANGED_FINISH
*                  USING E_MODIFIED ET_GOOD_CELLS.
    ENDMETHOD.
  ENDCLASS.
*&---------------------------------------------------------------------*
*&  选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN FUNCTION KEY 1. "这是在屏幕的执行按钮后的位置添加一个功能按钮

SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
  PARAMETERS p_file TYPE rlgrap-filename  MODIF ID m1.
SELECTION-SCREEN END OF BLOCK blk1.

*&---------------------------------------------------------------------*
*&  定义相关变量
*&---------------------------------------------------------------------*

FORM frm_init_data.
  DATA: ls_textfield TYPE smp_dyntxt. "菜单制作器:动态文本的程序接口
  ls_textfield-icon_id  = '@49@'.
  ls_textfield-icon_text  = '下载导入模板'.
  sscrfields-functxt_01 = ls_textfield.
  ENDFORM.


*&---------------------------------------------------------------------*
*&  屏幕事件
*&---------------------------------------------------------------------*

INITIALIZATION. "初始化
  "选择屏幕添加按钮
  PERFORM frm_init_data.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR  p_file. "按选择帮助<F4>键时触发该事件
  PERFORM frm_get_file_name CHANGING p_file.

AT SELECTION-SCREEN.  "在此事件里可以进行对用户输入进行完整性进行检查。
* 处理选择屏幕的按钮 下载模板
  PERFORM frm_screen_button_event.

" AT SELECTION SCREEN OUTPUT事件(也就是PBO) ,在这个事件里你可以通过修改系统默认screen内表修改屏幕的某些属性
AT SELECTION-SCREEN OUTPUT.
* 修改选择屏幕的元素的状态
  PERFORM modify_selction_screen_status.

START-OF-SELECTION. "仅在选择屏幕处理结束之后触发,即当用户点击“执行”按钮时
  PERFORM frm_check_authority.
  PERFORM batch_input.
  PERFORM alv_display USING 'X'.
*&---------------------------------------------------------------------*
*& Form frm_get_file_name:获取文件名称
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- P_FILE
*&---------------------------------------------------------------------*
FORM frm_get_file_name CHANGING cv_file.
  DATA: lt_filetable TYPE filetable,  "表类型
        ls_filetable TYPE file_table, "结构类型
        lv_rc TYPE i.
  FREE lt_filetable.
  CLEAR: lv_rc.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
*        window_title            =
        default_extension       = cl_gui_frontend_services=>filetype_excel
*        default_filename        =
        file_filter             = cl_gui_frontend_services=>filetype_excel
*        with_encoding           =
*        initial_directory       =
*        multiselection          =
    CHANGING
        file_table              = lt_filetable
        rc                      = lv_rc
*        user_action             =
*        file_encoding           =
    EXCEPTIONS
        file_open_dialog_failed = 1
        cntl_error              = 2
        error_no_gui            = 3
        not_supported_by_gui    = 4
        OTHERS                  = 5
            .
  READ TABLE lt_filetable INTO ls_filetable INDEX 1.
    IF sy-subrc <> 0.
*     Implement suitable error handling here
    ENDIF.
    IF sy-subrc EQ 0.
      cv_file = ls_filetable-filename.
    ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_screen_button_event:点击下载模板按钮
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_screen_button_event .
  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      PERFORM frm_download_template USING cos_template cos_filename.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form modify_selction_screen_status
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM modify_selction_screen_status .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_authority
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_authority .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form batch_input
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM batch_input .
*   EXCEL数据到内表
  PERFORM file_data_input.
*   转换内表
  PERFORM file_data_convert.
*   检查数据
  PERFORM file_data_check.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form alv_display:展示alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&---------------------------------------------------------------------*
FORM alv_display  USING  u_edit TYPE abap_bool .
  PERFORM set_alv_layout.
  PERFORM build_fieldcat USING u_edit.
  PERFORM call_alv_func.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_download_template:下载模板
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> COS_TEMPLATE
*&      --> COS_FILENAME
*&---------------------------------------------------------------------*
FORM frm_download_template  USING    u_objid TYPE w3objid
                                     u_file_name TYPE string.
  DATA: ls_key TYPE wwwdatatab,
        lv_filename TYPE string,
        lv_path TYPE string,
        lv_fullpath TYPE string.

  "判断模板是否存在
  SELECT SINGLE * FROM wwwdata
    WHERE relid EQ 'MI'
    AND objid EQ @u_objid
    INTO CORRESPONDING FIELDS OF @ls_key.
  IF sy-subrc NE 0.
*   模板&1不存在
    MESSAGE s007 WITH u_objid.
    RETURN.
  ENDIF.
*   调用函数打开文件选择框

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
*      window_title              =
      default_extension         = cl_gui_frontend_services=>filetype_excel
      default_file_name         =  u_file_name
*      with_encoding             =
*      file_filter               =
*      initial_directory         =
*      prompt_on_overwrite       = 'X'
    CHANGING
      filename                  = lv_filename
      path                      = lv_path
      fullpath                  = lv_fullpath
*      user_action               =
*      file_encoding             =
    EXCEPTIONS
      cntl_error                = 1
      error_no_gui              = 2
      not_supported_by_gui      = 3
      invalid_default_file_name = 4
      OTHERS                    = 5
          .
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.
  CHECK lv_fullpath NE ''.
*   下载SMW0模版
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key = ls_key
      destination = CONV localfile( lv_fullpath ).

ENDFORM.
*&---------------------------------------------------------------------*
*& Form file_data_input:EXCEL数据到内表
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM file_data_input .
* 数据EXCEL-》内表
  PERFORM frm_excel_to_table TABLES gt_input USING p_file 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form file_data_convert:转换内表
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM file_data_convert .
*   添加前导0
  LOOP AT gt_input ASSIGNING FIELD-SYMBOL(<lfs_input>).
    <lfs_input>-zmj_matnr = |{ <lfs_input>-zmj_matnr ALPHA = IN }|.
    <lfs_input>-zcp_matnr = |{ <lfs_input>-zcp_matnr ALPHA = IN }|.
    ENDLOOP.
  gt_output = CORRESPONDING #( gt_input ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form file_data_check:检查数据
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM file_data_check .
  IF gt_output IS NOT INITIAL.
    LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<ls_output>).
      CLEAR:<ls_output>-type,
           <ls_output>-message.
      IF <ls_output>-werks IS INITIAL.
          <ls_output>-type = 'E'.
          <ls_output>-message = '工厂不能为空;'.
      ENDIF.
      IF <ls_output>-zmj_matnr IS INITIAL.
           <ls_output>-type = 'E'.
           <ls_output>-message = <ls_output>-message && '模具料号不能为空;'.
      ENDIF.
      IF <ls_output>-zcp_matnr IS INITIAL.
            <ls_output>-type = 'E'.
            <ls_output>-message = <ls_output>-message && '挤压产出成品料号不能为空;'.
      ENDIF.
      IF <ls_output>-type <> 'E'. "如果关键值不为空
          <ls_output>-type = 'N'. "将类型设置为N
      ENDIF.
      PERFORM set_light CHANGING <ls_output>. "设置提示灯
    ENDLOOP.

  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_excel_to_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GT_INPUT
*     -->U_FILE       文件
*     -->U_START_ROW  文件内的数据从哪行开始取
*&---------------------------------------------------------------------*
FORM frm_excel_to_table  TABLES   et_input TYPE STANDARD TABLE
                         USING    u_file  TYPE rlgrap-filename
                                  u_start_row TYPE i.
  DATA: lt_intern TYPE STANDARD TABLE OF zalsmex_tabline.
  FREE: lt_intern.

*DATA FILENAME    TYPE RLGRAP-FILENAME.
*DATA I_BEGIN_COL TYPE I.
*DATA I_BEGIN_ROW TYPE I.
*DATA I_END_COL   TYPE I.
*DATA I_END_ROW   TYPE I.
*DATA INTERN      TYPE STANDARD TABLE OF ZALSMEX_TABLINE.

  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename          = u_file
      i_begin_col       = 1
      i_begin_row       = 2
      i_end_col         = 99
      i_end_row         = 65536
    TABLES
      intern            = lt_intern
    EXCEPTIONS
      inconsistent_parameters   = 1
      upload_ole                = 2
      OTHERS                    = 3
            .
  IF sy-subrc NE 0.
  ENDIF.
  SORT lt_intern BY row col.
  LOOP AT lt_intern INTO DATA(ls_intern).
    "下面检查是否是数字
    AT NEW row. "如果字段row及row的左侧全部字段的数据,与上一行数据不一致,则执行代码。
      APPEND INITIAL LINE TO et_input ASSIGNING FIELD-SYMBOL(<ls_input>). "创建一个新行,并分配指针
    ENDAT.
    ASSIGN COMPONENT ls_intern-col OF STRUCTURE <ls_input> TO FIELD-SYMBOL(<lv_val>)."就是在每次循环中,都会分配一个结构的字段,是根据索引来决定的
    IF <lv_val> IS ASSIGNED.
      IF ls_intern-col EQ 5.  "如果是第5列(是否通用)
        <lv_val> = ls_intern-value.
      ENDIF.
      TRY.
        <lv_val> = ls_intern-value.
      CATCH cx_sy_conversion_no_number INTO DATA(lr_cx_sy_conversion_no_number).
*&1&2&3,&4
        MESSAGE e003 WITH ls_intern-row ls_intern-col ls_intern-value lr_cx_sy_conversion_no_number->get_text( ).
      CATCH cx_sy_conversion_overflow INTO DATA(lr_cx_sy_conversion_overflow).
*&1&2&3,&4
        MESSAGE e003 WITH ls_intern-row ls_intern-col ls_intern-value lr_cx_sy_conversion_overflow->get_text( ).
      CATCH cx_root INTO DATA(lr_cx_root).
*&1&2&3,&4
        MESSAGE e003 WITH ls_intern-row ls_intern-col ls_intern-value lr_cx_root->get_text( ).
      ENDTRY.
      UNASSIGN <lv_val>.  "取消分配
    ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form set_alv_layout:设置alv的layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM set_alv_layout .
  CLEAR: gs_layout,gs_variant.
  gs_layout-zebra = 'X'.  "斑马线
  gs_layout-cwidth_opt = 'X'.  "自动列宽
  gs_layout-box_fname = 'SLBOX'.  "选择框字段名 "用户在ALV控件的行选中,对应的内存中【SLBOX】字段会被打上X
  gs_variant-report = sy-repid.
  gs_variant-handle = '01'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> U_EDIT
*&---------------------------------------------------------------------*
FORM build_fieldcat  USING    e_edit TYPE abap_bool.
  IF gt_fieldcat IS INITIAL.  "如果gt_fieldcat是初始状态
    APPEND VALUE  #( fieldname = 'ICON' ref_field  = 'ID' ref_table  = 'ICON'  scrtext_l = '状态' )  TO  gt_fieldcat[].
    APPEND VALUE  #( fieldname = 'MESSAGE'  ref_field = 'MESSAGE' ref_table = 'BAPIRET2' scrtext_l = '' ) TO gt_fieldcat[].
  ENDIF.
* DATA CT_FIELDCAT TYPE LVC_T_FCAT.
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
*     I_BUFFER_ACTIVE        = I_BUFFER_ACTIVE
      i_structure_name       = 'ZFI_MFWB'
*     I_CLIENT_NEVER_DISPLAY = 'X'
*     I_BYPASSING_BUFFER     = I_BYPASSING_BUFFER
*     I_INTERNAL_TABNAME     = I_INTERNAL_TABNAME
    CHANGING
      ct_fieldcat            = gt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
*     循环字段,修改显示的列名
  CLEAR gs_fieldcat.
  LOOP AT gt_fieldcat INTO gs_fieldcat.
    IF gs_fieldcat-fieldname = 'ZMJ_MATNR'.
      gs_fieldcat-coltext = '模具料号'.
    ELSEIF gs_fieldcat-fieldname = 'ZXLH'.
      gs_fieldcat-coltext = '序列号'.
    ELSEIF gs_fieldcat-fieldname = 'ZCP_MATNR'.
      gs_fieldcat-coltext = '挤出产出成品料号'.
    ELSEIF gs_fieldcat-fieldname = 'ZDMCZL'.
      gs_fieldcat-coltext = '单套模具预计产出重量'.
      gs_fieldcat-edit = 'X'."可编辑
*        gs_fieldcat-edit = ''."不可编辑
*        IF p_file IS INITIAL. "如果不是导入文件的操作,则设置重量为编辑
*          gs_fieldcat-edit = 'X'."可编辑
*        ENDIF.
    ELSEIF gs_fieldcat-fieldname = 'ZSFTY'.
      gs_fieldcat-coltext = '是否通用'.
      gs_fieldcat-edit = 'X'."可编辑
    ELSEIF gs_fieldcat-fieldname = 'ZWHRJ'.
      gs_fieldcat-coltext = '维护日期'.
    ELSEIF gs_fieldcat-fieldname = 'ZWHR'.
      gs_fieldcat-coltext = '维护人'.
    ELSEIF gs_fieldcat-fieldname = 'ZSFBF'.
      gs_fieldcat-coltext = '是否报废'.
      "gs_fieldcat-edit = 'X'."可编辑
    ENDIF.
    MODIFY gt_fieldcat FROM gs_fieldcat.
    CLEAR gs_fieldcat.
  ENDLOOP.
  IF sy-subrc <> 0.
*     Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form call_alv_func:调用alv显示函数
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM call_alv_func .
  DATA: lt_event TYPE slis_t_event,
        ls_event TYPE slis_alv_event.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
   EXPORTING
     i_callback_program                = sy-repid
     i_callback_pf_status_set          = 'SET_PF_STATUS'
     i_callback_user_command           = 'USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     i_callback_html_top_of_page       = 'FRM_TOP_OF_PAGE'
     is_layout_lvc                     = gs_layout
     it_fieldcat_lvc                   = gt_fieldcat
     i_save                            = 'U'
     is_variant                        = gs_variant
     it_events                         = lt_event
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           = E_EXIT_CAUSED_BY_CALLER
*     ES_EXIT_CAUSED_BY_USER            = ES_EXIT_CAUSED_BY_USER
    TABLES
      t_outtab                          = gt_output
   EXCEPTIONS
     program_error                     = 1
     OTHERS                            = 2
            .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& FORM FRM_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM frm_top_of_page USING p_cl_dd TYPE REF TO cl_dd_document.

ENDFORM.

*&---------------------------------------------------------------------*
*& FORM SET_PF_STATUS
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM set_pf_status USING u_t_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD' EXCLUDING u_t_extab.
  SET TITLEBAR 'STANDARD'.
ENDFORM.

*&---------------------------------------------------------------------*
*& FORM USER_COMMAND
*&---------------------------------------------------------------------*
FORM user_command USING u_v_ucomm LIKE sy-ucomm
                        u_s_selfield TYPE slis_selfield.
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid,
        lv_error TYPE char1,
        lv_confirm  TYPE c.
  DATA: lt_mod_data TYPE lvc_t_modi,
        ls_mod_data TYPE lvc_s_modi.
  DATA: lo_data TYPE REF TO cl_alv_changed_data_protocol.

*DATA IR_SALV_FULLSCREEN_ADAPTER TYPE REF TO CL_SALV_FULLSCREEN_ADAPTER.
*DATA ET_EXCLUDING               TYPE SLIS_T_EXTAB.
*DATA E_REPID                    TYPE SY-REPID.
*DATA E_CALLBACK_PROGRAM         TYPE SY-REPID.
*DATA E_CALLBACK_ROUTINE         TYPE SLIS_FORMNAME.
*DATA E_GRID                     TYPE REF TO CL_GUI_ALV_GRID.
*DATA ET_FIELDCAT_LVC            TYPE LVC_T_FCAT.
*DATA ER_TRACE                   TYPE REF TO CL_ALV_TRACE.
*DATA E_FLG_NO_HTML              TYPE C.
*DATA ES_LAYOUT_KKBLO            TYPE KKBLO_LAYOUT.
*DATA ES_SEL_HIDE                TYPE SLIS_SEL_HIDE_ALV.
*DATA ET_EVENT_EXIT              TYPE KKBLO_T_EVENT_EXIT.
*DATA ER_FORM_TOL                TYPE REF TO CL_SALV_FORM.
*DATA ER_FORM_EOL                TYPE REF TO CL_SALV_FORM.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*   EXPORTING
*     IR_SALV_FULLSCREEN_ADAPTER       = IR_SALV_FULLSCREEN_ADAPTER
   IMPORTING
     e_GRID                          = lr_grid.
  lr_grid->check_changed_data( ).
  CASE u_v_ucomm.
    WHEN 'SAVE'.
      PERFORM file_data_check.
      PERFORM refresh_alv.
      PERFORM user_command_import_check CHANGING lv_error.
      CHECK lv_error  = ''.
      PERFORM check_user_decision USING '确认' '确定保存?' CHANGING lv_confirm.
      CHECK lv_confirm EQ abap_true.
      PERFORM user_command_import.
      gv_save_flag = 'X'.
    WHEN  'EXIT'.
      LEAVE TO SCREEN 0.
      CLEAR: gv_edit_flag,gv_save_flag.
    WHEN OTHERS.
  ENDCASE.
  PERFORM refresh_alv.
  ENDFORM.
*&---------------------------------------------------------------------*
*& Form refresh_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM refresh_alv .
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid,
        ls_stable TYPE lvc_s_stbl.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.

  lr_grid->get_frontend_layout(
    IMPORTING
      es_layout = DATA(ls_layout)
  ).
  ls_layout-cwidth_opt = abap_true.
  lr_grid->set_frontend_layout( is_layout = ls_layout ).

  ls_stable-row = 'X'.
  ls_stable-col = 'X'.

  lr_grid->refresh_table_display(
    EXPORTING
      is_stable = ls_stable
    EXCEPTIONS
      finished = 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.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form user_command_import_check
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LV_ERROR
*&---------------------------------------------------------------------*
FORM user_command_import_check  CHANGING c_error TYPE char1.
  CLEAR c_error.
  IF lines( gt_output ) = 0.
    MESSAGE s000 WITH '导入数据为空' DISPLAY LIKE 'E'.
    c_error = 'X'.
    EXIT.
  ENDIF.
  IF NOT line_exists( gt_output[ slbox = 'X' ] ).
    MESSAGE s000 WITH '至少选中一行数据' DISPLAY LIKE 'E'.
    c_error = 'X'.
    EXIT.
  ENDIF.

  IF line_exists( gt_output[ type = 'E' slbox = 'X' ] ).
    MESSAGE s000 WITH '数据检查不通过,不可导入' DISPLAY LIKE 'E'.
    c_error = 'X'.
    EXIT.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form check_user_decision:确认用户决定
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&      --> P_
*&      <-- LV_CONFIRM
*&---------------------------------------------------------------------*
FORM check_user_decision  USING    u_title
                                    u_question
                           CHANGING ch_confirm.
  DATA: lv_answer TYPE char1.
  CLEAR: ch_confirm.

  CLEAR: lv_answer.
  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      titlebar              = u_title
      text_question         = u_question
      default_button        = '2'
      display_cancel_button = ''
    IMPORTING
      answer                = lv_answer
    EXCEPTIONS
      text_not_found        = 1
      OTHERS                = 2.
  IF sy-subrc NE 0.
  ENDIF.

  IF lv_answer EQ '1'.
    ch_confirm = abap_true.
  ELSE.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form user_command_import
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM user_command_import .
  DATA: gs_input TYPE zfi_mfwb.  "工作区结构与zfi_mfwb一致
   LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<lfs_output>) WHERE slbox = abap_true.
     MOVE-CORRESPONDING <lfs_output> TO gs_input.
     gs_input-mandt = sy-mandt.  "当前集团号
     gs_input-zwhrj = sy-datum. "当前日期
     gs_input-zwhr = sy-uname. "当前登录用户名
     INSERT zfi_mfwb FROM gs_input.
     IF sy-subrc <> 0.
       <lfs_output>-type = 'E'.
       IF sy-subrc = 4.
         <lfs_output>-message = '导入失败!数据库已存在此条数据'.
       ENDIF.
     ENDIF.
     IF sy-subrc = 0.
       <lfs_output>-type = 'S'.
       <lfs_output>-message = '导入成功!'.
     ENDIF.
     PERFORM set_light CHANGING <lfs_output>. "设置提示灯
   ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form USER_COMMAND_EXIT_CHECK
*&---------------------------------------------------------------------*
*& 如果没保存就退出 弹框提示
*&---------------------------------------------------------------------*
*&      <-- LV_ERROR
*&---------------------------------------------------------------------*
FORM user_command_exit_check CHANGING c_error.
  DATA: lv_confirm TYPE c.

*  IF p_cre = 'X'.
*    IF NOT line_exists( gt_output[ type = 'E' ] ).
*      gv_edit_flag = 'X'.
*    ENDIF.
*  ENDIF.

  IF gv_edit_flag = 'X' AND gv_save_flag = '' .
    PERFORM check_user_decision USING '确认'
                                        '还没保存,确定退出?'
                                  CHANGING lv_confirm.
    IF lv_confirm EQ abap_true.
    ELSE.
      c_error = 'X'.
      EXIT.
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form set_light:设置提示灯
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- <LS_OUTPUT>
*&---------------------------------------------------------------------*
FORM set_light  CHANGING ch_output TYPE ts_output.
  IF ch_output-type EQ 'E'.   "失败状态
    ch_output-icon = 'ICON_RED_LIGHT'.
  ELSEIF ch_output-type EQ 'S'.   "成功状态
    ch_output-icon = 'ICON_GREEN_LIGHT'.
  ELSEIF ch_output-type EQ 'N'.   "空状态
    ch_output-icon = 'ICON_YELLOW_LIGHT'.
  ENDIF.
  CALL FUNCTION 'ICON_CREATE'
    EXPORTING
      name                  = ch_output-icon
    IMPORTING
      result                = ch_output-icon
    EXCEPTIONS
      icon_not_found        = 1
      outputfield_too_short = 2
      OTHERS                = 3.
  IF sy-subrc <> 0.
  ENDIF.
ENDFORM.

使用的结构

双击结构名称,结构的字段如下:
在这里插入图片描述

上传下载模板

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1459885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux】查看openssl程序的安装情况

【linux】查看openssl程序的安装情况 1、查看安装包信息 $ rpm -qa |grep openssl 2、安装路径 $ rpm -ql openssl $ rpm -ql openssl-libs $ rpm -ql openssl-devel 3、相关文件和目录 /usr/bin/openssl /usr/include/openssl /usr/lib64/libssl.so.* /usr/lib64/libcrypto…

idea自动导包。已经无用导包自动移除

1.setting中勾选这两项&#xff0c;然后点击apply即可

【DDD】学习笔记-薪资管理系统的场景驱动设计

场景驱动设计的起点是领域场景&#xff0c;它不一定需要与事件风暴结合&#xff0c;只要识别并确定了领域场景&#xff0c;就可以进行任务分解。每个分解出来的子任务都可以视为是职责。分配职责时&#xff0c;场景驱动设计规定了履行职责的角色构造型&#xff0c;其中&#xf…

MongoDB 权限管理

文章目录 前言1. 权限控制1.1 MongoDB 默认角色1.1.1 读写角色1.1.2 管理角色1.1.3 其他角色1.1.4 超级用户角色 1.2 用户管理1.2.1 查看用户1.2.2 创建新用户1.2.3 调整角色1.2.4 删除用户1.2.4 修改密码 前言 上一篇 《MongoDB 单机安装部署》 文章中&#xff0c;为 MongoDB…

[SwiftUI]启动页LaunchScreen.storyboard中适配状态栏加安全区域的高度

如下图&#xff0c;我有一个需求。在启动页&#xff08;LaunchScreen.storyboard&#xff09;和引导页&#xff08;GuideView&#xff09;的黑色背景上&#xff0c;使用了同一张正方形图片。要求从启动页切换到引导页时&#xff0c;这两张相同的图片的过渡要无缝衔接&#xff0…

三防加固平板在房地产行业的应用|亿道三防onerugged

近期&#xff0c;有一款引人注目的解决方案——亿道三防onerugged平板电脑&#xff0c;它以其出色的性能和多功能的设计&#xff0c;为房地产行业带来了全新的应用体验。 首先&#xff0c;亿道三防onerugged平板电脑的NFC功能在小区业主身份验证中发挥着重要作用。传统的身份验…

Spring Boot项目中TaskDecorator的应用实践

一、前言 TaskDecorator是一个执行回调方法的装饰器&#xff0c;主要应用于传递上下文&#xff0c;或者提供任务的监控/统计信息&#xff0c;可以用于处理子线程与主线程间数据传递的问题。 二、开发示例 1.自定义TaskDecorator import org.springframework.core.task.Task…

小程序--模板语法

一、插值{{}}语法 1、内容绑定 <view>{{iptValue}}</view> 2、属性绑定 <switch checked"{{true}}" /> Page({data: {iptValue: 123} }) 二、简易双向数据绑定 model:value&#xff1a;支持双向数据绑定 注&#xff1a;仅input和textarea支持&a…

Linux(五)__系统管理

介绍 通常&#xff0c; Windows 中使用"任务管理器"主要有 3 个目的&#xff1a; 利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程&#xff1b;利用"性能"和"用户"标签来判断服务器的健康状态&#xff1…

MySQL锁相关总结|悲观锁、乐观锁、读锁、写锁、表锁、行锁、页面锁、间隙锁、临键锁

MySQL锁总体结构 MySQL 的锁上可以分成三类:总体、类型、粒度。 总体上分成两种:乐观锁和悲观锁类型上也是两种:读锁和写锁锁的粒度上可以分成五种:表锁,行锁,页面锁,间隙锁,临键锁下面我们就来详细讲一下这些锁 1. 悲观锁 悲观锁对于数据库中数据的读写持悲观态度,即…

无人机的视频图传技术有哪些?

在操控无人机时&#xff0c;视频图传技术显得尤为关键。通过这项技术&#xff0c;无人机的摄像头所捕捉的画面能实时回传至遥控器&#xff0c;使操作者全面掌握无人机的拍摄情况。同时&#xff0c;无人机图传技术也是衡量无人机性能的重要标准&#xff0c;它关乎飞行距离与时间…

shapely 笔记 voronoi图

Voronoi 图是一种将平面分割成区域的方法&#xff0c;每个区域包含一个输入点&#xff0c;任何在该区域内的点都比其他输入点更接近该区域的输入点 1 基本使用方法 shapely.ops.voronoi_diagram(geom, envelopeNone, tolerance0.0, edgesFalse) 2 参数说明 geom任何几何类型…

算法——数值算法——牛顿迭代法

目录 牛顿迭代法 一、1021: [编程入门]迭代法求平方根 牛顿迭代法 迭代法&#xff08;Iteration&#xff09;是一种通过反复递推计算来逼近解的方法。而牛顿迭代法&#xff08;Newtons method&#xff09;则是一种特定的迭代法&#xff0c;用于求解方程或函数的根、最小值、最…

Word 文档中的图片另存为 .jpg 格式图片

Word 文档中的图片另存为 .jpg 格式图片 1. Office 按钮 -> 另存为2. 筛选过的网页 (*.htm;*.html)3. 查看生成文件夹References 1. Office 按钮 -> 另存为 2. 筛选过的网页 (*.htm;*.html) ​​​ 3. 查看生成文件夹 References [1] Yongqiang Cheng, https://yongq…

WEB APIs (3)

事件对象 事件对象有事件触发时的相关信息&#xff0c;如点击事件中事件对象储存了鼠标点在哪个位置的信息 场景&#xff1a; 用户按下了哪个键&#xff0c;按下回车键可以发布新闻 鼠标点击了哪个元素&#xff0c;从而做哪些操作 参数e为事件对象 常用属性 type 获取当前…

游戏行业洞察:分布式开源爬虫项目在数据采集与分析中的应用案例介绍

前言 我在领导一个为游戏行业巨头提供数据采集服务的项目中&#xff0c;我们面临着实时数据需求和大规模数据处理的挑战。我们构建了一个基于开源分布式爬虫技术的自动化平台&#xff0c;实现了高效、准确的数据采集。通过自然语言处理技术&#xff0c;我们确保了数据的质量和…

Vue封装全局公共方法

有的时候,我们需要在多个组件里调用一个公共方法,这样我们就能将这个方法封装成全局的公共方法。 我们先在src下的assets里新建一个js文件夹,然后建一个common.js的文件,如下图所示: 然后在common.js里写我们的公共方法,比如这里我们写了一个testLink的方法,然后在main…

二叉树OJ题(2)——二叉树的四种遍历

前序 -> 深度优先遍历dfs 层序 -> 广度优先遍历bfs 6 二叉树的前序遍历 OJ链接 思路分析 开辟一个数组&#xff0c;然后把前序遍历树的顺序放入数组即可。 把根的val放入数组第一个元素接着放入左右&#xff08;递归下去&#xff09; 代码实现 int TreeSize(struct Tr…

2.20号qt

1.Qt中的信息调试类 &#xff08;输出类&#xff09; QDebug //1.类似与printf qDebug("%s","hello kittiy"); //2. 类似与cout 默认有换行 比较常用的方式 qDebug() << "你好" ; //1.类似与printf qDebug("%s",&q…

Harmony-UIAbility组件与UI的数据同步

UIAbility组件与UI的数据同步 基于HarmonyOS的应用模型&#xff0c;可以通过以下两种方式来实现UIAbility组件与UI之间的数据同步。 使用EventHub进行数据通信&#xff1a;基于发布订阅模式来实现&#xff0c;事件需要先订阅后发布&#xff0c;订阅者收到消息后进行处理。 使…