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 应用里需要用到附件功能的引用上面 的组件: