[ABAP] Popup für Ausgabe von einfachen Textlisten im Format der F1-Hilfe

* Anzeigetext
DATA(it_text) = VALUE tline_t( ( tdformat = 'U1' tdline = 'Zeile 1' )
                               ( tdformat = '' tdline = 'Zeile 2' )
                               ( tdformat = '' tdline = 'Zeile 3' ) ).

* Kommando bei Buttonklick
DATA: lv_ret_code TYPE sy-ucomm.

* Popup zur Anzeige einer Textliste (Texte in einer Tabelle)
* task: 'DECIDE':  Popup mit zwei Buttons 'Übernehmen' und 'Ändern'
*       'DISPLAY': Popup mit Ok- und Scrollbuttons
CALL FUNCTION 'COPO_POPUP_TO_DISPLAY_TEXTLIST'
  EXPORTING
    task       = 'DECIDE' " 'DISPLAY' oder 'DECIDE'
    titel      = 'Anzeige'
  IMPORTING
    function   = lv_ret_code
  TABLES
    text_table = it_text.

WRITE: / lv_ret_code.

[ABAP] CONVERT_OTF: OTF-Format als PDF speichern und anzeigen (Beispiel Smart Forms-Formular)

* https://www.tutorialspoint.com/sap_smart_forms/
* https://www.berater-wiki.de/Smart_Forms_Generierter_Funktionsbaustein
* https://mind-forms.de/sap-formulartechnologien/sapscript/sapscript-formulare-in-pdf-umwandeln/

* Tabelle STXFADM

PARAMETERS: p_form TYPE stxfadm-formname DEFAULT 'SF_EXAMPLE_01'.
PARAMETERS: p_open TYPE abap_bool DEFAULT abap_true.

START-OF-SELECTION.
  DATA(lv_control_parameters) = VALUE ssfctrlop( no_dialog = abap_true
                                                 preview   = space
                                                 getotf    = abap_true
                                                 langu     = sy-langu ).

  DATA: lv_devtype TYPE rspoptype.

* Smart Forms: Gerätetyp nach Sprache ermitteln
  CALL FUNCTION 'SSF_GET_DEVICE_TYPE'
    EXPORTING
      i_language             = lv_control_parameters-langu
    IMPORTING
      e_devtype              = lv_devtype
    EXCEPTIONS
      no_language            = 1
      language_not_installed = 2
      no_devtype_found       = 3
      system_error           = 4
      OTHERS                 = 5.

  IF sy-subrc = 0.
    DATA(lv_output_options) = VALUE ssfcompop( tddest    = 'LOCL'
                                               tdprinter = lv_devtype ).

* FuBa Name ermitteln
    DATA: lv_fm_name TYPE rs38l_fnam.

* Smart Forms: Name des Funktionsbausteins bestimmen
    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      EXPORTING
        formname           = p_form
      IMPORTING
        fm_name            = lv_fm_name
      EXCEPTIONS
        no_form            = 1
        no_function_module = 2
        OTHERS             = 3.

    IF sy-subrc = 0.

      DATA: lv_document_output_info TYPE ssfcrespd.
      DATA: lv_job_output_info TYPE ssfcrescl.
      DATA: lv_job_output_options TYPE ssfcresop.

* Zusatzparameter für Fuba für Formular 'SF_EXAMPLE_01'
      DATA: lv_customer TYPE scustom.
      DATA: it_bookings TYPE ty_bookings.
      DATA: it_connections TYPE ty_connections.

* FuBa der Form aufrufen und OTF-Daten erzeugen
      CALL FUNCTION lv_fm_name
        EXPORTING
          control_parameters   = lv_control_parameters
          output_options       = lv_output_options
          user_settings        = space
          customer             = lv_customer
          bookings             = it_bookings
          connections          = it_connections
        IMPORTING
          document_output_info = lv_document_output_info
          job_output_info      = lv_job_output_info
          job_output_options   = lv_job_output_options
        EXCEPTIONS
          formatting_error     = 1
          internal_error       = 2
          send_error           = 3
          user_canceled        = 4
          OTHERS               = 5.

      IF sy-subrc = 0.

        DATA(lv_bin_filesize) = 0.

        DATA: lv_pdf_xstring TYPE xstring.
        DATA: it_lines TYPE tline_t.

* Konvertieren von OTF-Format in verschiedene Formate (TLINE Tabelle)
        CALL FUNCTION 'CONVERT_OTF'
          EXPORTING
            format                = 'PDF' " ASCII, PDF
          IMPORTING
            bin_filesize          = lv_bin_filesize
*           bin_file              = lv_pdf_xstring             " PDF Binärdaten -> einkommentieren, wenn benötigt, sonst it_lines leer!
          TABLES
            otf                   = lv_job_output_info-otfdata " Input OTF
            lines                 = it_lines                   " Output
          EXCEPTIONS
            err_max_linewidth     = 1
            err_format            = 2
            err_conv_not_possible = 3
            err_bad_otf           = 4
            OTHERS                = 5.

        IF sy-subrc = 0.

          DATA: lv_action TYPE i.
          DATA: lv_filename TYPE string.
          DATA: lv_fullpath TYPE string.
          DATA: lv_path TYPE string.

          TRY.
* Speichern-Dialog
              cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                            default_file_name = |{ p_form }.pdf|
                                                            default_extension = 'pdf'
                                                            file_filter       = '(*.pdf)|*.pdf|'
                                                          CHANGING
                                                            filename          = lv_filename
                                                            path              = lv_path
                                                            fullpath          = lv_fullpath
                                                            user_action       = lv_action ).

              IF lv_action EQ cl_gui_frontend_services=>action_ok.
* Daten lokal speichern
                cl_gui_frontend_services=>gui_download( EXPORTING
                                                          bin_filesize = lv_bin_filesize
                                                          filename     = lv_fullpath
                                                          filetype     = 'BIN'
                                                        CHANGING
                                                          data_tab     = it_lines ).

                WRITE: / |Datei erfolgreich unter { lv_fullpath } gespeichert.|.

                IF abap_true = p_open.
* Datei anzeigen
                  cl_gui_frontend_services=>execute( document = lv_fullpath ).
                ENDIF.
              ENDIF.

            CATCH cx_root INTO DATA(e_text).
              WRITE: / e_text->get_text( ).
          ENDTRY.
        ENDIF.
      ELSE.

        DATA: it_sf_errors TYPE tsferror.

* Smart Forms: Lesen der Fehlertabelle nach Aufruf
        CALL FUNCTION 'SSF_READ_ERRORS'
          IMPORTING
            errortab = it_sf_errors.

        cl_demo_output=>display( it_sf_errors ).
      ENDIF.

    ELSE.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

  ELSE.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

[ABAP] String nach TLINE konvertieren

* https://www.tricktresor.de/blog/textstream-konvertieren/
DATA(lv_string) = 'AAAA' && cl_abap_char_utilities=>newline && 'BBBB' && cl_abap_char_utilities=>cr_lf && 'CCCC'.
DATA(it_strings) = VALUE string_table( ( lv_string ) ).

DATA: it_tline TYPE tline_t.

* Stringtabelle -> TLINE-Tabelle
* SAPscript: Konvertieung Textstream nach ITF für TextEditControl
CALL FUNCTION 'CONVERT_STREAM_TO_ITF_TEXT'
  EXPORTING
    stream_lines = it_strings
    lf           = abap_true
  TABLES
    itf_text     = it_tline.

cl_demo_output=>write_data( it_strings ).
cl_demo_output=>write_data( it_tline ).
cl_demo_output=>display( ).

[ABAP] TLINE nach String konvertieren

Variante 1 (CONVERT_ITF_TO_STREAM_TEXT)

* https://www.tricktresor.de/blog/textstream-konvertieren/
DATA(it_tline) = VALUE tline_t( ( tdformat = '*' tdline = 'AAAA' )
                                ( tdformat = '*' tdline = 'BBBB' )
                                ( tdformat = '*' tdline = 'CCCC' ) ).

DATA(it_strings) = VALUE string_table( ).

* TLINE-Tabelle -> Stringtabelle
* SAPscript: Konvertierung ITF nach Textstream für TextEditControl
CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT'
  EXPORTING
    lf           = abap_true
  IMPORTING
    stream_lines = it_strings
  TABLES
    itf_text     = it_tline.

cl_demo_output=>write_data( it_tline ).
cl_demo_output=>write_data( it_strings ).
cl_demo_output=>display( ).

Variante 2 (IDMX_DI_TLINE_INTO_STRING)

DATA(it_tline) = VALUE tline_t( ( tdformat = '*' tdline = 'AAAA' )
                                ( tdformat = '*' tdline = 'BBBB' )
                                ( tdformat = '*' tdline = 'CCCC' ) ).

DATA(lv_string) = ||.

* TLINE-Tabelle -> String
* Converts ITF text into a string
* ruft implizit CONVERT_ITF_TO_STREAM_TEXT
CALL FUNCTION 'IDMX_DI_TLINE_INTO_STRING'
  EXPORTING
    it_tline       = it_tline
  IMPORTING
    ev_text_string = lv_string.

cl_demo_output=>write_data( it_tline ).
cl_demo_output=>write_data( lv_string ).
cl_demo_output=>display( ).