SAP BDC入门

REPORT zme11_bdc
       NO STANDARD PAGE HEADING LINE-SIZE 255.



PARAMETERSdataset(132LOWER 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  ***
DATABEGIN OF record,
* data element: ELIFN
        lifnr_001(010),    "供应商帐户号
* data element: MATNR
        matnr_002(018),    "物料号
* data element: EKORG
        ekorg_003(004),    "采购组织
* data element: EWERK
        werks_004(004),    "工厂
* data element: NORMB
        normb_005(001),    "信息类别(标准)
* data element: ULAND
        urzla_006(003),    "原产地国
* data element: REGIO
        regio_007(003),    "地区
* data element: BSTME
        meins_008(003),    "订单单位
* data element: UMBSZ
        umrez_009(006),    "转换单位
* data element: UMBSN
        umren_010(006),    "转换单位
* data element: PLIFZ
        aplfz_011(003),    "计划交货时间
* data element: BKGRP
        ekgrp_012(003),    "采购组
* data element: NORBM
        norbm_013(017),    "标准数量
* data element: WEBRE
        webre_014(001),    "基于发票验证
* data element: DATTP
        iprkz_015(001),    "转换单位
* data element: IPREI
        netpr_016(014),    "净价
* data element: WAERS
        waers_017(005),    "货币单位
* data element: EPEIN
        peinh_018(006),    "没PC多少钱
* data element: BBPRM
        bprme_019(003),    "数量单位
* data element: BPUMZ
        bpumz_020(006),    "数量单位转换
* data element: BPUMN
        bpumn_021(006),    "数量单位转换
* data element: SPRAS
        dyn_drop_lang_inftxt_022(020),
* data element: SPRAS
        dyn_drop_lang_ordtxt_023(020),
      END OF record.


*** End generated data section ***

DATA: itab_out LIKE TABLE OF record WITH HEADER LINE.

TABLES sscrfields."用于按键

DATA: bdcdata LIKE bdcdata OCCURS WITH HEADER LINE.                "批输入:新表格字段结构 包含bdc的一些屏幕号等内容
DATA: messtab LIKE bdcmsgcoll OCCURS 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
*&---------------------------------------------------------------------*
*       text 选择对话框
*----------------------------------------------------------------------*
*  -->  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
*&---------------------------------------------------------------------*
*       text 读取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             '2'                   "开始行
      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-lifnr_001.
        WHEN'2'.
        MOVE lt_excel-value TO itab_out-matnr_002.
        WHEN'3'.
        MOVE lt_excel-value TO itab_out-ekorg_003.
        WHEN'4'.
        MOVE lt_excel-value TO itab_out-werks_004.
        WHEN'5'.
        MOVE lt_excel-value TO itab_out-meins_008.
        WHEN'6'.
        MOVE lt_excel-value TO itab_out-umrez_009.
        WHEN'7'.
        MOVE lt_excel-value TO itab_out-umren_010.
        WHEN'8'.         
MOVE lt_excel-value TO itab_out-aplfz_011.         
WHEN'9'.         
MOVE lt_excel-value TO itab_out-ekgrp_012.         
WHEN'10'.         
MOVE lt_excel-value TO itab_out-norbm_013.         
WHEN'11'.         
MOVE lt_excel-value TO itab_out-netpr_016.         
WHEN'12'.         
MOVE lt_excel-value TO itab_out-waers_017.         
WHEN'13'.         
MOVE lt_excel-value TO itab_out-peinh_018.         
WHEN'14'.         
MOVE lt_excel-value TO itab_out-bprme_019.         
WHEN'15'.         
MOVE lt_excel-value TO itab_out-bpumz_020.         
WHEN'16'.         
MOVE lt_excel-value TO itab_out-bpumn_021.         
WHEN'17'.     

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
*&---------------------------------------------------------------------*
*       text 将内表数据重复bdc录屏操作
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_upload_data .   


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

LOOP AT itab_out.     

PERFORM bdc_dynpro      USING 'SAPMM06I' '0100'.     
PERFORM bdc_field       USING 'BDC_CURSOR'                                   
'EINA-LIFNR'.     
PERFORM bdc_field       USING 'BDC_OKCODE'                                   
'/00'.     
PERFORM bdc_field       USING 'EINA-LIFNR'                                  itab_out
-lifnr_001.     
PERFORM bdc_field       USING 'EINA-MATNR'                                   itab_out
-matnr_002.     
PERFORM bdc_field       USING 'EINE-EKORG'                                   itab_out
-ekorg_003.     
PERFORM bdc_field       USING 'EINE-WERKS'                                   itab_out
-werks_004.     
PERFORM bdc_field       USING 'RM06I-NORMB'                                   
'X'.     

PERFORM bdc_dynpro      USING 'SAPMM06I' '0101'.     
PERFORM bdc_field       USING 'BDC_CURSOR'                                   
'EINA-MAHN1'.     
PERFORM bdc_field       USING 'BDC_OKCODE'                                   
'/00'.     
PERFORM bdc_field       USING 'EINA-URZLA'                                   itab_out
-urzla_006.     
PERFORM bdc_field       USING 'EINA-REGIO'                                  itab_out
-regio_007.     
PERFORM bdc_field       USING 'EINA-MEINS'                                   itab_out
-meins_008.     
PERFORM bdc_field       USING 'EINA-UMREZ'                                   itab_out
-umrez_009.     
PERFORM bdc_field       USING 'EINA-UMREN'                                   itab_out
-umren_010.     
PERFORM bdc_dynpro      USING 'SAPMM06I' '0102'.     
PERFORM bdc_field       USING 'BDC_CURSOR'                                   
'EINE-NETPR'.     
PERFORM bdc_field       USING 'BDC_OKCODE'                                   
'/00'.     
PERFORM bdc_field       USING 'EINE-APLFZ'                                   itab_out
-aplfz_011.     
PERFORM bdc_field       USING 'EINE-EKGRP'                                   itab_out
-ekgrp_012.     
PERFORM bdc_field       USING 'EINE-NORBM'                                   itab_out
-norbm_013.     
PERFORM bdc_field       USING 'EINE-WEBRE'                                   itab_out
-webre_014.     
PERFORM bdc_field       USING 'EINE-IPRKZ'                                   itab_out
-iprkz_015.     
PERFORM bdc_field       USING 'EINE-NETPR'                                   itab_out
-netpr_016.     
PERFORM bdc_field       USING 'EINE-WAERS'                                   itab_out
-waers_017.     
PERFORM bdc_field       USING 'EINE-PEINH'                                   itab_out
-peinh_018.     
PERFORM bdc_field       USING 'EINE-BPRME'                                   itab_out
-bprme_019.     
PERFORM bdc_field       USING 'EINE-BPUMZ'                                   itab_out
-bpumz_020.     
PERFORM bdc_field       USING 'EINE-BPUMN'                                   itab_out
-bpumn_021.     
PERFORM bdc_dynpro      USING 'SAPMM06I' '0105'.     
PERFORM bdc_field       USING 'BDC_CURSOR'                                   
'EINE-ANGNR'.     
PERFORM bdc_field       USING 'BDC_OKCODE'                                   
'/00'.     
PERFORM bdc_dynpro      USING 'SAPMM06I' '0123'.     
PERFORM bdc_field       USING 'BDC_CURSOR'                                   
'INFREC_TEXT_DYN-DYN_DROP_LANG_INFTXT'.     
PERFORM bdc_field       USING 'BDC_OKCODE'                                   
'/00'.     
PERFORM bdc_field       USING 'INFREC_TEXT_DYN-DYN_DROP_LANG_INFTXT'                                   itab_out
-dyn_drop_lang_inftxt_022.     
PERFORM bdc_field       USING 'INFREC_TEXT_DYN-DYN_DROP_LANG_ORDTXT'                                   itab_out
-dyn_drop_lang_ordtxt_023.     
PERFORM bdc_dynpro      USING 'SAPLSPO1' '0100'.     
PERFORM bdc_field       USING 'BDC_OKCODE'                                   
'=YES'.     
PERFORM bdc_transaction USING 'ME11' 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-lifnr_001,l_mstring.         
CLEAR: itab_out.       
ENDIF.     
ENDLOOP.   
ENDIF.   
REFRESH bdcdata.

ENDFORM.                    " BDC_TRANSACTION
*&---------------------------------------------------------------------*
*&      Form  BDC_DYNPRO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0420   text
*      -->P_0421   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
*&---------------------------------------------------------------------*
*       text 初始化按钮 为按钮添加图标和文本
*----------------------------------------------------------------------*
*  -->  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 VALUE 'D:\test\' ,   "C:\Users\yang\Desktop\文件名          lc_path      
TYPE  string VALUE 'D:\test\' "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 
'ZTEST.XLS'.   
CONCATENATE lc_filename '_' sy-datum '_' sy-uzeit               
INTO lc_filename.  "给模板命名   
CALL METHOD cl_gui_frontend_services=>file_save_dialog "调用保存对话框     
EXPORTING       default_extension    
'XLSX'       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 AND relid 'MI' AND objid = p_objid.

*检查表wwwdata中是否存在所指定的模板文件     
IF sy-subrc NE 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.                    "

posted @ 2017-03-09 16:58  快乐VS神  阅读(297)  评论(0编辑  收藏  举报