Pfadauswahl mit DIRECTORY_BROWSE

Um einen Dateipfad auf dem Frontend auszuwählen, gibt es die Methode DIRECTORY_BROWSE der Klasse CL_GUI_FRONTEND_SERVICES. Um sie jedoch in der F4-Hilfe eines Reports sinnvoll verwenden zu können, muss man sich noch eines Tricks bedienen. Das Problem: Bei Aufruf der F4-Hilfe steht der Wert des Parameters für den die F4-Hilfe aufgerufen wurde, nicht zur Verfügung.

Aus diesem Grund muss der Feldinhalt explizit mit Hilfe des Funktionsbausteins DYNP_VALUES_READ gelesen werden.

Coding

REPORT z_test_browse_directory.

*== SELECTION SCREEN
PARAMETERS p_path  TYPE text200 OBLIGATORY LOWER CASE.

*== Help Value path
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
  PERFORM f4_path.

*== init
INITIALIZATION.
  PERFORM get_download_path.

*&---------------------------------------------------------------------*
*&      Form  get_download_path
*&---------------------------------------------------------------------*
FORM get_download_path.

*== local data
  DATA lv_upload_path    TYPE string.
  DATA lv_download_path  TYPE string.

*== get current download path
  CALL METHOD cl_gui_frontend_services=>get_upload_download_path
    CHANGING
      upload_path   = lv_upload_path
      download_path = lv_download_path.

*== set parameter
  p_path = lv_download_path.

ENDFORM.                    "get_download_path

*&---------------------------------------------------------------------*
*&      Form  f4_path
*&---------------------------------------------------------------------*
FORM f4_path.

*== local data
  DATA lv_out    TYPE string.
  DATA lv_in     TYPE string.
  DATA lt_fields TYPE TABLE OF dynpread.
  DATA ls_field  TYPE dynpread.

*== get current value for path
  ls_field = 'P_PATH'.
  APPEND ls_field TO lt_fields.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname     = sy-cprog
      dynumb     = sy-dynnr
    TABLES
      dynpfields = lt_fields
    EXCEPTIONS
      OTHERS     = 1.

  IF sy-subrc = 0.
    READ TABLE lt_fields INTO ls_field INDEX 1.
    lv_in = ls_field-fieldvalue.
  ENDIF.

*== call popup for directory selection
  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      initial_folder  = lv_in
    CHANGING
      selected_folder = lv_out
    EXCEPTIONS
      OTHERS          = 4.

  IF sy-subrc = 0 AND lv_out IS NOT INITIAL.
*== set selected path
    p_path = lv_out.
  ELSE.
*== set origin path
    p_path = lv_in.
  ENDIF.

ENDFORM.

Verwendung in einer Suchhilfe

Einfacher und sinnvoller jedoch ist die Verwendung in einer Suchhilfe! Warum? Erstens kann die Suchhilfe an ein entsprechendes Feld einer Dictionarystruktur angebunden werden und zweitens lässt sich auch in einem Report eine Suchhilfe einfacher verwenden.

Das Programm reduziert sich so auf die folgende Angabe bei dem Parameter P_PATH:

PARAMETERS p_path  TYPE string OBLIGATORY LOWER CASE MATCHCODE OBJECT ZSH_DIRECTORY.

du ahnst es schon: Die Suchhilfe heißt in diesem Fall ZSH_DIRECTORY. Um diese zu erstellen musst du folgendes tun:

  1. Anlage der Suchhilfe in der SE11
  2. Anlage eines Funktionsbausteins, der als Suchhilfe-Exit verwendet wird.

Wir fangen bei 2. an:

2. Anlage Suchhilfe-Exit

Du benötigst eine Funktionsgruppe. Einfach in der SE80 eine anlegen. In diese Funktionsgruppe kopierst du den Baustein F4IF_SHLP_EXIT_EXAMPLE auf den Baustein Z_F4IF_SHLP_EXIT_DIRECTORY. Das Kopieren ist wichtig, da die Suchhilfe-Exit-Bausteine eine definierte Schnittstelle haben.

Im STEP SELECT fügst du das Coding ein, dessen Kern wir bereits aus dem vorherigen Coding kennen:

  IF callcontrol-step = 'SELECT'.
*== data (please set data definitions to top of function module!)
    DATA lv_in TYPE string.
    DATA lv_out TYPE string.
    FIELD-SYMBOLS <itf> LIKE LINE OF shlp-interface.
    FIELD-SYMBOLS <rec> LIKE LINE OF record_tab.
*== get field value
    READ TABLE shlp-interface WITH KEY shlpfield = 'PATH' ASSIGNING <itf>.
    IF sy-subrc = 0.
*== use field value as start directory
      lv_in = <itf>-value.
*== call popup for directory selection
      CALL METHOD cl_gui_frontend_services=>directory_browse
        EXPORTING
          initial_folder  = lv_in
        CHANGING
          selected_folder = lv_out
        EXCEPTIONS
          OTHERS          = 4.
      IF sy-subrc = 0 AND lv_out IS NOT INITIAL.
        APPEND INITIAL LINE TO record_tab ASSIGNING <rec>.
        <rec>-string = lv_out.
        callcontrol-step = 'RETURN'.
      ENDIF.
    ENDIF.
  ENDIF.

Grob passiert folgendes:

  1. Wir lesen aus der Schnittstellenbeschreibung den Parameter PATH, den wir in der Suchhilfe definiert haben, aus und verwenden ihn als Startverzeichnis
  2. Aufruf der Methode DIRECTORY_BROWSE
  3. Füllen der Rückgabetabelle RECORD_TAB
  4. Setzen des Folgeschrittes RETURN um die Anzeige des gefundenen Verzeichnisses im Popup zu verhindern

[notice type=’info’]Eventuell kann es sein, dass in dem Beispiel das Startverzeichnis nicht in die Suchhilfe übernommen wird. In dem Fall muss gegebenenfalls ebenfalls der Funktionsbaustein DYNP_VALUES_READ eingesetzt werden. Das verwendete Parametername steht in der INTERFACE-Struktur im Feld VALFIELD.[/notice]

1. Anlage der Suchhilfe

Transaktion SE11: Suchhilfe Anlegen:

In der Suchhilfe muss der erstellte Funktionsbaustein als Suchhilfe-Exit eingetragen werden:

Enno Wulff