*&---------------------------------------------------------------------* *& Report Name : /EUTIN/ARCHIVELINK_DOCUMENT *& Title : ABAP-Demo: Archive - Add/Display Document (HYPARCHIV) *& Developer : Michael Eutin - 06.12.2025 *& Development Class : $TMP *& Description : *& Add new document to the archive like HYPARCHIV or display *& existing one and enable analysis for problem solving by most *& relevant transaction codes *& *&---------------------------------------------------------------------* *& CHANGE HISTORY *&---------------------------------------------------------------------* *& Date Description *&---------------------------------------------------------------------* *& *& *& *&---------------------------------------------------------------------* REPORT /eutin/archivelink_document NO STANDARD PAGE HEADING LINE-SIZE 1023. *---------------------------------------------------------------------- * definition of local classes *---------------------------------------------------------------------- CLASS lc_main DEFINITION FINAL. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PUBLIC SECTION. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CLASS-METHODS: process_pov RETURNING VALUE(rv_filename) TYPE saepfad, process_pai IMPORTING iv_ucomm TYPE syucomm iv_file TYPE saepfad iv_sap_object TYPE toa01-sap_object iv_ar_object TYPE toa01-ar_object iv_saeobjid TYPE saeobjid iv_ardocid TYPE saeardoid. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENDCLASS. *---------------------------------------------------------------------- * selection screen 1000 *---------------------------------------------------------------------- SELECTION-SCREEN BEGIN OF BLOCK sel WITH FRAME TITLE sel. PARAMETERS: p_file TYPE saepfad LOWER CASE, p_sapobj TYPE toa01-sap_object, p_arobj TYPE toa01-ar_object, p_objid TYPE saeobjid LOWER CASE. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN PUSHBUTTON /2(38) save_doc USER-COMMAND save_doc. SELECTION-SCREEN SKIP 1. PARAMETERS: p_docid TYPE saeardoid. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN PUSHBUTTON /2(38) show_doc USER-COMMAND show_doc. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN COMMENT /2(38) cust. "Customizing für Datenablage SELECTION-SCREEN PUSHBUTTON /2(38) smicm USER-COMMAND smicm. SELECTION-SCREEN PUSHBUTTON /2(38) sicf USER-COMMAND sicf. SELECTION-SCREEN PUSHBUTTON /2(38) strust USER-COMMAND strust. SELECTION-SCREEN PUSHBUTTON /2(38) sa38 USER-COMMAND sa38. SELECTION-SCREEN PUSHBUTTON /2(38) se11 USER-COMMAND se11. SELECTION-SCREEN PUSHBUTTON /2(38) oac0 USER-COMMAND oac0. SELECTION-SCREEN PUSHBUTTON /2(38) oac2 USER-COMMAND oac2. SELECTION-SCREEN PUSHBUTTON /2(38) oac3 USER-COMMAND oac3. SELECTION-SCREEN END OF BLOCK sel. *---------------------------------------------------------------------- * event: initialization *---------------------------------------------------------------------- INITIALIZATION. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *--- define texts for selection screen 1000 sy-title = 'Demo: ArchiveLink'. sel = 'Selektionen'. %_p_file_%_app_%-text = 'Dateiname'. %_p_sapobj_%_app_%-text = 'SAP-Objekt'. %_p_arobj_%_app_%-text = 'Archiv-Obj'. %_p_objid_%_app_%-text = 'Arc-Obj-ID'. %_p_docid_%_app_%-text = 'Arc-Dok-ID'. cust = 'Customizing für Datenablage'. save_doc = |{ icon_system_save } Dokument via ArchiveLink ablegen|. show_doc = |{ icon_display } Dokument via ArchiveLink anzeigen|. smicm = |{ icon_execute_object } HTTP-Port aktivieren (SMICM)|. sicf = |{ icon_execute_object } Service aktivieren (SICF)|. strust = |{ icon_execute_object } Zertifikat einrichten (STRUST)|. sa38 = |{ icon_execute_object } Austauschverzeichnis (SA38)|. se11 = |{ icon_execute_object } Tabelle erstellen (SE11)|. oac0 = |{ icon_execute_object } Content-Repository (OAC0)|. oac2 = |{ icon_execute_object } Dokumentart erstellen (OAC2)|. oac3 = |{ icon_execute_object } Verknüpfung einrichten (OAC3)|. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *---------------------------------------------------------------------- * event: process on value-request (POV) *---------------------------------------------------------------------- AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - p_file = lc_main=>process_pov( ). * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *---------------------------------------------------------------------- * event: process after input (PAI) *---------------------------------------------------------------------- AT SELECTION-SCREEN. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lc_main=>process_pai( EXPORTING iv_ucomm = sy-ucomm iv_file = p_file iv_sap_object = p_sapobj iv_ar_object = p_arobj iv_saeobjid = p_objid iv_ardocid = p_docid ). * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *---------------------------------------------------------------------- * implementation of local classes *---------------------------------------------------------------------- CLASS lc_main IMPLEMENTATION. METHOD process_pov. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *--- RETURNING VALUE(rv_filename) TYPE saepfad * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *--- initialization CLEAR rv_filename. * DATA: lv_rc TYPE i, lt_files TYPE filetable, lv_action TYPE i. *--- call file open dialog for single fileselection of file type PDF TRY. DATA: lt_file_table TYPE filetable, lv_rc TYPE i, lv_user_action TYPE i. CLEAR: lt_file_table[], lv_rc, lv_user_action. cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter = |pdf (*.pdf)\|*.pdf\|{ cl_gui_frontend_services=>filetype_all }| multiselection = abap_false CHANGING file_table = lt_file_table rc = lv_rc user_action = lv_user_action ). IF lv_user_action = cl_gui_frontend_services=>action_ok AND lines( lt_file_table ) > 0. rv_filename = lt_file_table[ 1 ]-filename. RETURN. ENDIF. CATCH cx_root INTO DATA(lx_root) ##CATCH_ALL. *--- SLIN/ATC: Every class-based exception is found. *--- Deactivatable using pragma ##CATCH_ALL. Message Code UNR 0210 DATA(lv_msgtext) = lx_root->get_text( ). IF lv_msgtext IS NOT INITIAL. MESSAGE lv_msgtext TYPE 'I' DISPLAY LIKE 'E'. ENDIF. MESSAGE 'technischer Fehler beim Aufruf "FILE_OPEN_DIALOG"' TYPE 'S' DISPLAY LIKE 'E'. ENDTRY. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENDMETHOD. METHOD process_pai. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *--- IMPORTING iv_ucomm TYPE syucomm *--- iv_file TYPE saepfad *--- iv_sap_object TYPE toa01-sap_object *--- iv_ar_object TYPE toa01-ar_object *--- iv_saeobjid TYPE saeobjid, *--- iv_ardocid TYPE saeardoid * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CASE iv_ucomm. WHEN 'SAVE_DOC'. *--- ensure mandatory parameters are provided IF iv_file IS INITIAL. MESSAGE |Angabe fehlt: { %_p_file_%_app_%-text }='{ iv_file }'!| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. IF iv_sap_object IS INITIAL. MESSAGE |Angabe fehlt: { %_p_sapobj_%_app_%-text }='{ iv_sap_object }'!| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. IF iv_ar_object IS INITIAL. MESSAGE |Angabe fehlt: { %_p_arobj_%_app_%-text }='{ iv_ar_object }'!| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. IF iv_saeobjid IS INITIAL. MESSAGE |Angabe fehlt: { %_p_objid_%_app_%-text }='{ iv_saeobjid }'!| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. *--- Security Checks (CVA/SLIN_SEC) Warning and restructed access: *--- Read access (SELECT) to database table / view TOAOM *--- Cannot be deactivated using a pragma. Message Code SEC 11G0 *--- Note: *--- In restricted language scope, like BTP etc., direct read access to database table TOAOM is not allowed! *--- Use FUNC 'ARCHIV_METAINFO_GET' instead SELECT SINGLE archiv_id, doc_type FROM toaom WHERE sap_object = @iv_sap_object ##WARN_OK AND ar_object = @iv_ar_object "#EC CI_NOORDER INTO @DATA(ls_toaom). IF sy-subrc IS NOT INITIAL OR ls_toaom-archiv_id IS INITIAL OR ls_toaom-doc_type IS INITIAL. MESSAGE 'Fehler im Customizing: kein Eintrag für { %_p_sapobj_%_app_%-text } und { %_p_arobj_%_app_%-text } vorhanden! Bitte OAC3 prüfen' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. *--- upload file using logical filename incl. logical path DATA lv_archive_doc_id TYPE saeardoid. CLEAR lv_archive_doc_id. CALL FUNCTION 'ARCHIVOBJECT_CREATE_FILE' EXPORTING archiv_id = ls_toaom-archiv_id document_type = ls_toaom-doc_type path = iv_file IMPORTING archiv_doc_id = lv_archive_doc_id EXCEPTIONS error_archiv = 1 error_communicationtable = 2 error_upload = 3 error_kernel = 4 OTHERS = 5. IF sy-subrc NE 0 OR lv_archive_doc_id IS INITIAL. MESSAGE |technischer Fehler (ARCHIVOBJECT_CREATE_FILE): sy-subrc='{ sy-subrc }' / archiv_doc_id='{ lv_archive_doc_id }'!| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. *--- insert entry in ArchiveLink directory table CALL FUNCTION 'ARCHIV_CONNECTION_INSERT' EXPORTING archiv_id = ls_toaom-archiv_id arc_doc_id = lv_archive_doc_id ar_object = iv_ar_object object_id = iv_saeobjid sap_object = iv_sap_object doc_type = ls_toaom-doc_type EXCEPTIONS error_connectiontable = 1 OTHERS = 2. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno DISPLAY LIKE sy-msgty WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. *--- in case of an error, delete unassigned but uploaded file! CALL FUNCTION 'ARCHIVOBJECT_DELETE' EXPORTING archiv_id = ls_toaom-archiv_id archiv_doc_id = lv_archive_doc_id EXCEPTIONS error_archiv = 1 error_communicationtable = 2 error_kernel = 3 OTHERS = 4. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno DISPLAY LIKE sy-msgty WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. MESSAGE |Archiveintrag wurde nicht erstellt: ArcID='{ ls_toaom-archiv_id }', { %_p_docid_%_app_%-text }='{ lv_archive_doc_id }': technischer Fehler (ARCHIVOBJECT_DELETE): sy-subrc='{ sy-subrc }'!| TYPE 'S' DISPLAY LIKE 'E'. ELSE. MESSAGE |Archiveintrag wurde nicht erstellt: ArcID='{ ls_toaom-archiv_id }', { %_p_docid_%_app_%-text }='{ lv_archive_doc_id }'!| TYPE 'S' DISPLAY LIKE 'E'. ENDIF. RETURN. ENDIF. MESSAGE 'Archivierung war erfolgreich' TYPE 'S'. WHEN 'SHOW_DOC'. *--- ensure mandatory parameters are provided IF iv_sap_object IS INITIAL. MESSAGE |Angabe fehlt: { %_p_sapobj_%_app_%-text }='{ iv_sap_object }'!| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. IF iv_ar_object IS INITIAL. MESSAGE |Angabe fehlt: { %_p_arobj_%_app_%-text }='{ iv_ar_object }'!| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. IF iv_ardocid IS INITIAL. MESSAGE |Angabe fehlt: { %_p_docid_%_app_%-text }='{ iv_ardocid }'!| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. *--- check customing (OAC3) *--- Security Checks (CVA/SLIN_SEC) Warning and restructed access: *--- Read access (SELECT) to database table / view TOAOM *--- Cannot be deactivated using a pragma. Message Code SEC 11G0 *--- Note: *--- In restricted language scope, like BTP etc., direct read access to database table TOAOM is not allowed! *--- Use FUNC 'ARCHIV_METAINFO_GET' instead SELECT SINGLE archiv_id FROM toaom WHERE sap_object = @iv_sap_object ##WARN_OK AND ar_object = @iv_ar_object "#EC CI_NOORDER INTO @DATA(lv_archiv_id). IF sy-subrc IS NOT INITIAL OR lv_archiv_id IS INITIAL. MESSAGE 'Fehler im Customizing: kein Eintrag für { %_p_sapobj_%_app_%-text } und { %_p_arobj_%_app_%-text } vorhanden! Bitte OAC3 prüfen' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. *--- display file using the Document Viewer CALL FUNCTION 'ARCHIVOBJECT_DISPLAY' EXPORTING archiv_doc_id = iv_ardocid archiv_id = lv_archiv_id EXCEPTIONS OTHERS = 1. IF sy-subrc IS NOT INITIAL. MESSAGE |Dokument kann nicht angezeigt werden: ({ %_p_docid_%_app_%-text }='{ iv_ardocid }' / Archiv-ID='{ lv_archiv_id })!| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. WHEN 'SMICM'. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'SMICM' EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. MESSAGE 'Fehler beim Aufruf der Transaktion' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. RETURN. ENDIF. WHEN 'SICF'. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'SICF' EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. MESSAGE 'Fehler beim Aufruf der Transaktion' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. RETURN. ENDIF. WHEN 'STRUST'. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'STRUST' EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. MESSAGE 'Fehler beim Aufruf der Transaktion' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. RETURN. ENDIF. WHEN 'SA38'. SET PARAMETER ID 'RID' FIELD 'RSPARAM'. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'SA38' EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. MESSAGE 'Fehler beim Aufruf der Transaktion' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. RETURN. ENDIF. WHEN 'SE11'. SET PARAMETER ID 'DTB' FIELD 'SDOKCONT1'. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'SE11' EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. MESSAGE 'Fehler beim Aufruf der Transaktion' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. RETURN. ENDIF. WHEN 'OAC0'. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'OAC0' EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. MESSAGE 'Fehler beim Aufruf der Transaktion' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. RETURN. ENDIF. WHEN 'OAC2'. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'OAC2' EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. MESSAGE 'Fehler beim Aufruf der Transaktion' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. RETURN. ENDIF. WHEN 'OAC3'. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'OAC3' EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. MESSAGE 'Fehler beim Aufruf der Transaktion' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. RETURN. ENDIF. WHEN OTHERS. RETURN. ENDCASE. ENDMETHOD. ENDCLASS. *--- The End!