BSP/How To: Create attachment in Business transact...
Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
Introduction: This blog describes how to Attach the documents from BSP Application to any SAP Business transactions like IE01, VA01, FB01, WTY etc.
In order to achieve this, we are going to use Business Document Service (BDS).
Before we see the code, let us look at the result.
As I said earlier, you can attach it to any Business transaction. I took an example of attaching the document into ISR: Notification (IQS22) Transaction.
Note: This example will not show how to create the Notification. Assume that Notification already exists.
Now attachment got created under the business transaction with given Key. Lets look at that.
As per the business object BUS7051; the attachment can be viewed under Transaction code IQS22 since I'm trying to create attachment to ISR Transaction.
In IQS22, place the Notification number & click on "Attachment list" as shown below.
Once you click on attachment, you can see the attachment list in pop-up where you can select & view the documents.
Just for information: All the attachment can also be viewed in Transaction called OAOR irrespective of any Objects. Go to Tcode OAOR & enter the below detail and execute:
Here is the Function module, which can be used to upload the document to any business transaction. All you need to do is, finding a proper business object as per your requirement:
Note: Make it as "Remote Enabled", so that it can be called outside SAP also.
FUNCTION ZATTACH_CREATE. *"----""Local Interface: *" IMPORTING *" VALUE(FILE) TYPE SAPB-SAPFILES *" VALUE(STR_FILE_CONTENT) TYPE XSTRING *" VALUE(OBJECT_KEY) TYPE BAPIBDS01-OBJKEY *" VALUE(BUS_OBJECT) TYPE BAPIBDS01-CLASSNAME *" TABLES *" RETURN STRUCTURE BAPIRET2 *"---- DATA: LOGICAL_SYSTEM TYPE BAPIBDS01-LOG_SYSTEM, CLASSNAME TYPE BAPIBDS01-CLASSNAME, CLASSTYPE TYPE BAPIBDS01-CLASSTYPE. DATA: IT_FILES TYPE TABLE OF BAPIFILES, IT_SIGNATURE TYPE TABLE OF BAPISIGNAT, FILES TYPE BAPIFILES, SIGNATURE TYPE BAPISIGNAT. DATA: I_TOADD TYPE TOADD, FILENAME_ALL TYPE SAPB-SAPFILES, FILE_PATH TYPE SAPB-SAPFILES, FILE_PATH_MEMORY(250) TYPE C, " path für SAP memory FILE_PATH_LENGTH TYPE I, " length of the file_path FILE_CONTENT_LENGTH TYPE I, " length of the file_CONTENT FILE_NAME TYPE SAPB-SAPFILES, FILE_EXTENSION TYPE TOADD-DOC_TYPE. " file-extension. DATA: I_FILE_CONTENT TYPE TABLE OF BAPICONTEN. DATA: WA_FILE_CONTENT TYPE BAPICONTEN. DATA: I_FILES TYPE TABLE OF BAPIFILES , I_SIGNATURE TYPE TABLE OF BAPISIGNAT , I_COMPONENTS TYPE TABLE OF BAPICOMPON , COMPONENTS TYPE BAPICOMPON , I_PROPERTIES TYPE TABLE OF SDOKPROPTY , I_PROPERTIES2 TYPE TABLE OF BAPIPROPER , I_PROPERTIES_DEL TYPE TABLE OF BAPIDPROPT , MIMETYPE TYPE TOADD-MIMETYPE, COMPID TYPE BAPICOMPON-COMP_ID, " compid for popup COMPID_FLAG(1) TYPE C, " compid can't be changed MODIFY_FLAG(1) TYPE C, " document is modified ATTRI_FLAG(1) TYPE C, " attri can't be changed TITLE_FLAG(1) TYPE C, " titel of the popup CANCEL_FLAG(1) TYPE C, " cancel button Yes/No BUTTON_TEXT(10) TYPE C, INFO_TEXT(100) TYPE C, VERSION_NR TYPE BDN_CON-DOC_VER_NO, " version_nr for popup VERSION_LANGU2 TYPE T002T-SPTXT, " language field in POPUP VERSION_LANGU TYPE BDN_CON-LANGU," SPRAS language field TITLE_TEXT(100) TYPE C, " title of the popup DESCRIPTION TYPE BDN_CON-DESCRIPT. " descr. for popup FILE_CONTENT_LENGTH = XSTRLEN( STR_FILE_CONTENT ). FILENAME_ALL = FILE . DATA: OUT_LINES TYPE TABLE OF XSTRING. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING BUFFER = STR_FILE_CONTENT TABLES BINARY_TAB = I_FILE_CONTENT.
-- split filename -- *
DATA: LENGTH TYPE I. DATA: PATH2(1200). " LIKE sapb-sapfiles. DATA: L_FILE(1200), L_DIR(1200), L_DELIMITER TYPE C, L_OFFSET TYPE I, L_BYTES TYPE I, L_DELIMITER_OFFSET TYPE I, L_DELIMITER_BYTES TYPE I, L_CHAR TYPE C, L_PREVIOUS_CHAR TYPE C, L_LAST_CHAR TYPE C. PATH2 = FILENAME_ALL. LENGTH = STRLEN( PATH2 ). L_OFFSET = 0. WHILE L_OFFSET < LENGTH. L_LAST_CHAR = L_CHAR. "remember last character L_BYTES = CHARLEN( PATH2+L_OFFSET ). L_CHAR = PATH2+L_OFFSET(L_BYTES). "get current character IF L_CHAR = '/' OR L_CHAR = '\' OR L_CHAR = ':'. IF L_DELIMITER IS INITIAL OR L_DELIMITER = ':'. L_DELIMITER = L_CHAR. ENDIF. IF L_CHAR = L_DELIMITER. L_DELIMITER_OFFSET = L_OFFSET. L_DELIMITER_BYTES = L_BYTES. "remember character in front of delimiter: L_PREVIOUS_CHAR = L_LAST_CHAR. ENDIF. ENDIF. L_OFFSET = L_OFFSET + L_BYTES. ENDWHILE. IF NOT L_DELIMITER IS INITIAL. L_OFFSET = L_DELIMITER_OFFSET + L_DELIMITER_BYTES. L_FILE = PATH2+L_OFFSET. IF L_PREVIOUS_CHAR = ':' OR L_DELIMITER = ':'. "path ends with or after drive identifer, include the delimiter L_DIR = PATH2(L_OFFSET). ELSEIF NOT L_DELIMITER_OFFSET IS INITIAL. "do not include a trailing delimiter for compatibility reasons L_DIR = PATH2(L_DELIMITER_OFFSET). ELSE. CLEAR L_DIR. ENDIF. ELSE. L_DIR = SPACE. L_FILE = PATH2. ENDIF. FILE_PATH = L_DIR. FILE_NAME = L_FILE. **----
-- set new file_path to SAP memory -- *
FILE_PATH_LENGTH = STRLEN( FILE_PATH ). IF FILE_PATH <> SPACE AND FILE_PATH_LENGTH < 250. FILE_PATH_MEMORY = FILE_PATH. SET PARAMETER ID 'OAP' FIELD FILE_PATH_MEMORY. ELSE. FILE_PATH_MEMORY = SPACE. SET PARAMETER ID 'OAP' FIELD FILE_PATH_MEMORY. ENDIF.
-- data declaration ------------------------------------------------ *
CLEAR: SINGLE_C. LENGTH = STRLEN( FILE_NAME ). IF LENGTH > 0. WHILE LENGTH > 0. SINGLE_C = FILE_NAME+LENGTH(1). IF SINGLE_C CO '.'. LENGTH = LENGTH + 1. EXIT. ELSE. LENGTH = LENGTH - 1. ENDIF. ENDWHILE. IF LENGTH > 0. FILE_EXTENSION = FILE_NAME+LENGTH. ELSE. FILE_EXTENSION = SPACE. ENDIF. ELSE. FILE_EXTENSION = SPACE. ENDIF. IF FILE_EXTENSION <> SPACE. SET LOCALE LANGUAGE SY-LANGU. TRANSLATE FILE_EXTENSION TO UPPER CASE. "#EC TRANSLANG SET LOCALE LANGUAGE SPACE. ENDIF. DATA: I_TOADV TYPE TABLE OF TOADV. DATA: WA_TOADV TYPE TOADV. DATA: OBJECT TYPE SAEOBJART. SELECT * FROM TOADV INTO CORRESPONDING FIELDS OF TABLE I_TOADV WHERE STANDARD = 'X'. DELETE I_TOADV WHERE AR_OBJECT CS 'BDS' OR AR_OBJECT CS 'ZSEST'. READ TABLE I_TOADV INTO WA_TOADV WITH KEY DOC_TYPE = FILE_EXTENSION. *
-- get name and description for the document -- *
CLEAR: COMPID, DESCRIPTION, VERSION_NR, MODIFY_FLAG, COMPID_FLAG, ATTRI_FLAG, TITLE_FLAG. COMPID_FLAG = ' '. " -> compid can't be changed MODIFY_FLAG = 'S'. " -> popup in save modus ATTRI_FLAG = 'X'. " -> attri's can be changed COMPID = FILE_NAME. VERSION_NR = '00000001'. VERSION_LANGU2 = SY-LANGU. TITLE_FLAG = '1'. " -> BDN
-- get the mimetype of the docuclass -- *
DATA: I_DOCUMENTCLASS TYPE TOADD-DOC_TYPE. MOVE FILE_EXTENSION TO I_DOCUMENTCLASS. SET LOCALE LANGUAGE SY-LANGU. TRANSLATE I_DOCUMENTCLASS TO UPPER CASE. "#EC TRANSLANG SET LOCALE LANGUAGE SPACE. SELECT SINGLE * FROM TOADD INTO I_TOADD WHERE DOC_TYPE EQ I_DOCUMENTCLASS. IF SY-SUBRC NE 0. " nothing found -> default! I_TOADD-DOC_TYPE = I_DOCUMENTCLASS. I_TOADD-MIMETYPE = 'application/x-docType'. "#EC NOTEXT ENDIF. MOVE I_TOADD-MIMETYPE TO MIMETYPE.
PERFORM BAPI_MESSAGE TABLES RETURN USING SY-MSGTY SY-MSGID SY-MSGNO SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 SPACE 0 SPACE.
ENDIF.
ENDFUNCTION.
Subroutines used:
&---- *& Form bapi_message &----
Add message to BAPI message table
----
<--P_RETURN Error table
-->P_MSGTY Message type
-->P_MSGID Message id
-->P_MSGNO Message number
-->P_MSGV1 Message variable 1
-->P_MSGV1 Message variable 2
-->P_MSGV1 Message variable 3
-->P_MSGV1 Message variable 4
-->P_PARAMETER Parameter name
-->P_ROW Line no in case the parameter is a table
-->P_FIELD Field name within parameter structure
---- FORM BAPI_MESSAGE TABLES P_RETURN STRUCTURE BAPIRET2 USING P_MSGTY LIKE SY-MSGTY P_MSGID LIKE SY-MSGID P_MSGNO LIKE SY-MSGNO P_MSGV1 P_MSGV2 P_MSGV3 P_MSGV4 P_PARAMETER LIKE BAPIRET2-PARAMETER P_ROW LIKE BAPIRET2-ROW P_FIELD LIKE BAPIRET2-FIELD.
Let's look at the BSP Application which we used to upload the documents:<br><br>
Note: I didn’t handle any validation in my BSP Application. Just kept in mind to attach the document & developed quick BSP Application :).<br><br>
<ol>
<li>Create below BSP Application & Pages as shown below:</li><br><br>
!https://weblogs.sdn.sap.com/weblogs/images/11786/BSP_attach_appl1.JPG|height=152|alt=image|width=357|src=https://weblogs.sdn.sap.com/weblogs/images/11786/BSP_attach_appl1.JPG|border=0!<br><br>
<li>Layout:</li><br>
<textarea rows="10" cols="79">
<%@page language="abap" %>
<%@extension name="htmlb" prefix="htmlb" %> <htmlb:content id = "content" design = "classicdesign2002design2003" controlRendering = "sap" rtlAutoSwitch = "true" >
event handler for checking and processing user input and
for defining navigation
DATA: FILE TYPE REF TO CL_HTMLB_FILEUPLOAD, FILE_DETAIL TYPE SAPB-SAPFILES, OBJKEY TYPE BAPIBDS01-OBJKEY, RETURN TYPE BAPIRET2_T. FILE ?= CL_HTMLB_MANAGER=>GET_DATA( REQUEST = REQUEST ID = 'uploadID' NAME = 'fileUpload' ). V_KEY = REQUEST->GET_FORM_FIELD( 'keyid' ). V_BO = REQUEST->GET_FORM_FIELD( 'busid' ). CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = V_KEY IMPORTING OUTPUT = V_KEY. OBJKEY = V_KEY. FILE_DETAIL = FILE->FILE_NAME. CALL FUNCTION 'ZATTACH_CREATE' DESTINATION 'NONE' EXPORTING FILE = FILE_DETAIL " file Name STR_FILE_CONTENT = FILE->FILE_CONTENT "File content in XSTRING format OBJECT_KEY = OBJKEY "Key Field BUS_OBJECT = V_BO "Business object TABLES RETURN = RETURN.
Now we are done with the uploading documents to Business transaction.