3

Can somebody please explain how to upload DMS files via a rest service. I'm using BAPI_DOCUMENT_CREATE2 like some guides suggest, but I don't see how to get the file on the server.

If you look at the guide I link below, he passes the filename, but not the content. Can anybody please explain how he gets the content?

Btw, I can't use the Gateway so I'm just using a SICF service.

https://blogs.sap.com/2016/08/22/upload-document-into-dms-server-using-net-weaver-gateway/

"Variables
DATA: LS_DOCDATA     TYPE BAPI_DOC_DRAW2.
DATA: LS_OBJECTLINK  TYPE BAPI_DOC_DRAD.
DATA: LT_OBJECTLINKS TYPE TABLE OF BAPI_DOC_DRAD.
DATA: LS_OBJECTDESCR TYPE BAPI_DOC_DRAT.
DATA: LT_OBJECTDESCR TYPE TABLE OF BAPI_DOC_DRAT.
DATA: LS_OBJECTFILE  TYPE BAPI_DOC_FILES2.
DATA: LT_OBJECTFILES TYPE TABLE OF BAPI_DOC_FILES2.
DATA: LV_DOCTYPE     TYPE DOKAR.
DATA: LV_DOCNUMBER   TYPE DOKNR.
DATA: LV_DOCPART     TYPE DOKTL_D.
DATA: LV_DOCVERSION  TYPE DOKVR.

" SET VALUES
LS_DOCDATA-DOCUMENTTYPE = 'DRW'.
LS_DOCDATA-DOCUMENTVERSION = '00'.
LS_DOCDATA-DOCUMENTPART = '000'.
LS_DOCDATA-LABORATORY = '001'.

LS_OBJECTDESCR-DESCRIPTION  = 'test dms doc'.
LS_OBJECTDESCR-LANGUAGE     = 'E'.
LS_OBJECTDESCR-LANGUAGE_ISO = 'EN'.
APPEND LS_OBJECTDESCR TO LT_OBJECTDESCR.

LS_OBJECTFILE-ORIGINALTYPE      = '1'.
LS_OBJECTFILE-SOURCEDATACARRIER = 'SAP-SYSTEM'.
LS_OBJECTFILE-CREATED_BY        = SY-UNAME
LS_OBJECTFILE-DOCFILE           =  'test'.
LS_OBJECTFILE-WSAPPLICATION     = 'JPG'.
APPEND LS_OBJECTFILE TO LT_OBJECTFILES.

LS_OBJECTLINK-OBJECTTYPE    = 'EQUI'.
LS_OBJECTLINK-OBJECTKEY     = '000000000210100004'.
APPEND LS_OBJECTLINK TO LT_OBJECTLINKS.

" CREATE ATTACHMENT
CALL FUNCTION 'BAPI_DOCUMENT_CREATE2'
  EXPORTING
    DOCUMENTDATA         = LS_DOCDATA
    HOSTNAME             = SY-HOST
    PF_FTP_DEST          = 'SAPFTPA'
    PF_HTTP_DEST         = 'SAPHTTP'
  IMPORTING
    DOCUMENTTYPE         = LV_DOCTYPE
    DOCUMENTNUMBER       = LV_DOCNUMBER
    DOCUMENTPART         = LV_DOCPART
    DOCUMENTVERSION      = LV_DOCVERSION
    RETURN               = LT_RETURN
  TABLES
    DOCUMENTDESCRIPTIONS = LT_OBJECTDESCR
    OBJECTLINKS          = LT_OBJECTLINKS
    DOCUMENTFILES        = LT_OBJECTFILES.

IF SY-SUBRC <> 0.
  MESSAGE 'Error uploading attachment' TYPE 'E'.
ENDIF.

" COMMIT
COMMIT WORK.
Matthijs Mennens
  • 1,125
  • 9
  • 33
  • What have you tried? Share your code – Suncatcher Jun 13 '18 at 09:29
  • I tried something like this. But in the guide, he doesn't seem to upload the file or get the content of it. – Matthijs Mennens Jun 13 '18 at 09:41
  • I checked the link that you shared. OData service will transfer the file, and you redefine the CREATE_STREAM method and add the DMS bapi. I think you should use IV_SLUG as a parameter for the file name, instead of 'test'. – Oguz Jun 13 '18 at 12:28

2 Answers2

2

I actually used this piece of code to solve it. I found it here: Solution

DATA LV_OUTPUT_LENGTH TYPE I.
DATA LS_SOLIX TYPE SOLIX-LINE.
DATA LT_SOLIX_TAB TYPE TABLE OF SOLIX-LINE.
DATA LV_FILENAME TYPE STRING.
DATA LV_DOCNUM TYPE DOKNR.

CONCATENATE '/usr/sap/' SY-SYSID SY-UNAME SY-DATUM INTO LV_FILENAME.

CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  EXPORTING
    BUFFER        = LV_FILESOURCE " this is the XSTRING of the file u want to upload
  IMPORTING
    OUTPUT_LENGTH = LV_OUTPUT_LENGTH
  TABLES
    BINARY_TAB    = LT_SOLIX_TAB.

IF NOT LT_SOLIX_TAB IS INITIAL.
  OPEN DATASET LV_FILENAME FOR OUTPUT IN BINARY MODE.
  LOOP AT LT_SOLIX_TAB INTO LS_SOLIX.
    TRANSFER LS_SOLIX TO LV_FILENAME.
  ENDLOOP.
  CLOSE DATASET LV_FILENAME.
ENDIF.

So I combined my earlier code with the above snippet and it seems to work.

"Variables
DATA: LS_DOCDATA     TYPE BAPI_DOC_DRAW2.
DATA: LS_OBJECTLINK  TYPE BAPI_DOC_DRAD.
DATA: LT_OBJECTLINKS TYPE TABLE OF BAPI_DOC_DRAD.
DATA: LS_OBJECTDESCR TYPE BAPI_DOC_DRAT.
DATA: LT_OBJECTDESCR TYPE TABLE OF BAPI_DOC_DRAT.
DATA: LS_OBJECTFILE  TYPE BAPI_DOC_FILES2.
DATA: LT_OBJECTFILES TYPE TABLE OF BAPI_DOC_FILES2.
DATA: LV_DOCTYPE     TYPE DOKAR.
DATA: LV_DOCNUMBER   TYPE DOKNR.
DATA: LV_DOCPART     TYPE DOKTL_D.
DATA: LV_DOCVERSION  TYPE DOKVR.

" SET VALUES
LS_DOCDATA-DOCUMENTTYPE    = 'DRW'.
LS_DOCDATA-DOCUMENTVERSION = '00'.
LS_DOCDATA-DOCUMENTPART    = '000'.
LS_DOCDATA-LABORATORY      = '001'.

LS_OBJECTDESCR-DESCRIPTION  = 'test dms doc'.
LS_OBJECTDESCR-LANGUAGE     = 'E'.
LS_OBJECTDESCR-LANGUAGE_ISO = 'EN'.
APPEND LS_OBJECTDESCR TO LT_OBJECTDESCR.

LS_OBJECTFILE-ORIGINALTYPE      = '1'.
LS_OBJECTFILE-SOURCEDATACARRIER = 'SAP-SYSTEM'.
LS_OBJECTFILE-CREATED_BY        =  SY-UNAME.
LS_OBJECTFILE-DOCFILE           =  LV_FILENAME.
LS_OBJECTFILE-WSAPPLICATION     = 'TXT'.
APPEND LS_OBJECTFILE TO LT_OBJECTFILES.

LS_OBJECTLINK-OBJECTTYPE    = 'EQUI'.
LS_OBJECTLINK-OBJECTKEY     = '000000000210100004'.
APPEND LS_OBJECTLINK TO LT_OBJECTLINKS.

" CREATE ATTACHMENT
CALL FUNCTION 'BAPI_DOCUMENT_CREATE2'
  EXPORTING
    DOCUMENTDATA         = LS_DOCDATA
    PF_FTP_DEST          = 'SAPFTPA'
    PF_HTTP_DEST         = 'SAPHTTP'
  IMPORTING
    DOCUMENTTYPE         = LV_DOCTYPE
    DOCUMENTNUMBER       = LV_DOCNUMBER
    DOCUMENTPART         = LV_DOCPART
    DOCUMENTVERSION      = LV_DOCVERSION
    RETURN               = LT_RETURN
  TABLES
    DOCUMENTDESCRIPTIONS = LT_OBJECTDESCR
    OBJECTLINKS          = LT_OBJECTLINKS
    DOCUMENTFILES        = LT_OBJECTFILES.

IF SY-SUBRC <> 0.
  MESSAGE 'Error uploading attachment' TYPE 'E'.
ENDIF.

" COMMIT
COMMIT WORK.
Matthijs Mennens
  • 1,125
  • 9
  • 33
1

You should give file path and storage category. This should solve the problem.

LS_OBJECTFILE-ORIGINALTYPE      = '001'. "**
LS_OBJECTFILE-storagecategory   = 'DMS_C1_ST'.. "**
LS_OBJECTFILE-CREATED_BY        = SY-UNAME
LS_OBJECTFILE-DOCFILE           =  IV_SLUG. "path that comes from the OData service.
LS_OBJECTFILE-WSAPPLICATION     = 'JPG'.
APPEND LS_OBJECTFILE TO LT_OBJECTFILES.
Oguz
  • 1,867
  • 1
  • 17
  • 24
  • I really don't understand how sending a local file url via a web service gets the file to the backend. Am I missing something there? – Matthijs Mennens Jun 13 '18 at 11:53
  • Normally, you choose a file with SAP GUI operations. However, you are going to using rest services. I think firstly you should transfer the file to the server. After that save it in the DMS. I don't see any other ways sorry :(. – Oguz Jun 13 '18 at 12:04