[ABAP] Adobe Forms Formular aufrufen und als xstring weiterverarbeiten

* https://www.berater-wiki.de/Aufruf_des_Adobe_Formulars_im_Rahmenprogramm
* https://wiki.scn.sap.com/wiki/display/ABAP/Adobe+Forms+from+Scratch

* Hilfsfunktionen für Adobe Forms
INCLUDE fp_utilities.

* Formularname
DATA(lv_form) = CONV fpname( 'ZADOBE_FORM_NAME' ).
* Name für generierten Funktionsbaustein
DATA: lv_funcname TYPE funcname.
DATA: lv_interface_type TYPE fpinterfacetype.

TRY.
* Namen des Funktionsbausteins für ein Formular bestimmen
  CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
    EXPORTING
      i_name           = lv_form
    IMPORTING
      e_funcname       = lv_funcname
      e_interface_type = lv_interface_type.

  DATA: lv_outputparams TYPE sfpoutputparams.

** Output Parameter für neues Interface
** Druckerdialog ausblenden
*  lv_outputparams-nodialog = 'X'.
** Druckvorschau
*  lv_outputparams-preview  = 'X'.
** Druckbutton ausblenden
*  lv_outputparams-noprint  = 'X'.
** Druckvorschaubutton ausblenden
*  lv_outputparams-nopreview   = 'X'.
** Name Ausgabegerät (Drucker)
*  lv_outputparams-dest     = 'LP01'.
*  lv_outputparams-nopdf    =
** Spoolsteuerung
** Neuen Spoolrequest anlegen
*  lv_outputparams-reqnew   = 'X'.
** Spoolrequest schließen
*  lv_outputparams-reqfinal = 'X'.

* PDF XSTRING anfordern
   lv_outputparams-getpdf   = 'X'.


** XFP Settings für Externes Interface
*  lv_outputparams-xfp       =
** Context
*  lv_outputparams-xfptype   =
*  lv_outputparams-xfpoutdev =

* Formularprozessierung: Job beginnen
  CALL FUNCTION 'FP_JOB_OPEN'
    CHANGING
      ie_outputparams = lv_outputparams
    EXCEPTIONS
      cancel          = 1
      usage_error     = 2
      system_error    = 3
      internal_error  = 4
      OTHERS          = 5.

  IF sy-subrc = 0.

    DATA(lv_docparams) = VALUE sfpdocparams( langu = 'D' country  = 'DE' ).
    DATA: lv_formout TYPE fpformoutput.

* Funtionsbaustein aufrufen
    CALL FUNCTION lv_funcname
      EXPORTING
        /1bcdwb/docparams  = lv_docparams
* ggf. spez. Parameter für Funktionsaufruf hier aufführen
* siehe Transaktion SFP (Form Builder)
      IMPORTING
        /1bcdwb/formoutput = lv_formout
      EXCEPTIONS
        usage_error        = 1
        system_error       = 2
        internal_error     = 3
        OTHERS             = 4.

    IF sy-subrc = 0.
* xstring mit PDF-Daten
      DATA(lv_pdf_raw) = lv_formout-pdf.
* hier weitere Verarbeitung
      ...
    ELSE.
* wenn Fehler beim ADS-Aufruf
      DATA: lv_error_string TYPE string.

      CALL FUNCTION 'FP_GET_LAST_ADS_ERRSTR'
        IMPORTING
          e_adserrstr = lv_error_string.

      IF NOT lv_error_string IS INITIAL.
* detaillierte Fehlermeldung ausgeben
        WRITE: / lv_error_string COLOR COL_NEGATIVE.
      ELSE.
* sonst nur eine unspezifische Fehlermeldung ausgeben
        WRITE: / 'Error within Form Call : ', sy-subrc COLOR COL_NEGATIVE.
      ENDIF.

    ENDIF.

    DATA: lv_result TYPE sfpjoboutput.

* Formularprozessierung: Job beenden
    CALL FUNCTION 'FP_JOB_CLOSE'
      IMPORTING
        e_result       = lv_result
      EXCEPTIONS
        usage_error    = 1
        system_error   = 2
        internal_error = 3
        OTHERS         = 4.

    IF sy-subrc <> 0.
* Fehler beim Beenden der Formprozessierung
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ELSE.
* Formprozessierung kann nicht gestartet werden
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

CATCH cx_root.
  WRITE : / 'Fehler beim Ermitteln des Funktionsbausteinnamens.'.
ENDTRY.