2016-08-24 101 views
2

因此,我正在開發一個小程序,用於從ECC中提取質量通知數據。到目前爲止,我已使用標準「BAPI_QUALNOT_GETDETAIL」來提取通知的文本數據。我想要做的是提取與通知相關的附件。獲取質量通知附件 - SAP

爲此,我找到了「BAPI_DOCUMENT_GETDETAIL2」,我希望能滿足我的要求。我擁有的問題是我在哪裏可以獲得運行BAPI所需的以下信息;

  • DOC TYPE
  • DOC NUMBER
  • DOC PART
  • DOC VERSION

BAPI

我有唯一的信息是,我已經從所提取的數據BAPI_QUALNOT_GETDETAIL迄今爲止我找不到任何信息與通知中上傳的任何附件相關。

以下是t-code IQS3中的Document Flow屏幕截圖,其中顯示了與通知相關的3個附件。

Document Flow

+0

您可以查看相關表格,瞭解如何調用BAPI_DOCUMENT_GETDETAIL2。從我在bapi資源中看到的情況來看,DRAD表可能是一個很好的開始。 –

+0

您是否試圖提取DMS文檔,或者您是否對通過對象服務附加的文檔感興趣?如果你在對象服務之後,那麼你可以調用類方法cl_binary_relation => read_links。 –

+0

@StuG兩者有什麼區別? – Isuru

回答

0

如果使用GOS用於存儲附件的嘗試使用以下FM用於獲取他們:

CALL FUNCTION 'BDS_GOS_CONNECTIONS_GET' 
IMPORTING 
    logical_system = <system name> * << optional parameter  
    classname  = BUS2078  * << object type for quality notification  
    objkey   = 1014866112016 * << quality notification number + year   
    client   = XXX 
TABLES 
    gos_connections = lt_attachments 
. 

質量的通知號碼,以及其他屬性,保存在VIQMEL數據庫表。

-2

如果附件存儲在DMS系統中,請使用以下代碼檢索它們。

REPORT qn_attachments. 

    DATA ls_docfile TYPE bapi_doc_files2. 
    DATA lv_objkey TYPE objky. 
    DATA lv_objekt TYPE dokob. 
    DATA lt_drad TYPE TABLE OF drad. 
    DATA lt_docfiles TYPE bapi_tt_doc_files2. 
    DATA lv_msg  TYPE string. 
    DATA lt_content_bin TYPE sdokcntbins. 
    DATA lt_access_info TYPE STANDARD TABLE OF scms_acinf. 
    DATA ls_access_info TYPE scms_acinf. 
    DATA ls_packing_list TYPE sopcklsti1. 
    DATA lv_xstring  TYPE xstring. 
    DATA lv_type     TYPE string. 
    DATA lv_name     TYPE string. 
    DATA lv_dot_offset TYPE i. 
    DATA lv_extension TYPE mimetypes-extension. 
    DATA lv_mimetype TYPE mimetypes-type. 
    data lv_qmnum type qmnum. 

    lv_objkey = lv_qmnum." QMNUM 

    lv_objekt = 'QMQMEL'. 
    CALL FUNCTION 'DOKUMENTE_ZU_OBJEKT' 
    EXPORTING 
     key   = lv_objkey 
     objekt  = lv_objekt 
    TABLES 
     doktab  = lt_drad 
    EXCEPTIONS 
     kein_dokument = 1 
     OTHERS  = 2. 
    IF sy-subrc <> 0. 
    ENDIF. 

    LOOP AT lt_drad INTO DATA(ls_drad). 
    CLEAR: lt_docfiles, ls_docfile. 

    CALL FUNCTION 'BAPI_DOCUMENT_GETDETAIL2' 
    EXPORTING        
     documenttype = ls_drad-dokar  
     documentnumber = ls_drad-doknr  
     documentpart = ls_drad-doktl  
     documentversion = ls_drad-dokvr  
     getactivefiles = 'X'     
    TABLES         
     documentfiles = lt_docfiles.   

    LOOP AT lt_docfiles INTO ls_docfile. 
* Get binary content for documents 
     REFRESH lt_access_info. 
     REFRESH lt_content_bin. 
     CALL FUNCTION 'SCMS_DOC_READ' 
     EXPORTING 
      stor_cat    = ls_docfile-storagecategory 
      doc_id    = ls_docfile-file_id 
     TABLES 
      access_info   = lt_access_info 
      content_bin   = lt_content_bin 
     EXCEPTIONS 
      bad_storage_type  = 1 
      bad_request   = 2 
      unauthorized   = 3 
      comp_not_found  = 4 
      not_found    = 5 
      forbidden    = 6 
      conflict    = 7 
      internal_server_error = 8 
      error_http   = 9 
      error_signature  = 10 
      error_config   = 11 
      error_format   = 12 
      error_parameter  = 13 
      error     = 14 
      OTHERS    = 15. 
     IF sy-subrc EQ 0. 
     APPEND LINES OF: lt_access_info TO lt_access_info, 
         lt_content_bin TO lt_content_bin. 
     ELSE. 
     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_msg. 
     ENDIF. 

     READ TABLE lt_access_info INTO ls_access_info INDEX 1. 
     IF sy-subrc = 0. 

     CLEAR ls_packing_list. 

     "Convert DMS document content to XSTRING 
     CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' 
      EXPORTING 
      input_length = ls_access_info-comp_size 
      first_line = ls_access_info-first_line 
      last_line = ls_access_info-last_line 
      IMPORTING 
      buffer  = lv_xstring 
      TABLES 
      binary_tab = lt_content_bin 
      EXCEPTIONS 
      failed  = 1 
      OTHERS  = 2. 
     IF sy-subrc <> 0. 
      DELETE lt_content_bin FROM ls_access_info-first_line TO ls_access_info-last_line. 
      CONTINUE. 
     ENDIF. 
     DELETE lt_content_bin FROM ls_access_info-first_line TO ls_access_info-last_line. 
* File extension 
     FIND FIRST OCCURRENCE OF REGEX '\.[^\.]+$' 
      IN ls_access_info-comp_id MATCH OFFSET lv_dot_offset. 
     lv_extension = ls_access_info-comp_id+lv_dot_offset. 
     TRANSLATE lv_extension TO LOWER CASE. 
     lv_type = ls_access_info-mimetype. 
     ENDIF. 
    ENDLOOP. 
    ENDLOOP. 
+0

雖然此代碼片段是受歡迎的,並且可能會提供一些幫助,但如果它包含解釋,它會[大大改進] (//meta.stackexchange.com/q/114762)* how *和* why *解決了這個問題。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –

+0

感謝您的評論。我添加了以下內容:如果附件存儲在DMS系統中,請使用以下代碼來檢索它們。 –