BDC范例

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.

后记:写这些东西只是为了让给自己做个记录。如果你看到了这篇博文希望能对你有那么一点帮助,关于里面的注解只是我自己的理解,不正确的地方,请指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值