[ABAP] SAP-ShortCode-Datei (*.sap) erzeugen

Variante 1 (SWN_CREATE_SHORTCUT -> *.sap-Datei speichern)

* SAP ShortCode-Dateien sind mit der installierten SAPGUI verknüpft und werden von dieser beim Doppelklick auf den Dateinamen geöffnet und ausgeführt
* SAP ShortCode-Dateien können auch im SAPGUI über den Button "Erstellt eine Verknüpfung" erzeugt werden
* SAP Hinweis: 103019 - SAPshortcut: Programmparameter
* http://troublefreeabap.blogspot.com/2013/06/creating-sapgui-shortcuts.html
PARAMETERS: p_matnr TYPE mara-matnr.

START-OF-SELECTION.

* Kommando (i_system_command):
* - fasst i_transaction und i_parameter zusammen
* - Transaktion MM03 in neuem Fenster anzeigen
*   - '/o' --> neuen Modus öffnen
*   - '*' --> überspringt Selektionsbild
* - Übergabe: MATNR an Dynpro-Feld für die MATNR im Selektionsbild (RMMG1-MATNR)
* - entfernen führenden Nullen (ALPHA = OUT)
  DATA(lv_cmd) = |/o*MM03 RMMG1-MATNR={ p_matnr ALPHA = OUT }|.
* Texttabelle mit generierten Daten für die Shortcut-Datei (*.sap)
  DATA(it_sap_shortcut_data) = VALUE soli_tab( ).

* WF Notif: SAP Shortcut als Anlage erzeugen
  CALL FUNCTION 'SWN_CREATE_SHORTCUT'
    EXPORTING
      i_system_command        = CONV char40( lv_cmd )
*      i_transaction           = '*MM03'
*      i_parameter             = CONV text255( |RMMG1-MATNR={ p_matnr ALPHA = OUT }| )
      i_user                  = ''
      i_windowsize            = 'Maximized' " oder 'Normal window'
      i_title                 = CONV char80( |MM03 - Material anzeigen| )
    IMPORTING
      shortcut_table          = it_sap_shortcut_data
    EXCEPTIONS
      inconsistent_parameters = 1
      OTHERS                  = 2.

  IF sy-subrc = 0.
* *.sap ShortCut-Datei speichern
    TRY.
        DATA: lv_action TYPE i.
        DATA: lv_filename TYPE string.
        DATA: lv_fullpath TYPE string.
        DATA: lv_path TYPE string.

* Save-Dialog
        cl_gui_frontend_services=>file_save_dialog( EXPORTING default_file_name = 'Start_MM03.sap'
                                                              default_extension = 'sap'
                                                              file_filter       = |ShortCut-Datei (*.sap)\|*.sap\|{ cl_gui_frontend_services=>filetype_all }|
                                                    CHANGING  filename          = lv_filename
                                                              path              = lv_path
                                                              fullpath          = lv_fullpath
                                                              user_action       = lv_action ).

        IF lv_action EQ cl_gui_frontend_services=>action_ok.
* Datei lokal speichern
          cl_gui_frontend_services=>gui_download( EXPORTING filename     = lv_fullpath
                                                            filetype     = 'DAT'
                                                  CHANGING  data_tab     = it_sap_shortcut_data ).

        ENDIF.
      CATCH cx_root INTO DATA(e_text).
        MESSAGE e_text->get_text( ) TYPE 'I'.
    ENDTRY.
  ENDIF.

Variante 2 (SICF-Service /sap/public/bc/workflow/shortcut)

PARAMETERS: p_matnr TYPE mara-matnr.

START-OF-SELECTION.

  DATA: it_servlist TYPE STANDARD TABLE OF icm_sinfo2 WITH DEFAULT KEY.

* Statistikdaten des ICM lesen
  CALL FUNCTION 'ICM_GET_INFO2'
    TABLES
      servlist           = it_servlist
    EXCEPTIONS
      icm_error          = 1
      icm_timeout        = 2
      icm_not_authorized = 3
      OTHERS             = 4.

  IF sy-subrc = 0.
* protocol 1: HTTP
* protocol 2: HTTPS
    IF line_exists( it_servlist[ protocol = 2 ] ).
* URL für workflow-shortcut zusammenbauen
* SICF-Service muss aktiv sein: /sap/public/bc/workflow/shortcut
* Daten werden in der Klasse CL_SWN_HTTP_SHORTCUT prozessiert
      DATA(lv_server) = it_servlist[ protocol = 2 ].
      DATA(lv_html) = |https://{ lv_server-hostname }:{ lv_server-service }|.
      lv_html = lv_html && |/sap/public/bc/workflow/shortcut?|.
      lv_html = lv_html && |sysid={ sy-sysid }&client={ sy-mandt }|.
      lv_html = lv_html && |&logonid=&uname={ sy-uname }|.
      lv_html = lv_html && |&langu=DE|.
      lv_html = lv_html && |&transaction=*MM03|.
      lv_html = lv_html && |&param=RMMG1-MATNR%3d{ p_matnr ALPHA = OUT }|.

      WRITE: / lv_html.
    ENDIF.
  ENDIF.