*---------------------------------------------------------------------*
*              Z _ B J H _ S M A R T F O R M S _ M I N I              *
*                                                                     *
*                  Autor: Bernd Haase (BJH Software)                  *
*---------------------------------------------------------------------*
* Beispielprogramm für die Ansteuerung des Druckes über Smart Forms.  *
* Programm führt keine Aktionen aus, liest auch keine Daten ein !     *
* Das dazugehörige SmartForms-Formular benötigt nur 2 Ausgaben in     *
* einem Fenster, wobei der Texte und die Grafik Eingabeparameter sind.*
* Das Programm kann als Test genutzt werden, da alle Aktionsrichtungen*
* wie Druck, Fax und Email aktiv hinterlegt sind.                     *
*---------------------------------------------------------------------*
* (S) SmartForms                                                      *
*---------------------------------------------------------------------*
* 18.02.2005 BHaa: Programm für einen Grafiktest erstellt             *
* 18.05.2005 BHaa: Emailversand über SmartForms                       *
*---------------------------------------------------------------------*
REPORT z_bjh_smartforms_mini.

DATA:
 i TYPE i,
 j TYPE i,
 x_mark(1) TYPE c VALUE 'X',

* interne SAP-Codierung für das SmartForms-Formular
 fm_name TYPE rs38l_fnam,

* Ausgabegerät für Smart Forms Ausgabe
 wa_smartforms_geraet TYPE ssfctrlop,
 wa_smartforms_output TYPE ssfcompop,

* Smart Forms Email-Funktion. Datendeklaration (BOR).
 sender_id      LIKE swotobjid,
 appl_object_id LIKE swotobjid,
 recipient_id   LIKE swotobjid.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* Eingabeparameter zum Formular
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-901.
PARAMETER:
* Formularname, welches Formular gedruckt wird
 pm_forms TYPE tdsfname DEFAULT 'ZMGL_BJH_MINI',
* welchen Text ausgeben
 pm_text(30) TYPE c,
* welche Grafik zeichnen
 pmgrafik LIKE stxbitmaps-tdname DEFAULT 'BJH_DAMPFLOK'.
SELECTION-SCREEN: END OF BLOCK a1.

* Ausgabeoptionen
SELECTION-SCREEN: BEGIN OF BLOCK a2 WITH FRAME TITLE text-902.
PARAMETER:
*********
* Druck *
*********
 pmxdruck TYPE c RADIOBUTTON GROUP grp2 DEFAULT 'X',
* Ausgabedrucker. Achtung: Referenzierung auf TSP03D-PADEST geht nicht !
 pm_wohin LIKE tsp03-padest,

*******
* Fax *
*******
 pmxfax   TYPE c RADIOBUTTON GROUP grp2,
* Faxen. In welches Land
 pm_land LIKE t005-intca,
* Faxen, zu welcher Telefonnummer
 pm_telnr LIKE adr2-tel_number,

*********
* Email *
*********
 pmxemail TYPE c RADIOBUTTON GROUP grp2,
* an welche Emailadresse was schicken
 pm_email(50) TYPE c.              "50 Zeichen sollten ausreichen

* Zusatzoptionen
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) text-921 FOR FIELD pmdialog.
* Kontrollausgabe am Bildschirm
PARAMETERS pmdialog  TYPE c DEFAULT 'X' AS CHECKBOX.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) text-922 FOR FIELD pm_f8.
* Druckansicht
PARAMETERS pm_f8  TYPE c DEFAULT 'X' AS CHECKBOX.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN: END OF BLOCK a2.

INITIALIZATION.

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
START-OF-SELECTION.

 PERFORM upro-smartforms.

END-OF-SELECTION.
 EXIT.

*---------------------------------------------------------------------*
*                        S M A R T F O R M S                          *
*---------------------------------------------------------------------*
* Ab hier Routinen für den Aufruf des Drucken über die Programme von  *
* Smart Forms. Alle Werte und Tabellen sind vorbereitet und brauchen  *
* nur durch die Funktionsbausteine übergeben werden                   *
*---------------------------------------------------------------------*
FORM upro-smartforms.

* internen Programmparameter für Formular herausfinden
* Formularname (pm_forms) ist als Variable gehalten
 CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      EXPORTING  formname           = pm_forms
*                 variant            = ' '
*                 direct_call        = ' '
      IMPORTING  fm_name            = fm_name
      EXCEPTIONS no_form            = 1
                 no_function_module = 2
                 OTHERS             = 3.

*---------------------------------------------------------------------*
* Fehlerroutine und Meldung (Standard SAP-Meldung)
*---------------------------------------------------------------------*
 IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
   EXIT.
 ENDIF.

 CLEAR: wa_smartforms_geraet, wa_smartforms_output.

*---------------------------------------------------------------------*
* Entsprechend der Ausgabeart Werte ermitteln und vorbesetzen.
* Standard ist Druck (Option: Druck, Email und Fax sind aktiv)
*---------------------------------------------------------------------*
 CASE x_mark.
* Formular als Email ausgeben. Da Aufbereitung mehrere Funktionen
* beinhaltet, diese über ein Extra-Unterprogramm gesteuert.
   WHEN pmxemail.
     MOVE 'MAIL' TO wa_smartforms_geraet-device.
     PERFORM upro-smartforms_email.
* Formular als Fax aufbereiten
   WHEN pmxfax.
* Smart Forms Definition für Faxausgabe
     MOVE 'TELEFAX' TO wa_smartforms_geraet-device.
* Länderkennzeichen (ISO-Code), Basis hier aus dem Lieferantenstamm
     MOVE pm_land TO wa_smartforms_output-tdteleland.

* Land und Telefaxnummer vorbesetzen. Sicherheitshalber bei der
* Faxnummer nur Zahlen zulassen und nur das entsprechende Feld
* aufbereiten, auch wenn SmartForms einige Sonderzeichen unterstützt
     i = 0.
     j = 0.
     WHILE i < 31.
       CASE pm_telnr+i(1).
         WHEN '0' OR '1' OR '2' OR '3' OR '4'
           OR '5' OR '6' OR '7' OR '8' OR '9'.
           MOVE pm_telnr+i(1) TO
                wa_smartforms_output-tdtelenum+j(1).
           ADD 1 TO j.
       ENDCASE.
       ADD 1 TO i.
     ENDWHILE.
     PERFORM upro-smartforms_druck.

* Standardausgabe. Drucker. Keinerlei Werte zu besetzen
* Ausgabedrucker nur interessant im Hintergrundprozeß
   WHEN OTHERS.
     MOVE '        ' TO wa_smartforms_geraet-device.
     MOVE pm_wohin   TO wa_smartforms_output-tddest.
     PERFORM upro-smartforms_druck.
 ENDCASE.

ENDFORM.

*---------------------------------------------------------------------*
*                  S M A R T F O R M S  -  E M A I L                  *
*---------------------------------------------------------------------*
* Verwendung des Kommunikations-Interfaces über SmartForms:           *
*                                                                     *
* Dieser Report zeigt an einem einfachen Beispiel, wie man auch über  *
* SmartForms von der erweiterten Funktionalität des neuen Kommunika-  *
* tions-Interfaces profitieren kann.                                  *
*---------------------------------------------------------------------*
* A C H T U N G  !!!                                         13102003 *
* Programmmacke SmartForms: bei Aufbereitung Email und Schablone im   *
* Formular beachten: Höhe muß in cm angegeben sein und generell 1,00. *
* Andere Werte (Zahl oder Maßeinheit) führen zum Abbruch, SQLcode = 1 *
*---------------------------------------------------------------------*
FORM upro-smartforms_email.

 TABLES: soud.      "SAPoffice: Benutzerdefinition

* Makros für Zugriff aufs BOR
 INCLUDE .

* Datendeklaration (BOR), allgemeine Datendeklaration (global)
*  DATA: sender_id      LIKE swotobjid,
*        appl_object_id LIKE swotobjid,
*        recipient_id   LIKE swotobjid,
 DATA:
         recipient      TYPE swc_object,
         sender         TYPE swc_object,
         recipient_tab  TYPE swc_object OCCURS 0 WITH HEADER LINE,
         folder         TYPE swc_object,
         BEGIN OF sofmfol_key,
             foldertype   LIKE sofm-foltp,
             folderyear   LIKE sofm-folyr,
             foldernumber LIKE sofm-folno,
             type         LIKE sofm-doctp,
             year         LIKE sofm-docyr,
             number       LIKE sofm-docno,
             forwarder    LIKE soub-usrnam,
         END OF sofmfol_key,
         bor_key        LIKE swotobjid-objkey,
         address_string LIKE soxna-fullname.

* Deklaration eines Containers
 swc_container container.

************************************************************************
*                    Sender (BOR-Objekt-ID)
************************************************************************
* Adreßtypen, mögliche Werte
*  B=interner SAP Benutzer, Benutzerkennung (s. Absender)
*  P=Persönliche Verteilerliste
*  C=Allgemeine Verteilerliste
*  F=Faxnummer
*  U=Internet-Adresse
*  R=Remote-Mail-Adresse (innerhalb R/3-R/3 Systemverbundes)
*  X=X.400-Adresse
*  G=ID einer Organisationseinheit
*  H=Name einer Organisationseinheit
************************************************************************
* Objektreferenz auf ein RECIPIENT-Objekt erzeugen
 swc_create_object sender 'RECIPIENT' space.
* Container leeren
 swc_clear_container container.
* Adresse (aufrufender interner Benutzer)
 swc_set_element container 'AddressString' sy-uname.
* Adreßtyp (interner Benutzer)
 swc_set_element container 'TypeId' 'B'.
* Aufruf der Methode RECIPIENT.FindAddress
 swc_call_method sender 'FindAddress' container.
* Ausgabe der zur Ausnahme gehörigen Fehlermeldung
 IF sy-subrc NE 0.
   MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno.
 ENDIF.
* Ermittlung der BOR-Objekt-ID
 swc_object_to_persistent sender sender_id.

************************************************************************
*                   Empfänger (BOR-Objekt-ID)
************************************************************************
* Objektreferenz auf ein RECIPIENT-Objekt erzeugen
 swc_create_object recipient 'RECIPIENT' space.
* Container leeren
 swc_clear_container container.
* Adresse (aufrufender interner Benutzer oder Email)
 swc_set_element container 'AddressString' pm_email.
* Adreßtyp (Internet-Adresse)
 swc_set_element container 'TypeId' 'U'.
* Aufruf der Methode RECIPIENT.CreateAddress
 swc_call_method recipient 'CreateAddress' container.
* Ausgabe der zur Ausnahme gehörigen Fehlermeldung
 IF sy-subrc NE 0.
   MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno.
 ENDIF.

* Container leeren
 swc_clear_container container.
* send express flag
 swc_set_element container 'SendExpress' 'X'.
* Methodenlauf
 swc_call_method recipient 'SetExpress' container.
 IF sy-subrc NE 0.
   MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
 ENDIF.

************************************************************************
*                 Anwendungsobjekt (BOR-Objekt-ID)                     *
************************************************************************
* Dieser Parameter (MAIL_APPL_OBJECT) sollte mit der BOR-Objekt-ID
* des Anwendungsobjekts (z.B. Rechnung, Bestellung), von dem aus
* das Senden initiiert wird, gefüllt werden. Beim Senden wird dieses
* Anwendungsobjekt automatisch mit dem Dokument verknüpft.
* In diesem Beispiel wird als Anwendungsobjekt-ID die BOR-ID des
* Eingangs des Reportaufrufers genommen.

* Lesen der Eingangs-ID des Aufrufers
 SELECT * FROM soud
 WHERE sapnam LIKE sy-uname
 AND deleted = ' '.
 ENDSELECT.
 IF sy-subrc NE 0.
* Aufrufer besitzt kein Office => wird angelegt
   CALL FUNCTION 'SO_USER_AUTOMATIC_INSERT'
        EXPORTING
             sapname        = sy-uname
        EXCEPTIONS
             no_insert      = 1
             sap_name_exist = 2
             x_error        = 3
             OTHERS         = 4.
   IF sy-subrc NE 0.
*   Office konnte nicht angelegt werden: Inbox-ID = SPACE
     CLEAR soud.
   ELSE.
* Neuer Versuch: Lesen der Eingangs-ID des Aufrufers
     SELECT * FROM soud WHERE sapnam LIKE sy-uname AND deleted = ' '.
     ENDSELECT.
   ENDIF.
 ENDIF.

* Anlegen eines Anwendungsobjekts (hier vom Typ SOFMFOL)
 CLEAR sofmfol_key.
 sofmfol_key-type   = 'FOL'.
 sofmfol_key-year   = soud-inbyr.
 sofmfol_key-number = soud-inbno.
 bor_key = sofmfol_key.
 IF NOT bor_key IS INITIAL.
   swc_create_object folder 'SOFMFOL' bor_key.
   IF sy-subrc = 0.
* * Ermittlung der BOR-Objekt-ID
     swc_object_to_persistent folder appl_object_id.
     IF sy-subrc NE 0.
       CLEAR appl_object_id.
     ENDIF.
   ENDIF.
 ELSE.
   CLEAR appl_object_id.
 ENDIF.

***********************************************************************
*                     Aufruf von Smart Forms                          *
*                                                                     *
* Auflösen des Recipient-Objekts in "flache" Recipient-Objekte mit    *
* Hilfe der Methode Expand. Bei genau einer Emailadresse ist diese    *
* Auflösung eigentlich nicht nötig. Für den allgemeinen Fall wird     *
* diese Vorgehensweise jedoch dringend empfohlen, deswegen ist es     *
* hier so programmiert.                                               *
***********************************************************************
 swc_clear_container container.
 REFRESH recipient_tab.
 swc_call_method recipient 'Expand' container.
 IF sy-subrc NE 0.
   MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno.
 ENDIF.
* "Flache" Recipient-Objekte aus Container lesen
 swc_get_table container 'ResultTable' recipient_tab.
 IF sy-subrc NE 0.
   REFRESH recipient_tab.
 ENDIF.

* Anzeige am Bildschirm, da sonst nie die Adresse angegeben wird
 CONCATENATE 'Emailversand an:' pm_email
             'am' sy-datum 'um' sy-uzeit
             INTO wa_smartforms_output-tdtitle
             SEPARATED BY space.

* Loop über die "flachen" Recipient-Objekt.
 LOOP AT recipient_tab.
* Für jedes "flache" Recipient-Objekt ein Aufruf von SAPscript:
* BOR-Objekt-ID des Handles ermitteln
   swc_object_to_persistent recipient_tab recipient_id.

   PERFORM upro-smartforms_druck.

   IF sy-subrc NE 0.
     MESSAGE a634(so) WITH 'OPEN_FORM' sy-subrc.
   ENDIF.
 ENDLOOP.
ENDFORM.

*---------------------------------------------------------------------*
*                  S M A R T F O R M S  -  D R U C K                  *
*---------------------------------------------------------------------*
* Druck oder Faxen des aufbereiteten Dokumentes. Es braucht nur noch  *
* der Funktionsbaustein zum Ausdrucken des Formulares aufgerufen      *
* werden.                                                             *
*---------------------------------------------------------------------*
FORM upro-smartforms_druck.

* Die Ausgabe erscheint immer über den Dialog-Bildschirm (Standard)
* auch dieser könnte ausgeschaltet werden. Dazu dienen folgende
* Parameter.

* Pop-Up für Druckeinstellung. Achtung, negierte Logik, wenn gesetzt,
* soll Pop-Up erscheinen, Übergabeparameter muß dann ausgeschaltet sein
* WICHTIGER HINWEIS: Pop-Up kann nur unterdrückt werden, wenn Benutzer-
* stamm sauber gepflegt ist (su01d - Festwerte)
 IF pmdialog = 'X'.
   MOVE ' ' TO wa_smartforms_geraet-no_dialog.
 ELSE.
   MOVE 'X' TO wa_smartforms_geraet-no_dialog.
 ENDIF.

* Druckansicht (Eingabeparameter), Sofortausgabe und Spoolauftrag
* löschen als Konstanten
 MOVE pm_f8 TO wa_smartforms_geraet-preview.
 MOVE 'X'   TO wa_smartforms_output-tdimmed.
 MOVE 'X'   TO wa_smartforms_output-tddelete.

* Funktionsbaustein zum Ausrucken des Formulares
 CALL FUNCTION fm_name
      EXPORTING
*           archive_index        =
*           archive_parameters   =
           control_parameters   = wa_smartforms_geraet
           mail_appl_obj        = appl_object_id
           mail_recipient       = recipient_id
           mail_sender          = sender_id
           output_options       = wa_smartforms_output
*           user_settings        = 'X'
           dr_grafik            = pmgrafik
           dr_text              = pm_text
*      importing
*           document_output_info =
*           job_output_info      =
*           job_output_options   =
      EXCEPTIONS
           formatting_error     = 1
           internal_error       = 2
           send_error           = 3
           user_canceled        = 4
           OTHERS               = 5.

*---------------------------------------------------------------------*
* Fehlerroutine und Meldung (Standard SAP-Meldung)
*---------------------------------------------------------------------*
 IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
 ENDIF.

ENDFORM.

*--- Copyright BJH Software, 2003 -----*
***** Ende *****
* Copyright BJH Software, Datei überarbeitet am: 21.5.2005