生产版本号批导

根据业务需求,将EXCEL的生产版本的相关数据通过程序导入到系统。

TABLES:SSCRFIELDS.
TYPE-POOLS slis,icon,truxs .
TYPES:
  BEGIN OF ty_alv,
    werks     TYPE mkal-werks"工厂
    matnr     TYPE mkal-matnr"物料编码
    verid     TYPE mkal-verid"生产版本
    text1     TYPE mkal-text1"生产版本描述
    adatu     TYPE string"有效日期从
    bdatu     TYPE string"有效日期至   都为99991231


*    ADATU TYPE MKAL-ADATU, "有效日期从
*    BDATU TYPE MKAL-BDATU, "有效日期至   都为99991231
    plnty     TYPE mkal-plnty"任务清单类型   默认都为N
    plnnr     TYPE mkal-plnnr"工艺路线组
    alnal     TYPE mkal-alnal"组计数器    默认都为1
    stlal     TYPE mkal-stlal"可选BOM
    stlan     TYPE mkal-stlan"BOM用途  默认都为1
    id        TYPE icon-id,
    mess(200TYPE c,
    box       TYPE c,
  END OF ty_alv.
DATA gt_alv TYPE TABLE OF ty_alv,
       gs_alv LIKE LINE OF gt_alv.

DATA gv_id        TYPE icon-id,
       gv_mess(200TYPE c.

TYPES:
  BEGIN OF ty_upload,
    werks TYPE mkal-werks"工厂
    matnr TYPE mkal-matnr"物料编码
    verid TYPE mkal-verid"生产版本
    text1 TYPE mkal-text1"生产版本描述

    adatu TYPE string"有效日期从
    bdatu TYPE string"有效日期至   都为99991231


*    ADATU TYPE MKAL-ADATU, "有效日期从
*    BDATU TYPE MKAL-BDATU, "有效日期至   都为99991231

    plnty TYPE mkal-plnty"任务清单类型   默认都为N
    plnnr TYPE mkal-plnnr"工艺路线组
    alnal TYPE mkal-alnal"组计数器    默认都为1
    stlal TYPE mkal-stlal"可选BOM
    stlan TYPE mkal-stlan"BOM用途  默认都为1
  END OF ty_upload.
DATA gt_upload TYPE TABLE OF ty_upload,
       gs_upload LIKE LINE OF gt_upload.

FIELD-SYMBOLS <fs_alv> TYPE ty_alv.

DATA gt_bdcdata TYPE TABLE OF bdcdata WITH HEADER LINE"BDC执行内表
DATA gt_msgtab TYPE TABLE OF bdcmsgcoll WITH HEADER LINE "BDC返回信息表

TYPESBEGIN OF ty_message,
         message(100TYPE c,
         ztype        TYPE c,
       END OF ty_message.
DATA:gt_mes TYPE TABLE OF ty_message,
     gs_mes TYPE ty_message.




*&---定义ALV显示的字段列及其描述等属性
DATAgt_fieldcat TYPE TABLE OF lvc_s_fcat,
      gs_fieldcat TYPE lvc_s_fcat,
      gs_layout   TYPE lvc_s_layo,
      g_repid     LIKE sy-repid VALUE sy-repid.
DATA:FUNCTXT   TYPE SMP_DYNTXT.

*--进度条--------------------------------------------------------------------*
"进度条标志
DATA:GV_FLAG TYPE C.
"进度条变量
DATA:GV_INDEX TYPE SY-TABIX.
"上传模板条目数
DATA:GV_LINES TYPE I.

*----------定义选择屏幕参数 ------------------------------------------------*
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
PARAMETERS:
  p_path  LIKE rlgrap-filename,        "文件路径
  p_mode  TYPE c DEFAULT 'N'.
SELECTION-SCREEN END OF BLOCK blk1.

*-------初始化-------------------------------------------------------------*
INITIALIZATION.
  FUNCTXT-ICON_ID   ICON_EXPORT.
  FUNCTXT-QUICKINFO '下载模板'.
  FUNCTXT-ICON_TEXT '下载模板'.
  SSCRFIELDS-FUNCTXT_01 FUNCTXT.

*----选择屏幕事件----------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.    "为P_PATH创建搜索帮助
  PERFORM frm_browser_file.         "选择屏幕获取本地EXCEL

AT SELECTION-SCREEN.
  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'."系统预留的功能码
      PERFORM frm_down_excel."下载模板文件
    WHEN OTHERS.
  ENDCASE.

*----选择事件开始----------------------------------------------------------*
START-OF-SELECTION.
  IF p_path IS INITIAL.
    MESSAGE '请输入文件路径!' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.
    PERFORM frm_up_excel.       "上传Excel数据
    PERFORM frm_chk_data.       "检查数据
    PERFORM frm_layout.
    PERFORM frm_fieldcat.
    PERFORM frm_display.
*----选择事件结束----------------------------------------------------------*
END-OF-SELECTION.



*&---------------------------------------------------------------------*
*& Form FRM_BROWSER_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_browser_file .

  CALL FUNCTION 'TB_LIMIT_WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME     = ' '
*     DEF_PATH         = ' '
      mask             'Excel Files,*.xls,All Files,*.*. '
      mode             'O'
*     TITLE            = ' '
    IMPORTING
      filename         p_path
*     PATH             =
*     FILE             =
    EXCEPTIONS
      selection_cancel 1
      selection_error  2
      OTHERS           3.
  CASE sy-subrc.
    WHEN 0.
    WHEN 2.
      MESSAGE 'Cancel.' TYPE 'S'.
    WHEN OTHERS.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDCASE.








ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GV_FULLPATH
*&---------------------------------------------------------------------*
FORM frm_down_excel .

*变量定义
  DATA:lv_text       TYPE string,                   "消息
       lv_filename   TYPE string,                   "文件名
       lv_path       TYPE string,                   "文件路径
       lv_filepath   TYPE rlgrap-filename VALUE 'c'"文件路径
       lv_title      TYPE string ,                  "标题
       lv_title_name TYPE string,                   "标题
       lv_mod(20),                                  "模式
       lv_fullpath   TYPE string,                   "路径
       lv_rc         TYPE sy-subrc.                 "返回值
  DATA:ls_object     TYPE wwwdatatab.               "对象名

*SMW0模版名称为:ZPPB_810
  lv_mod        'ZPP010'.
  lv_title      TEXT-004.
  lv_title_name TEXT-005.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    
EXPORTING
      window_title      lv_title      保存'
      default_file_name lv_title_name 生产版本导入模板
    CHANGING
      filename          lv_filename
      path              
lv_path
      fullpath          
lv_fullpath.

*OS文件路径
  CONCATENATE lv_path lv_filename '.xls' INTO lv_filepath.

  IF strlenlv_filepath NE 5.
*查询模板.
    SELECT SINGLE relid
                  objid
      
INTO CORRESPONDING FIELDS OF ls_object
      
FROM wwwdata
    
WHERE srtf2 EQ '0'
    AND objid EQ lv_mod."smw0里对象名称
    IF sy-subrc NE OR ls_object-objid EQ space .
      CONCATENATE TEXT-006 lv_mod TEXT-007 INTO lv_text.
      MESSAGE lv_text TYPE 'E'.
      STOP.
    ENDIF.

    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         ls_object
        destination 
lv_filepath
      
IMPORTING
        rc          lv_rc.
    IF lv_rc <> 0.
      CONCATENATE TEXT-006 lv_mod TEXT-008 INTO lv_text.
      MESSAGE lv_text TYPE 'E'.
      STOP.
    ENDIF.
*已下载
    MESSAGE TEXT-009 TYPE 'S'.
  ELSE.
*已取消下载
    MESSAGE TEXT-010 TYPE 'S'.
  ENDIF.

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

  DATAlt_filename TYPE rlgrap-filename,   "路径
        lt_data     TYPE truxs_t_text_data.

  lt_filename p_path.   "路径
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*     I_FIELD_SEPERATOR    = 'X'
      i_line_header        'X'
      i_tab_raw_data       lt_data
      i_filename           
lt_filename
    
TABLES
      i_tab_converted_data gt_upload
    
EXCEPTIONS
      conversion_failed    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 FRM_CHK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_chk_data .
  LOOP AT gt_upload INTO gs_upload.
    MOVE-CORRESPONDING gs_upload TO gs_alv.

    gs_alv-id icon_yellow_light.
    gs_alv-mess '数据检查无误'.
    APPEND gs_alv TO gt_alv.
    CLEAR gs_upload.
  ENDLOOP.
  SORT gt_alv BY werks matnr.
  IF gt_alv IS INITIAL.
    MESSAGE '没有数据' TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.
  LOOP AT gt_alv INTO gs_alv.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  gs_alv-stlal
      
IMPORTING
        output gs_alv-stlal.



    MODIFY gt_alv FROM gs_alv.
  ENDLOOP.


校验导入数据中工厂、物料、BOM用途、可选BOM是否存在于系统表MAST
  DATA lt_mast TYPE TABLE OF mast,
         ls_mast LIKE LINE OF lt_mast.
  SELECT
    werks
    matnr
    stlal
    stlan
    
INTO CORRESPONDING FIELDS OF TABLE lt_mast
    
FROM mast
    
FOR ALL ENTRIES IN gt_alv
    
WHERE werks gt_alv-werks
    
AND   matnr gt_alv-matnr
    
AND   stlal gt_alv-stlal
    
AND   stlan gt_alv-stlan.


*校验导入数据中工厂、物料、类型、组是否存在于系统表MAPL
  DATA lt_mapl TYPE TABLE OF mapl,
         ls_mapl LIKE LINE OF lt_mapl.

  SELECT
    werks
    matnr
    plnty
    plnnr
    
INTO CORRESPONDING FIELDS OF TABLE lt_mapl
    
FROM mapl
    
FOR ALL ENTRIES IN gt_alv
    
WHERE werks gt_alv-werks
    
AND   matnr gt_alv-matnr
    
AND   plnty gt_alv-plnty
    
AND   plnnr gt_alv-plnnr.


  DATA lv_mess1(255TYPE c.

  DATA lv_mess3(255TYPE c.
  DATA lv_mess2(255TYPE c.
  DATA lv_date TYPE sy-datum.
  SORT lt_mast BY werks matnr.
  SORT lt_mapl BY werks matnr.

  LOOP AT gt_alv INTO gs_alv.
    CLEAR lv_mess1,lv_mess2.

校验导入数据中工厂、物料、BOM用途、可选BOM是否存在于系统表MAST
    READ TABLE lt_mast INTO ls_mast WITH KEY werks gs_alv-werks  matnr gs_alv-matnr     stlal gs_alv-stlal     stlan gs_alv-stlan     .
    IF sy-subrc <> 0.
      lv_mess1 '该物料在工厂下不存在对应的BOM数据 '.
    ENDIF.

*校验导入数据中工厂、物料、类型、组是否存在于系统表MAPL

    READ TABLE lt_mapl INTO ls_mapl WITH KEY werks gs_alv-werks  matnr gs_alv-matnr     plnty gs_alv-plnty     plnnr gs_alv-plnnr     .
    IF sy-subrc <> 0.
      lv_mess2 '该物料在工厂下不存在对应的工艺路线'.
    ENDIF.

    lv_date gs_alv-adatu.

*校验日期是否正确

    CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
      EXPORTING
        date                      lv_date
      
EXCEPTIONS
        plausibility_check_failed 1
        OTHERS                    2.
    IF sy-subrc NE 0"如果返回非0,则日期不合法
      lv_mess3 '日期不正确'.
    ENDIF.


    IF lv_mess1 IS NOT INITIAL.
      gs_alv-mess lv_mess1.
      gs_alv-id icon_red_light.    红灯

    ELSEIF lv_mess1 IS INITIAL AND lv_mess2 IS NOT INITIAL.
      gs_alv-mess lv_mess2.
      gs_alv-id icon_red_light.    红灯
    ELSEIF lv_mess1 IS INITIAL AND lv_mess2  IS INITIAL AND lv_mess3 IS NOT INITIAL .
      gs_alv-mess lv_mess3.
      gs_alv-id icon_red_light.    红灯
    ENDIF.



    MODIFY gt_alv FROM gs_alv.
    CLEAR gs_alv,ls_mast,ls_mapl,lv_mess1,lv_mess2,lv_date,lv_mess3.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_layout .
  gs_layout-zebra 'X'.
  gs_layout-cwidth_opt 'X'.
  gs_layout-box_fname  'BOX'.   " ALV 左侧选择框
  gs_layout-sel_mode 'A'.
ENDFORM.

FORM frm_fieldcat .




  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'WERKS'.
  gs_fieldcat-coltext '工厂'.
*  GS_FIELDCAT-CONVEXIT = 'ALPHA'.
  gs_fieldcat-outputlen 10.
  APPEND gs_fieldcat TO gt_fieldcat .


  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'ID'.
  gs_fieldcat-coltext '状态'.
  gs_fieldcat-outputlen 200.
  APPEND gs_fieldcat TO gt_fieldcat .


  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'MESS'.
  gs_fieldcat-coltext '信息'.
  gs_fieldcat-outputlen 200.
  APPEND gs_fieldcat TO gt_fieldcat .

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'MATNR'.
  gs_fieldcat-coltext '物料编码'.
*  GS_FIELDCAT-CONVEXIT = 'MATN1'.
  gs_fieldcat-outputlen 10.
  APPEND gs_fieldcat TO gt_fieldcat .

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'VERID'.
  gs_fieldcat-coltext '生产版本'.
  gs_fieldcat-outputlen 10.
  APPEND gs_fieldcat TO gt_fieldcat .

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'TEXT1'.
  gs_fieldcat-coltext '生产版本描述'.
  gs_fieldcat-outputlen 10.
  APPEND gs_fieldcat TO gt_fieldcat .

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'ADATU'.
  gs_fieldcat-coltext '有效日期从(YYYYMMDD)'.
  gs_fieldcat-outputlen 10.
  APPEND gs_fieldcat TO gt_fieldcat .

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'BDATU'.
  gs_fieldcat-coltext '有效日期至(YYYYMMDD)'.
  gs_fieldcat-outputlen 10.
  APPEND gs_fieldcat TO gt_fieldcat .

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'PLNTY'.
  gs_fieldcat-coltext '任务清单类型'.
  gs_fieldcat-outputlen 10.
  gs_fieldcat-no_zero   'X'.
  APPEND gs_fieldcat TO gt_fieldcat .

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'PLNNR'.
  gs_fieldcat-coltext '工艺路线组'.
  gs_fieldcat-outputlen 10.
  APPEND gs_fieldcat TO gt_fieldcat .

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'ALNAL'.
  gs_fieldcat-coltext '组计数器'.
  gs_fieldcat-outputlen 10.
  APPEND gs_fieldcat TO gt_fieldcat .

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'STLAL'.
  gs_fieldcat-coltext '可选BOM'.
  gs_fieldcat-outputlen 10.
  APPEND gs_fieldcat TO gt_fieldcat .

  CLEAR gs_fieldcat.
  gs_fieldcat-fieldname 'STLAN'.
  gs_fieldcat-coltext 'BOM用途'.
  gs_fieldcat-outputlen 10.
  APPEND gs_fieldcat TO gt_fieldcat .





ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display .
  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'
      is_layout_lvc            gs_layout
      it_fieldcat_lvc          
gt_fieldcat
    
TABLES
      t_outtab                 gt_alv
    
EXCEPTIONS
      program_error            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 set_pf_status USING rt_extab TYPE slis_t_extab.

  SET PF-STATUS 'STATUS'.

ENDFORM.

FORM user_command USING r_ucomm LIKE sy-ucomm
                        rs_selfield 
TYPE slis_selfield.
  DATAgv_grid TYPE REF TO cl_gui_alv_grid .

*--------------------刷新-------------------*
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid gv_grid.

  CALL METHOD gv_grid->check_changed_data.

  CALL METHOD gv_grid->refresh_table_display.

  rs_selfield-refresh 'X'.

  CASE r_ucomm.
    WHEN 'ZBDC'.
      PERFORM frm_bdc.
  ENDCASE.

  CALL METHOD gv_grid->refresh_table_display.

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

  LOOP AT  gt_alv INTO gs_alv WHERE  id icon_red_light.
    IF sy-subrc 0.
      MESSAGE '有错误消息数据,请检查红灯信息' TYPE 'E' .
    ENDIF.
  ENDLOOP.
  GV_LINES LINESGT_ALV ).
  LOOP AT gt_alv INTO gs_alv WHERE box 'X'.
  GV_INDEX SY-TABIX.
    PERFORM FRM_INDICATOR USING GV_INDEX.

    PERFORM bdc_dynpro      USING 'SAPLCMFV' '1000'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '=ENTE'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
                                  'MKAL-WERKS'.
    PERFORM bdc_field       USING 'MKAL-WERKS'
                                  gs_alv-werks.  "工厂
    PERFORM bdc_field       USING 'MKAL-MATNR'
                                  gs_alv-matnr"物料编码


    PERFORM bdc_dynpro      USING 'SAPLCMFV' '1000'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '=CREA'.
*输入后检查

    PERFORM bdc_dynpro      USING 'SAPLCMFV' '2000'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
                                  'MKAL_EXPAND-STLAN'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '=PRFG'.
    PERFORM bdc_field       USING 'MKAL_EXPAND-MATNR'
                                  gs_alv-matnr.
    PERFORM bdc_field       USING 'MKAL_EXPAND-VERID'
                                  gs_alv-verid.       "生产版本
    PERFORM bdc_field       USING 'MKAL_EXPAND-TEXT1'
                                  gs_alv-text1.       "生产版本描述
    PERFORM bdc_field       USING 'MKAL_EXPAND-ADATU'
                                  gs_alv-adatu.
    PERFORM bdc_field       USING 'MKAL_EXPAND-BDATU'
                                  '9999.12.31'.                      "     都为99991231
*    PERFORM bdc_field       USING 'MKAL_EXPAND-ALNAL'
*                                  GS_ALV-plnal.
    PERFORM bdc_field       USING 'MKAL_EXPAND-PLNTY'
                                  ' N '.                           "  任务清单类型  默认都为N
    PERFORM bdc_field       USING 'MKAL_EXPAND-PLNNR'
                                  gs_alv-plnnr.

    PERFORM bdc_field       USING 'MKAL_EXPAND-STLAL'
                                  gs_alv-stlal.
    PERFORM bdc_field       USING 'MKAL_EXPAND-STLAN'          " BOM用途  默认都为1
                                  1.
*                                   GS_ALV-STLAN.
    PERFORM bdc_field       USING 'MKAL_EXPAND-ALNAL'
                                  1.
*                                  GS_ALV-ALNAL.               " 组计数器 默认都为1
*检查后回退
    PERFORM bdc_dynpro      USING 'SAPMSSY0' '0120'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '=RW'.
    PERFORM bdc_dynpro      USING 'SAPLCMFV' '2000'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
                                  'MKAL_EXPAND-VERID'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '=CLOS'.

*保存
    PERFORM bdc_dynpro      USING 'SAPLCMFV' '1000'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '=SAVE'.



    CALL TRANSACTION 'C223' USING gt_bdcdata
                             
MODE  p_mode
                             
UPDATE 'S'
                             MESSAGES INTO gt_msgtab.

    IF gt_msgtab[] IS INITIAL.
      gs_alv-mess '创建成功'.
      gs_alv-id icon_green_light.
    ENDIF.
    IF gt_msgtab[] IS NOT INITIAL.

      LOOP AT gt_msgtab."获取MESSAGE
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               gt_msgtab-msgid
            msgnr               
gt_msgtab-msgnr
            msgv1               
gt_msgtab-msgv1
            msgv2               
gt_msgtab-msgv2
            msgv3               
gt_msgtab-msgv3
            msgv4               
gt_msgtab-msgv4
          
IMPORTING
            message_text_output gs_mes.

        IF gt_msgtab-msgtyp 'E' .
          gv_id icon_red_light.
          gv_mess gs_mes-message.
        ELSE.
          gv_mess '创建成功'.
          gv_id icon_green_light.
        ENDIF.

        CLEAR gs_mes,gt_msgtab[].
      ENDLOOP.
      gs_alv-id gv_id.
      gs_alv-mess gv_mess.

    ENDIF.



    MODIFY gt_alv FROM gs_alv.

    CLEAR gt_bdcdata[]gt_msgtab[],gs_alv ,gs_mes ,gv_id,gv_mess.
*
  ENDLOOP.
ENDFORM.
*
*
*----------------------------------------------------------------------*
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
  CLEAR gt_bdcdata.
  gt_bdcdata-program  program.
  gt_bdcdata-dynpro   dynpro.
  gt_bdcdata-dynbegin 'X'.
  APPEND gt_bdcdata.
ENDFORM.
*----------------------------------------------------------------------*
*        INSERT FIELD                                                  *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
*  IF FVAL <> NODATA.
  CLEAR gt_bdcdata.
  gt_bdcdata-fnam fnam.
  gt_bdcdata-fval fval.
  SHIFT gt_bdcdata-fval LEFT DELETING LEADING space.
  APPEND gt_bdcdata.
*  ENDIF.
ENDFORM.

FORM FRM_INDICATOR  USING    P_INDEX.
"data declaration/进度条变量
  CONSTANTS LC_STEP_WIDTH TYPE I VALUE 1." 5.     "Width of each step
  DATALV_STEP       TYPE I VALUE LC_STEP_WIDTH"current step
        LV_LINESC     TYPE C LENGTH 20,           "total records to be processed of string
        LV_INDEX      TYPE I,                     "current records being processed
        LV_PERCENTAGE TYPE F,                     "percentage of processed records
        LV_REMAINING  TYPE I,                     "remaining records to be processed
        LV_TEXT       TYPE C LENGTH 80,           "info displayed at progress indicator
        LV_START      TYPE TIMESTAMP.             "time stamp of process started

  "process logic
  LV_INDEX P_INDEX.

  "Initialization
  IF GV_FLAG IS INITIAL."sy-batch IS INITIAL.
    GV_FLAG 'X'.
    GET TIME STAMP FIELD LV_START.
  ENDIF.

  "show progress indicator/显示进度条
  IF GV_LINES GE LC_STEP_WIDTH AND LV_INDEX >= LV_STEP.
    ADD LC_STEP_WIDTH TO LV_STEP.
    "当前占比%
    LV_PERCENTAGE LV_INDEX / GV_LINES * 100.
    "剩余条目数
    LV_REMAINING GV_LINES LV_INDEX.
    "数字文本强制转换
    WRITE GV_LINES     TO LV_LINESC LEFT-JUSTIFIED.
    WRITE LV_REMAINING TO LV_TEXT   LEFT-JUSTIFIED.
    "进度条(记录)
    CONCATENATE TEXT-904 "'Processing remaining'(005)
     LV_TEXT
     
'/'
     LV_LINESC
     
TEXT-905"'items'(007)
     INTO LV_TEXT SEPARATED BY SPACE.
    "时间记录
    PERFORM ESTIMATE_REMAINING_TIME USING LV_START
                                          LV_INDEX
                                          GV_LINES
                                    
CHANGING LV_TEXT.
    "SAP GUI 进度条
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        PERCENTAGE LV_PERCENTAGE
        
TEXT       LV_TEXT.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ESTIMATE_REMAINING_TIME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_START
*&      --> LV_INDEX
*&      --> LV_LINES
*&      <-- LV_TEXT
*&---------------------------------------------------------------------*
FORM ESTIMATE_REMAINING_TIME USING PV_START TYPE "timestamp of start processing
                                   PV_INDEX TYPE I "current record being processed
                                   PV_TOTAL TYPE I "total number of records to be processed
                                   CHANGING PV_TEXT TYPE C."text to display remaining time

  "Data declaration/进度条时间变量
  DATA:LV_CURRENT   TYPE TIMESTAMP,    "当前时间戳
       LV_DURATION  TYPE TZNTSTMPL,    "持续时间
       LV_REMAINING TYPE C LENGTH 15,  "剩余时间
       LV_HOURS     TYPE C LENGTH 4,   "换算小时数
       LV_MINUTES   TYPE N LENGTH 2,   "换算分钟数
       LV_SECONDS   TYPE N LENGTH 2.   "换算秒数

  "Get current time stamp/获取当前时间戳
  GET TIME STAMP FIELD LV_CURRENT.
  "calculate execution time (so far)/计算持续时间
  TRY.
      CALL METHOD CL_ABAP_TSTMP=>SUBTRACT
        EXPORTING
          TSTMP1 LV_CURRENT
          TSTMP2 
PV_START
        RECEIVING
          R_SECS 
LV_DURATION.
    CATCH CX_PARAMETER_INVALID_RANGE .                  "#EC NO_HANDLER
    CATCH CX_PARAMETER_INVALID_TYPE .                   "#EC NO_HANDLER
  ENDTRY.

  "estimate remaining execution time/剩余执行时间
  LV_REMAINING LV_DURATION / PV_INDEX * PV_TOTAL PV_INDEX ).
  "整小时数
  LV_HOURS     LV_REMAINING DIV 3600.
  "剩余分钟数
  LV_REMAINING LV_REMAINING MOD 3600.
  "整分钟数
  LV_MINUTES   LV_REMAINING DIV 60.
  "剩余秒数
  LV_SECONDS   LV_REMAINING MOD 60.
  "append to the text/文本
  CONCATENATE PV_TEXT
   
' ('
   TEXT-906" 'estimated remaining time:'(006)
   LV_HOURS
   
':'
   LV_MINUTES
   
':'
   LV_SECONDS
   
')'
   INTO PV_TEXT.
ENDFORM" ESTIMATE_REMAINING_TIME

猜你喜欢

转载自blog.csdn.net/z_x_xing_/article/details/90172977
今日推荐