SAP 附件增删改查与文件服务器交互应用

【需求背景】

非SAP标准附件应用,自定义一套,跟公司内部文档服务器交互,支持各个应用场景的附件增删改查等。

每个附件在文件服务器上都有一个文件唯一ID作为关键字。

应用分两块:SAP GUI端,跟WDA Portal端应用

GUI端效果如下:

1. HTTP接口获取文件

云盘附件获取  token获取 文档解析应用

电子附件地址存储表

tables:t001,ztfi1013_04.
data:gt_data type standard table of ztfi1013_05,
     gt_tab  type standard table of ztfi1013_04,
     gt_log  type standard table of ztfi1013_06,
     wa_data type ztfi1013_05,
     wa_tab  type ztfi1013_04,
     wa_log  type ztfi1013_06.

data:gs_json     type zsdoc003,
     gs_docs     type zsdoc001,
     gt_docs     type ztdoc010,
     gv_guid(36).
form frm_get_data .

  check s_datum[] is not initial.
  if rb_1 is initial..
    select * into corresponding fields of table gt_tab from ztfi1013_04
      where bukrs in s_bukrs
      and   datum in s_datum
      and   zjxzt = ''.
  else.
    select * into corresponding fields of table gt_tab from ztfi1013_04
      where bukrs in s_bukrs
      and   datum in s_datum.
  endif.

endform.

*&---------------------------------------------------------------------*
*&      Form  FRM_ANALYZE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form frm_analyze_data .

  data:lv_docid    type string,
       ls_json     type zsdoc003,
       ls_docs     type zsdoc001,
       lt_docs     type ztdoc010,
       lt_rows     type standard table of string,
       wa_rows     type string,
       content     type string,
       conv        type ref to cl_abap_conv_in_ce,
       count       type i,
       field01(50),
       field02(50),
       field03(50),
       field04(50),
       field05(50),
       field06(50),
       field07(50),
       field08(50),
       field09(50),
       field10(50),
       field11(50),
       field12(50),
       field13(50),
       field14(50),
       field15(50),
       field16(50),
       field17(50),
       field18(50).
  loop at gt_tab into wa_tab.
    ls_docs-docid = wa_tab-docid_txt.
    lv_docid      = wa_tab-docid_txt.
    append ls_docs to lt_docs.

    perform frm_get_guid changing gv_guid.

    "获取file attr
    zcl_wd_json=>get_files(
      exporting
        it_docs = lt_docs " 文档结构表类型
      importing
        ev_msg  = data(lv_msg)
        es_json = ls_json ).

    "获取token
    zcl_wd_json=>get_docid_token(
          exporting
             iv_docid = lv_docid                            "|14563|
          receiving
             ev_token = data(lv_token) ).

    data(ls_rows) = ls_json-rows[ 1 ].

    data(lv_url) = ls_rows-downloadurl && '&f_token=' && lv_token.

    "getting doc for bin
    zcl_wd_docx=>get(
         exporting
*        iv_type    = 'X'
           iv_url     = lv_url
         importing
           ev_xstring = data(lv_xstring)
           ev_msg     = lv_msg ).

    if lv_xstring is not initial.
      conv = cl_abap_conv_in_ce=>create( input = lv_xstring ).
      conv->read( importing data = content ).
      split content at cl_abap_char_utilities=>cr_lf into table lt_rows .

      loop at lt_rows into wa_rows .
        split wa_rows at cl_abap_char_utilities=>horizontal_tab
        into
        field01
        field02
        field03
        field04
        field05
        field06
        field07
        field08
        field09
        field10
        field11
        field12
        field13
        field14
        field15
        field16
        field17
        field18.

        wa_data-posnm   = field01.
        wa_data-skjlid  = field02.
        wa_data-zskje   = field03.
        wa_data-jylnm   = field04.
        wa_data-zshbm   = field05.
        wa_data-shddh   = field06.
        wa_data-dzriq   = field07.
        wa_data-jyshj   = field08.
        wa_data-jyjin   = field09.
        wa_data-shoux   = field10.
        wa_data-zjies   = field11.
        wa_data-zpici   = field12.
        wa_data-belnr   = field13.
        wa_data-zcank   = field14.
        wa_data-zsdhh   = field15.
        wa_data-qdshh   = field16.
        wa_data-qdzdh   = field17.
        wa_data-possn   = field18.
        wa_data-bukrs   = wa_tab-bukrs.
        wa_data-cname   = sy-uname.
        wa_data-datum   = sy-datum.
        wa_data-uzeit   = sy-uzeit.
        call function 'CIF_GEN4_CONVERT_DATETIME'
          exporting
            iv_date                = sy-datum
            iv_time                = sy-uzeit
            iv_timezone            = sy-zonlo
          importing
            ev_timestamp           = wa_data-timestamp
          exceptions
            time_conversion_failed = 1
            others                 = 2.
        append wa_data to gt_data.
        clear: wa_data.
      endloop .
      count = lines( gt_data ).
      perform frm_add_successful_msg using gv_guid wa_tab-guiid count.
    else.
      perform frm_add_error_msg using gv_guid wa_tab-guiid lv_msg.
    endif.

    clear:lt_docs,ls_json,lv_docid,lv_url,lv_msg,lv_xstring,
          field01,field02,field03,field04,field05,field06,
          field07,field08,field09,field10,field11,field12,
          field13,field14,field15,field16,field17,field18,
          count.
  endloop.
endform.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_GUIID
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_ENDIF  text
*----------------------------------------------------------------------*
form frm_get_guid  changing cv_guid.

  call function 'RS_DME_MG_GENERATE_GUID'
    importing
      e_guid_32 = cv_guid.

endform.

通过HTTP接口获取文档服务器附件

METHOD get_files.

    DATA : ls_c010 TYPE zsdoc001.
    DATA : lv_docs TYPE string.

    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

    IF lines( it_docs ) = 0.
      ev_msg = '文档ID不能为空!'.
      RETURN .
    ENDIF.

    "文件ID集
    LOOP AT it_docs INTO ls_c010.
      lv_docs = lv_docs && ls_c010-docid && ','.
    ENDLOOP.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'GET_FILES2' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN .
    ENDIF.

    "get APIKEY
    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    lv_url = lv_url && |?fileId=| && lv_docs && |&{ lv_apikey }| .

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.


* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

        CALL TRANSFORMATION id
                         SOURCE XML ex_string
                         RESULT status = es_json-status
                                rows = es_json-rows
                                msg = es_json-msg.

      CATCH cx_root .
        ev_msg = '异常'.
    ENDTRY.

    lr_client->close( ).


  ENDMETHOD.
 

 获取文件token 

METHOD get_docid_token.
    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

    DATA : ev_msg TYPE string.

    "获取token地址
*    lv_url = gv_get_token1 && gv_get_token2 && iv_docid.

    IF iv_docid IS INITIAL.
      ev_msg = '文档ID不能为空!'.
      RETURN.
    ENDIF.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'GET_TOKEN' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN.
    ENDIF.

    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    lv_url = lv_url && iv_docid && |&{ lv_apikey }|.

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.

* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

        CALL TRANSFORMATION id
                         SOURCE XML ex_string
                         RESULT token = ev_token.
      CATCH cx_root .
        ev_msg = '异常'.
    ENDTRY.

    lr_client->close( ).
  ENDMETHOD.
 

获取文档内容转换成BIN二进制

METHOD get.

    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',

           ex_string       TYPE string,
           lv_ip           TYPE string.

    TRY .

        IF iv_url IS INITIAL.
          lv_url = 'http://xxx/api.action?acmod=downloadcommfile&id=445&revision=0&apikey=9b11127a9701975c734b8aee81ee3526&usid=fbd672e88c900f26a0221af266cd22ba-fe1b9a223ba095ff-attachment'.
        ELSE.

          IF iv_type EQ 'X'.
            lv_url =   iv_url.
          ELSE.
            lv_ip = get_ip( ).
            lv_url = lv_ip && iv_url.
          ENDIF.

        ENDIF.

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                =  lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).


* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.

*        CALL METHOD lr_client->request->set_header_field
*          EXPORTING
*            name  = 'Charset'
*            value = 'utf-16'.


* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).

          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).

          RETURN.
        ENDIF.

        ev_xstring = lr_client->response->get_data( ).

      CATCH cx_abapcg_exception  .
        ev_msg = '异常'.

        RETURN.
    ENDTRY.

* 关闭链接ie
    lr_client->close( ).


  ENDMETHOD.
 

获取文件信息(转成内表)

通过上传URL获取json数据并转换为内表

文件信息转换步骤: XSTRING to STRING, JSON转成内表

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

*    "json to itab
        CALL TRANSFORMATION id
                             SOURCE XML ex_string
                             RESULT status = es_json-status
                                    msg = es_json-msg
                                    rows = es_json-rows.

METHOD get_itab_for_json.
    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

*    IF iv_guid IS INITIAL.
*      lv_url = |http://10.0.2.31/ws/restful/SAPDocRestService/getSAPFormFile?guid=123|.
*    ELSE.
*      lv_url = gv_url_getfiles && iv_guid .
*    ENDIF.

    IF iv_guid IS INITIAL.
      ev_msg = 'GUID不能为空!'.
      RETURN.
    ENDIF.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'GET_FILES' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN.
    ENDIF.

    "get APIKEY
    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    lv_url = lv_url && iv_guid && |&{ lv_apikey }|.

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.

* 填充参数
*  CLEAR lv_len.
*  lv_len = strlen( iv_json ).
*  IF lv_len GT 0.
*    CALL METHOD lr_client->request->set_cdata   " Removed APPEND_CDATA
*      EXPORTING
*        data   = iv_json
*        offset = 0
*        length = lv_len.
*  ENDIF.

* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
*  CLEAR: lv_xjson .
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

*    "json to itab
        CALL TRANSFORMATION id
                             SOURCE XML ex_string
                             RESULT status = es_json-status
                                    msg = es_json-msg
                                    rows = es_json-rows.

      CATCH cx_abapcg_exception  .
        ev_msg = '异常'.
    ENDTRY.

* 关闭链接ie
    lr_client->close( ).
  ENDMETHOD.
 

2. 附件上传到文件服务器

自定义一个FUNCTION GROUP 实现附件上传到文件服务器

FUNCTION zfifm_0010.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_GUID) TYPE  GUID_32
*"     VALUE(IV_PZFJ) TYPE  BOOLEAN OPTIONAL
*"  EXPORTING
*"     REFERENCE(EV_DOCS) TYPE  ZSDOC003
*"----------------------------------------------------------------------
  gv_pzfj = iv_pzfj.  

  lcl_main=>start( iv_guid ).
  ev_docs = lcl_main=>get_docs( ).
ENDFUNCTION.
 

LZFG_FI0012TOP

FUNCTION-POOL zfg_fi0012.                   "MESSAGE-ID ..

* INCLUDE LZFG_FI0012D...                    " Local class definition


*---------------------------------------------------------------------*
*           CONSTANTS DATA                                            *
*---------------------------------------------------------------------*
CONSTANTS:
  c_html TYPE string VALUE 'https://10.0.2.31/common/vanke/erp/pd/attachment.htm',
  c_open TYPE string VALUE 'http://10.0.2.31'.


*---------------------------------------------------------------------*
*           VARIABLES AND INTERNAL TABLES DATA                        *
*---------------------------------------------------------------------*
DATA: ok_code TYPE syst-ucomm,
      save_ok TYPE syst-ucomm.
DATA: lf_flag TYPE flag.     " 为X,则上传;否则打开文档 --
DATA: lr_cont     TYPE REF TO cl_gui_custom_container,
      lr_html     TYPE REF TO cl_gui_html_viewer,
      lr_timer    TYPE REF TO cl_gui_timer. "add yisz 2023/5/16

DATA: gv_surl TYPE c LENGTH 2048."ADD BY CBJ 20200819
DATA  gv_pzfj TYPE boolean.  "add yisz 2023/5/16
 

LZFG_FI0012M01    屏幕的PBO/PAI事件

*&---------------------------------------------------------------------*
*&  包含                LZFG_FI0012M01
*&---------------------------------------------------------------------*


*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.

  DATA fcode TYPE TABLE OF sy-ucomm.
  REFRESH fcode.

  IF gv_pzfj = abap_true.
    APPEND 'ZUP' TO fcode.
    SET PF-STATUS '0100'  EXCLUDING fcode.
  ELSE.
    
    SET PF-STATUS '0100'.
  ENDIF.
  SET TITLEBAR '0100'.
  lcl_main=>exec_html( ).
ENDMODULE. " STATUS_0100 OUTPUT


*&---------------------------------------------------------------------*
*&      Module  EXIT_0100  INPUT
*&---------------------------------------------------------------------*
MODULE exit_0100 INPUT.
  save_ok = ok_code.  CLEAR: ok_code.
  CASE save_ok.
    WHEN  'ESC'.
      SET SCREEN 0.
      LEAVE SCREEN.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE. " EXIT_0100 INPUT


*&---------------------------------------------------------------------*
*&   Module  USER_COMMAND_0100  INPUT  TEXT: 响应键盘鼠标事件 --
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  save_ok = ok_code.  CLEAR: ok_code.
  CASE save_ok.
    WHEN  'S_OK'.
      IF lf_flag IS NOT INITIAL.   "如果是上传文件 --
        lcl_main=>get_file( ).
      ENDIF.
      SET SCREEN 0.  LEAVE SCREEN.
    WHEN 'ZUP'.
      CALL FUNCTION 'CALL_BROWSER'
        EXPORTING
          url                    = gv_surl
*         WINDOW_NAME            = ' '
*         NEW_WINDOW             = ' '
*         BROWSER_TYPE           =
*         CONTEXTSTRING          =
        EXCEPTIONS
          frontend_not_supported = 1
          frontend_error         = 2
          prog_not_found         = 3
          no_batch               = 4
          unspecified_error      = 5
          OTHERS                 = 6.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
 

LZFG_FI0012F01

*&---------------------------------------------------------------------*
*&  包含                LZFG_FI0012F01
*&---------------------------------------------------------------------*

*----------------------------------------------------------------------*
*      CLASS lcl_main DEFINITION FINAL CREATE PRIVATE                  *
*----------------------------------------------------------------------*
CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS: start IMPORTING iv_guid TYPE guid_32,
      exec_html, get_file,
      bowr_html IMPORTING iv_surl TYPE clike,
      get_docs RETURNING VALUE(es_data) TYPE zsdoc003,
      open_file IMPORTING iv_guid  TYPE guid_32
                          iv_docid TYPE ze_docid,
      open_url  IMPORTING iv_docid   TYPE ze_docid
                          iv_url_dwn TYPE ze_downloadurl1 .
  PRIVATE SECTION.
    CLASS-DATA: lv_guid TYPE string,
                lv_surl TYPE c LENGTH 2048,
                ls_json TYPE zsdoc003.
ENDCLASS. "lcl_main DEFINITION --

"DATA: evt_receiver TYPE REF TO lcl_main.
"html viewer事件
*CLASS c1_event DEFINITION.
*  PUBLIC SECTION.
*    CLASS-METHODS:m_sapevent FOR EVENT sapevent OF cl_gui_html_viewer
*      IMPORTING action frame getdata postdata query_table.
*ENDCLASS.
*
*CLASS c1_event IMPLEMENTATION.
*  METHOD m_sapevent.
*    DATA:lv_str TYPE string.
*    DATA:lt_postdata TYPE cnht_post_data_tab.
*    DATA:ls_postdata LIKE LINE OF lt_postdata.
*    DATA:lt_edquery TYPE cnht_query_table.
*    DATA:ls_edquery LIKE LINE OF lt_edquery.
*    lv_str = 'action:' && action
*      && ';frame' && frame
*      && ';getdata' && getdata.
*    lt_postdata = postdata.
*    lt_edquery = query_table.
*    IF lt_postdata IS NOT INITIAL.
*      READ TABLE lt_postdata INTO ls_postdata INDEX 1.
*    ENDIF.
*    lv_str = lv_str && ';' && ls_postdata.
*    LOOP AT lt_edquery INTO ls_edquery.
*      lv_str = lv_str && ';name='
*        && ls_edquery-name
*        && '-'
*        && ls_edquery-value.
*    ENDLOOP.
*    MESSAGE lv_str TYPE 'I'.
*  ENDMETHOD.
*ENDCLASS.
"add yisz 2023/5/16 end

*----------------------------------------------------------------------*
*       CLASS lcl_main IMPLEMENTATION                                  *
*----------------------------------------------------------------------*
CLASS lcl_main IMPLEMENTATION.
  METHOD start.             " 程序入口 --
    lv_guid = iv_guid.
    lf_flag = 'X'.

    CALL SCREEN 0100 STARTING AT 5 5
                       ENDING AT 65 20.
  ENDMETHOD.               " start --

  METHOD exec_html.             " 执行附件上传的HTML --
**** modify by Nicolas 20170417 start*******************
    DATA: lv_url TYPE string.
    lv_url = zcl_wd_json=>get_system_url(
       iv_system = 'DMS'
       iv_action = 'UPLOAD' ).

**** modify by Nicolas 20170417 end*******************
    IF lf_flag IS NOT INITIAL.
*      lv_surl = c_html && '?guid=' && lv_guid.
      lv_surl = lv_url && '?guid=' && lv_guid.
      lv_surl = lv_surl && '&apikey=14c20740acb1bff7fc1784625a268a9b'.
      lv_surl = lv_surl && '&usid=fbd672e88c900f26a0221af266cd22ba-79c0917cb7620f12-attachment'.

      "add yisz 2023/5/16 begin
      IF gv_pzfj = abap_true.
*        lv_surl = lv_surl && |&fileTypes=| && 'pdf,PDF,MSG,msg,OFD,ofd,PNG,png,JPG,jpg,xls,XLS,xlsm,XLSM,xlsx,XLSX,eml,EML'.
        lv_surl = lv_surl && |&fileTypes=| && 'pdf,PDF,OFD,ofd,PNG,png,JPG,jpg,xls,XLS,xlsm,XLSM,xlsx,XLSX'.
      ENDIF.
      "add yisz 2023/5/16 end

    ENDIF.
    CLEAR:gv_surl.
    gv_surl = lv_surl."ADD BY CBJ 20200819
    bowr_html( lv_surl ).

    "add yisz 2023/5/16 begin
    IF gv_pzfj = abap_true.
      CALL FUNCTION 'CALL_BROWSER'
        EXPORTING
          url                    = gv_surl
        EXCEPTIONS
          frontend_not_supported = 1
          frontend_error         = 2
          prog_not_found         = 3
          no_batch               = 4
          unspecified_error      = 5
          OTHERS                 = 6.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.
    ENDIF.
    "add yisz 2023/5/16 end

  ENDMETHOD.               " exec_html --


  METHOD bowr_html.             " 浏览网页 --
    DATA: lv_surl TYPE c LENGTH 2048.
    IF lr_cont IS INITIAL.
      CREATE OBJECT lr_cont
        EXPORTING
          container_name = 'HTML'
        EXCEPTIONS
          OTHERS         = 1.

      "create _html_viewer object
      CREATE OBJECT lr_html
        EXPORTING
          parent = lr_cont.

*      "add yisz 2023/5/16 begin
*      IF gv_pzfj = abap_true.
*        "设置event
*        "ls_events-eventid = cl_gui_html_viewer=>m_id_navigate_complete.
*        "APPEND ls_events TO lt_events.
*
*        ls_events-eventid = lr_html->m_id_sapevent.
*        ls_events-appl_event = 'X'.
*        APPEND ls_events TO lt_events.
*        lr_html->set_registered_events( events = lt_events ).
*        SET HANDLER c1_event=>m_sapevent FOR lr_html.
*
**      IF lr_timer IS INITIAL.
**        CREATE OBJECT lr_timer
**          EXCEPTIONS
**            error  = 1
**            OTHERS = 2.
**        IF sy-subrc <> 0.
**          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
**          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
**        ENDIF.
**
**        lr_timer->interval = 300.
**        CALL METHOD lr_timer->run
**          EXCEPTIONS
**            error  = 1
**            OTHERS = 2.
**      ENDIF.
*      ENDIF.

    ENDIF.

    "使用GUI显示html
    lv_surl = iv_surl.
    CALL METHOD lr_html->show_url
      EXPORTING
        url                  = lv_surl
      EXCEPTIONS
        cnht_error_parameter = 1
        OTHERS               = 2.
    CALL METHOD lr_html->do_refresh.

    IF lf_flag IS INITIAL.
      SET SCREEN 0.
      LEAVE SCREEN.
    ENDIF.
  ENDMETHOD.               " bowr_html --

  METHOD get_file.             " 获取文件信息 --
    DATA: lv_msgt TYPE string.
    CLEAR ls_json.
    zcl_wd_json=>get_itab_for_json(
      EXPORTING iv_guid = lv_guid
      IMPORTING ev_msg  = lv_msgt es_json = ls_json ).
  ENDMETHOD.               " get_file --

  METHOD get_docs.             " 获取文件服务器的文档信息 --
    es_data = ls_json.
    CLEAR:ls_json.
  ENDMETHOD.               " get_docs --

  METHOD open_file.             " 打开文件 --
    DATA: ls_docs  TYPE zsdoc002,
          lt_docs  TYPE ztdoc002,
          lv_docid TYPE string,
          lv_token TYPE string.

    lv_guid = iv_guid.  lf_flag = space.
    get_file( ).
    CHECK ls_json-rows IS NOT INITIAL.
    lt_docs = ls_json-rows.
    "MOD BY CBJ 20190620
*    READ TABLE LT_DOCS INTO LS_DOCS INDEX 1.
    READ TABLE lt_docs INTO ls_docs WITH KEY id = iv_docid.
    "END MOD

    DATA: lv_url TYPE string.
    lv_url = zcl_wd_json=>get_system_url(
       iv_system = 'DMS'
       iv_action = 'IP' ).
*    lv_surl = c_open && ls_docs-downloadurl.
    lv_surl = lv_url && ls_docs-downloadurl.
    lv_docid = iv_docid.
    lv_token = zcl_wd_json=>get_docid_token( iv_docid = lv_docid ).
    lv_surl = lv_surl && '&f_token=' && lv_token.

    CALL SCREEN 0100 STARTING AT 5 5
                       ENDING AT 65 20.
  ENDMETHOD.               " open_file --

  METHOD open_url.
    DATA: ls_docs  TYPE zsdoc002,
          lt_docs  TYPE ztdoc002,
          lv_docid TYPE string,
          lv_token TYPE string.        " 打开文件 --
    lv_surl = iv_url_dwn.

    lv_docid = iv_docid.
    lv_token = zcl_wd_json=>get_docid_token( iv_docid = lv_docid ).
    lv_surl = lv_surl && '&f_token=' && lv_token.

    CALL SCREEN 0100 STARTING AT 5 5
                       ENDING AT 65 20.
  ENDMETHOD.               " open_file --
ENDCLASS. "lcl_main IMPLEMENTATION --
 

调用上传文件服务器

FORM frm_attach_add .

  DATA:
    lv_guid TYPE guid_32,
    ls_d003 TYPE zsdoc003,
    ls_alv2 LIKE gs_alv2,
    ls_d002 TYPE zsdoc002,
    lt_d002 TYPE ztdoc002,
    lv_row  TYPE i.

  CLEAR: lv_row, lv_guid.
  lv_guid = zcl_pubfm=>get_guid( ).
  CALL FUNCTION 'ZFIFM_0010'
    EXPORTING
      iv_guid = lv_guid
    IMPORTING
      ev_docs = ls_d003.
  CHECK ls_d003-rows IS NOT INITIAL.

  lt_d002 = ls_d003-rows.
  READ TABLE lt_d002 INTO ls_d002 INDEX 1.

* 更新 信息
  go_grid2->get_current_cell( IMPORTING e_row = lv_row ).
  READ TABLE gt_alv2 INTO ls_alv2 INDEX lv_row.
  ls_alv2-iguid = lv_guid.       " 文档主键GUID --
  ls_alv2-docid = ls_d002-id.    " JAVA文档ID流水号 --
  ls_alv2-zfjmc = ls_d002-name.  " 文档名称 --
  ls_alv2-erdat = sy-datum.      " 上传日期 --

  MODIFY gt_alv2 FROM ls_alv2 INDEX lv_row.
  CLEAR ls_d003.  FREE lt_d002.

  go_grid2->refresh_table_display( ).

ENDFORM.

3. 其他文档相关方法封装

3.1 删除文档

METHOD delete_files_for_json.
    DATA : ls_c010 TYPE zsdoc001.
    DATA : lv_docs TYPE string.

    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

    IF lines( it_docs ) = 0.
      ev_msg = '文档ID不能为空!'.
      RETURN .
    ENDIF.

    "文件ID集
    LOOP AT it_docs INTO ls_c010.
      lv_docs = lv_docs && ls_c010-docid && ','.
    ENDLOOP.

    "删除POST地址
*    lv_url = gv_url_dele && lv_docs.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'DELETE' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN .
    ENDIF.

    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    lv_url = lv_url && lv_docs && |&{ lv_apikey }|.

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.


* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

        CALL TRANSFORMATION id
                         SOURCE XML ex_string
                         RESULT status = es_json-status
                                msg = es_json-msg.

      CATCH cx_root .
        ev_msg = '异常'.
    ENDTRY.

    lr_client->close( ).
  ENDMETHOD.
 

3.2 提交业务单据到文档系统

METHOD post_bill_to_doc.
    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ev_string       TYPE string,
           ex_string       TYPE string.

    DATA lv_hash   TYPE md5_fields-hash.
    DATA lv_str    TYPE string.
    DATA lv_tstamp TYPE tzntstmps.

    IF iv_json IS INITIAL AND iv_cate IS INITIAL.
      ev_msg = 'JSON对象和类别不能为空!'.
      RETURN.
    ENDIF.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'POST' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL'.
      RETURN.
*      lv_url = |http://10.0.2.31/ws/restful/SAPDocRestService/sapFormMetadataAdd|.
    ENDIF.

    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'POST'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type. "'multipart/form-data; boundary=----WebKitFormBoundaryIusB0IWHP4fpJXHA'.

*        DATA(lv_json) = to_lower( iv_json ).

        DATA(lv_json) = iv_json.

        lr_client->request->set_form_field(
         EXPORTING
         name  = 'metadata'
         value = | { lv_json }  | ).

        lr_client->request->set_form_field(
         EXPORTING
         name  = 'formtype'
         value = iv_cate ).

        lr_client->request->set_form_field(
         EXPORTING
         name  = 'apikey'
         value = lv_apikey ).


* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).

          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).

          RETURN.
        ENDIF.

* 返回
*  CLEAR: lv_xjson .
        ev_xstring = lr_client->response->get_data( ).

        IF ev_xstring IS INITIAL.
          ev_msg = '读取流出错'.
        ELSE.
* XSTRING to STRING
          CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
            EXPORTING
              im_xstring  = ev_xstring
              im_encoding = 'UTF-8'
            IMPORTING
              ex_string   = ev_string.

**      必须转换
          ex_string = to_upper( ev_string ).

*    "json to itab
          CALL TRANSFORMATION id
                               SOURCE XML ex_string
                               RESULT status = es_json-status
                                      msg = es_json-msg.
        ENDIF.



      CATCH cx_abapcg_exception  .
        ev_msg = '异常'.
    ENDTRY.

* 关闭链接ie
    lr_client->close( ).


  ENDMETHOD.
 

3.3 获取单据信息转换为json

业务单据信息拼接成JSON,KEY,VALUE键值对形式组装。

  METHOD get_bill_to_json.
    DATA : lt_doc004    TYPE ztdoc004,
           ls_doc004    TYPE zsdoc004,
           lv_status(4).

    DATA : ls_0002 TYPE zspd0002,
           lt_0002 TYPE TABLE OF zspd0002.

    DATA : lv_json_body TYPE string.
    CASE iv_cate.
        "文档评审
      WHEN '1'.
        "上会资料
        SELECT
          ztpd0017~bukrs
          ztpd0017~butxt
          ztpd0017~xmbhc
          ztpd0017~xmbhd
          ztpd0017~fenqi
          ztpd0017~fbukrs
          ztpd0017~fbukrs_d
          ztpd0017~fenqd
          ztpd0020~docid
          ztpd0017~sname
          ztpd0020~rmark
          ztpd0020~biaoq AS bqian
          ztpd0017~pnode
          ztpd0017~noded
          ztpd0017~pdate
          ztpd0017~billn AS pbill
          ztpd0020~itemn
          APPENDING CORRESPONDING FIELDS OF TABLE lt_doc004  FROM ztpd0017
          INNER JOIN ztpd0020 ON ztpd0017~hguid = ztpd0020~hguid
          WHERE ztpd0017~hguid = iv_guid.
    ENDCASE.

    "json拼凑
    DATA(lv_begin) = |[|.
    DATA(lv_end)   = |]|.

    LOOP AT lt_doc004 INTO ls_doc004 WHERE docid IS NOT INITIAL . "文档ID必须有值
      lv_json_body = lv_json_body && ',{'
                 && |"bukrs":"{ ls_doc004-bukrs }",|
                 && |"butxt":"{ ls_doc004-butxt }",|
                 && |"fbukrs":"{ ls_doc004-fbukrs }",|
                 && |"bukrs_p":"{ ls_doc004-fbukrs_d }",|
                 && |"xmbhc":"{ ls_doc004-xmbhc }",|
                 && |"xmbhd":"{ ls_doc004-xmbhd }",|
                 && |"fenqi":"{ ls_doc004-fenqi }",|
                 && |"fenqd":"{ ls_doc004-fenqd }",|
                 && |"docid":"{ ls_doc004-docid }",|
                 && |"billn":"{ ls_doc004-billn }",|
                 && |"lifnr":"{ ls_doc004-lifnr }",|
                 && |"name1":"{ ls_doc004-name1 }",|
                 && |"pnode":"{ ls_doc004-pnode }",|
                 && |"noded":"{ ls_doc004-noded }",|
                 && |"ndate":"{ ls_doc004-ndate }",|
                 && |"bqian":"{ ls_doc004-bqian }",|
                 && |"sname":"{ ls_doc004-sname }",|
                 && |"rmark":"{ ls_doc004-rmark }",|
                 && |"pbill":"{ ls_doc004-pbill }",|
                 && |"qbill":"{ ls_doc004-qbill }",|
                 && |"itemn":"{ ls_doc004-itemn }",|
                 && |"status":"{ lv_status }",|
                 && |"bcate":"{ ls_doc004-bcate }" | && '}'.
    ENDLOOP.
    "如果没有文档信息有返回
    IF lv_json_body IS INITIAL.
      CLEAR ev_json.
      RETURN.
    ENDIF.

    "截取
    DATA(lv_len) = strlen( lv_json_body ) - 1.
    ev_json = lv_begin && lv_json_body+1(lv_len) && lv_end.

    CLEAR : ls_0002,lt_0002.

  ENDMETHOD.
 

3.4  文档移动到文件夹

METHOD FIELS_TO_FOLDER.
    DATA : ls_c010 TYPE zsdoc001.
    DATA : lv_docs TYPE string.

    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

    IF lines( it_docs ) = 0.
      ev_msg = '文档ID不能为空!'.
      RETURN .
    ENDIF.

    "文件ID集
    LOOP AT it_docs INTO ls_c010.
      lv_docs = lv_docs && ls_c010-docid && ','.
    ENDLOOP.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'FOLDER_M' ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN .
    ENDIF.

    lv_url = lv_url && |&fileId=| && lv_docs && |&archMode=1| && |&opuser=| && sy-uname && |&pathId=| && iv_folder .
    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'POST'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.


* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

        CALL TRANSFORMATION id
                         SOURCE XML ex_string
                         RESULT status = es_json-status
                                msg = es_json-msg.
      CATCH cx_root .
        ev_msg = '异常'.
    ENDTRY.

    lr_client->close( ).
  ENDMETHOD.
 

3.5 获取DMS目录

  METHOD get_dms_catalog.
    DATA : ls_c010 TYPE zsdoc001.
    DATA : lv_docs TYPE string.

    DATA : lr_client       TYPE REF TO if_http_client,
           lv_url          TYPE string,
           lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',
           ev_xstring      TYPE xstring,
           ex_string       TYPE string.

    "get url
    lv_url = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = iv_cate ).

    IF lv_url IS INITIAL.
      ev_msg = '未获取到URL!'.
      RETURN .
    ENDIF.

    "get APIKEY
    DATA(lv_apikey) = zcl_wd_json=>get_system_url(
             iv_system = 'DMS'
             iv_action = 'APIKEY' ).

    lv_url = lv_url && |&{ lv_apikey }| .

    TRY .

        "创建http对象
        cl_http_client=>create_by_url(
          EXPORTING
          url                = lv_url
          IMPORTING
          client             = lr_client
           EXCEPTIONS
           argument_not_found = 1
           plugin_not_active  = 2
           internal_error     = 3
           OTHERS             = 4 ).

* set protocol version
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~server_protocol'
            value = 'HTTP/1.1'.
* 提交方式
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = '~request_method'
            value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
        CALL METHOD lr_client->request->set_header_field
          EXPORTING
            name  = 'Content-Type'
            value = lv_content_type.

* 发送
        CALL METHOD lr_client->send
          EXPORTING
            timeout                    = 200
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3
            OTHERS                     = 4.

        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 获取返回
        CALL METHOD lr_client->receive
          EXCEPTIONS
            http_communication_failure = 1
            http_invalid_state         = 2
            http_processing_failed     = 3.
        IF sy-subrc NE 0.
          lr_client->get_last_error(
            IMPORTING
              message = ev_msg
          ).
          RETURN.
        ENDIF.

* 返回
        ev_xstring = lr_client->response->get_data( ).

* XSTRING to STRING
        CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
          EXPORTING
            im_xstring  = ev_xstring
            im_encoding = 'UTF-8'
          IMPORTING
            ex_string   = ex_string.

        CALL TRANSFORMATION id
                         SOURCE XML ex_string
                         RESULT status = es_json-status
                                rows = es_json-rows
                                msg = es_json-msg.

      CATCH cx_root .
        ev_msg = '异常'.
    ENDTRY.

    lr_client->close( ).
  ENDMETHOD.

4. Web Dynpro附件上传公共组件 

ZWD_AB_0003 附件上传公共组件

ZWD_AB_C996 附件上传公共组件(全自动)

COMPONENTCONTROLLER定义 Events Interface: 在扩展应用程序再实例化

定时器事件  

同样调用 zcl_wd_json封装的文档交互methods

METHOD onactionact_timer .
  DATA : ls_upload TYPE wd_this->element_upload.
  DATA : lv_msg  TYPE string.
  DATA : ls_json     TYPE zsdoc003,
         ls_fileinfo TYPE zsdoc002.

  DATA : lv_date TYPE string,
         lv_time TYPE string.

  DATA : ls_item TYPE wd_this->element_item,
         lt_item TYPE wd_this->elements_item.

  DATA : lt_doc TYPE ztdoc010,
         ls_doc TYPE zsdoc001.

  DATA : lv_itemn TYPE ze_itemn VALUE '000000'.

  "获取当前items
  zcl_wd_common=>get_elements(
    EXPORTING
      iv_none = wd_context
      iv_name = 'ITEM'
    IMPORTING
      et_item = lt_item ).

  IF lt_item[] IS NOT INITIAL.
    "获取最大的行项目
    SORT lt_item BY itemn DESCENDING.
    READ TABLE lt_item INTO ls_item INDEX 1.
    lv_itemn = ls_item-itemn.
    CLEAR : ls_item.
  ENDIF.

  zcl_wd_common=>get_element(
    EXPORTING
      iv_none    = wd_context
      iv_name    = 'UPLOAD'
    IMPORTING
      es_stru    =  ls_upload ).

  "获取取消的文档信息
  zcl_wd_upload=>init( EXPORTING ir_usage = wd_this->wd_cpuse_upload( ) ).
  DATA(lv_flag) = wd_this->wd_cpifc_upload( )->get_flag( ).

  "通过业务ID获取文档系统附件清单
  zcl_wd_json=>get_itab_for_json(
     EXPORTING
       iv_guid = |{ ls_upload-guid }|
    IMPORTING
      ev_msg  = lv_msg
      es_json = ls_json ).

  IF ls_json IS NOT INITIAL.
    zcl_wd_common=>set_attribute(
      EXPORTING
        iv_none = wd_context
        iv_name = 'ENABLED'
        iv_attr = || ).

    LOOP AT ls_json-rows INTO ls_fileinfo.

      "清除删除清单的文档ID
      READ TABLE wd_comp_controller->gt_0021_dele INTO DATA(ls_dele) WITH KEY docid_c = ls_fileinfo-id.
      IF sy-subrc = 0.
        CONTINUE." 解决删除文件后点确认再次带出已删除文件的问题
      ENDIF.

      "如果是取消上传,就从内表里清除
      IF lv_flag = 'X'.
        READ TABLE lt_item INTO ls_item WITH KEY docid_c = ls_fileinfo-id.
        IF sy-subrc <> 0.
          ls_doc-docid = ls_fileinfo-id.
          APPEND ls_doc TO lt_doc.
          CLEAR : ls_doc.
          CONTINUE.
        ELSE.
          CONTINUE.
        ENDIF.
      ELSE.
        READ TABLE lt_item INTO ls_item WITH KEY docid_c = ls_fileinfo-id.
        "如果列表中,已存在就不再加载文档清单
        IF sy-subrc = 0.
          CONTINUE.
        ENDIF.
      ENDIF.

      ls_item-docid = ls_fileinfo-id.
      ls_item-docid_c = ls_fileinfo-id.
      ls_item-fdown = ls_fileinfo-downloadurl.
      ls_item-fextn = ls_fileinfo-ext.
      ls_item-fname = ls_fileinfo-name.
      ls_item-fpath = ls_fileinfo-previewurl.
      ls_item-fsize = ls_fileinfo-formatsize.
      lv_itemn = lv_itemn + 10.
      ls_item-itemn = lv_itemn.
      ls_item-ronly = 'X'.
      ls_item-itemn = lv_itemn.
      ls_item-sname = sy-uname.

      lv_date = |{ ls_fileinfo-createdate+0(10) }|.
      REPLACE ALL OCCURRENCES OF '-' IN lv_date WITH '' .
      lv_time = |{ ls_fileinfo-createdate+11(8) }|.
      REPLACE ALL OCCURRENCES OF ':' IN lv_time WITH '' .
      ls_item-sdate = lv_date.
      ls_item-stime = lv_time.
      APPEND ls_item TO lt_item.
      CLEAR : ls_item,ls_fileinfo.
    ENDLOOP.

    "删除文档服务器的文件
    CLEAR :ls_json.
    zcl_wd_json=>delete_files_for_json(
      EXPORTING
        it_docs = lt_doc
      IMPORTING
        es_json = ls_json ).

    SORT lt_item BY itemn.
    zcl_wd_common=>set_elements(
      EXPORTING
        iv_none = wd_context
        iv_name = 'ITEM'
        it_item = lt_item ).
    CLEAR : lv_itemn.

  ENDIF.

  wd_comp_controller->fire_file_check_evt( ).

ENDMETHOD.

VIEW METHOD实现文档交互

在各个WDA 应用里需要用到附件功能的引用上面 的组件:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38989.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux__之__基于UDP的Socket编程网络通信

前言 本篇博客旨在使用Linux系统接口进行网络通信, 帮助我们更好的熟悉使用socket套接字网络通信, 学会了socket网络通信, 就能发现所谓网络, 不过都是套路而已, 话不多说, 让我们直接进入代码编写部分. 1. 事先准备 今天我们先来模拟实现一个echo demo, 也就是客户端向服务…

【Agent】Dify Docker 安装问题 INTERNAL SERVER ERROR

总结&#xff1a;建议大家选择稳定版本的分支&#xff0c;直接拉取 master 分支&#xff0c;可能出现一下后面更新代码导致缺失一些环境内容。 启动报错 一直停留在 INSTALL 界面 我是通过 Docker 进行安装的&#xff0c;由于项目开发者不严谨导致&#xff0c;遇到一个奇怪的…

unity开发效率提升笔记

本文将记录提升Unity开发效率的若干细节&#xff0c;持续更新 一.VSCode文件标签多行显示 1.File->Preference->Settings (快捷键Ctrl 逗号) 2.搜索workbench.editor.wrapTabs 3.勾选上这个单选开关 若依然不是多行 4.搜索workbench.editor.tabSizing,选择fi…

python每日十题(6)

列表操作函数有&#xff08;假设列表名为ls&#xff09;&#xff1a; len(ls)&#xff1a;返回列表ls的元素个数&#xff08;长度&#xff09;。min(ls)&#xff1a;返回列表ls的最小元素。max(ls)&#xff1a;返回列表ls的最大元素。list(x)&#xff1a;将x转变为列表类型。使…

【Java】TCP网络编程:从可靠传输到Socket实战

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

使用HAI来打通DeepSeek的任督二脉

一、什么是HAI HAI是一款专注于AI与科学计算领域的云服务产品&#xff0c;旨在为开发者、企业及科研人员提供高效、易用的算力支持与全栈解决方案。主要使用场景为&#xff1a; AI作画&#xff0c;AI对话/写作、AI开发/测试。 二、开通HAI 选择CPU算力 16核32GB&#xff0c;这…

mysql——第二课

学生表 CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,sex varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,age int(11) DEFAULT NULL,c_id int(10) DEFAULT NULL,PRIMARY KEY (id),KEY c_id (c_id),CONSTR…

单播、广播、组播和任播

文章目录 一、单播二、广播三、组播四、任播代码示例&#xff1a; 五、各种播的比较 一、单播 单播&#xff08;Unicast&#xff09;是一种网络通信方式&#xff0c;它指的是在网络中从一个源节点到一个单一目标节点对的传输模式。单播传输时&#xff0c;数据包从发送端直接发…

1-1 MATLAB深度极限学习机

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 更多内容&#xff0c;欢迎点击本专栏目录&#xff0c;查看更多内容。 参考[1]魏洁.深度极限学习机的研究与应用[D].太原理工大学[2023-10-14].DOI:CNKI:CDMD:2.1016.714596. 目录 0.引言 1.ELM-AE实现 2.DE…

头歌 数据采集概述答案

问题1&#xff1a;以下哪个不是Scrapy体系架构的组成部分&#xff1f; 正确答案&#xff1a;B. 支持者(Support) 解释&#xff1a;Scrapy的主要组成部分包括&#xff1a; 爬虫(Spiders)&#xff1a;定义如何爬取网站和提取数据 引擎(Engine)&#xff1a;负责控制数据流在系统中…

【uniapp】记录tabBar不显示踩坑记录

由于很久没有使用uniapp了&#xff0c;官方文档看着又杂乱&#xff0c;底部tab导航栏一直没显示&#xff0c;苦思许久&#xff0c;没有发现原因&#xff0c;最后网上搜到帖子&#xff0c;list里的第一个数据&#xff0c;pages 的第一个 path 必须与 tabBar 的第一个 pagePath 相…

JVM 知识点梳理

JDK 、JRE、JVM JDK&#xff08; Java Development Kit &#xff09; Java开发工具包 JRE 开发命令工具&#xff08;运行java.exe、编译javac.exe、javaw.exe&#xff09; JRE&#xff08; Java Runtime Environment &#xff09;Java运行环境 JVM Java核心类库&#xff08;l…

蓝桥杯 之 第27场月赛总结

文章目录 习题1.抓猪拿国一2.蓝桥字符3.蓝桥大使4.拳头对决5.未来竞赛6.备份比赛数据 习题 比赛地址 1.抓猪拿国一 十分简单的签到题 print(sum(list(range(17))))2.蓝桥字符 常见的字符匹配的问题&#xff0c;是一个二维dp的问题&#xff0c;转化为对应的动态规划求解 力扣…

Ambari、Bigtop源码编译最新支持情况汇总

以下是目前的版本情况 支持了绝大部分的组件编译及安装 版本组件名称组件版本env 版本v1.0.5Ozone1.4.11.0.5Impala4.4.11.0.5Nightingale7.7.21.0.5Categraf0.4.11.0.5VictoriaMetrics1.109.11.0.5Cloudbeaver24.3.31.0.5Celeborn0.5.31.0.5v1.0.4Doris2.1.71.0.4v1.0.3Phoen…

仅靠prompt,Agent难以自救

Alexander的观点很明确&#xff1a;未来 AI 智能体的发展方向还得是模型本身&#xff0c;而不是工作流&#xff08;Work Flow&#xff09;。还拿目前很火的 Manus 作为案例&#xff1a;他认为像 Manus 这样基于「预先编排好的提示词与工具路径」构成的工作流智能体&#xff0c;…

【Docker系列一】Docker 简介

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Sqoop 常用命令

Sqoop 是用于在 Hadoop 和关系型数据库&#xff08;如 MySQL、Oracle 等&#xff09;之间高效传输数据的工具。以下是常用的 Sqoop 命令及示例&#xff1a; CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, -- 自增主键&#xff0c;用于唯一标识每一行name VAR…

连续型随机变量及其分布

连续型随机变量 数学公式可以看作一门精确描述事物的语言&#xff0c;比语言尤其是汉语的模糊性精确多了&#xff01;离散型数据的处理可以通过枚举和相加进行处理。而连续型数据则没有办法这样处理。我们必须要通过函数和取值区间还有微积分计算。 &#xff3b;定义1&#x…

PostgreSQL_数据使用与日数据分享

目录 前置&#xff1a; 1 使用 1.1 获取前复权因子 1.2 查询股票的纵向数据 1.3 查询股票的横向数据 2 日数据分享&#xff08;截止至&#xff1a;2025-03-21&#xff09; 总结 前置&#xff1a; 本博文是一个系列。在本人“数据库专栏”-》“PostgreSQL_”开头的博文。…

Rocky9.5基于sealos快速部署k8s集群

首先需要下载 Sealos 命令行工具&#xff0c;sealos 是一个简单的 Golang 二进制文件&#xff0c;可以安装在大多数 Linux 操作系统中。 以下是一些基本的安装要求&#xff1a; 每个集群节点应该有不同的主机名。主机名不要带下划线。 所有节点的时间需要同步。 需要在 K8s …