[ABAP] KPRO: Prüfen, ob Verbindung zum Content-Repository eingerichtet ist

CONSTANTS: c_none TYPE string VALUE '0 '.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title.
* CR
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (17) lbl1 FOR FIELD p_crep.
    PARAMETERS: p_crep TYPE scms_crep MATCHCODE OBJECT h_crep_http.
  SELECTION-SCREEN END OF LINE.
* 'N'
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (17) lbl2 FOR FIELD p_rbs1.
    PARAMETERS: p_rbs1 RADIOBUTTON GROUP rbg DEFAULT 'X'.
  SELECTION-SCREEN END OF LINE.
* 'S'
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (17) lbl3 FOR FIELD p_rbs2.
    PARAMETERS: p_rbs2 RADIOBUTTON GROUP rbg.
  SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.

  title = 'Auswahl'.
  lbl1 = 'Content Repository:'.
  lbl2 = 'Security (N):'.
  lbl3 = 'Security (S):'.

START-OF-SELECTION.
* CREP_HTTP (KPRO CMS: Content-Repositories (HTTP))
  SELECT SINGLE
    FROM crep_http
    FIELDS crep_id,
           http_serv,
           http_port,
           http_sport,
           http_scrpt,
           version
    WHERE crep_id = @p_crep
    INTO @DATA(lv_crep).

  IF sy-subrc EQ 0.
    IF NOT lv_crep-http_port CO c_none OR lv_crep-http_sport CO c_none.

      DATA(lv_sec) = 'N'.

* Security-Typ unterscheiden
      CASE abap_true.
        WHEN p_rbs1.
          lv_sec = 'N'.
        WHEN p_rbs2.
          lv_sec = 'S'.
      ENDCASE.

* CMS: HTTP Verbindungstest
      CALL FUNCTION 'SCMS_HTTP_PING'
        EXPORTING
          crep_id    = lv_crep-crep_id
          http_serv  = lv_crep-http_serv
          http_port  = lv_crep-http_port
          http_sport = lv_crep-http_sport
          http_scrpt = lv_crep-http_scrpt
          version    = lv_crep-version
          security   = lv_sec
        EXCEPTIONS
          error_http = 1
          OTHERS     = 2.

      IF sy-subrc = 0.
        WRITE: / |{ lv_crep-crep_id } ok.|.
      else.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO DATA(lv_msg).
        WRITE: / lv_msg.
      ENDIF.
    ELSE.
      WRITE: / 'No port.'.
    ENDIF.
  ELSE.
    WRITE: / 'No CS.'.
  ENDIF.

[ABAP] Anlagen zu Business-Objekten zählen

PARAMETERS: p_instid TYPE sibfboriid DEFAULT '000000001234567890'.
PARAMETERS: p_typeid TYPE sibftypeid DEFAULT 'BUS1001006'.
PARAMETERS: p_catid TYPE sibfcatid DEFAULT 'BO'.

START-OF-SELECTION.

* Schlüssel des Business-Objekts
  DATA(lv_object) = VALUE sibflporb( instid  = p_instid
                                     typeid  = p_typeid
                                     catid   = p_catid ).

* Statistiken für Anlagen -> Anlagen zählen
  DATA(it_stst) = cl_gos_attachment_query=>count_for_object( is_object = lv_object
                                                             ip_arl    = '' ).

* Übersicht zu angehangenen Objekten, COUNTER enthält die Anzahl
  cl_demo_output=>write_data( it_stst ).
  cl_demo_output=>display( ).

[ABAP] Klassen für Zugriff auf Business-Objekte

SAPoffice Dokumente

  • verlinkt auf Business Objekte via Object Relationship Service Tables
  • Klasse: CL_BINARY_RELATION (ersetzt FuBas SO_DOCUMENT*)
  • Tabellen: SRGBTBREL

Beispiel

* Quelle / Inspiration: https://www.inwerken.de/gos-anhange-auslesen-anlegen/

**********************************************************************
* Typen
**********************************************************************
TYPES: BEGIN OF ty_s_key,
         foltp     TYPE so_fol_tp,
         folyr     TYPE so_fol_yr,
         folno     TYPE so_fol_no,
         objtp     TYPE so_obj_tp,
         objyr     TYPE so_obj_yr,
         objno     TYPE so_obj_no,
         forwarder TYPE so_usr_nam,
       END OF ty_s_key.
**********************************************************************
* Selektionsbild
**********************************************************************
PARAMETERS: p_instid TYPE sibfboriid DEFAULT '000000001234567890'.
PARAMETERS: p_typeid TYPE sibftypeid DEFAULT 'BUS1001006'.
PARAMETERS: p_catid TYPE sibfcatid DEFAULT 'BO'.

START-OF-SELECTION.

* Schlüssel des Business-Objekts
  DATA(lv_object) = VALUE sibflporb( instid  = p_instid
                                     typeid  = p_typeid
                                     catid   = p_catid ).

* Verknüpfungsoptionen
* Verknüpfungstypen
  DATA(it_relopt) = VALUE obl_t_relt( ( sign   = 'I'
                                        option = 'EQ'
                                        low    = 'ATTA' " Anhänge
                                      )
                                      ( sign   = 'I'
                                        option = 'EQ'
                                        low    = 'NOTE' " Notizen
                                      )
                                      ( sign   = 'I'
                                        option = 'EQ'
                                        low    = 'URL'  " URLs
                                      )
                                    ).

  TRY.
* Verknüpfungen zum Objekt
      DATA(it_links) = VALUE obl_t_link( ).
      DATA(it_roles) = value obl_t_role( ).

* Verknüpfungen zum Objekt lesen
      cl_binary_relation=>read_links_of_binrels( EXPORTING
                                                   is_object           = lv_object
                                                   it_relation_options = it_relopt
                                                   ip_role             = 'GOSAPPLOBJ'
                                                 IMPORTING
                                                   et_links            = it_links
                                                   et_roles            = it_roles ).

      cl_demo_output=>write_data( it_links ).
      cl_demo_output=>write_data( it_roles ).

* Verknüpfungen vom Typ 'MESSAGE' durchgehen
      LOOP AT it_links ASSIGNING FIELD-SYMBOL(<l>) WHERE typeid_b = 'MESSAGE'.

        cl_demo_output=>line( ).

* Schlüssel einer Verknüpfung
        DATA(lv_key) = CONV ty_s_key( <l>-instid_b ).
        cl_demo_output=>write_data( lv_key ).

* Dokumenten-Grunddaten
        DATA(lv_doc_data) = VALUE sofolenti1( ).
* Dokumenteninhalt Text und Binär
        DATA(it_contx) = VALUE solix_tab( ).
        DATA(it_cont) = VALUE soli_tab( ).

* Daten des Dokuments lesen
        CALL FUNCTION 'SO_DOCUMENT_READ_API1'
          EXPORTING
            document_id                = CONV sofolenti1-doc_id( <l>-instid_b ) " Dokumenten-ID für SAPOffice == Instanz-ID
          IMPORTING
            document_data              = lv_doc_data
          TABLES
            object_content             = it_cont
            contents_hex               = it_contx
          EXCEPTIONS
            document_id_not_exist      = 1
            operation_no_authorization = 2
            x_error                    = 3
            OTHERS                     = 4.
        IF sy-subrc = 0.
          cl_demo_output=>write_data( lv_doc_data ).
          cl_demo_output=>write_data( it_cont ).
        ENDIF.

      ENDLOOP.

      cl_demo_output=>display( ).

    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

Archivdokumente

  • Logische Dokumente, verlinkt auf Business Objekte via Connection Tables des Content Management Systems
  • Klasse: CL_ALINK_CONNECTION
  • Funktionen: find, find_by_doc_key, compose, insert, delete_by_key
  • Tabellen: TOAAR, TOAOM, TOJTB, TOA01, TOA02, TOA03

Beispiel

TRY.
    DATA(o_alink) = NEW cl_alink_connection( ).
* Suche von Verknüpfungen
    o_alink->find( EXPORTING 
                     sap_object = 'ZXYZ'                   " SAP ArchiveLink: Objekttyp des Business Objekts
                     object_id  = CONV saeobjid( '12345' ) " SAP ArchiveLink: Objekt-Id (Objektidentifikator)
                     mandt      = sy-mandt                 " Mandantenkennung des aktuellen Benutzers
                     archiv_id  = 'XY'                     " Content Repository Identifikation
                   IMPORTING
                     connections = DATA(it_conn) ).
    
    cl_demo_output=>display( it_conn ).
  CATCH cx_root.
ENDTRY.

[ABAP] Konstanten für gängige MIME-Typen (IF_REST_MEDIA_TYPE, CL_FXS_MIME_TYPES)

Variante 1 (IF_REST_MEDIA_TYPE)

Konstante                       MIME-Typ
--------------------------------------------------------------
gc_all                          '*/*'
gc_appl_all                     'application/*'
gc_appl_xml                     'application/xml'
gc_appl_xhtml_xml               'application/xhtml+xml'
gc_appl_atom_xml                'application/atom+xml'
gc_appl_atom_xml_feed           'application/atom+xml;type=feed'
gc_appl_atom_xml_entry          'application/atom+xml;type=entry'
gc_appl_atomcat_xml             'application/atomcat+xml'
gc_appl_atomsvc_xml             'application/atomsvc+xml'
gc_appl_opensearch_descr_xml    'application/opensearchdescription+xml'
gc_appl_all_xml                 'application/*+xml'
gc_appl_java                    'application/java'
gc_appl_java_archive            'application/java-archive'
gc_appl_json                    'application/json'
gc_appl_json_odata_verbose      'application/json;odata=verbose'
gc_appl_mac_binhex40            'application/mac-binhex40'
gc_appl_mathml_xml              'application/mathml+xml'
gc_appl_msword                  'application/msword'
gc_appl_octet_stream            'application/octet-stream'
gc_appl_onenote                 'application/onenote'
gc_appl_pdf                     'application/pdf'
gc_appl_postscript              'application/postscript'
gc_appl_rdf_xml                 'application/rdf+xml'
gc_appl_relax_ng_compact_synt   'application/relax-ng-compact-syntax'
gc_appl_rss_xml                 'application/rss+xml'
gc_appl_rtf                     'application/rtf'
gc_appl_sparql_results_json     'application/sparql-results+json'
gc_appl_sparql_results_xml      'application/sparql-results+xml'
gc_appl_trix                    'application/trix'
gc_appl_vnd_google_earthkmlxml  'application/vndgoogle-earthkml+xml'
gc_appl_vnd_google_earth_kmz    'application/vndgoogle-earthkmz'
gc_appl_vnd_mozilla_xul_xml     'application/vndmozillaxul+xml'
gc_appl_vnd_ms_cab_compressed   'application/vndms-cab-compressed'
gc_appl_vnd_ms_excel            'application/vndms-excel'
gc_appl_vnd_ms_powerpoint       'application/vndms-powerpoint'
gc_appl_vnd_ms_project          'application/vndms-project'
gc_appl_vnd_sun_wadl_xml        'application/vndsunwadl+xml'
gc_appl_voicexml_xml            'application/voicexml+xml'
gc_appl_zip                     'application/zip'
gc_audio_all                    'audio/*'
gc_audio_basic                  'audio/basic'
gc_audio_midi                   'audio/midi'
gc_audio_mpeg                   'audio/mpeg'
gc_image_all                    'image/*'
gc_image_bmp                    'image/bmp'
gc_image_gif                    'image/gif'
gc_image_jpeg                   'image/jpeg'
gc_image_png                    'image/png'
gc_image_svg_xml                'image/svg+xml'
gc_image_tiff                   'image/tiff'
gc_message_all                  'message/*'
gc_model_all                    'model/*'
gc_model_vrml                   'model/vrml'
gc_multipart_all                'multipart/*'
gc_multipart_form_data          'multipart/form-data'
gc_text_all                     'text/*'
gc_text_calendar                'text/calendar'
gc_text_css                     'text/css'
gc_text_csv                     'text/csv'
gc_text_html                    'text/html'
gc_text_javascript              'text/javascript'
gc_text_n_triples               'text/n-triples'
gc_text_n3                      'text/n3'
gc_text_plain                   'text/plain'
gc_text_tab_separated_values    'text/tab-separated-values'
gc_text_uri_list                'text/uri-list'
gc_video_all                    'video/*'
gc_video_mp4                    'video/mp4'
gc_video_mpeg                   'video/mpeg'
gc_video_quicktime              'video/quicktime'
gc_appl_www_form_url_encoded    'application/x-www-form-urlencoded'
gc_multipart_mixed              'multipart/mixed'
gc_appl_http                    'application/http'

Variante 2 (CL_FXS_MIME_TYPES)

Konstante                           MIME-Typ
--------------------------------------------------------------
CL_FXS_MIME_TYPES=>CO_BINARY        'application/octet-stream'
CL_FXS_MIME_TYPES=>CO_PDF           'application/pdf'
CL_FXS_MIME_TYPES=>CO_IMAGE_BITMAP  'image/x-ms-bmp'
CL_FXS_MIME_TYPES=>CO_IMAGE_PNG     'image/png'
CL_FXS_MIME_TYPES=>CO_IMAGE_GIF     'image/gif'
CL_FXS_MIME_TYPES=>CO_IMAGE_TIFF    'image/tiff'
CL_FXS_MIME_TYPES=>CO_IMAGE_JPEG    'image/jpeg'

[ABAP] RFC-Abruf aller verlinkten Dokumente zu einem Business Object

* System-ID
PARAMETERS: p_rfc TYPE sy-sysid DEFAULT 'XYZ'.
* Typ-Material 
PARAMETERS: p_sobj TYPE toav0-sap_object DEFAULT 'BUS1001006'.
* MATNR
PARAMETERS: p_oid TYPE toav0-object_id DEFAULT '000000001234567890'.

START-OF-SELECTION.

  DATA: lv_message TYPE bapiret2.
  DATA: it_results TYPE STANDARD TABLE OF toars_s WITH DEFAULT KEY.
  DATA: it_urls TYPE STANDARD TABLE OF toadurl_s WITH DEFAULT KEY.

* Gibt alle Dokumente zum Business Object zurück
  CALL FUNCTION 'ALINK_RFC_DOCUMENTS_GET' DESTINATION p_rfc
    EXPORTING
      im_botype             = p_sobj
      im_boid               = p_oid
      im_x_urls             = abap_false " Schalter zum Füllen von IT_URLS => Performance beachten
    IMPORTING
      ex_message            = lv_message
    TABLES
      ex_results            = it_results
      ex_urls               = it_urls
    EXCEPTIONS
      system_failure        = 1
      communication_failure = 2
      OTHERS                = 3.

  WRITE: / lv_message-message.

  IF sy-subrc = 0.
    cl_demo_output=>display( it_results ).
  ENDIF.

[ABAP] MIME-Repository: Verzeichnis lesen

DATA: it_file_list TYPE string_table.

* MIME-API holen
DATA(o_mime_rep) = cl_mime_repository_api=>get_api( ).

TRY.
* Bild aus dem MIME-Repository laden
    o_mime_rep->file_list( EXPORTING
                             i_url             = '/SAP/BC/BSP'
                             i_recursive_call  = abap_true
*                             i_check_authority = abap_false
                           IMPORTING
                             e_files           = it_file_list ).

    cl_demo_output=>display( it_file_list ).
  CATCH cx_root INTO DATA(e).
    WRITE : / e->get_text( ).
ENDTRY.

[ABAP] MIME-Repository: Objekt-ID, Pfad, Attribute, Berechtigungen

DATA: lv_io    TYPE skwf_io.
DATA: lv_error TYPE skwf_error.

* Repository-Objekt (MIME) über Pfad suchen
CALL FUNCTION 'SKWF_NMSPC_IO_FIND_BY_ADDRESS'
  EXPORTING
    url   = '/SAP/PUBLIC/xyz.jpg'
    appl  = wbmr_c_skwf_appl_name " 'MIME'
  IMPORTING
    io    = lv_io
    error = lv_error.

IF lv_error-type = 'E'.
ELSE.
  WRITE: / lv_io-objid, lv_io-objtype, lv_io-object, lv_io-class.

* Objekttyp
  CASE lv_io-objtype.
    WHEN skwfc_obtype_folder.
      WRITE: / 'Folder'.
    WHEN skwfc_obtype_any.
      WRITE: / 'Any'.
    WHEN skwfc_obtype_loio.
      WRITE: / 'Logical object'.
    WHEN skwfc_obtype_phio.
      WRITE: / 'Physical object'.
    WHEN skwfc_obtype_rela.
      WRITE: / 'Relation'.
  ENDCASE.

  TRY.
* Zugriff prüfen
      cl_mime_services=>mime_check_authority( i_operation = 'SHOW' " Aktion ('INSERT','MODIFY','SHOW','DELETE')
                                              i_object_io = lv_io ).

      DATA: lv_url TYPE skwf_url.
      DATA: lv_relative_url TYPE skwf_descr.

      DATA: lv_error2 TYPE skwf_error.

* Pfad zum Repository-Objekt (MIME) suchen
      CALL FUNCTION 'SKWF_NMSPC_IO_ADDRESS_GET'
        EXPORTING
          io           = lv_io
        IMPORTING
          url          = lv_url
          relative_url = lv_relative_url
          error        = lv_error2.

      IF lv_error2-type = 'E'.
      ELSE.
        WRITE: / lv_url.
        WRITE: / lv_relative_url.
      ENDIF.

    CATCH cx_root INTO DATA(e).
  ENDTRY.
ENDIF.

[ABAP] Content-Repositorys auslesen

Variante 1 (CREP)

SELECT c~crep_id,
       c~crep_type,
       c~crep_stype,
       c~crea_user,
       c~crea_time,
       c~chng_user,
       c~chng_time,
       t~descript,
       h~archivpath,
       r~r3db_tab
INTO TABLE @DATA(it_crep)
FROM crep AS c                                              " CREP: KPRO CMS: Content-Repositories"
INNER JOIN crepdescr AS t ON ( c~crep_id = t~crep_id )      " CREPDESCR: KPRO CMS: Beschreibungen der Content-Repositories"
LEFT OUTER JOIN crep_http AS h ON ( c~crep_id = h~crep_id ) " CREP_HTTP: KPRO CMS: Content-Repositories (HTTP)"
LEFT OUTER JOIN crep_r3db AS r ON ( c~crep_id = r~crep_id ) " CREP_R3DB: KPRO CMS: Content-Repositories (R3DB)"
WHERE t~langu = @sy-langu.

cl_demo_output=>display( it_crep ).

Variante 2 (SCMS_SDOKSTRE_LIST)

DATA: it_sdokstre TYPE STANDARD TABLE OF sdokstre WITH DEFAULT KEY.

CALL FUNCTION 'SCMS_SDOKSTRE_LIST'
  TABLES
    i_sdokstre = it_sdokstre
  EXCEPTIONS
    not_found  = 1
    OTHERS     = 2.

cl_demo_output=>display( it_sdokstre ).