Register Login

Use BDS to Store Files Like Excel JPG

Updated May 19, 2018

BDS or MIME Repository to keep EXECL JPGs etc inside SAP
* Use SE80+Mime Repository to create a Folder ZJNC in PUBLIC with your image

* Program yjncMimeTest shows how easy it is to use Interface IF_MR_API
* The MIME way is small and crisp
* Thanks to
* https://forums.sdn.sap.com/thread.jspa?threadID=266657&tstart=15
* http://www.sapdevelopment.co.uk/graphics/add_image.htm

*================================================================================
* yjncBDStest is a Simple Maintenance of BDS
* Idea is to use BDS to store files like Excel JPG
* I prefer this now over CLUSTER & IMPORT/EXPORT
* as with BDN(Tcode OAOR) it is possible to transport BDS content

* Based on
http://smoschid.tripod.com/APPL_SAP_SOURCE_CODE/Z_BUSINESS_DOC_SERVICE.TXT
* by Stefanos Moschidis - SAP Certified Technical Consultant

* create a screen 100 with a container MCONTAINER
* GuiTitle TITLEBAR100
* GuiStatus STATUS100 weith 1 EXIT button

* SAP Desktop Office Integration Using ABAP Objects
*
http://www.intelligententerprise.com/channels/applications/feature/archive/ehre.jhtml
* SAP BDS & BDN: Integrated Document Management
*
http://www.intelligententerprise.com/channels/applications/feature/archive/schulze.jhtml

* Good ready code of BDS+DOI
* http://www.sappro.com/download03.cfm?session=

*
http://help.sap.com/printdocu/core/Print46c/en/data/pdf/BCSRVBDS/BDS_STRUCTURE.pdf

* there could be situations where you want BDS integration

*================================================================================

* Author Jayanta Narayan Choudhuri
* Flat 302
* 395 Jodhpur Park
* Kolkata 700 068
* Email sss@cal.vsnl.net.in
* URL: http://www.geocities.com/ojnc

*================================================================================
REPORT yjncMimeTest. " the MIME way

DATA: o_mr_api TYPE REF TO if_mr_api.

DATA: BEGIN OF graphic_table OCCURS 0,
line(255) TYPE x,
END OF graphic_table.

DATA: graphic_size TYPE i.

DATA : mycontainer TYPE REF TO cl_gui_custom_container .

DATA : ok_code LIKE sy-ucomm ,
save_ok LIKE sy-ucomm .

DATA: graphic_url(255).

DATA: image TYPE REF TO cl_gui_picture.

DATA: l_graphic_xstr TYPE xstring,
l_graphic_conv TYPE i,
l_graphic_offs TYPE i.

START-OF-SELECTION.

IF o_mr_api IS INITIAL.
o_mr_api = cl_mime_repository_api=>if_mr_api~get_api( ).
ENDIF.

CALL METHOD o_mr_api->get
EXPORTING
i_url = 'sap/public/zjnc/jbln.jpg'
IMPORTING
e_content = l_graphic_xstr
EXCEPTIONS
parameter_missing = 1
error_occured = 2
not_found = 3
permission_failure = 4
OTHERS = 5.

* current will hold the image in a XSTRING var

CLEAR graphic_url.


graphic_size = XSTRLEN( l_graphic_xstr ).
CHECK graphic_size > 0.

l_graphic_conv = graphic_size.
l_graphic_offs = 0.

WHILE l_graphic_conv > 255.
graphic_table-line = l_graphic_xstr+l_graphic_offs(255).
APPEND graphic_table.
l_graphic_offs = l_graphic_offs + 255.
l_graphic_conv = l_graphic_conv - 255.
ENDWHILE.

graphic_table-line = l_graphic_xstr+l_graphic_offs(l_graphic_conv).
APPEND graphic_table.

CALL FUNCTION 'DP_CREATE_URL'
EXPORTING
type = 'IMAGE'
subtype = 'GIF'
TABLES
data = graphic_table[]
CHANGING
url = graphic_url
EXCEPTIONS
dp_invalid_parameter = 1
dp_error_put_table = 2
dp_error_general = 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.
EXIT.
ENDIF.

* PERFORM f_download_blob.

CALL SCREEN 100 .

*&;---------------------------------------------------------------------*
*&; Module STATUS_0100 OUTPUT
*&;---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS100'.
SET TITLEBAR 'TITLEBAR100'.

ENDMODULE. " STATUS_0100 OUTPUT

*&;---------------------------------------------------------------------*
*&; Module prepare_controls OUTPUT
*&;---------------------------------------------------------------------*
MODULE prepare_controls OUTPUT.
IF mycontainer IS INITIAL.

CREATE OBJECT mycontainer
EXPORTING
container_name = 'MCONTAINER'
EXCEPTIONS
OTHERS = 1.

CASE sy-subrc.
WHEN 0.
WHEN OTHERS.
RAISE cntl_error.
ENDCASE.

ENDIF.

IF graphic_url IS NOT INITIAL AND image IS INITIAL.
PERFORM f_pic_display.
EXIT.
ENDIF.


ENDMODULE. " prepare_controls OUTPUT

*&;---------------------------------------------------------------------*
*&; Module USER_COMMAND_0100 INPUT
*&;---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
save_ok = ok_code .
CLEAR ok_code .
IF save_ok = 'EXIT' .
LEAVE TO SCREEN 0.
ENDIF .
ENDMODULE. " USER_COMMAND_0100

*&---------------------------------------------------------------------*
*& Form f_pic_display
*&---------------------------------------------------------------------*
FORM f_pic_display.

CREATE OBJECT image
EXPORTING
parent = mycontainer.

CALL METHOD image->load_picture_from_url
EXPORTING
url = graphic_url.

image->set_display_mode( image->display_mode_normal_center ).

cl_gui_cfw=>flush( ).

cl_gui_cfw=>update_view( ).

ENDFORM. "f_pic_display

*================================================================================
REPORT yjncbdstest. " the BDS way

TYPE-POOLS: sbdst, abap.

*
======================================================================
* DATA DECLARATIONS
*
======================================================================
DATA : viewer TYPE REF TO i_oi_document_viewer .
DATA : mycontainer TYPE REF TO cl_gui_custom_container .

DATA : edurl(2048).

CONSTANTS : buttonselected VALUE 'X' .

DATA : ok_code LIKE sy-ucomm ,
save_ok LIKE sy-ucomm .

* For uploading Files to BDS
DATA: BEGIN OF itab OCCURS 0,
raw TYPE sdok_sdatx,
END OF itab.

DATA: filesize TYPE i,
filename TYPE string,
myext TYPE string.

DATA: myclassname TYPE sbdst_classname,
myclasstype TYPE sbdst_classtype,
mymimetype TYPE bapicompon-mimetype,
mycomponents TYPE sbdst_components WITH HEADER LINE,
myfiles TYPE sbdst_files WITH HEADER LINE,
mysignature TYPE sbdst_signature WITH HEADER LINE,
excluding TYPE sbdst_excluding WITH HEADER LINE,
myquery TYPE sbdst_query WITH HEADER LINE,
myuris TYPE sbdst_uri WITH HEADER LINE.

DATA: graphic_url(255).

DATA: image TYPE REF TO cl_gui_picture.

DATA: len TYPE i,
offset TYPE i,
wlen TYPE i,
woff TYPE i.

* -------------------------------------------------------------------
* 2 KEYWORDS
* -------------------------------------------------------------------
DATA: key_1 LIKE bapibds01-key_word,
key_2 LIKE bapibds01-key_word.

*
======================================================================
* SELECTION SCREEN DEFAULT
*
======================================================================
* -------------------------------------------------------------------
* Frame of Program Options ; TEXT-002 = 'Program Options' .
* -------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK action_a WITH FRAME TITLE text-002 .

PARAMETERS: upload RADIOBUTTON GROUP navs DEFAULT 'X',
get_url RADIOBUTTON GROUP navs,
downsngl RADIOBUTTON GROUP navs,
navigato RADIOBUTTON GROUP navs,
showimg RADIOBUTTON GROUP navs.

SELECTION-SCREEN END OF BLOCK action_a .

SELECTION-SCREEN BEGIN OF BLOCK action_b WITH FRAME TITLE text-002 .

PARAMETERS: p_file TYPE rlgrap-filename,
p_mime TYPE bapicompon-mimetype,
p_class TYPE sbdst_classname.


SELECTION-SCREEN END OF BLOCK action_b.

*
======================================================================
INITIALIZATION .
*
======================================================================
* t_upload = '1 Upload File to BDS' .
* t_url = '2 Show from URL' .
* t_single = '3 Download File from BDS' .
* t_navi = '4 Show Navigator' .
* t_show = '5 Show Image' .



* At selection screen
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
field_name = 'P_FILE'
IMPORTING
file_name = p_file.

*
======================================================================
START-OF-SELECTION .
*
======================================================================

MOVE p_class TO: myclassname, key_1.

MOVE 'OT' TO myclasstype.

CLEAR myfiles.

MOVE '1' TO: myfiles-doc_count, myfiles-comp_count.

MOVE p_file TO filename.
COMPUTE len = STRLEN( filename ).

DO len TIMES.
offset = len - sy-index.
IF filename+offset(1) = '.'.
woff = offset + 1.
wlen = len - woff.
MOVE filename+woff(wlen) TO myext.
ENDIF.

IF filename+offset(1) = '' OR filename+offset(1) = '/'.
woff = offset + 1.
wlen = len - woff.
MOVE filename+woff(wlen) TO myfiles-filename.

wlen = offset.
MOVE filename+0(wlen) TO myfiles-directory.
EXIT.
ENDIF.
ENDDO.

TRANSLATE myext TO UPPER CASE.

* http://www.w3schools.com/media/media_mimeref.asp
CASE myext.
WHEN 'XLS'.
MOVE 'application/vnd.ms-excel' TO mymimetype.
WHEN 'DOC'.
MOVE 'application/msword' TO mymimetype.
WHEN 'PPT'.
MOVE 'application/vnd.ms-powerpoint' TO mymimetype.
WHEN 'PDF'.
MOVE 'application/pdf' TO mymimetype.
WHEN 'JPG'.
MOVE 'image/jpeg' TO mymimetype.
WHEN 'GIF'.
MOVE 'image/gif' TO mymimetype.
WHEN 'BMP'.
MOVE 'image/bmp' TO mymimetype.
WHEN 'TIF'.
MOVE 'image/tiff' TO mymimetype.
WHEN 'ZIP'.
MOVE 'application/zip' TO mymimetype.
WHEN 'RTF'.
MOVE 'application/rtf' TO mymimetype.
WHEN 'TXT'.
MOVE 'text/plain' TO mymimetype.
ENDCASE.

IF mymimetype IS INITIAL.
MOVE p_mime TO mymimetype.
ENDIF.

MOVE mymimetype TO: myfiles-mimetype, key_2.

IF myfiles-filename IS NOT INITIAL.
IF myfiles-directory IS INITIAL.
MOVE '/' TO myfiles-directory.
ENDIF.
APPEND myfiles.
ENDIF.

CASE buttonselected .

* -------> UPLOAD DOCUMENT IN BUSINESS DOCUMENT NAVIGATOR
WHEN upload.
PERFORM build_keyword_criteria .

IF myfiles-filename IS INITIAL.
MESSAGE e999(zmsgs) WITH 'File Name is Mandatory'.
ENDIF.

IF mymimetype IS INITIAL.
MESSAGE e999(zmsgs) WITH 'Mime Type is Mandatory'.
ENDIF.

CALL METHOD cl_bds_document_set=>create_with_files
EXPORTING
classname = myclassname
classtype = myclasstype
CHANGING
files = myfiles[]
signature = mysignature[]
EXCEPTIONS
internal_error = 1
error_kpro = 2
parameter_error = 3
not_allowed = 4
not_authorized = 5
nothing_found = 6
OTHERS = 7.

IF sy-subrc 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

MESSAGE i999(zmsgs) WITH 'Upload Successful'.

* -------> Display Image ACCORDING TO KEYWORD CRITERIA WHEN downsngl .
PERFORM build_keyword_criteria .

IF myfiles-filename IS INITIAL.
MESSAGE e999(zmsgs) WITH 'File Name is Mandatory'.
ENDIF.

CALL METHOD cl_bds_document_set=>get_with_url
EXPORTING
classname = myclassname
classtype = myclasstype
url_lifetime = 'T'
CHANGING
uris = myuris[]
signature = mysignature[].

CALL METHOD cl_bds_document_set=>get_with_files
EXPORTING
classname = myclassname
classtype = myclasstype
CHANGING
files = myfiles[]
signature = mysignature[]
EXCEPTIONS
nothing_found = 1
error_kpro = 2
internal_error = 3
parameter_error = 4
not_authorized = 5
not_allowed = 6.

IF sy-subrc NE 0 .
MESSAGE i999(zmsgs) WITH 'ERROR DOWNLOADING FILE' sy-subrc .
ENDIF .

* -------> FIND A FILE SHOW INPLACE FROM SAP R3 URL WHEN get_url .
PERFORM build_keyword_criteria.

CALL METHOD cl_bds_document_set=>get_with_url
EXPORTING
classname = myclassname
classtype = myclasstype
url_lifetime = 'T'
CHANGING
uris = myuris[]
signature = mysignature[].

CALL SCREEN 100 .

* -------> SHOW DOCUMENTS IN BUSINESS DOCUMENT NAVIGATOR
WHEN navigato .
PERFORM build_keyword_criteria.

CALL METHOD cl_bds_document_set=>call_navigator
EXPORTING
classname = myclassname
classtype = myclasstype
CHANGING
excluding = excluding[]
signature = mysignature[].

* -------> SHOW IMAGE if image/jpeg WHEN showimg .
PERFORM build_keyword_criteria.

CALL METHOD cl_bds_document_set=>get_with_table
EXPORTING
classname = myclassname
classtype = myclasstype
CHANGING
content = itab[]
EXCEPTIONS
error_kpro = 1
internal_error = 2
nothing_found = 3
no_content = 4
parameter_error = 5
not_authorized = 6
not_allowed = 7
OTHERS = 8.

IF sy-subrc 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

PERFORM f_display_pic.

ENDCASE .

*&;---------------------------------------------------------------------*
*&; Form BUILD_KEYWORD_CRITERIA
*&;---------------------------------------------------------------------*
FORM build_keyword_criteria.

MOVE '1' TO: mysignature-doc_count, mysignature-comp_count.
MOVE: 'BDS_KEYWORD' TO mysignature-prop_name,
key_1 TO mysignature-prop_value.
APPEND mysignature.

MOVE '1' TO: mysignature-doc_count, mysignature-comp_count.
MOVE: 'BDS_KEYWORD' TO mysignature-prop_name,
key_2 TO mysignature-prop_value.
APPEND mysignature.

ENDFORM. " BUILD_KEYWORD_CRITERIA

*&;---------------------------------------------------------------------*
*&; Module STATUS_0100 OUTPUT
*&;---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS100'.
SET TITLEBAR 'TITLEBAR100'.

ENDMODULE. " STATUS_0100 OUTPUT

*&;---------------------------------------------------------------------*
*&; Module prepare_controls OUTPUT
*&;---------------------------------------------------------------------*
MODULE prepare_controls OUTPUT.
IF mycontainer IS INITIAL.

CREATE OBJECT mycontainer
EXPORTING
container_name = 'MCONTAINER'
EXCEPTIONS
OTHERS = 1.

CASE sy-subrc.
WHEN 0.
WHEN OTHERS.
RAISE cntl_error.
ENDCASE.

ENDIF.

IF graphic_url IS NOT INITIAL AND image IS INITIAL.
PERFORM f_pic_display.
EXIT.
ENDIF.

IF viewer IS INITIAL.
CALL METHOD c_oi_container_control_creator=>get_document_viewer
IMPORTING
viewer = viewer
EXCEPTIONS
unsupported_platform = 1.

IF sy-subrc NE 0.
MESSAGE i999(zmsg) WITH 'Unknown error'.
ENDIF.

CALL METHOD viewer->init_viewer
EXPORTING
parent = mycontainer
EXCEPTIONS
cntl_error = 1
cntl_install_error = 2
dp_install_error = 3
dp_error = 4.

IF sy-subrc NE 0.
MESSAGE i999(zmsgs) WITH 'Unknown error'.
ENDIF.
ENDIF.

CLEAR edurl.

SORT myuris BY uri_count DESCENDING .

READ TABLE myuris INDEX 1 .
IF sy-subrc = 0 .
edurl = myuris-uri .
ENDIF .

IF NOT edurl IS INITIAL.
CALL METHOD viewer->view_document_from_url
EXPORTING
document_url = edurl
show_inplace = 'X'
EXCEPTIONS
cntl_error = 1
not_initialized = 2
dp_error_general = 3
invalid_parameter = 4.

IF sy-subrc NE 0.
MESSAGE i999(zmsgs) WITH 'Unknown error'.
ENDIF.
ENDIF.


ENDMODULE. " prepare_controls OUTPUT

*&;---------------------------------------------------------------------*
*&; Module USER_COMMAND_0100 INPUT
*&;---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
save_ok = ok_code .
CLEAR ok_code .
IF save_ok = 'EXIT' .
LEAVE TO SCREEN 0.
ENDIF .
ENDMODULE. " USER_COMMAND_0100

*&---------------------------------------------------------------------*
*& Form F_upload_blob
*&---------------------------------------------------------------------*
FORM f_upload_blob.

MOVE p_file TO filename.

CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filetype = 'BIN'
filename = filename
IMPORTING
filelength = filesize
TABLES
data_tab = itab
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.

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. " F_upload_blob

*&---------------------------------------------------------------------*
*& Form F_download_blob
*&---------------------------------------------------------------------*
FORM f_download_blob.

MOVE p_file TO filename.

CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filetype = 'BIN'
filename = filename
IMPORTING
filelength = filesize
TABLES
data_tab = itab
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.

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. " F_download_blob

*&---------------------------------------------------------------------*
*& Form f_display_pic
*&---------------------------------------------------------------------*
FORM f_display_pic.

CLEAR graphic_url.

CALL FUNCTION 'DP_CREATE_URL'
EXPORTING
type = 'IMAGE'
subtype = 'GIF'
TABLES
data = itab[]
CHANGING
url = graphic_url
EXCEPTIONS
dp_invalid_parameter = 1
dp_error_put_table = 2
dp_error_general = 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.
EXIT.
ENDIF.

* PERFORM f_download_blob.

CALL SCREEN 100 .

ENDFORM. "f_display_pic

*&---------------------------------------------------------------------*
*& Form f_pic_display
*&---------------------------------------------------------------------*
FORM f_pic_display.

CREATE OBJECT image
EXPORTING
parent = mycontainer.

CALL METHOD image->load_picture_from_url
EXPORTING
url = graphic_url.

image->set_display_mode( image->display_mode_normal_center ).

cl_gui_cfw=>flush( ).

cl_gui_cfw=>update_view( ).

ENDFORM. "f_pic_display


* CREATE FROM TABLE
*==================
* PERFORM build_keyword_criteria .
*
* PERFORM f_upload_blob.
*
* MOVE 1 TO mycomponents-doc_count.
* MOVE 1 TO mycomponents-comp_count.
* MOVE mymimetype TO mycomponents-mimetype.
* APPEND mycomponents.
*
* CALL METHOD cl_bds_document_set=>create_with_table
* EXPORTING
* classname = myclassname
* classtype = myclasstype
* components = mycomponents[]
* content = itab[]
* CHANGING
* signature = mysignature[]
* EXCEPTIONS
* internal_error = 1
* error_kpro = 2
* parameter_error = 3
* not_authorized = 4
* not_allowed = 5
* nothing_found = 6
* OTHERS = 7.
*
* IF sy-subrc 0.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
* ENDIF.


×