SAP:【MIME】使用MIME object

1.介绍

MIME object在我们的开发过程中,使用是非常频繁的了,例如smartforms, webdynpro, EnjoySAP control等。

关于MIME更多可以参考:

http://help.sap.com/saphelp_nw70/helpdata/en/46/bb182fab4811d4968100a0c94260a5/content.htm

这里以一个例子, 记录在web Repository中使用MIME object的过程。

使用两种方式取得MIME object.同时还给出如何通过程序将Object上传至MIME的案例.

2.创建MIME object

Tcode: SMW0(注意也SWO1 Business Object相区分;同时,注意,也SE78 Form Graphics区分)

clip_image001

这里我们选择binary类型,即数据将以binary形式进行保存。

这里仅关注自己的package

clip_image002

可以先check一下MIME type:

Menu: Setting –> MIME Type

clip_image004

我们添加一个关于picture的

clip_image006

注意,它的类型为JPG/GIF,这是很重要的技术信息;另外,它的extension说明了,哪些类型的文件可以匹配到该type下(如import时);

点击创建

clip_image007

这里的object name非常重要,是唯一标识符。

然后点击import:

clip_image009

然后上传

clip_image010

3.ABAP中读取MIME – 方法1

在本程序,我是使用了WWW_GET_MIME_OBJECT这个FM来读取MIME object的content,然后利用得到的content和obj. type得到它的URL,然后供picture control进行展示;

注意: WWW_GET_MIME_OBJECT这个FM已经obsolete;因此该程序虽然可以执行,但不推荐(但是如何得到它的path暂未细仔去寻找);但是,我们目前还是可以通过从该FM内部的逻辑知道很多于我们开发有用的东西,如从哪查找MIME object信息等.

*&———————————————————————*
*& Report  ZTEST_MIME_1
*&
*&———————————————————————*
*& Using MIME Object in ABAP
*&
*&———————————————————————*

REPORT  ZTEST_MIME_1 NO STANDARD PAGE HEADING.

*—Data and Types
DATA:
  ref_container 
type REF TO cl_gui_docking_container,
  ref_picture   
type REF TO cl_gui_picture.
DATA:
  gv_url         
type char256,
  gs_query       
type W3QUERY,
  gt_query       
type TABLE OF W3QUERY,
  gs_html        
type W3HTML,
  gt_html        
type TABLE OF W3HTML,
  gs_mime        
TYPE W3MIME,
  gt_mime        
TYPE TABLE OF W3MIME,
  gv_rtn_cd      
type W3PARAM-RET_CODE,
  gv_ct_typ      
type W3PARAM-CONT_TYPE,
  gv_ct_len      
type W3PARAM-CONT_LEN.

PARAMETERS: name type char50.

AT SELECTION-SCREEN OUTPUT.
*— Show UI in PBO
  
PERFORM show_ui.

START-OF-SELECTION.
WRITE‘Using MIME Object in ABAP’.

*&———————————————————————*
*&      Form  SHOW_UI
*&———————————————————————*
*       Show UI of this program
*———————————————————————-*
FORM SHOW_UI .

*1. Create controls
  
CREATE OBJECT ref_container
    
EXPORTING
      repid     = sy-repid
      dynnr     = sy-dynnr
      side      = ref_container->DOCK_AT_LEFT
      extension = 
420.
  
IF SY-SUBRC ne 0 .
    
“Instantiate container Error!
    
message ‘Instantiate ontainer Error!’ type ‘E’.
  
ENDIF.
*2. Instantiate the Picture
  
IF ref_container is not INITIAL.
    
create OBJECT ref_picture
      
EXPORTING
        parent =  ref_container
      
EXCEPTIONS
        
others = 1.
    
IF SY-SUBRC ne 0 .
      
“Instantiate Picture Error!
      
message ‘Instantiate Picture Error!’ type ‘E’.
    
ENDIF.
  
ENDIF.

*3. Get MIME object
  
clear:gs_query.
  gs_query-NAME = 
‘_OBJECT_ID’.
  gs_query-
VALUE = ‘ZSAPLOGO’.
  
append gs_query to gt_query.
  
CALL FUNCTION ‘WWW_GET_MIME_OBJECT’
    
TABLES
      QUERY_STRING              = gt_query
      HTML                      = gt_html
      MIME                      = gt_mime
    
CHANGING
      RETURN_CODE               = gv_rtn_cd
      CONTENT_TYPE              = gv_ct_typ
      CONTENT_LENGTH            = gv_ct_len
   
EXCEPTIONS
     OBJECT_NOT_FOUND          = 
1
     PARAMETER_NOT_FOUND       = 
2
     
OTHERS                    = 3.
  
IF SY-SUBRC <> 0.
    
“Get MIME object Error!
    
message ‘Get MIME object Error!’ type ‘E’.
  
ENDIF.

*4. Get the URL of MIME object
  
CALL FUNCTION ‘DP_CREATE_URL’
    
EXPORTING
      
TYPE                       = ‘JPG/GIF’
      SUBTYPE                    = cndp_sap_tab_unknown
*     SIZE                       =
*     DATE                       =
*     TIME                       =
*     DESCRIPTION                =
*     LIFETIME                   =
*     CACHEABLE                  =
*     SEND_DATA_AS_STRING        =
*     FIELDS_FROM_APP            =
    
TABLES
      
DATA                       = gt_mime
*     FIELDS                     =
*     PROPERTIES                 =
*     COLUMNS_TO_STRETCH         =
    
CHANGING
      URL                        = gv_url
   
EXCEPTIONS
     DP_INVALID_PARAMETER       = 
1
     DP_ERROR_PUT_TABLE         = 
2
     DP_ERROR_GENERAL           = 
3
     
OTHERS                     = 4.
  
IF SY-SUBRC <> 0.
    
“Get MIME object’s URL Error!
    
message ‘Get MIME object’’s URL Error!’ type ‘E’.
  
ENDIF.

*5. Show the Picture in Picture control
  
CALL METHOD ref_picture->load_picture_from_url
    
EXPORTING
      url = gv_url.

ENDFORM.                    “ SHOW_UI

注意:

(1) 这里,我们需要将screen的展示放在PBO事件中;

(2) 这里,为了使用picture同时不使用dynpro,这里是使用了docking container,具体可以参阅前面的OO UI总结.

(3) 同时,还得注意,该程序是一个纯粹的Report,不是dynpro,它要有”PBO”或者说需要执行PBO的前提条件是:必须要有selection-screen。所以,这里我使用了一个parameter来得到selection-screen。

(4) 在使用DP_CREATE_URL时传递的type即是我们在前面创建MIME object 所 创建的MIME TYPE,但是并不是必须的,也就是说我们可以任意(其实通过coding还可以知道更多的事情,如是否是APPLICATION等).

最后执行结果:

clip_image002

可以发现,我们的MIME对象被成功读取出来.

4.ABAP中读取MIME – 方法2

在本程序,使用以下的MIME:

路径为: /sap/bc/webdynpro/SAP/ZDAUI_MOCKUP/googleLogo.gif

clip_image004[5]

程序

*&———————————————————————*
*& Report  ZTEST_MIME_2
*&
*&———————————————————————*
*& Using MIME Object in ABAP
*& Method 2
*&———————————————————————*

REPORT  ZTEST_MIME_2 NO STANDARD PAGE HEADING.

*—Data and Types
DATA:
  ref_container 
type REF TO cl_gui_docking_container,
  ref_picture   
type REF TO cl_gui_picture.
DATA:
  gv_url        
type char256,
  go_mime_api   
type ref to if_mr_api,
  gv_xstring    
type xstring,
  gv_string     
type string,
  gv_binary     
type i,
  gt_cntbin     
type sdokcntbins.

PARAMETERS: name type char50.

AT SELECTION-SCREEN OUTPUT.
*— Show UI in PBO
  
PERFORM show_ui.

START-OF-SELECTION.
WRITE‘Using MIME Object in ABAP’.

*&———————————————————————*
*&      Form  SHOW_UI
*&———————————————————————*
*       Show UI of this program
*———————————————————————-*
FORM SHOW_UI .

*1. Create controls
  
CREATE OBJECT ref_container
    
EXPORTING
      repid     = sy-repid
      dynnr     = sy-dynnr
      side      = ref_container->DOCK_AT_LEFT
      extension = 
420.
  
IF SY-SUBRC ne 0 .
    
“Instantiate container Error!
    
message ‘Instantiate ontainer Error!’ type ‘E’.
  
ENDIF.
*2. Instantiate the Picture
  
IF ref_container is not INITIAL.
    
create OBJECT ref_picture
      
EXPORTING
        parent =  ref_container
      
EXCEPTIONS
        
others = 1.
    
IF SY-SUBRC ne 0 .
      
“Instantiate Picture Error!
      
message ‘Instantiate Picture Error!’ type ‘E’.
    
ENDIF.
  
ENDIF.

*3. Get MIME object
  go_mime_api = cl_mime_repository_api=>if_mr_api~get_api( ).
*3-1. Get MIME’s Xstring
  go_mime_api->get(
    
exporting
      i_url = 
‘/sap/bc/webdynpro/SAP/ZDAUI_MOCKUP/googleLogo.gif’
  
importing
      e_content = gv_xstring ).
*3-2. Change Xstring to Binary
  
call function ‘SCMS_XSTRING_TO_BINARY’
    
exporting
      
buffer = gv_xstring
    
importing
      output_length = gv_binary
    
tables
      binary_tab   = gt_cntbin.
“*3-2. Change Binary to String
“  call function ’SCMS_BINARY_TO_STRING’
“    exporting
“      input_length = gv_binary
“    importing
“      text_buffer = gv_string
“    tables
“      binary_tab   = gt_cntbin.

*4. Get the URL of MIME object
  
CALL FUNCTION ‘DP_CREATE_URL’
    
EXPORTING
      
TYPE                       = ‘JPG/GIF’
      SUBTYPE                    = cndp_sap_tab_unknown
*     SIZE                       =
*     DATE                       =
*     TIME                       =
*     DESCRIPTION                =
*     LIFETIME                   =
*     CACHEABLE                  =
*     SEND_DATA_AS_STRING        =
*     FIELDS_FROM_APP            =
    
TABLES
      
DATA                       = gt_cntbin “Binary data
*     FIELDS                     =
*     PROPERTIES                 =
*     COLUMNS_TO_STRETCH         =
    
CHANGING
      URL                        = gv_url
   
EXCEPTIONS
     DP_INVALID_PARAMETER       = 
1
     DP_ERROR_PUT_TABLE         = 
2
     DP_ERROR_GENERAL           = 
3
     
OTHERS                     = 4.
  
IF SY-SUBRC <> 0.
    
“Get MIME object’s URL Error!
    
message ‘Get MIME object’’s URL Error!’ type ‘E’.
  
ENDIF.

*5. Show the Picture in Picture control
  
CALL METHOD ref_picture->load_picture_from_url
    
EXPORTING
      url = gv_url.

ENDFORM.                    “ SHOW_UI

注意:

(1) 这里不是利用FM来取得MIME object,而是利用了MIME-proxy class来取得;

(2) 需要传递path参数,可以通过SE80的repository中得到;但这里暂时还未找到如何得到SE78和SMW0的graphic的路径;

最后程序执行结果为:

clip_image002[5]

5.使用ABAP上传图片至MIME

测试程序:

*&———————————————————————*
*& Report  ZTEST_MIME_3
*&
*&———————————————————————*
*& Upload Data into MIME programlly
*&
*&———————————————————————*

REPORT  ZTEST_MIME_3 NO STANDARD PAGE HEADING.

*—Data & Types
DATA: go_mime_api       TYPE REF TO if_mr_api,
      gt_data           
TYPE STANDARD TABLE OF x255,
      gv_filename       
TYPE string,
      gv_path           
TYPE string,
      gv_fullpath       
TYPE string,
      gv_content        
TYPE xstring,
      gv_length         
TYPE i,
      gt_file           
TYPE filetable,
      gs_file           
LIKE LINE OF gt_file,
      gv_rc             
TYPE i,
      gv_user_action    
TYPE i.

*—MIME object path
PARAMETERS: p_path TYPE string
             
DEFAULT ‘SAP/PUBLIC/SAPLOGO.JPG’.

START-OF-SELECTION.
*1. Open File Dialog
cl_gui_frontend_services=>file_open_dialog(
  
CHANGING
    file_table              =  gt_file  
“ Table Holding Selected Files
    user_action             = gv_user_action
    rc                      =  gv_rc  ).
READ TABLE gt_file INTO gs_file INDEX 1.
IF sy-subrc = 0.
  gv_filename = gs_file-filename.
else.
  gv_user_action = cl_gui_frontend_services=>action_cancel.
ENDIF.

*2. Upload the file
cl_gui_frontend_services=>gui_upload(
  
EXPORTING
    filename                = gv_filename  
“Name of file
    filetype                = 
‘BIN’ “Here is ”Binary type”
  
IMPORTING
    filelength              =  gv_length   
“File length
  
CHANGING
    data_tab                = gt_data      
“Transfer table for file contents
  
EXCEPTIONS
    
OTHERS                  = 19 ).
  
IF SY-SUBRC ne 0 .
    
“Upload the file Error!
    
message ‘Upload the file Error!’ type ‘E’.
  
ENDIF.

*3. Convert Binary to Xstring
CALL FUNCTION ‘SCMS_BINARY_TO_XSTRING’
  
EXPORTING
    input_length = gv_length
*    first_line   = 0
*    last_line    = 0
  
IMPORTING
    
buffer       = gv_content
  
TABLES
    binary_tab   = gt_data
  
EXCEPTIONS
    failed       = 
1
    
OTHERS       = 2.
  
IF SY-SUBRC ne 0 .
    
“Convert Binary to Xstring Error!
    
message ‘Convert Binary to Xstring Error!’ type ‘E’.
  
ENDIF.

*4. Get MIME API
  go_mime_api = cl_mime_repository_api=>if_mr_api~get_api( ).

*5. Save the MIME object
  go_mime_api->put(
    
EXPORTING
      i_url                     = p_path
      i_content                 = gv_content
    
EXCEPTIONS
      parameter_missing         = 
1
      error_occured             = 
2
      cancelled                 = 
3
      permission_failure        = 
4
      data_inconsistency        = 
5
      new_loio_already_exists   = 
6
      is_folder                 = 
7
      
OTHERS                    = 8 ).
  
IF SY-SUBRC ne 0 .
    
“Save MIME object Error!
    
message ‘Save MIME object Error!’ type ‘E’.
  
else.
    
“Save MIME object Successfully!
    
message ‘Save MIME object Successfully!’ type ‘S’.
  
ENDIF.

程序执行结果:

clip_image002[7]

F8执行

clip_image003

然后在SE80中MIME Repository中可以发现:

clip_image005

文件上传成功.

6.关于MIME 附加

通过上面几节,对于SAP中的MIME有了一个overview的概念的了解。但是其实在SAP中,大量地存在着repository的概念。

就比如,我们可以直接通过SE80来创建/import MIME对象,可以直接在webdynpro的component中create/import component-dependent的MIME对象,也可以在像上面测试的SMW0中添加Web Repository的MIME对象,还可以像Script/Smartforms中使用SE78添加graphics等等.

同时,MIME作了一个数据存放集市(突然想到有点类似于BW中EDW概念),从上面可以看出,它的肉容大部分是以xstring/Binary的形式进行存放;所以,我们还知道,有很多其他的方式,如cluster table/Dataset等等也可以进行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值