BDC范例
事务代码:SHDB
上传文件:SMW0
代码:
*&---------------------------------------------------------------------*
*& Report ZSDR023
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsdr023.
*----------------------------------------------------------------------*
*表声明
*----------------------------------------------------------------------*
TABLES:sscrfields.
*----------------------------------------------------------------------*
*类型池声明
*----------------------------------------------------------------------*
TYPE-POOLS:slis,icon.
*----------------------------------------------------------------------*
* 类型定义
*----------------------------------------------------------------------*
"定义ALV
TYPES:BEGIN OF ty_upload,
vbeln TYPE vbak-vbeln,
kunnr TYPE vbak-kunnr,
END OF ty_upload.
TYPES:BEGIN OF ty_alv,
vbeln TYPE vbak-vbeln,
kunnr TYPE vbak-kunnr,
msg TYPE char100,
icon TYPE icon_d,
END OF ty_alv.
*----------------------------------------------------------------------*
* 声明内表和工作区
*----------------------------------------------------------------------*
DATA:gt_upload TYPE TABLE OF ty_upload,
gs_upload TYPE ty_upload.
DATA:gt_alv TYPE TABLE OF ty_alv,
gs_alv TYPE ty_alv.
DATA: "Variable
g_index TYPE i, "顺序号
g_lines TYPE i, "内表行数
g_datum TYPE sy-datum, "日期
g_msgtx TYPE bapi_msg, "消息文本
g_msgtx1 TYPE bapi_msg. "消息文本
*BDC
DATA: "Variable for BDC
gs_bdcdata TYPE bdcdata, "BDC Data
gt_bdcdata TYPE TABLE OF bdcdata, "BDC Data
gs_option TYPE ctu_params, "BDC Option
g_msgtext TYPE bapi_msg, "消息文本
gs_bdcmsg TYPE bdcmsgcoll, "BDC Return Message
gt_bdcmsg TYPE TABLE OF bdcmsgcoll. "BDC Return Message
*----------------------------------------------------------------------*
*ALV参数声明
*----------------------------------------------------------------------*
"ALV参数定义
DATA:gt_fieldcat TYPE lvc_t_fcat, "字段目录内表
gs_fieldcat TYPE lvc_s_fcat, "字段目录工作区
gs_layout TYPE lvc_s_layo. "用于定义ALV表单的相关格式、属性
*&---alv 表头宏
DEFINE init_fieldcat.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-coltext = &2.
gs_fieldcat-ref_table = &3.
gs_fieldcat-ref_field = &4.
gs_fieldcat-qfieldname = &5.
gs_fieldcat-edit = &6.
gs_fieldcat-hotspot = &7.
gs_fieldcat-key = &8.
gs_fieldcat-cfieldname = &9.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
* 全局变量声明
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
*选 择 屏 幕 定 义 块
*----------------------------------------------------------------------*
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_file LIKE rlgrap-filename MODIF ID m1. "上传文件名
SELECTION-SCREEN: END OF BLOCK b1.
*----------------------------------------------------------------------*
*初 始 化 块
*----------------------------------------------------------------------*
SELECTION-SCREEN: FUNCTION KEY 1.
INITIALIZATION.
sscrfields-functxt_01 = '销售订单客户号修改模板'. "定义按钮
*----------------------------------------------------------------------*
*选 择 屏 幕 字 段 处 理 块
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
"下载模板
CASE sscrfields-ucomm.
WHEN 'FC01'."系统预留的功能码
PERFORM download_excel USING 'ZSDR023' '销售订单批量修改客户号模板'.
WHEN OTHERS.
ENDCASE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
"选择路径
PERFORM frm_choose_file.
*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
*----------------------------------------------------------------------*
* ALV逻辑流
*----------------------------------------------------------------------*
START-OF-SELECTION.
*&---导入数据
PERFORM frm_upload_data.
*&---设置ALV输出字段
PERFORM frm_fieldcat.
*&---设置ALV输出格式
PERFORM init_layout.
*&---设置ALV显示
PERFORM frm_display_alv.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_EXCEL
*&---------------------------------------------------------------------*
* text 下载模板
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM download_excel USING objid fname.
DATA: lv_fname TYPE string,
lv_title TYPE string,
lv_path TYPE string VALUE 'D:/',
lv_fpath TYPE string VALUE 'D:/',
pv_file TYPE rlgrap-filename . "下载文件
DATA: p_objid(20) TYPE c.
DATA: ls_wdatb LIKE wwwdatatab.
DATA: lv_subrc TYPE sy-subrc.
DATA: gv_msg TYPE string.
p_objid = objid.
lv_fname = fname.
CONCATENATE lv_fname '下载' INTO lv_title.
"保存文件
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = lv_title
default_extension = 'xls'
default_file_name = lv_fname
initial_directory = 'D:\'
file_filter = 'EXCEL文件(*.xls)||全部文件 (*.*)||'
prompt_on_overwrite = 'X'
CHANGING
filename = lv_fname
path = lv_path
fullpath = lv_fpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
"判断文件模板是否存在
SELECT SINGLE
relid
objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF ls_wdatb
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = p_objid. "P_OBJID就是传入模板的参数
IF ls_wdatb IS INITIAL.
MESSAGE '模板文件不存在!' TYPE 'E'.
ELSE.
pv_file = lv_fpath.
IF pv_file IS NOT INITIAL.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_wdatb
destination = pv_file
IMPORTING
rc = lv_subrc.
IF lv_subrc NE 0.
MESSAGE '模板下载失败!' TYPE 'E'.
ELSE.
CLEAR gv_msg.
CONCATENATE '模板下载到本地文件' pv_file INTO gv_msg.
MESSAGE gv_msg TYPE 'S' .
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. " DOWNLOAD_EXCEL
*&---------------------------------------------------------------------*
*& Form FRM_CHOOSE_FILE
*&---------------------------------------------------------------------*
* text 选择文件
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_choose_file .
CALL FUNCTION 'TB_LIMIT_WS_FILENAME_GET'
EXPORTING
def_path = ''
mask = ',Excel Files,*.xls,All Files,*.*.'
title = '选择导入Excel'
IMPORTING
filename = p_file
EXCEPTIONS
selection_cancel = 1
selection_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* MESSAGE '请选择上传文件!' TYPE 'E'.
ENDIF.
ENDFORM. "FRM_CHOOSE_FILE
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
* text 上传文件数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_upload_data .
DATA: lt_filename TYPE rlgrap-filename. "上传数据
DATA:gt_data TYPE TABLE OF zalsmex_tabline WITH HEADER LINE.
FIELD-SYMBOLS: <fs>.
CLEAR:lt_filename,gt_data[],gt_upload[].
lt_filename = p_file. "路径
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = lt_filename
i_begin_col = '1'
i_begin_row = '2'
i_end_col = '128'
i_end_row = '99999'
TABLES
intern = gt_data
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
*&----将excel加载入内表中
IF gt_data[] IS NOT INITIAL.
LOOP AT gt_data.
ON CHANGE OF gt_data-row.
IF sy-tabix NE 1.
APPEND gs_upload TO gt_upload.
CLEAR gs_upload.
ENDIF.
ENDON.
ASSIGN COMPONENT gt_data-col OF STRUCTURE gs_upload TO <fs>.
<fs> = gt_data-value.
ENDLOOP.
APPEND gs_upload TO gt_upload.
CLEAR gs_upload.
ELSE.
MESSAGE 'EXCEL文档中没有数据或EXCEL字段与程序字段不对应,请检查!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
MOVE-CORRESPONDING gt_upload TO gt_alv.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM init_layout .
CLEAR gs_layout.
gs_layout-zebra = 'X'. " 斑马线
gs_layout-sel_mode = 'A'. " 设置行模式"
gs_layout-cwidth_opt = 'A'. " 自动调整ALVL列宽
* gs_layout-box_fname = 'BOX'. " left selected flag
* gs_layout-stylefname = 'EDIT'. " left selected flag
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_fieldcat .
*&---调用结构获取ALV 表头
CLEAR gs_fieldcat.
CLEAR gt_fieldcat[].
FIELD-SYMBOLS:<lfs> LIKE LINE OF gt_fieldcat.
init_fieldcat 'ICON' '状态 ' '' '' '' '' '' '' ''.
init_fieldcat 'MSG' '消息 ' '' '' '' '' '' '' ''.
init_fieldcat 'VBELN' '销售订单 ' 'VBAK' 'VBELN' '' '' '' '' ''.
init_fieldcat 'KUNNR' '客户号 ' 'VBAK' 'KUNNR' '' '' '' '' ''.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
*&---ALV 显示函数
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid " 当前程序
is_layout_lvc = gs_layout " 界面格式
it_fieldcat_lvc = gt_fieldcat[] " 字段属性
i_callback_pf_status_set = 'FRM_PF_STATUS' " GUI状态
i_callback_user_command = 'FRM_USER_COMMAND' " 响应状态触发事件
* i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE' " 页头
i_default = 'X' " 用户是否可以定义默认的布局
i_save = 'U' " 表格布局
* it_events = it_events " 事件
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 frm_pf_status
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM frm_pf_status USING rt_extab TYPE slis_t_extab.
*&---设置GUI状态
SET PF-STATUS 'STANDARD' .
ENDFORM. "FRM_PF_STATUS
*&---------------------------------------------------------------------*
*& Form frm_user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
*&---刷新屏幕数据到内表
DATA: lr_grid1 TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid1.
CALL METHOD lr_grid1->check_changed_data.
*&---按钮功能实现
CASE r_ucomm.
WHEN 'OK'. "----执行
PERFORM frm_msg_display.
WHEN OTHERS.
ENDCASE.
****************************** 按钮事件结束 ****************************
*&---调用后数据保存处理
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid1.
CALL METHOD lr_grid1->check_changed_data.
*&---刷新ALV 显示值
rs_selfield-refresh = 'X' .
ENDFORM. "frm_user_command
*&---------------------------------------------------------------------*
*& Form FRM_MSG_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_msg_display .
DATA:lv_mode TYPE ctu_mode.
lv_mode = 'N'.
DATA:salesdocument TYPE bapivbeln-vbeln,
order_header_in TYPE bapisdh1,
order_header_inx TYPE bapisdh1x.
DATA:lt_return TYPE TABLE OF bapiret2,
ls_order_item_in TYPE bapisditm,
ls_order_item_inx TYPE bapisditmx,
lt_order_item_in TYPE TABLE OF bapisditm,
lt_order_item_inx TYPE TABLE OF bapisditmx,
ls_schedule_lines TYPE bapischdl,
lt_schedule_lines TYPE TABLE OF bapischdl,
ls_schedule_linesx TYPE bapischdlx,
lt_schedule_linesx TYPE TABLE OF bapischdlx,
ls_partners TYPE bapiparnr,
lt_partners TYPE TABLE OF bapiparnr.
LOOP AT gt_alv INTO gs_alv.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_alv-kunnr
IMPORTING
output = gs_alv-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_alv-vbeln
IMPORTING
output = gs_alv-vbeln.
PERFORM bdc_dynpro USING 'SAPMV45A' '0102'.
PERFORM bdc_field USING 'BDC_CURSOR'
'VBAK-VBELN'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENT2'.
PERFORM bdc_field USING 'VBAK-VBELN'
gs_alv-vbeln.
PERFORM bdc_dynpro USING 'SAPMV45A' '4001'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'BDC_CURSOR'
'KUWEV-KUNNR'.
PERFORM bdc_dynpro USING 'SAPMV45A' '4001'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=SICH'.
PERFORM bdc_field USING 'KUAGV-KUNNR'
gs_alv-kunnr.
PERFORM bdc_field USING 'KUWEV-KUNNR'
gs_alv-kunnr.
PERFORM bdc_field USING 'BDC_CURSOR'
'RV45A-MABNR(02)'.
PERFORM bdc_transaction USING 'VA02' lv_mode.
IF sy-subrc = 0."Success
COMMIT WORK AND WAIT.
"消息类型
gs_alv-icon = icon_green_light."绿灯
gs_alv-msg = '销售订单客户号修改成功!'.
ELSE."Error
"合并错误消息
CLEAR g_msgtx.
LOOP AT gt_bdcmsg[] INTO gs_bdcmsg
WHERE msgtyp = 'A' OR msgtyp = 'E' OR msgtyp = 'X' OR msgtyp = 'S'.
CLEAR g_msgtx1.
MESSAGE ID gs_bdcmsg-msgid
TYPE gs_bdcmsg-msgtyp
NUMBER gs_bdcmsg-msgnr
WITH gs_bdcmsg-msgv1
gs_bdcmsg-msgv2
gs_bdcmsg-msgv3
gs_bdcmsg-msgv4
INTO g_msgtx1.
CONCATENATE g_msgtx g_msgtx1 '。'
INTO g_msgtx.
ENDLOOP.
gs_alv-icon = icon_red_light."红灯
gs_alv-msg = g_msgtx.
ENDIF.
MODIFY gt_alv FROM gs_alv.
CLEAR:gt_bdcmsg[],g_msgtx1,g_msgtx,gs_alv,gt_bdcdata,gs_bdcdata,gt_bdcmsg[].
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_BDC_OPTION
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GS_OPTION
*&---------------------------------------------------------------------*
FORM f_bdc_option USING us_option TYPE ctu_params.
CLEAR us_option.
* us_option-dismode = 'N'. " Display Mode
us_option-dismode = 'A'. " Display Mode
us_option-updmode = 'S'. " Upload Mode
us_option-defsize = 'X'. " Default size
us_option-racommit = 'X'. " Racommit
us_option-nobinpt = 'X'. " Not a batch input session
ENDFORM.
FORM bdc_dynpro USING program dynpro.
CLEAR gs_bdcdata.
gs_bdcdata-program = program.
gs_bdcdata-dynpro = dynpro.
gs_bdcdata-dynbegin = 'X'.
APPEND gs_bdcdata TO gt_bdcdata.
ENDFORM.
FORM bdc_field USING fnam fval.
CLEAR gs_bdcdata.
gs_bdcdata-fnam = fnam.
gs_bdcdata-fval = fval.
APPEND gs_bdcdata TO gt_bdcdata.
ENDFORM.
FORM bdc_transaction USING u_tcode u_mode.
CALL TRANSACTION u_tcode USING gt_bdcdata
MODE u_mode
UPDATE 'S'
MESSAGES INTO gt_bdcmsg.
ENDFORM.
后记:写这些东西只是为了让给自己做个记录。如果你看到了这篇博文希望能对你有那么一点帮助,关于里面的注解只是我自己的理解,不正确的地方,请指出。