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区分)
这里我们选择binary类型,即数据将以binary形式进行保存。
这里仅关注自己的package
可以先check一下MIME type:
Menu: Setting –> MIME Type
我们添加一个关于picture的
注意,它的类型为JPG/GIF,这是很重要的技术信息;另外,它的extension说明了,哪些类型的文件可以匹配到该type下(如import时);
点击创建
这里的object name非常重要,是唯一标识符。
然后点击import:
然后上传
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等).
最后执行结果:
可以发现,我们的MIME对象被成功读取出来.
4.ABAP中读取MIME – 方法2
在本程序,使用以下的MIME:
路径为: /sap/bc/webdynpro/SAP/ZDAUI_MOCKUP/googleLogo.gif
程序
*&———————————————————————* *& 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的路径;
最后程序执行结果为:
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. |
程序执行结果:
F8执行
然后在SE80中MIME Repository中可以发现:
文件上传成功.
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等等也可以进行。