Druckansicht in SAP aus einem externen OMS erzeugen

Bei manchen SAP Anwendern werden SAP Formulare nicht mit den SAP-internen Formularwerkzeugen (SAP Script, Smart Forms, Adobe Forms) erzeugt, sondern die Formulargenerierung geschieht über ein externes Outputmanagement-System (OMS). Bei dem externen OMS kann es sich z.B. um die Produkte Jetforms, Formscape, Streamserve oder den TDS (Tentacle Document Server) handeln.

Werden SAP Formulare mit einem externen OMS erzeugt, so ist häufig die Druckbildansicht direkt in SAP nicht möglich. Man müsste in das externe OMS verzweigen, um die Druckbildansicht zu sehen. Ein typischer SAP Anwender hat jedoch keinen Zugang zum externen OMS und wünscht in vielen Fällen eine Druckbildansicht direkt in SAP, bevor das Formular gedruckt oder per Mail verschickt wird.

Szenario

Der SAP Anwender erzeugt die Formulare mit einem externen OMS, im expliziten Beispiel wurde ein TDS (Tentacle Document Server) über eine SAP PI an das SAP ERP angebunden. Die Rohdaten hierzu werden in einem SAP Script-Druckprogramm erzeugt. Das SAP Script-Formular ist so eingestellt, dass kein Formulardruck erfolgt, sondern die Rohdaten des Formulars als Idoc über die SAP PI an das externe OMS geschickt werden. Alternativ könnte auch ein RDI-Datenstrom im SAP Spool erzeugt werden, den sich dann das externe OMS abgreift.

Wünscht der SAP Anwender eine Druckbildansicht, so wird im Idoc ein Kennzeichen an das externe OMS mitgegeben, damit es eine PDF-Datei erstellt und als binäres Objekt in der SAP Datenbank ablegt. Die SAP-Anwendung wartet dabei so lange, bis die PDF-Datei gelesen werden und in einem HTML-Control im Sapgui angezeigt werden kann.

Umsetzen der Anforderung

Realisierung im Druckprogramm

Vor dem Aufruf des Funktionsbausteins OPEN_FORM wird im Falle einer Druckbildansicht eine eindeutige GUID erzeugt.

* GUID bei Druckbildansicht erzeugen
  if  us_screen = abap_true.
*    CALL METHOD cl_guid_services=>create
*      IMPORTING
*        ev_guid_16 = yvbdka-guid.
    call function 'GUID_CREATE'
      importing
        ev_guid_16 = yvbdka-guid.
  endif.

Direkt vor OPEN_FORM wird die GUID in das Feld ITCPO-TDCOVTITLE geschrieben.

* Spoolparameter setzen
  if not yvbdka-guid is initial.
    lvs_itcpo-tdcovtitle = 'GUID:'.
    lvs_itcpo-tdcovtitle+5 = yvbdka-guid.
  endif.

* OPEN_FORM
  call function 'OPEN_FORM'
       exporting
            archive_index      = toa_dara
            archive_params     = arc_params
            device             = lvf_device
            dialog             = ' '
            form               = tnapr-fonam
            language           = nast-spras
            options            = lvs_itcpo
            mail_sender        = lvs_sender
            mail_recipient     = lvs_recipient
       exceptions
            canceled           = 1
            device             = 2
            form               = 3
            options            = 4
            unclosed           = 5
            mail_options       = 6
            archive_error      = 7
            others             = 8.

Das Formular wird nun erzeugt, CLOSE_FORM wird prozessiert und das SAP Script-Formular geht als Idoc an das externe OMS.

Wenn die GUID gefüllt ist, dann druckt das externe OMS nicht das Formular, sondern reicht das PDF im Format BASE64 an die SAP PI weiter.

Die SAP PI ruft nun einen Proxy im ERP auf und übergibt die PDF-Datei in folgender Struktur.

SAP-Forms-Externes-OMS-Struktur-Proxy1

Im Feld Content vom Typ RAWSTRING befindet sich die PDF-Datei.

sap-forms-externes-oms-struktur-proxy2

In einem eigens entwickelten Funktionsbaustein Z_PI_SAVE_PDF_FROM_TDS erfolgt die Speicherung der PDF-Datei zur GUID in Tabelle ZTDS_PREVIEW. Der Funktionsbaustein Z_PI_SAVE_PDF_FROM_TDS wird in die Methode des Proxy im SAP ERP eingebunden.

SAP Forms Externes OMS-Struktur Tabelle PDF Daten

So sieht die PDF-Datei im Format BASE64 in der Datenbank aus (Transaktion SE16).

SAP Forms Externes OMS-Tabelleninhalt PDF Daten

Coding im Funktionsbaustein Z_PI_SAVE_PDF_FROM_TDS:

FUNCTION z_pi_save_pdf_from_tds.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     VALUE(IT_CONTENT) TYPE  ZPI_CONTENT_T OPTIONAL
*"----------------------------------------------------------------------

* Deklarationen ------------------------------------------------------ *
  DATA: ls_content        TYPE zpi_content_s,
        ls_preview        type ztds_preview.
* Uhrzeit holen ------------------------------------------------------ *
  GET TIME.

* PDF aus TDS sichern ------------------------------------------------ *
  LOOP AT it_content INTO ls_content.
    MOVE-CORRESPONDING ls_content TO ls_preview.
    ls_preview-ernam = sy-uname.
    ls_preview-erdat = sy-datum.
    ls_preview-eruhr = sy-uzeit.
    MODIFY ztds_preview from ls_preview.
  ENDLOOP.

* ... und sofort verbuchen ------------------------------------------- *
  COMMIT WORK.

ENDFUNCTION.

Das PDF liegt nun in der Tabelle und kann jetzt auf dem Bildschirm angezeigt werden.

Im FuBa CLOSE_FORM wurde direkt an das Ende ein Enhancement implementiert, wo dann das PDF in einem HTML-Control am Bildschirm angezeigt wird.

SAP Forms Externes OMS-Enhancement bei CLOSE_FORM

Coding im Enhancement am Ende des Funktionsbausteins CLOSE_FORM:

ENHANCEMENT 1  ZZ_TDS_PREVIEW.    "active version

* Im folgenden wird bei einer Druckbildansicht aus dem TDS ein Dynpro    * mit einem HTML-Control angezeigt, der das Formular als PDF zeigt.
  data: lv_guid        type guid_16.
  if result-tdcovtitle+0(5) = 'GUID:'.
    lv_guid = result-tdcovtitle+5.
    CALL FUNCTION 'Z_FRM_PRINT_PREVIEW_FROM_TDS'
      EXPORTING
        iv_guid = lv_guid.
  endif.

ENDENHANCEMENT.

Der FuBa Z_FRM_PRINT_PREVIEW_FROM_TDS pollt jetzt insgesamt 10 x mit einer Verzögerung von 1 sec zur GUID auf die Tabelle ZTDS_PREVIEW und zeigt im Erfolgsfall das PDF in einem HTML-Control an. Wird nichts gefunden, wird nach 10 sec abgebrochen.

Coding im Funktionsbaustein Z_FRM_PRINT_PREVIEW_FROM_TDS:

FUNCTION-POOL zfrm_preview_01 MESSAGE-ID zfrm.

* TYPES -------------------------------------------------------------- *
TYPES: tt_pdf           TYPE TABLE OF sdokcntbin.

* OBJEKTREFERENZEN --------------------------------------------------- *
DATA: go_viewer         TYPE REF TO i_oi_document_viewer,
      go_container      TYPE REF TO cl_gui_custom_container.

* INTERNE TABELLEN --------------------------------------------------- *
DATA: gt_pdf            TYPE tt_pdf.

* HILFSFELDER -------------------------------------------------------- *
DATA: subrc             TYPE sysubrc,
      gv_file_size      TYPE i,
      gv_guid           TYPE guid_16,
      gv_counter        TYPE i.
DATA: go_timer          TYPE REF TO cl_gui_timer.

*----------------------------------------------------------------------*
*       CLASS lcl_receiver DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_receiver DEFINITION.

  PUBLIC SECTION.
    METHODS:
      handle_finished FOR EVENT finished OF cl_gui_timer.


ENDCLASS.                    "lcl_receiver DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_receiver IMPLEMENTATION.

  METHOD handle_finished.

    DATA: lv_count_c(5)  TYPE c.

    ADD 1 TO gv_counter.
    WRITE gv_counter TO lv_count_c LEFT-JUSTIFIED.

    CALL METHOD go_timer->run.

    PERFORM read_pdf  USING    gv_guid
                      CHANGING subrc
                               gt_pdf
                               gv_file_size.

    IF subrc = 0.
      go_timer->cancel( ).
      CALL SCREEN 2000.
      CALL METHOD go_viewer->destroy_viewer.
      CALL METHOD go_container->free.
      FREE: go_viewer,
            go_container.
    ELSE.
      MESSAGE s001.
    ENDIF.

    IF gv_counter = 10.
      MESSAGE s002.
      LEAVE TO SCREEN 0.
    ENDIF.

  ENDMETHOD.                    "handle_finished

ENDCLASS.                    "lcl_receiver IMPLEMENTATION
 
*----------------------------------------------------------------------*
***INCLUDE LZFRM_PREVIEW_01F01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  READ_PDF
*&---------------------------------------------------------------------*
FORM read_pdf  USING    pv_guid        TYPE guid_16
               CHANGING subrc          TYPE sysubrc
                        gt_pdf         TYPE tt_pdf
                        gv_file_size   TYPE i.

* Deklarationen ------------------------------------------------------ *
  DATA: ls_preview      TYPE ztds_preview.

* Initialisieren ----------------------------------------------------- *
  CLEAR:   subrc,
           gv_file_size,
           gt_pdf,
           ls_preview.
  REFRESH: gt_pdf.

* PDF in Tabelle lesen ----------------------------------------------- *
  SELECT single * INTO ls_preview
         FROM ztds_preview
         WHERE guid = pv_guid.

  IF sy-subrc NE 0.
    subrc = 8.
    EXIT.
  ENDIF.

  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer          = ls_preview-content
      append_to_table = 'X'
    IMPORTING
      output_length   = gv_file_size
    TABLES
      binary_tab      = gt_pdf.

ENDFORM.                    " READ_PDF
*&---------------------------------------------------------------------*
*&      Form  SHOW_PDF_INPLACE
*&---------------------------------------------------------------------*
FORM show_pdf_inplace .

* Deklarationen ------------------------------------------------------ *

  IF go_viewer IS INITIAL.
    CALL METHOD c_oi_container_control_creator=>get_document_viewer
      IMPORTING
        viewer = go_viewer.

    CREATE OBJECT go_container
      EXPORTING
        container_name = 'CONTAINER'.

    CALL METHOD go_viewer->init_viewer
      EXPORTING
        parent = go_container.

    CALL METHOD go_viewer->view_document_from_table
      EXPORTING
        show_inplace   = 'X'  "Mit ' ' funktioniert es einwandfrei...
        type           = 'application'
        subtype        = 'pdf'
        size           = gv_file_size
      CHANGING
        document_table = gt_pdf.
  ENDIF.

ENDFORM.                    " SHOW_PDF_INPLACE

*&---------------------------------------------------------------------*
*&      Form  SHOW_PDF_INPLACE
*&---------------------------------------------------------------------*
FORM print_preview.

  PERFORM read_pdf USING    gv_guid
                   CHANGING subrc
                            gt_pdf
                            gv_file_size.

  CHECK subrc = 0.
* Dynpro aufrufen ---------------------------------------------------- *
  CALL SCREEN 2000.

ENDFORM.                    " PRINT_PREVIEW


Dynpro 2000

PROCESS BEFORE OUTPUT.
  MODULE status_2000.
*
PROCESS AFTER INPUT.

  MODULE exit_2000 AT EXIT-COMMAND.

  MODULE user_command_2000.
sap-forms-externes-oms-enhancement-screen-painter

 

Weitere Informationen

Spezialthemen zu SAP Formularen

SAP Formulare zum Festpreis

SAP Formularentwicklung