Bei der Definition des E-Mail Templates wurde eine CDS View hinterlegt und innerhalb des Mail Textes auf die Spalten zugegriffen. Die Datenbeschaffung selbst erfolgt im einfachsten Fall ebenfalls über die CDS View.

Weiterlesen

Zunächst werden die erforderlichen BCS Objekte und die E-Mail API instantiiert

    DATA(lo_bcs) = cl_bcs=>create_persistent( ). " Create instance of BCS class

    " create instance of eMail API, provide name of Mail template
    DATA(lo_email_api) = cl_smtg_email_api=>get_instance( iv_template_id = 'ZMAIL_TEMPLATE1'  ).

Anschließend wird das E-Mail Dokument mittels Methode render_bcs vorbereitet. Hierbei werden auch die Schlüsselfelder der CDS View mit Werten versorgt. Die Methode kümmert sich um die Datenbeschaffung und das Ersetzen der Platzhalter.

  " Build key for CDS view
     DATA(lt_cds_key) = VALUE if_smtg_email_template=>ty_gt_data_key( ( name = 'prueflos' value = '000000758871' ) ).

  " Render E-Mail for CL_BCS class. This replaces all placeholders with real data
     lo_email_api->render_bcs( io_bcs = lo_bcs iv_language = sy-langu it_data_key = lt_cds_key ).

Nun werden noch der Empfänger

          lr_recipient =
             cl_cam_address_bcs=>create_internet_address(
                                 'XY@Z.com' ).
          IF lr_recipient IS BOUND.
            ls_recip-recipient = lr_recipient.
            lo_bcs->add_recipient( EXPORTING i_recipient = lr_recipient ).
          ENDIF.

Sowie der Absender definiert

      " Define sender
      DATA(lo_sender) = cl_sapuser_bcs=>create( sy-uname ).
      lo_bcs->set_sender( i_sender = lo_sender ).

Und schon kann die Mail versendet werden

      " Send Email
      lo_bcs->send( ).

      IF sy-subrc IS INITIAL.
        COMMIT WORK. " Commit to really send the message
        FREE lo_bcs.
      ENDIF.

Vollständiges Programm

*&---------------------------------------------------------------------*
*& Report z_mail_template2
*&---------------------------------------------------------------------*
*& Send E-Mail based on Template by using data from CDS View
*&
*& E-Mail Template must be defined with relation to an existing CDS view.
*&---------------------------------------------------------------------*
REPORT z_mail_template2.



DATA: gv_subrc_send_email TYPE sy-subrc.

DATA: ls_recip          TYPE bcss_re3,
      lr_recipient      TYPE REF TO if_recipient_bcs,
      lo_email_document TYPE REF TO cl_document_bcs.


TRY.
    DATA(lo_bcs) = cl_bcs=>create_persistent( ). " Create instance of BCS class

    " create instance of eMail API, provide name of Mail template
    DATA(lo_email_api) = cl_smtg_email_api=>get_instance( iv_template_id = 'ZMAIL_TEMPLATE1'  ).

     " Build key for CDS view
     DATA(lt_cds_key) = VALUE if_smtg_email_template=>ty_gt_data_key( ( name = 'prueflos' value = '000000758871' ) ).
    TRY.

        " Render E-Mail for CL_BCS class. This replaces all placeholders with real data
        lo_email_api->render_bcs( io_bcs = lo_bcs iv_language = sy-langu it_data_key = lt_cds_key ).

      CATCH cx_smtg_email_common INTO DATA(ls_cx).
        DATA(lv_message) = ls_cx->get_text( ).
        MESSAGE s899(id) WITH 'Unable to send message:'(004) lv_message.
        FREE lo_bcs.
        gv_subrc_send_email = 1.
    ENDTRY.

    IF gv_subrc_send_email = 0.

      TRY.
          " Define recipient
          CLEAR: lr_recipient.
          lr_recipient =
             cl_cam_address_bcs=>create_internet_address(
                                 'XY@Z.com' ).
          IF lr_recipient IS BOUND.
            ls_recip-recipient = lr_recipient.
            lo_bcs->add_recipient( EXPORTING i_recipient = lr_recipient ).
          ENDIF.
        CATCH cx_address_bcs INTO DATA(lr_bcs_exception).

      ENDTRY.

      " Define sender
      DATA(lo_sender) = cl_sapuser_bcs=>create( sy-uname ).
      lo_bcs->set_sender( i_sender = lo_sender ).

      " Send Email
      lo_bcs->send( ).

      IF sy-subrc IS INITIAL.
        COMMIT WORK. " Commit to really send the message
        FREE lo_bcs.
      ENDIF.

    ELSEIF gv_subrc_send_email = 4.
      MESSAGE s167(qm).
    ENDIF.

  CATCH cx_send_req_bcs INTO DATA(lr_send_req_bcs_excp).
*     possible error types of CX_SEND_REQ_BCS
*    (without those inherited from cx_bcs):
*    ALLREADY_RELEASED   RECIPIENT_EXISTS  DOCUMENT_NOT_EXISTS
*    DOCUMENT_NOT_SENT   NOT_SUBMITED      FOREIGN_LOCK
*    TOO_MANY_RECEIVERS  NO_INSTANCE       CANCELLED
*    NOT_RELEASED        MIME_PROBLEMS     NO_RECIPIENTS
*    SENDER_PROBLEMS


    DATA(lv_diagnosis) = lr_send_req_bcs_excp->get_text( ).
    MESSAGE s899(id) WITH
    'Unable to send message:'(004) lv_diagnosis.
    FREE lo_bcs.

*   possible bcs errors
  CATCH cx_bcs INTO DATA(lr_bcs).
*     possible error types of cx_bcs:
*     INTERNAL_ERROR     OS_EXCEPTION     X_ERROR
*     PARAMETER_ERROR    INVALID_VALUE    CREATION_FAILED
*     NO_AUTHORIZATION   LOCKED           CAST_ERROR

    lv_diagnosis = lr_bcs->get_text( ).
    MESSAGE s899(id) WITH
    'Unable to send message:'(004) lv_diagnosis.
    FREE lo_bcs.

  CATCH cx_smtg_email_common INTO DATA(lr_common).
    lv_diagnosis = lr_common->get_text( ).
    MESSAGE s899(id) WITH 'Unable to send message:'(004) lv_diagnosis .

  CATCH cx_os_object_not_found INTO DATA(lr_object_not_found).
    lv_diagnosis = lr_object_not_found->get_text( ).

ENDTRY.

Mit S/4-HANA führt SAP eine neue Möglichkeit zum E-Mail Versand ein. Bisher wurden E-Mail Vorlagen als SAPScript- oder Standard Texte definiert.

Unter S/4-HANA können E-Mail Templates als ABAP Entwicklungsobjekte definiert werden. Diese basieren auf einer CDS View, deren Daten innerhalb der E-Mail verwendet werden können.

Dieser Beitrag ist der erste in einer Serie über die Verwendung von E-Mail Templates. Beginnen wir zunächst mit der Definition eines Templates.

Weiterlesen

Zunächst wird die CDS View definiert

@AbapCatalog.sqlViewName: 'ZMAIL_TEMP1'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Mail Template 1'
define view Zmail_template1
  as select from qals     as ip_lot
    
{
  key ip_lot.prueflos             as prueflos,
  ltrim( ip_lot.matnr, '0' )  as material,
  ltrim( ip_lot.aufnr, '0' )  as aufnr,
  ip_lot.ktextmat             as maktx
}

Anschließend wird das E-Mail Template als ABAP Entwicklungsobjekt angelegt, etwa mit der SE80 oder mittels ADT in Eclipse. In den Kopfdaten des Templates wird nun die zugrunde liegende CDS View hinterlegt.

Kopf des Mail Templates

Im Reiter "Texte" werden nun der Betreff  sowie der Inhalt der Mail definiert. Auf die einzelnen Spalten der CDS View kann mittels {{ }} zugegriffen werden.

Um das Template zu verwenden, gibt es verschiedene Möglichkeiten, welche auf den folgenden Seiten dargestellt sind.

I recently had to create some PM order (IW31) based on Equipment Task list (IA01). Luckily, there is a BAPI available which can be used for such a task. Moreover, BAPI_ALM_ORDER_MAINTAIN is your Swiss Army Knife when it comes to ALM. It can be used for mostly everything related to ALM ,beside of making some coffee. SAP also provides some documentation for this BAPI. Sadly, it is a common SAP documentation which means, it describes some points but lacks in others.

After several attempts, I was able to create a PM Order related to a Notification which uses an Equipment task list instead of defining each operation manually.

... weiterlesen

Wie bereits auf der Seite "Nintex Workflow Delegation" beschrieben, können Aufgaben in SharePoint Online nicht einfach delegiert werden. Über den Workaround der dort beschrieben ist, kann man sich jedoch behelfen. Aus dem Umfeld entstand eine neue Anforderung, welche sich als recht umfassend erwiesen hat.

Wird eine Task delegiert, soll der neue Besitzer ebenfalls über eine E-Mail benachrichtigt werden. Der Inhalt der E-Mail soll identisch zu der ursprünglichen aufgebaut sein. Inhalt der Mail ist zum Beispiel das Datum, bis zu dem der Task abgeschlossen werden soll. Diese Information befindet sich in dem Task Element, nicht aber in dem Element des dazugehörigen Workflows (also dem eigentlichen Element des Antrags)

... weiterlesen

Wird SharePoint on-premise betrieben, können Nintex Workflow Tasks (generell Tasks) an andere Personen delegiert werden. Dazu kann auf dem Task Formular ein Link aktiviert werden, über den der Besitzer des Tasks diesen weiterleiten kann (Beispielsweise falls der Task ihm fälschlicherweise zugewiesen wurde).
Ergänzend kann der Benutzer über die Site Einstellungen eine Art Abwesenheitszeitraum definieren. Während dieses Zeitraums werden alle an ihn gerichteten Tasks automatisch an die zuvor benannte Person delegiert. Praktisch bei Urlaub oder längerer Krankheit.

Dies ist leider im Kontext von SharePoint Online nicht möglich. Hier gibt es weder in den SharePoint Tasks, noch bei den Nintex Tasks (welche letztlich die SharePoint Tasks als Basis verwenden) eine Möglichkeit der Delegation.

... weiterlesen

In der Workflow History kann man den Fortschritt eines Workflows einfach nachvollziehen. Man sieht genau, welche Tasks erstellt und wann von wem bearbeitet wurden. Zudem kann man als Entwickler zahlreiche Informationen hier protokollieren um den aktuellen Fortschritt darzustellen.

Die History wird allerdings nach einer gewissen Zeit gelöscht und steht somit nur begrenzte Zeit zur Verfügung. Je nach Geschäftsprozess ist es aber relevant, Entscheidungen (wer hat wann entschieden), dauerhaft zu protokollieren.

... weiterlesen

Ein Benutzer nimmt an einer Fiori Anwendung bestimmte Einstellungen vor. Beispielsweise selektiert er in einem Drop Down Menü, dass er nur bestimmte Arbeitsplätze bearbeiten möchte. Diese Auswahl soll dauerhaft gespeichert werden, bis der Benutzer eine neue Auswahl trifft. Dabei sollen die Einstellungen auch beibehalten werden, wenn er die Anwendung verlässt und später erneut aufruft.

... weiterlesen

Problem

Aus SAP heraus soll ein bestehendes PDF Dokument gedruckt werden. Das Dokument wurde nicht mittels Adobe Forms Service erstellt, sondern z.B.: über Dienste zum Objekt an einen Materialstammsatz abgelegt.

Auf dieser Seite ist beschrieben, wie ein PDF Dokument, welches im SAP Dokumentenmanagementsystem abgelegt ist oder mittels GUI_UPLOAD hochgeladen wurde, mittels ABAP ausgedruckt werden kann.

... weiterlesen