根据业务需求,将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(200) TYPE 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(200) TYPE 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返回信息表
TYPES: BEGIN OF ty_message,
message(100) TYPE c,
ztype TYPE c,
END OF ty_message.
DATA:gt_mes TYPE TABLE OF ty_message,
gs_mes TYPE ty_message.
*&---定义ALV显示的字段列及其描述等属性
DATA: gt_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 strlen( lv_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 0 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 .
DATA: lt_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(255) TYPE c.
DATA : lv_mess3(255) TYPE c.
DATA : lv_mess2(255) TYPE 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.
DATA: gv_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 = LINES( GT_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
DATA: LV_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 P "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