Dynamische Übergabe von Werten in eine Druckstruktur

Im Customizing der SAP IS-H Organisationsmittelverwaltung wird die Möglichkeit geboten, kundenspezifische Funktionsbausteine zu nutzen, mit der die Formularausgabe gesteuert wird.

Beispiel:

*   Customer-FuB aufrufen
     CALL FUNCTION print_rnfor-fbprint
       EXPORTING
         dialog        dialog
         i_rnexl       i_rnexl
         i_rnanz1      i_rnanz1
         nfal          nfal
         npat          ls_npat_pseudo    "EhP5 Pseudon
         i_rnf01       rnf01
         i_rnf02       rnf02
         i_rnf04       rnf04
         i_rnf05       rnf05
         i_rnf15       rnf15
         i_rnf19       rnf19
         i_tn01        i_tn01
         i_print_rnfor print_rnfor
       IMPORTING
         abbruch       abbruch
         print_error   print_error
       TABLES
         nbewtab       nbewtab
         ndiatab       ndiatab.

Da ich ein Fan der Übergabe einer schmalen, verschachtelten Druckstruktur (Felder, Strukturen, Tabellen in einer einzigen Struktur)  ans Formular bin, stelle sich mir die Aufgabe, diese Daten so einfach wie möglich in meine Druckstruktur zu übergeben.

Beispiel Formularschnittstelle:

Dazu bediente ich mich an der folgenden SAP Methode:

cl_fb_function_utility=>meth_get_interface

Mit dieser Methode lese ich die Schnittstellenparameter aus meinem kundenspezifischen Funktionsbaustein und der Formularschnittstelle.

* Lesen der Schnittstellenparameter
     CALL METHOD cl_fb_function_utility=>meth_get_interface
       EXPORTING
         im_name             lv_im_name
       IMPORTING
         ex_interface        E_INTERFACE
       EXCEPTIONS
         error_occured       1
         object_not_existing 2
         OTHERS              3.

Dann folgt noch die dynamische Übergabe:

*************************************************
 *  PDF Druck - Ermitteln der Importparameter
 *************************************************
   CALL METHOD zcl_form_druck=>get_import_params
     EXPORTING
       i_fm_name        lv_fm_name
       i_name_parameter 'I_PD'
       i_import_flg     abap_true
     IMPORTING
       e_import_params  ls_import_param.
 
   IF ls_import_param IS NOT INITIAL.
 
 *************************************************
 * Dynamische Referenz der Druckstruktur erstellen
 *************************************************
     CREATE DATA ls_ref TYPE (ls_import_param-structure).
     ASSIGN ls_ref->TO <fs_pd>.
 
     IF <fs_pd> IS ASSIGNED.
 
 *************************************************
 *  Komponenten der Druckstruktur lesen
 *************************************************
       CLEARlcl_struclt_comp[].
       lcl_struc ?= cl_abap_structdescr=>describe_by_data<fs_pd> ).
       lt_comp lcl_struc->get_components).
 
 *************************************************
 *  Formularschnittstelle dynamisch füllen
 *************************************************
       LOOP AT lt_comp ASSIGNING <fs_comp>.
 
         CLEAR lv_structure.
         lv_structure <fs_comp>-type->get_relative_name).
 
 *************************************************
 *  Importparameter dynamisch übergeben
 *************************************************
         LOOP AT ls_interface-import ASSIGNING <fs_parameter>
           WHERE structure lv_structure.
 
           ASSIGN (<fs_parameter>-parameterTO <fs_quelle>.
           ASSIGN COMPONENT <fs_comp>-name  OF STRUCTURE <fs_pd> TO <fs_ziel>.
 
 * Zuweisung durchführen
           IF <fs_quelle> IS ASSIGNED AND <fs_ziel> IS ASSIGNED.
             TRY.
                 <fs_ziel> <fs_quelle>.
             ENDTRY.
             UNASSIGN <fs_quelle>.
             UNASSIGN <fs_ziel>.
           ENDIF.
         ENDLOOP.
 
 **************************************************
 **  Tabellenparameter dynamisch übergeben
 **************************************************
         LOOP AT ls_interface-tables  ASSIGNING <fs_parameter>
           WHERE structure lv_structure.
 
           lv_tablename <fs_parameter>-parameter && '[]'.
           ASSIGN (lv_tablenameTO <fs_quelle>.
           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_pd> TO <fs_ziel>.
 
 * Zuweisung durchführen
           IF <fs_quelle> IS ASSIGNED AND <fs_ziel> IS ASSIGNED.
             TRY.
                 <fs_ziel> <fs_quelle>.
             ENDTRY.
             UNASSIGN <fs_quelle>.
             UNASSIGN <fs_ziel>.
           ENDIF.
         ENDLOOP.
       ENDLOOP.
          ENDIF.
      ENDIF.

Folgende Datendeklarationen habe ich vorgenommen:

* Datendeklaration
   DATAlv_fm_name                  TYPE funcname,
         ls_fp_outputparams          TYPE sfpoutputparams,
         ls_fm_docparams             TYPE sfpdocparams,
         ls_fpformoutput             TYPE fpformoutput,
         ls_import_param             TYPE rsfbpara,
         ls_structure                TYPE objectname,
         ls_ref                      TYPE REF TO data,
         lv_error                    TYPE xfeld,
         lv_subrc                    TYPE sy-subrc,
         ls_interface                TYPE rsfbintfv,
         lv_tablename(30)            TYPE c,
         ls_tn01                     TYPE tn01,
         ls_rnf19                    TYPE rnf19,
         lv_structure                TYPE string,
         lcl_struc                   TYPE REF TO cl_abap_structdescr,
         lt_comp                     TYPE cl_abap_structdescr=>component_table.
 
 * Datendeklaration Lokalte Tabellen
   DATAlt_nbewtab      TYPE TABLE OF vnbew.
 
 
   FIELD-SYMBOLS<fs_pd>        TYPE any,
                  <fs_quelle>    TYPE any,
                  <fs_ziel>      TYPE any,
                  <fs_parameter> TYPE rsfbpara,
                  <fs_comp>      LIKE LINE OF lt_comp.