on 01-31-2007 12:51 PM
Hi Vallery,
We have a scenario where we need to upload/download files of any type from webdynpro to Solution manager and viceversa. Our NWDS Version is 7.0.10. We are using file upload and file download UI Elements to achieve this. We have used the following test code to check uploading and dowloading an image file in an action.It works fine.
public void onActionuploadfile(com.sap.tc.webdynpro.progmodel.api.IWDCustomEvent wdEvent )
{
//@@begin onActionuploadfile(ServerEvent)
try
{
InputStream in=wdContext.currentContextElement().getFileup().read(true);
int i=0;
int size=in.available();
byte b[]=new byte[size];
//upload
in.read(b);
//get file uploaded values for download
IWDResource resource = WDResourceFactory.createResource(b, "sample", WDWebResourceType.GIF_IMAGE);
wdContext.currentContextElement().setFileResource(resource);
}
catch(Exception e)
{
wdComponentAPI.getMessageManager().reportException(""+e,true);
}
//@@end
}
There is a problem in sending the read byte content to R/3 as a string.So we tried to give the path of the uploaded file to GUI UPLOAD RFC.We couldn't execute the RFC from Web dynpro.From ABAP side the RFC can be executed successfully.
Kindly help me to enter the right content into the database(Raw data type) or to execute the GUI UPLOAD RFC.
Kindly also let us know ,what content should be passed to the RFC which accepts Raw data type.
Thanks in advance,
Krishnaveni.
Hi Valery,
I think i am facing a some what similar problem i have 30KB of binary data which i want to pass to R3 i am successful in executing my BAPI but at the R3 end we are recieving only 1KB of data due to which we are unable to generate the file properly we are using <b>BAPI CONTENT TYPE 255</b> as the datatype at the R3 end to catch the binary content we have tried with XSTRING too still we are not able to get the complete data. can you tell what can be the issue.
Regards
Siddharth
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi Sidhart,
I solved thi problem using XSTRING parameter in BAPI on ABAP side.
I have defined View for attachment input - File Upload element (binary type), File description field (string type), submit button.
All works - I import files grater than 20MB.
Here is source code of Save method -
public void mSaveFile( )
{
//@@begin mSaveFile()
//Sestavení záznamu pro zápis do R/3
// File_Content, File_Name, File_Extension, File_MIME, File_Description - do ZC4LIV_BAPI_INSERT_ATTACHMENT_INPUT
//IFilesElement row = wdContext.nodeFiles().createFilesElement();
IWDAttributeInfo attributeInfo1 = wdContext.getNodeInfo().getAttribute(IPrivateAddAttachment.IContextElement.TEMP__FILE__RESOURCE);
// get modifiable binary type from the attribute info, requires type cast.
IWDModifiableBinaryType binaryType1 = (IWDModifiableBinaryType) attributeInfo1.getModifiableSimpleType();
IPrivateAddAttachment.IContextElement element = wdContext.currentContextElement();
// if a file in the 'FileResource' attribute exists
if (element.getTemp_file_resource() != null) {
String mimeType = binaryType1.getMimeType().toString();
byte[] file = element.getInsertFile_BinContent();
// Set parameters for transfer to the R/3
wdContext.nodeZc4Liv_Bapi_Insert_Attachment_Input().moveFirst();
IPrivateAddAttachment.IZc4Liv_Bapi_Insert_Attachment_InputElement insertFileElement = wdContext.currentZc4Liv_Bapi_Insert_Attachment_InputElement();
if(element.getInsertFile_Description() == null)
{
element.setInsertFile_Description(binaryType1.getFileName());
}
insertFileElement.setIv_File_Bin_Content(element.getTemp_file_resource()); // File content
insertFileElement.setIv_File_Extension(binaryType1.getMimeType().getFileExtension()); // Extension
insertFileElement.setIv_File_Mimetype(binaryType1.getMimeType().getHtmlMime()); // Mime Type
insertFileElement.setIv_File_Name(binaryType1.getFileName()); // File name
insertFileElement.setIv_File_Description(element.getInsertFile_Description()); // File description
insertFileElement.setIv_Action("SAVE");
try {
wdThis.wdGetTMCZInvApprCustController().executeZC4LIV_BAPI_INSERT_ATTACHMENT();
if (wdContext.currentOutputElement().getEv_Retcode() == 0)
{
// Execute GetInvoice
wdThis.wdGetTMCZInvApprCustController().executeZC4LIV_BAPI_GETINVOICE_INPUT();
}
else
{
IWDMessageManager manager = wdComponentAPI.getMessageManager();
manager.reportException(wdThis.wdGetTMCZInvApprCustController().mgetMessageText("AttNotSaved"), true);
}
} catch (Exception e) {
//throw new WDRuntimeException(e);
// Nepodařilo se přílohu uloit (Save Error)
IWDMessageManager manager = wdComponentAPI.getMessageManager();
manager.reportException(e.getMessage(), true);
}
}
else
{
// No file inserted
// Message
IWDMessageManager manager = wdComponentAPI.getMessageManager();
manager.reportException(wdThis.wdGetTMCZInvApprCustController().mgetMessageText("AttNoFile"), true);
}
//@@end
}
good luck
Ondrej
Hi Ondrej,
We are having the similar requirement and trying to send the document as a mail to the SAP Inbox from the Webdynpro.
Can you please post your BAPI Structure --> Import / Export / Table Parameters
Also the Context Elements of the Webdynpro Project --> Controller.
Appreciate your great help.
Regards
Sumanth
Hi Hermann,
here is BAPI code, I hope it helps to you.
Ondrej
FUNCTION zc4liv_bapi_insert_attachment.
*"----
-
""Lokální rozhraní:
*" IMPORTING
*" VALUE(IV_OBJTYP) TYPE ORG_OBJTYP DEFAULT 'BUS2081'
*" VALUE(IV_OBJKEY) TYPE SWO_TYPEID OPTIONAL
*" VALUE(IV_WI_ID) TYPE SWW_WIID OPTIONAL
*" VALUE(IV_UNAME) TYPE SYUNAME DEFAULT SYST-UNAME
*" VALUE(IV_LANGU) TYPE LANGU DEFAULT SYST-LANGU
*" VALUE(IV_ACTION) TYPE TEXT40 DEFAULT 'Save'
*" VALUE(IV_FILE_BIN_CONTENT) TYPE XSTRING OPTIONAL
*" VALUE(IV_FILE_NAME) TYPE ZC4LIV_FILE_NAME OPTIONAL
*" VALUE(IV_FILE_EXTENSION) TYPE SAEDOKTYP OPTIONAL
*" VALUE(IV_FILE_MIMETYPE) TYPE W3CONTTYPE OPTIONAL
*" VALUE(IV_FILE_DESCRIPTION) TYPE ZC4LIV_FILE_DESCRIPTION
*" OPTIONAL
*" VALUE(IV_GET_FROM_DB) TYPE XFELD DEFAULT SPACE
*" EXPORTING
*" VALUE(EV_RETCODE) TYPE SYSUBRC
*" TABLES
*" ET_ARCHIVE_DOC_STRUCTURE STRUCTURE ZC4LIV_LN_TOAV0 OPTIONAL
*" ET_RETURN STRUCTURE BAPIRET2 OPTIONAL
*"----
-
DATA: lv_action TYPE text40,
ls_key_bus2081 TYPE zc4in_key_bus2081,
lt_toadd TYPE TABLE OF toadd,
ls_toadd TYPE toadd,
lt_toaom TYPE TABLE OF toaom,
ls_toaom TYPE toaom,
lt_toadv TYPE TABLE OF toadv,
ls_toadv TYPE toadv,
ls_toav0 TYPE toav0,
lv_url TYPE saeuri,
ls_attach TYPE zc4liv_attach,
lv_archiv_id LIKE toaar-archiv_id,
lv_arc_doc_id LIKE toav0-arc_doc_id,
lv_document_type LIKE toadd-doc_type,
lv_length LIKE sapb-length,
lv_length_i TYPE i,
lv_archiv_doc_id LIKE sapb-sapadokid,
lt_archivobject TYPE TABLE OF docs,
lv_doc_type TYPE saedoktyp,
lv_mime_type TYPE w3conttype.
gv_msg_objtyp = iv_objtyp.
gv_msg_objkey = iv_objkey.
gv_msg_state = '_APPR'.
gv_msg_funcname = 'ZC4LIV_BAPI_INSERT_ATTACHMENT'.
Break-point?
CALL FUNCTION 'ZC4SR_SUPPORT_BREAKPOINT'
EXPORTING
iv_bor = 'BUS2081'
iv_funcname = gv_msg_funcname
iv_rfc_call = abap_true.
Get invoice from DB
IF iv_get_from_db EQ abap_true.
CALL FUNCTION 'ZC4LIV_BAPI_GETINVOICE'
EXPORTING
iv_objtyp = iv_objtyp
iv_objkey = iv_objkey
iv_wi_id = iv_wi_id
iv_uname = iv_uname
iv_langu = iv_langu
iv_lock = abap_false
IMPORTING
ev_retcode = ev_retcode
TABLES
et_return = et_return.
CHECK ev_retcode EQ 0.
ENDIF.
Get invoice
IF iv_wi_id IS NOT INITIAL.
READ TABLE gt_invoice_data INTO gs_invoice_data
WITH KEY wi_id = iv_wi_id.
IF syst-subrc NE 0.
fill_message zc4in_msgid zc4in_msgty_error '028'
iv_wi_id space space space.
SET EXTENDED CHECK OFF.
IF 1 EQ 2.
MESSAGE e028.
ENDIF.
SET EXTENDED CHECK ON.
set_retcode.
ENDIF.
MOVE-CORRESPONDING gs_invoice_data-s_rbkpv TO ls_key_bus2081.
gv_msg_objtyp = 'BUS2081'.
gv_msg_objkey = ls_key_bus2081.
ELSE.
MOVE iv_objkey TO ls_key_bus2081.
READ TABLE gt_invoice_data INTO gs_invoice_data
WITH KEY s_rbkpv-belnr = ls_key_bus2081-belnr
s_rbkpv-gjahr = ls_key_bus2081-gjahr.
IF syst-subrc NE 0.
fill_message zc4in_msgid zc4in_msgty_error '011'
ls_key_bus2081-belnr
ls_key_bus2081-gjahr
space space.
SET EXTENDED CHECK OFF.
IF 1 EQ 2.
MESSAGE e011.
ENDIF.
SET EXTENDED CHECK ON.
set_retcode.
ENDIF.
ENDIF.
Get customizing
REFRESH: lt_toadd, lt_toadv.
SELECT * FROM toadd
INTO ls_toadd.
TRANSLATE ls_toadd-mimetype TO LOWER CASE.
APPEND ls_toadd TO lt_toadd.
ENDSELECT.
SELECT * FROM toaom
INTO TABLE lt_toaom
WHERE sap_object EQ gv_msg_objtyp
AND ar_status EQ abap_true.
SELECT * FROM toadv
INTO TABLE lt_toadv
FOR ALL ENTRIES IN lt_toaom
WHERE ar_object EQ lt_toaom-ar_object.
Process action
MOVE iv_action TO lv_action.
TRANSLATE lv_action TO UPPER CASE.
CASE lv_action.
WHEN 'SAVE'.
Insert Attachment
**************************************************************
Tato část kódu musí provést vytvoření přílohy v IXOSu
a navrátit zpět v tabulce ET_ARCHIVE_DOC_STRUCTURE
řádek s odkazem na přílohu. Struktura řádku je totoná
se strukturou v ZC4LIV_BAPI_GET_INVOICE
**************************************************************
Parameter IV_BIN_CONEXT have to exist!
IF iv_file_bin_content IS INITIAL
OR iv_file_name IS INITIAL
OR iv_file_mimetype IS INITIAL.
fill_message zc4in_msgid zc4in_msgty_error '057'
space space space space.
SET EXTENDED CHECK OFF.
IF 1 EQ 2.
MESSAGE e057.
ENDIF.
SET EXTENDED CHECK ON.
set_retcode.
ENDIF.
Get document type
MOVE iv_file_extension TO lv_doc_type.
TRANSLATE lv_doc_type TO UPPER CASE.
READ TABLE lt_toadd INTO ls_toadd
WITH KEY doc_type = lv_doc_type.
IF syst-subrc NE 0.
MOVE iv_file_mimetype TO lv_mime_type.
TRANSLATE lv_mime_type TO LOWER CASE.
READ TABLE lt_toadd INTO ls_toadd
WITH KEY mimetype = lv_mime_type.
IF syst-subrc NE 0.
READ TABLE lt_toadd INTO ls_toadd
WITH KEY doc_type = 'BIN'.
ENDIF.
ENDIF.
IF syst-subrc NE 0.
fill_message zc4in_msgid zc4in_msgty_error '055'
iv_file_extension
iv_file_mimetype
space space.
SET EXTENDED CHECK OFF.
IF 1 EQ 2.
MESSAGE e055.
ENDIF.
SET EXTENDED CHECK ON.
set_retcode.
ENDIF.
Get archive document type
READ TABLE lt_toadv INTO ls_toadv
WITH KEY doc_type = ls_toadd-doc_type.
IF syst-subrc NE 0.
fill_message zc4in_msgid zc4in_msgty_error '056'
ls_toadd-doc_type
gv_msg_objtyp
space space.
SET EXTENDED CHECK OFF.
IF 1 EQ 2.
MESSAGE e056.
ENDIF.
SET EXTENDED CHECK ON.
set_retcode.
ENDIF.
Get archive document type connection to archive
READ TABLE lt_toaom INTO ls_toaom
WITH KEY sap_object = gv_msg_objtyp
ar_object = ls_toadv-ar_object.
IF syst-subrc NE 0.
fill_message zc4in_msgid zc4in_msgty_error '056'
ls_toadd-doc_type
gv_msg_objtyp
space space.
SET EXTENDED CHECK OFF.
IF 1 EQ 2.
MESSAGE e056.
ENDIF.
SET EXTENDED CHECK ON.
set_retcode.
ENDIF.
Fill attachment content
REFRESH lt_archivobject.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = iv_file_bin_content
IMPORTING
output_length = lv_length_i
TABLES
binary_tab = lt_archivobject.
Add attachment to archive
lv_archiv_id = ls_toaom-archiv_id.
lv_document_type = ls_toadd-doc_type.
lv_length = XSTRLEN( iv_file_bin_content ).
CLEAR lv_archiv_doc_id.
CALL FUNCTION 'ARCHIVOBJECT_CREATE_TABLE'
EXPORTING
archiv_id = lv_archiv_id
document_type = lv_document_type
length = lv_length
IMPORTING
archiv_doc_id = lv_archiv_doc_id
TABLES
archivobject = lt_archivobject
EXCEPTIONS
error_archiv = 1
error_communicationtable = 2
error_kernel = 3
OTHERS = 4.
IF syst-subrc NE 0.
fill_message syst-msgid syst-msgty syst-msgno
syst-msgv1 syst-msgv2
syst-msgv3 syst-msgv4.
set_retcode.
ENDIF.
Save link to attachment
CLEAR ls_toav0.
ls_toav0-sap_object = gv_msg_objtyp.
ls_toav0-object_id = gv_msg_objkey.
ls_toav0-archiv_id = ls_toaom-archiv_id.
ls_toav0-arc_doc_id = lv_archiv_doc_id.
ls_toav0-ar_object = ls_toaom-ar_object.
ls_toav0-ar_date = syst-datum.
ls_toav0-DEL_DATE =
ls_toav0-reserve = ls_toadd-doc_type.
INSERT (ls_toaom-connection) FROM ls_toav0.
CLEAR ls_attach.
ls_attach-archiv_id = ls_toav0-archiv_id.
ls_attach-arc_doc_id = ls_toav0-arc_doc_id.
ls_attach-sap_object = ls_toav0-sap_object.
ls_attach-object_id = ls_toav0-object_id.
ls_attach-file_name = iv_file_name.
ls_attach-file_mimetype = iv_file_mimetype.
ls_attach-file_uname = iv_uname.
ls_attach-file_date = syst-datum.
ls_attach-file_time = syst-uzeit.
ls_attach-file_description = iv_file_description.
INSERT zc4liv_attach FROM ls_attach.
COMMIT WORK.
REFRESH et_archive_doc_structure.
CLEAR et_archive_doc_structure.
MOVE-CORRESPONDING ls_toav0 TO et_archive_doc_structure.
MOVE-CORRESPONDING ls_attach TO et_archive_doc_structure.
et_archive_doc_structure-xfile = abap_true.
PERFORM fill_ar_object_desrc USING et_archive_doc_structure-ar_object
iv_langu
CHANGING et_archive_doc_structure-descr.
CALL FUNCTION '/IXOS/OA_X_DISPLAY_JAVA_VIEWER'
EXPORTING
pi_doc_id = et_archive_doc_structure-arc_doc_id
pi_archive_id = et_archive_doc_structure-archiv_id
pi_sapgui_for_html = abap_false
pi_start_browser = abap_false
IMPORTING
pe_url = lv_url
EXCEPTIONS
its_not_available = 1
url_generation = 2
OTHERS = 3.
IF syst-subrc NE 0.
CLEAR lv_url.
ENDIF.
MOVE lv_url TO et_archive_doc_structure-java_url.
APPEND et_archive_doc_structure.
end of when 'SAVE'
WHEN 'DELETE'.
Action 'DELETE'
**********************************************************************************************
Provede výmaz souborů podle ID dokumentu v tabulce ET_ARCHIVE_DOC_STRUCTURE
Bude pouito jak pro akci smazání jediné přílohy (Uivatel si rozmyslel, e ji chce smazat),
tak i pro smazání vech uivatelem vloených příloh po akci 'EXITWITHOUTSAVE'
**********************************************************************************************
LOOP AT et_archive_doc_structure.
SELECT SINGLE * FROM toaom
INTO ls_toaom
WHERE sap_object EQ et_archive_doc_structure-sap_object
AND ar_object EQ et_archive_doc_structure-ar_object.
IF syst-subrc NE 0.
fill_message zc4in_msgid zc4in_msgty_error '056'
et_archive_doc_structure-ar_object
et_archive_doc_structure-sap_object
space space.
SET EXTENDED CHECK OFF.
IF 1 EQ 2.
MESSAGE e056.
ENDIF.
SET EXTENDED CHECK ON.
CONTINUE.
ENDIF.
DELETE FROM (ls_toaom-connection)
WHERE sap_object EQ et_archive_doc_structure-sap_object
AND object_id EQ et_archive_doc_structure-object_id
AND archiv_id EQ et_archive_doc_structure-archiv_id
AND arc_doc_id EQ et_archive_doc_structure-arc_doc_id.
ENDLOOP.
set_retcode.
end of when DELETE
WHEN OTHERS.
end of when OTHERS
ENDCASE.
ENDFUNCTION.
Hi Sumanth,
sorry about my delay,
here is FM structure and Context Elements
Function module ZC4LIV_BAPI_INSERT_ATTACHMENT Activ
Import parameters
IV_OBJTYP TYPE ORG_OBJTYP 'BUS2081' Typ organizačního objektu SAP
IV_OBJKEY TYPE SWO_TYPEID Klíč objektu
IV_WI_ID TYPE SWW_WIID Identifikace workitem
IV_UNAME TYPE SYUNAME SYST-UNAME Systém R/3, jméno uivatele z
IV_LANGU TYPE LANGU SYST-LANGU Jazykový klíč
IV_ACTION TYPE TEXT40 'Save' Text délky 40
IV_FILE_BIN_CONTENT TYPE XSTRING Binární obsah souboru
IV_FILE_NAME TYPE ZC4LIV_FILE_NAM LIV: Název souboru
IV_FILE_EXTENSION TYPE SAEDOKTYP SAP ArchiveLink: Typ dokumentu
IV_FILE_MIMETYPE TYPE W3CONTTYPE Typ HTML-Content
IV_FILE_DESCRIPTION TYPE ZC4LIV_FILE_DES LIV: Označení souboru
IV_GET_FROM_DB TYPE XFELD SPACE Načte FA z DB
Export parameters
EV_RETCODE TYPE SYSUBRC Návratový parametr
Tables
ET_ARCHIVE_DOC_STRUCLIKE ZC4LIV_LN_TOAV0 LIV: SAP ArchiveLink: Spojovac
ET_RETURN LIKE BAPIRET2 Návratový parametr
Structure ZC4LIV_LN_TOAV0
.INCLUDE TOAV0 0 0 SAP ArchiveLink: Link table
MANDT MANDT CLNT 3 0 Client
SAP_OBJECT SAEANWDID CHAR 10 0 SAP ArchiveLink: Object type of business object
OBJECT_ID SAEOBJID CHAR 50 0 SAP ArchiveLink: Object ID (object identifier)
ARCHIV_ID SAEARCHIVI CHAR 2 0 Content Repository Identification
ARC_DOC_ID SAEARDOID CHAR 40 0 SAP ArchiveLink: Document ID
AR_OBJECT SAEOBJART CHAR 10 0 Document type
AR_DATE SAEABADATE DATS 8 0 SAP ArchiveLink: Storage date
DEL_DATE SAEDELDATE DATS 8 0 Expiry Date
RESERVE SAERESERVE CHAR 27 0 SAP ArchiveLink: Reserved for future application
JAVA_URL TEXT255 CHAR 255 0 Text, 255 characters
DESCR SAEARONAME CHAR 40 0 SAP ArchiveLink: Document type
XFILE XFELD CHAR 1 0 Checkbox
FILE_NAME ZC4LIV_FILE_NAME CHAR 255 0 LIV: Filename
FILE_MIMETYPE W3CONTTYPE CHAR 128 0 HTML content type
FILE_UNAME UNAME CHAR 12 0 User Name
FILE_DATE DATE_ DATS 8 0 Date
FILE_TIME TIME_ TIMS 6 0 Time
FILE_DESCRIPTION ZC4LIV_FILE_DESCRIPTION CHAR 255 0 LIV: File description
Krishnaveni,
Typically RFC-s that accepts uploaded files has table parameter. Each line in this table is used to store part of file and has fixed length, typically about 1K.
So after accepting uploaded file just read it chunk by chunk and populate RFC table with lines per every chunk. Then execute RFC.
Valery Silaev
SaM Solutions
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
85 | |
10 | |
10 | |
9 | |
7 | |
6 | |
6 | |
5 | |
4 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.