【问题标题】:Get Quality notification attachments获取质量通知附件
【发布时间】:2025-11-28 08:10:02
【问题描述】:

所以我正在开发一个小程序,该程序将从 ECC 中提取质量通知数据。到目前为止,我已经使用标准“BAPI_QUALNOT_GETDETAIL”来提取通知的文本数据。我想要做的是提取与通知相关的附件。

为此,我找到了“BAPI_DOCUMENT_GETDETAIL2”,希望能满足我的要求。我遇到的问题是在哪里可以获得运行 BAPI 所需的以下信息;

  • 文档类型
  • 文档编号
  • 文档部分
  • 文档版本

我拥有的唯一信息是从 BAPI_QUALNOT_GETDETAIL 中提取的数据,到目前为止,我在其中找不到与针对通知上传的任何附件相关的任何信息。

以下是 t-code IQS3 中文档流的屏幕截图,其中显示了与通知相关的 3 个附件。

【问题讨论】:

  • 您可以查看相关表以了解如何调用 BAPI_DOCUMENT_GETDETAIL2。从我在 bapi 源代码中可以看到,表 DRAD 可能是一个不错的起点。
  • 您是在尝试仅提取 DMS 文档,还是对通过对象服务附加的文档感兴趣?如果您追求对象服务,那么您可以调用类方法 cl_binary_relation=>read_links。
  • @StuG 两者有什么区别?
  • DMS 文档是一个更传统的概念,它们在事务 CV01N 和 CV02N 中进行维护。它们需要维护整个文档信息记录,您可以在其中添加一个或多个“原件”,这将是您上传到应用程序服务器的实际文档。可以通过许多标准 SAP 事务左上角的“对象服务”菜单访问对象服务文档附件。见help.sap.com/saphelp_nw70/helpdata/en/be/…
  • 我不同意 DMS 是一个遗留概念。两个不同的用例。 GOS 没有版本控制,没有工作流等。DMS 更倾向于真正的文档管理系统(顾名思义):-)

标签: attachment abap bapi sap-erp


【解决方案1】:

如果您使用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 DB 表中。

【讨论】:

    【解决方案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.
    

    【讨论】:

    • 虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of howwhy 这解决了问题。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
    • 感谢您的评论。我添加了以下内容:如果附件存储在 DMS 系统中,请使用以下代码检索它们。