ABAP BDC MM02实例

该实例整合了下载模板功能,可以下载模板,按照模板格式填写excel数据,然后根据这些数据修改物料信息。实际做的时候先录屏,然后才能得出模板的。

效果:


大体步骤:

1.shdb录屏

2.程序实现

上传路径(绘制屏幕)

上传文件

批导实现

反馈结果处理(显示)


录屏就省略了,得到程序代码后,我们只要数据结构定义和 perform bdc_dynpro ,perform bdc_field这两部分内容。即:


---------------------------------------------------------------------------------



根据自动生成的record结构,可以自己制作模板:




代码:

report ZDBC
       no standard page heading line-size 255.

*include bdcrecx1.
"这里不使用系统自动生成的屏幕
*parameters: dataset(132) lower case.
***    DO NOT CHANGE - the generated data section - DO NOT CHANGE    ***
*
*   If it is nessesary to change the data section use the rules:
*   1.) Each definition of a field exists of two lines
*   2.) The first line shows exactly the comment
*       '* data element: ' followed with the data element
*       which describes the field.
*       If you don't have a data element use the
*       comment without a data element name
*   3.) The second line shows the fieldname of the
*       structure, the fieldname must consist of
*       a fieldname and optional the character '_' and
*       three numbers and the field length in brackets
*   4.) Each field must be type C.
*
*** Generated data section with specific formatting - DO NOT CHANGE  ***
"录制自动生成
data: begin of record,
* data element: MATNR
        MATNR_001(018),   "RMMG1 物料主数据维护:初始参数-原材料  MATNR即物料编号
* data element: XFELD
        KZSEL_01_002(001), "MSICHTAUSW 视图选择的帮助结构:物料主记录 表 KZSEL复选框
* data element: MAKTX
        MAKTX_003(040), "物料描述-物料描述(短文本)
* data element: MEINS
        MEINS_004(003), "常规物料数据-基本计量单位
* data element: MATKL
        MATKL_005(009),  "物料组
* data element: MTPOS_MARA
        MTPOS_MARA_006(004), "普通项目类别组
      end of record.

*** End generated data section ***

DATA: itab_out LIKE TABLE OF record WITH HEADER LINE.

TABLES SSCRFIELDS."用于按键

data: bdcdata like bdcdata occurs 0 with header line."批输入:新表格字段结构 包含bdc的一些屏幕号等内容
data: messtab like bdcmsgcoll occurs 0 with header line. " SAP 系统中的信息表

*** 绘屏 ***
SELECTION-SCREEN begin of block blk with frame title text-001.
SKIP 1.
SELECTION-SCREEN BEGIN OF LINE.
 SELECTION-SCREEN PUSHBUTTON 1(20) but1 USER-COMMAND download. " 定义搜索按钮
SELECTION-SCREEN END OF LINE.
SKIP 1.
parameters:p_typ  type ctu_mode obligatory default 'N', "批处理模式
           p_file like rlgrap-filename.
SELECTION-SCREEN end of block blk.

INITIALIZATION.
PERFORM frm_init_button. "初始化下载模板按钮

AT SELECTION-SCREEN . 
  IF SSCRFIELDS-UCOMM = 'DOWNLOAD'. " 下载模板按钮响应
    PERFORM temp_excel_get USING 'ZBDC_YHY' ."从服务器下载模板
    CLEAR SSCRFIELDS-UCOMM.
ENDIF.

"为了能有选择文件对话框
at selection-screen on value-request for p_file.
  perform frm_select_files.  



START-OF-SELECTION.
  perform frm_get_data.

END-OF-SELECTION.  "START-OF-SELECTION.执行完 但输出屏幕未显示之前
  perform frm_upload_data.

*&---------------------------------------------------------------------*
*&      Form  FRM_SELECT_FILES
*&---------------------------------------------------------------------*
*       选择文件对话框
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SELECT_FILES .
  data: l_filetab type filetable,
        l_waftab  like line of l_filetab,
        l_rc      type i.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = '打开文件'
      initial_directory       = 'C:/'
    CHANGING
      file_table              = l_filetab
      rc                      = l_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      others                  = 5.
  if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
    with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    exit.
  else.
    "l_filetab是个内表结构,我们现在只能单选,所以只有第一条数据。还可以多选的。
    read table l_filetab into l_waftab index 1.
    p_file = l_waftab-filename.
    clear: l_filetab,
    l_waftab.
  endif.

ENDFORM.                    " FRM_SELECT_FILES

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       读取excel数据到指定内表
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
  data lt_excel type table of alsmex_tabline with header line.
  data l_index  like sy-tabix.
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_row             = '3'     "开始行
      i_begin_col             = '1'     "开始列 注意实际需求 改动
      i_end_row               = '50000'
      i_end_col               = '50'
    TABLES
      intern                  = lt_excel  "lt_excel 有3个字段: row col value.即它的一行只存储一个单元格的数据
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      others                  = 3.
*&& 将EXCEL格式中的数据重新整理导入到内表TAB_LOAD中
  loop at lt_excel.
    move lt_excel-col to l_index.
    case l_index.
        when'1'.
        move lt_excel-value to itab_out-MATNR_001.
        when'2'.
        move lt_excel-value to itab_out-KZSEL_01_002.
        when'3'.
        move lt_excel-value to itab_out-MAKTX_003.
        when'4'.
        move lt_excel-value to itab_out-MEINS_004.
        when'5'.
        move lt_excel-value to itab_out-MATKL_005.
        when'6'.
        move lt_excel-value to itab_out-MTPOS_MARA_006.
    endcase.

    at end of row."设置内表循环触发条件,AT END OF F1: 如果字段F及F的左则全部字段的数据,与下一行数据不一致时,则执行代码。
                   "这里的row是lt_excel里面的字段 即row=1,2,3,....取完之后才构成完整的一条itab_out数据
      append itab_out.
      clear: itab_out.
    endat.
  endloop.

ENDFORM.                    " FRM_GET_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*       将内表数据重复bdc录屏操作
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_UPLOAD_DATA .
*  DATA: MESS(100) TYPE C.

  IF ITAB_OUT[] IS INITIAL.
    MESSAGE '没有数据!' TYPE 'E'.
  ENDIF.

  LOOP AT itab_out.

      perform bdc_dynpro      using 'SAPLMGMM' '0060'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'RMMG1-MATNR'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '=AUSW'.
      perform bdc_field       using 'RMMG1-MATNR'
                                    itab_out-MATNR_001.
      perform bdc_dynpro      using 'SAPLMGMM' '0070'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'MSICHTAUSW-DYTXT(01)'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '=ENTR'.
      perform bdc_field       using 'MSICHTAUSW-KZSEL(01)'
                                    itab_out-KZSEL_01_002.
      perform bdc_dynpro      using 'SAPLMGMM' '4004'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '/00'.
      perform bdc_field       using 'MAKT-MAKTX'
                                    itab_out-MAKTX_003.
      perform bdc_field       using 'BDC_CURSOR'
                                    'MARA-MEINS'.
      perform bdc_field       using 'MARA-MEINS'
                                    itab_out-MEINS_004.
      perform bdc_field       using 'MARA-MATKL'
                                    itab_out-MATKL_005.
      perform bdc_field       using 'MARA-MTPOS_MARA'
                                    itab_out-MTPOS_MARA_006.
      perform bdc_dynpro      using 'SAPLSPO1' '0300'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '=YES'.
       perform bdc_transaction using 'MM02' p_typ 'S'.

  ENDLOOP.

ENDFORM.                    " FRM_UPLOAD_DATA

*&---------------------------------------------------------------------*
*&      Form  BDC_TRANSACTION
*&---------------------------------------------------------------------*
*       执行事务代码 并返回处理结果
*----------------------------------------------------------------------*
*      -->P_1128   text
*      -->P_1129   text
*      -->P_1130   text
*----------------------------------------------------------------------*
form bdc_transaction using tcode p_typ cupdate.
  data: l_mstring(480).
  data: l_subrc like sy-subrc..
  refresh messtab.
  call transaction tcode using   bdcdata
                         mode    p_typ
                         update  cupdate  "更新模式 f1可看
                   messages into messtab.

  if lines( messtab ) > 0. "如更新一条记录 可能改动多个位置 会有多个消息 我们只要最后一个消息即可
    loop at messtab.
      if messtab-msgtyp ne 'E' and messtab-msgtyp ne 'S'.
        continue.
      endif.
      select single text from t100 into l_mstring
         where sprsl = messtab-msgspra
           and arbgb = messtab-msgid
           and msgnr = messtab-msgnr.
      if sy-subrc = 0.
        if l_mstring cs '&1'. "Contains String: True, if the content of operand2 is contained in operand1.
          replace '&1' with messtab-msgv1 into l_mstring.
          replace '&2' with messtab-msgv2 into l_mstring.
          replace '&3' with messtab-msgv3 into l_mstring.
          replace '&4' with messtab-msgv4 into l_mstring.
        else.
          replace '&' with messtab-msgv1 into l_mstring.
          replace '&' with messtab-msgv2 into l_mstring.
          replace '&' with messtab-msgv3 into l_mstring.
          replace '&' with messtab-msgv4 into l_mstring.
        endif.
        condense l_mstring.
        write: / itab_out-MATNR_001,l_mstring.
        CLEAR: itab_out.
      endif.
    endloop.
  endif.
  refresh bdcdata.

endform.                    " BDC_TRANSACTION


*&---------------------------------------------------------------------*
*&      Form  BDC_DYNPRO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PROGRAM    text
*      -->DYNPRO     text
*----------------------------------------------------------------------*
form bdc_dynpro using program dynpro.
  clear bdcdata.
  bdcdata-program = program.
  bdcdata-dynpro = dynpro.
  bdcdata-dynbegin = 'X'.
  append bdcdata.

endform.                    " BDC_DYNPRO

*&----------------------------------------------------------------
form bdc_field using fnam fval.
  clear bdcdata.
  bdcdata-fnam = fnam.
  bdcdata-fval = fval.
  append bdcdata.
endform.                    " BDC_FIELD

*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_BUTTON
*&---------------------------------------------------------------------*
*       初始化按钮 为按钮添加图标和文本
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_INIT_BUTTON .
CALL FUNCTION 'ICON_CREATE'
  EXPORTING
    NAME                       = 'ICON_DOCUMENT'
    TEXT                        = '下载模板'
*   INFO                        = ' '
*   ADD_STDINF                  = 'X'
 IMPORTING
   RESULT                      = but1
* EXCEPTIONS
*   ICON_NOT_FOUND              = 1
*   OUTPUTFIELD_TOO_SHORT       = 2
*   OTHERS                      = 3
 .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.

ENDFORM.                    " FRM_INIT_BUTTON

*下载EXCEL模板FORM
*----------------------------------------------------------------------*
*      -->VALUE(templat)    上传的excel模板名
*      <--VALUE(ls_destination)    返回excel文件模板对象
*
*----------------------------------------------------------------------*
FORM  temp_excel_get USING template TYPE any.
  DATA:  lo_objdata LIKE wwwdatatab,
         lo_mime LIKE w3mime,
         lc_filename  TYPE string VALUE 'dbc',"默认名
         lc_fullpath  TYPE string ,  "C:\Users\yang\Desktop\文件名
         lc_path      TYPE  string , "C:\Users\yang\Desktop\   不包括文件名
         ls_destination LIKE rlgrap-filename,
         ls_objnam TYPE string,
         li_rc LIKE sy-subrc,
         ls_errtxt TYPE string.
  DATA:p_objid TYPE wwwdatatab-objid,
       p_dest LIKE sapb-sappfad.
   p_objid = template.
  CONCATENATE lc_filename '_' SY-DATUM '_' SY-UZEIT
              INTO lc_filename.  "给模板命名
  CALL METHOD cl_gui_frontend_services=>file_save_dialog "调用保存对话框
    EXPORTING
      default_extension    = 'XLS'
      default_file_name    = lc_filename
    CHANGING
      filename             = lc_filename
      path                 = lc_path
      fullpath             = lc_fullpath
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF lc_fullpath = ''.
    MESSAGE  '不能打开excel' TYPE 'E'.
  ENDIF.
  IF sy-subrc = 0.
    p_dest = lc_fullpath.
*    concatenate p_objid '.XLS' into ls_objnam.
    CONDENSE ls_objnam NO-GAPS.
    SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF lo_objdata
           WHERE srtf2 = 0 AND relid = 'MI' AND objid = p_objid.

*检查表wwwdata中是否存在所指定的模板文件
    IF sy-subrc NE 0 OR lo_objdata-objid EQ space."如果不存在,则给出错误提示
      CONCATENATE '模板文件' ls_objnam '不存在' INTO ls_errtxt.
      MESSAGE ls_errtxt TYPE 'I'.
    ENDIF.
    ls_destination = p_dest. "保存路径

*如果存在,调用DOWNLOAD_WEB_OBJECT 函数下载模板到路径下
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = lo_objdata
        destination = ls_destination
      IMPORTING
        rc          = li_rc.
    IF li_rc NE 0.
      CONCATENATE '模板文件:' ls_objnam '下载失败' INTO ls_errtxt.
      MESSAGE ls_errtxt TYPE 'E'.
    ENDIF.
    p_file = ls_destination.  "fname 全局 注意
  ENDIF.
ENDFORM.                    "fm_excel












  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值