包装系数批导维护程序(ALV长篇备忘二)

该程序是一个使用SAPABAP编写的ALV程序,用于处理从Excel导入包装系数数据以及查询功能。程序首先定义了数据结构和表格,接着处理用户界面,包括选择屏幕和功能键。然后,它从Excel文件中读取数据并进行验证,将数据保存到内部表,最后通过ALV网格显示结果。此外,程序还提供了错误处理和数据更新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按最近的FS的需求,完成了一个ALV程序,做一个备忘吧。

全面代码:

*&---------------------------------------------------------------------*
*& Report ZMME0017B
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZMME0017B.


TABLES: ZTMM0089B,sscrfields,marc,MAKT.




  TYPES:
  BEGIN OF ty_excel,
    MATNR TYPE MATNR,
    WERKS TYPE WERKS_D,
    LIFNR    TYPE LIFNR,
    GROES TYPE ZTMM0089B-GROES,
    ZSNP TYPE ZTMM0089B-ZSNP,

    ICON_LIGHT(4) TYPE C,
    STATUS TYPE C,
    message(100) TYPE C,
  END   OF ty_excel.

  DATA gt_excel TYPE TABLE OF ty_excel.




DATA gt_89b LIKE TABLE OF ZTMM0089B.


DATA:gs_functxt   TYPE smp_dyntxt.


SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001 .
PARAMETERS: p_putin RADIOBUTTON GROUP rg1 DEFAULT 'X' USER-COMMAND uc01,
            p_cx RADIOBUTTON GROUP rg1.

SELECTION-SCREEN END OF BLOCK b1.



SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
    PARAMETER P_PATH1 LIKE RLGRAP-FILENAME MODIF ID M02.
SELECTION-SCREEN END OF BLOCK b2.


SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
SELECT-OPTIONS:s_MATNR      FOR marc-MATNR MODIF ID M03,
               s_LIFNR      FOR ZTMM0089B-LIFNR MODIF ID M03, "供应商
               s_werks      FOR marc-werks MODIF ID M03.

SELECTION-SCREEN END OF BLOCK b3.


SELECTION-SCREEN: FUNCTION KEY 1.


INITIALIZATION.
  CLEAR gs_functxt.
  gs_functxt-text = '包装系数导入模板'.
  gs_functxt-icon_id = icon_export.
  gs_functxt-icon_text = '包装系数导入模板'.
  gs_functxt-quickinfo = '包装系数导入模板'.
  sscrfields-functxt_01 = gs_functxt.






AT SELECTION-SCREEN OUTPUT.
  PERFORM frm_select_screen.


AT SELECTION-SCREEN.

CASE sscrfields-ucomm.

    WHEN 'FC01'.
      PERFORM frm_download_template_a1.

ENDCASE.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path1.
   PERFORM frm_sel_file CHANGING p_path1.






START-OF-SELECTION.

IF p_putin = 'X'. "导入

   PERFORM frm_excel_import.
   PERFORM frm_table_save.

ELSEIF p_cx = 'X'. "查询

  PERFORM frm_display_cx.

ENDIF.





"===========子函数如下===========


"选择屏幕切换4个功能的函数
FORM frm_select_screen .

  CASE 'X'.

    WHEN  p_putin.
          LOOP AT SCREEN.
            IF screen-group1 = 'M02'. screen-active = 1.  MODIFY SCREEN. ENDIF.
            IF screen-group1 = 'M03'. screen-active = 0.  MODIFY SCREEN.  ENDIF.

            ENDLOOP.

    WHEN  p_cx.
      LOOP AT SCREEN.
        IF screen-group1 = 'M02'. screen-active = 0.  MODIFY SCREEN. ENDIF.
        IF screen-group1 = 'M03'. screen-active = 1.  MODIFY SCREEN.  ENDIF.

      ENDLOOP.



  ENDCASE.
ENDFORM.                    " FRM_SET_SCREEN





FORM FRM_EXCEL_IMPORT .

     DATA CL_EX TYPE REF TO CX_ROOT.
  CHECK P_PATH1 IS NOT INITIAL.
  TRY .
      CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
        EXPORTING
          FILENAME                = P_PATH1
          I_BEGIN_COL             = 1
          I_BEGIN_ROW             = 4
          I_END_COL               = 5
          I_END_ROW               = 5000
*         SHEET_NAME              =
        TABLES
          INTERN                  = gt_excel
        EXCEPTIONS
          INCONSISTENT_PARAMETERS = 1
          UPLOAD_OLE              = 2
          OTHERS                  = 3.

    CATCH CX_ROOT INTO CL_EX.
      MESSAGE  CL_EX->GET_TEXT( ) TYPE 'E'.
  ENDTRY.



ENDFORM.





FORM FRM_TABLE_SAVE .



  DATA gs_89b type ZTMM0089B.

 LOOP AT GT_excel ASSIGNING FIELD-SYMBOL(<gs180>).

     CLEAR gs_89b.

     CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input  = <gs180>-MATNR
      IMPORTING
        output = gs_89b-MATNR.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = <gs180>-LIFNR
      IMPORTING
        output = gs_89b-LIFNR.


      SELECT SINGLE MAKTX FROM MAKT WHERE MATNR = @gs_89b-MATNR AND SPRAS = '1' INTO @gs_89b-MAKTX.

      SELECT SINGLE NAME1 FROM LFA1 WHERE LIFNR = @gs_89b-LIFNR  INTO @gs_89b-NAME1.

        gs_89b-WERKS = <gs180>-WERKS.
        gs_89b-GROES = <gs180>-GROES.
        gs_89b-ZSNP  = <gs180>-ZSNP.

    SELECT *
      FROM MARC
      WHERE matnr EQ @gs_89b-MATNR
      and   WERKS EQ @gs_89b-WERKS
      into TABLE @DATA(lt_temp).

    IF sy-subrc <> 0.

      gs_89b-STATUS = 'E'.
      gs_89b-MESSAGE = '物料和工厂在MARC表中没有,物料不存在或视图未维护!'.
      gs_89b-ICON_LIGHT = icon_red_light.

    ENDIF.


     SELECT *
      FROM EINA
      WHERE matnr EQ @gs_89b-MATNR
      and   LIFNR EQ @gs_89b-LIFNR
      into TABLE @DATA(lt_temp2).

    IF sy-subrc <> 0.

      gs_89b-STATUS = 'E'.
      gs_89b-MESSAGE = '物料供应商关系未维护!'.
      gs_89b-ICON_LIGHT = icon_red_light.

    ENDIF.

      APPEND gs_89b TO gt_89b.


 ENDLOOP.




 DATA: LT_FIELDCAT        TYPE SLIS_T_FIELDCAT_ALV,
        LS_FIELDCAT        TYPE SLIS_FIELDCAT_ALV,
        WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
        WS_LAYOUT          TYPE SLIS_LAYOUT_ALV,
        WS_SORTFIELDS_TAB  TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
        WS_EVENTS          TYPE SLIS_T_EVENT.
  DATA: lv_pos TYPE I VALUE 0.
  DATA: TITLE TYPE LVC_TITLE.
  DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.


  DEFINE macro_fieldcat.
    lv_pos = lv_pos + 1.
    ls_fieldcat-col_pos       =  lv_pos.
    ls_fieldcat-tabname       = 'gt_89b'.
    ls_fieldcat-fieldname     = &1.
    ls_fieldcat-seltext_l     = &2.
    ls_fieldcat-inttype       = &3.
    ls_fieldcat-intlen        = &4.
    append ls_fieldcat to lt_fieldcat .
    clear ls_fieldcat.
  END-OF-DEFINITION.

  macro_fieldcat:



    'MATNR' '物料编码' '' '',
    'MAKTX' '描述' '' '',
    'WERKS' '工厂' '' '',
    'LIFNR' '供应商' '' '',
    'NAME1' '供应商名称' '' '',
    'GROES' '规格型号' '' '',
    'ZSNP'  'SNP' '' '',
    'ZCNAME' '创建人' '' '',
    'ZCDATE' '创建日期' '' '',
    'ZCTIME' '创建时间' '' '',
    'ZAENAME' '更新人' '' '',
    'ZAEDATE' '更新日期' '' '',
    'ZAETIME' '更新时间' '' '',
    'ICON_LIGHT' '图标' '' '',
    'STATUS' '状态' '' '',
    'message' '消息描述' '' ''.


  WS_LAYOUT-ZEBRA             = 'X'.
  WS_LAYOUT-GET_SELINFOS      = 'X'.
  WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  WS_LAYOUT-DETAIL_POPUP      = 'X'.

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        I_CALLBACK_PROGRAM       = SY-REPID
        I_CALLBACK_PF_STATUS_SET = 'ALV_STATUS_SET'
        I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND'
        IS_LAYOUT                = WS_LAYOUT
        IT_FIELDCAT              = LT_FIELDCAT
        IT_SPECIAL_GROUPS        = WS_FIELDGROUPS_TAB[]
        IT_SORT                  = WS_SORTFIELDS_TAB[]
        IT_EVENTS                = WS_EVENTS[]
        I_GRID_TITLE             = TITLE
        I_DEFAULT                = 'X'
        I_SAVE                   = 'A'
      TABLES
        T_OUTTAB           = GT_89b
      EXCEPTIONS
        PROGRAM_ERROR      = 1
        OTHERS             = 2.





ENDFORM.



FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
  CLEAR: PT_EXTAB[].
  SET PF-STATUS 'ZS100'.
ENDFORM.


FORM FRM_USER_COMMAND  USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD.

  CASE R_UCOMM.
    WHEN '&GO1'.

      PERFORM FRM_PROCESS.
      rs_selfield-refresh = 'X'.

    WHEN OTHERS.
  ENDCASE.

ENDFORM.



FORM FRM_PROCESS .



  LOOP AT GT_89b ASSIGNING FIELD-SYMBOL(<gs300>) WHERE STATUS <> 'E'.

    SELECT SINGLE *
      FROM ZTMM0089B
      WHERE MATNR = @<gs300>-MATNR
      AND WERKS = @<gs300>-WERKS
      AND LIFNR = @<gs300>-LIFNR
      INTO @DATA(ls_line).

    IF sy-subrc = 0. "有就修改


        UPDATE ZTMM0089B
        SET
        GROES       = <gs300>-GROES
        ZSNP        = <gs300>-ZSNP
        STATUS      = 'S'
        ICON_LIGHT  = icon_green_light
        MESSAGE     = '修改数据完成'
        ZAENAME     = SY-UNAME
        ZAEDATE     = SY-DATUM
        ZAETIME     = SY-UZEIT

        WHERE MATNR = <gs300>-MATNR
        AND WERKS = <gs300>-WERKS
        AND LIFNR = <gs300>-LIFNR.

      COMMIT WORK AND WAIT.

    ELSE. "没有就新增

      <gs300>-GUID = cl_uuid_factory=>create_system_uuid( )->create_uuid_c32( ).

      <gs300>-ZCNAME = SY-UNAME.
      <gs300>-ZCDATE = SY-DATUM.
      <gs300>-ZCTIME = SY-UZEIT.
      <gs300>-STATUS = 'S'.
      <gs300>-ICON_LIGHT  = icon_green_light .
      <gs300>-MESSAGE     = '新建数据完成'  .



      INSERT  ZTMM0089B FROM <gs300>.

      COMMIT WORK AND WAIT.





    ENDIF.


  ENDLOOP.




ENDFORM.




FORM FRM_DISPLAY_CX .


  DATA lt_89b LIKE TABLE OF ZTMM0089B.

  SELECT *
    FROM ZTMM0089B
    WHERE MATNR IN @s_MATNR
    AND WERKS IN @s_werks
    AND LIFNR IN @S_LIFNR
    INTO TABLE @lt_89b.




 DATA: LT_FIELDCAT        TYPE SLIS_T_FIELDCAT_ALV,
        LS_FIELDCAT        TYPE SLIS_FIELDCAT_ALV,
        WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
        WS_LAYOUT          TYPE SLIS_LAYOUT_ALV,
        WS_SORTFIELDS_TAB  TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
        WS_EVENTS          TYPE SLIS_T_EVENT.
  DATA: lv_pos TYPE I VALUE 0.
  DATA: TITLE TYPE LVC_TITLE.
  DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.


  DEFINE macro_fieldcat.
    lv_pos = lv_pos + 1.
    ls_fieldcat-col_pos       =  lv_pos.
    ls_fieldcat-tabname       = 'lt_89b'.
    ls_fieldcat-fieldname     = &1.
    ls_fieldcat-seltext_l     = &2.
    ls_fieldcat-inttype       = &3.
    ls_fieldcat-intlen        = &4.
    append ls_fieldcat to lt_fieldcat .
    clear ls_fieldcat.
  END-OF-DEFINITION.

  macro_fieldcat:



    'MATNR' '物料编码' '' '',
    'MAKTX' '描述' '' '',
    'WERKS' '工厂' '' '',
    'LIFNR' '供应商' '' '',
    'NAME1' '供应商名称' '' '',
    'GROES' '规格型号' '' '',
    'ZSNP' 'SNP' '' '',
    'ZCNAME' '创建人' '' '',
    'ZCDATE' '创建日期' '' '',
    'ZCTIME' '创建时间' '' '',
    'ZAENAME' '更新人' '' '',
    'ZAEDATE' '更新日期' '' '',
    'ZAETIME' '更新时间' '' ''.



  WS_LAYOUT-ZEBRA             = 'X'.
  WS_LAYOUT-GET_SELINFOS      = 'X'.
  WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  WS_LAYOUT-DETAIL_POPUP      = 'X'.

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        I_CALLBACK_PROGRAM = SY-REPID
        IS_LAYOUT          = WS_LAYOUT
        IT_FIELDCAT        = LT_FIELDCAT
        IT_SPECIAL_GROUPS  = WS_FIELDGROUPS_TAB[]
        IT_SORT            = WS_SORTFIELDS_TAB[]
        IT_EVENTS          = WS_EVENTS[]
        I_GRID_TITLE       = TITLE
        I_DEFAULT          = 'X'
        I_SAVE             = 'A'
      TABLES
        T_OUTTAB           = lt_89b
      EXCEPTIONS
        PROGRAM_ERROR      = 1
        OTHERS             = 2.





ENDFORM.



"下载导入模板函数

FORM frm_download_template_a1 .
  DATA: lv_objname      TYPE text40, "object
        lv_def_filename TYPE string,
        lv_filename     TYPE string,
        lv_fullpath     TYPE string,
        lv_path         TYPE string,
        lv_len          TYPE i,
        lv_rc           TYPE char01,
        lv_msg          TYPE string.

  CLEAR:lv_def_filename,lv_objname.
  lv_objname = 'ZMME0017B'.
  lv_def_filename = '包装系数导入模板.xlsx'.

  CLEAR:lv_filename,lv_path,lv_fullpath.
  lv_rc = '1'.
  PERFORM frm_open_save_dialog USING lv_def_filename
                               CHANGING lv_filename
                                        lv_path
                                        lv_fullpath
                                        lv_rc.
  IF lv_rc = '0'.
    lv_len = 0.
    CALL METHOD cl_abap_list_utilities=>dynamic_output_length
      EXPORTING
        field = lv_fullpath
      RECEIVING
        len   = lv_len.
    IF lv_len = 0.
      MESSAGE '文件路径长度为0!' TYPE 'S' DISPLAY LIKE 'E'.
    ELSEIF lv_len > 128.
      MESSAGE '文件路径长度过长!' TYPE 'S' DISPLAY LIKE 'E'.
    ELSE.
      "get file from smw0 and download it to local
      lv_rc = 'X'.
      CLEAR lv_msg.
      PERFORM frm_down_template USING lv_objname
                                      lv_fullpath
                             CHANGING lv_rc
                                      lv_msg.
      IF lv_rc EQ ''.
        MESSAGE '模板下载完成!' TYPE 'S'.
      ELSE.
        IF lv_msg IS NOT INITIAL.
          MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
        ENDIF.
      ENDIF.
    ENDIF.
  ELSEIF lv_rc = '1'.
    MESSAGE '下载模板出错.' TYPE 'S' DISPLAY LIKE 'E'.
  ELSEIF lv_rc = '9'.
    MESSAGE '用户取消操作.' TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.
ENDFORM.








FORM frm_open_save_dialog  USING uv_def_filename TYPE string
                           CHANGING cv_filename TYPE string
                                    cv_path TYPE string
                                    cv_fullpath TYPE string
                                    cv_rc TYPE c.
  DATA: lv_filter      TYPE string,
        lv_filename    TYPE string,
        lv_path        TYPE string,
        lv_fullpath    TYPE string,
        lv_user_action TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = 'Save as'
      default_extension    = 'XLSX' "Set detault to XLS when opening a dialog
      default_file_name    = uv_def_filename
      file_filter          = cl_gui_frontend_services=>filetype_excel
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = lv_fullpath
      user_action          = lv_user_action
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    cv_rc = '1'.
  ELSE.
    IF lv_user_action = cl_gui_frontend_services=>action_ok.
      cv_filename = lv_filename.
      cv_path = lv_path.
      cv_fullpath = lv_fullpath.
      cv_rc = '0'.
    ELSEIF lv_user_action = cl_gui_frontend_services=>action_cancel.
      cv_rc = '9'.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_OPEN_SAVE_DIALOG





FORM frm_down_template USING uv_objname TYPE text40
                             uv_fullpath TYPE string
                    CHANGING cv_rc  TYPE char01
                             cv_msg TYPE string.

  DATA: lv_objname TYPE w3objid, "WWWDATATAB-OBJID, "object
        lv_dest    TYPE localfile,
        ls_objdata TYPE wwwdatatab,
        lv_strmsg  TYPE string,
        lv_rc      LIKE sy-subrc.

  CLEAR: lv_dest.
  IF uv_fullpath IS INITIAL.
    cv_msg = 'The path length is 0'.
    cv_rc = 'X'.
    EXIT.
  ELSE.
    lv_dest = uv_fullpath.
  ENDIF.

  CLEAR: lv_objname.
  IF uv_objname IS INITIAL.
    cv_msg = 'Object name is empty'.
    cv_rc = 'X'.
    EXIT.
  ELSE.
    lv_objname = uv_objname.
  ENDIF.

  CLEAR: ls_objdata.
  SELECT SINGLE relid objid
    FROM wwwdata
    INTO CORRESPONDING FIELDS OF ls_objdata
    WHERE srtf2 = 0
      AND relid = 'MI'
      AND objid = lv_objname.
  IF sy-subrc = 0 AND ls_objdata-objid <> space.
    CONDENSE lv_dest.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = ls_objdata
        destination = lv_dest
      IMPORTING
        rc          = lv_rc.
    IF lv_rc <> 0.
      CLEAR lv_strmsg.
      CONCATENATE 'Failed to download the Object:' lv_objname
        INTO lv_strmsg.
      cv_msg = lv_strmsg.
      cv_rc = 'X'.
    ELSE.
      "success
      cv_rc = ''.
      cv_msg = ''.
    ENDIF.
  ELSE.
    CLEAR lv_strmsg.
    CONCATENATE 'The Object:' lv_objname 'is not exist.'
      INTO lv_strmsg.
    cv_msg = lv_strmsg.
    cv_rc = 'X'.
  ENDIF.
ENDFORM.                    " FRM_DOWN_TEMPLATE







*&---------------------------------------------------------------------*
*&      Form  FRM_SEL_FILE
*&---------------------------------------------------------------------*
*       text 选择文件
*----------------------------------------------------------------------*
FORM frm_sel_file CHANGING po_path.
  DATA:
    lt_filetable    TYPE   filetable,
    ls_filetable    TYPE   file_table,
    lv_rc           TYPE   sy-subrc,
    lv_filename     TYPE   string,
    lv_initial_path TYPE   string VALUE 'C:\'.

  CLEAR lv_filename.
  lv_filename = po_path.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      default_filename        = lv_filename
      initial_directory       = lv_initial_path
    CHANGING
      file_table              = lt_filetable
      rc                      = lv_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4.

  IF sy-subrc NE 0 OR lv_rc LT 0.
    MESSAGE   '上传文件选择失败' TYPE 'E' ."上传文件选择失败
  ELSE.
    IF lv_rc = 1.
      READ TABLE lt_filetable INTO ls_filetable INDEX 1.
      po_path = ls_filetable-filename.
    ELSE.
      EXIT.
    ENDIF.
  ENDIF.
ENDFORM.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值