How to send emails from ABAP® with CL_BCS

Usage of the class CL_BCS in order to send eMails from ABAP™ applications via the Business Communication Service.

With our development tips we address special, related to praxis topics around the exciting and inexhaustible topic software development.

Valid for: SAP NetWeaver ABAP Web AS from 6.10

Index

  • General
  • e-mail dispatch from SAP
  • Class CL_BCS
  • Method CREATE_PERSISTENT – compile of a sending task
  • Method SET_DOCUMENT – attach text, data files and other objects
  • Method ADD_ATTACHMENT of the class CL_DOCUMENT_BCS
  • Method ADD_RECIPIENT – transfer of receiver
  • Method SEND – Sending of e-mail
  • Cases of application
  • Copyright & disclaimer

General

Often it is important to have necessary information at disposal in order to react quickly and in the right way. Especially, when the information procurement, like a report, takes a long time and cannot be constantly watched, it is useful to release an action upon completion. That can for example be an eMail with the status of a batch job or even the ABAP list.

eMail dispatch from SAP

SAP provided with the web AS 6.10 (6.20) the Business Communication Services (BCS) to send objects from ABAP applications. This object orientated interface is the successor of the Business Communication Interface (BCI), which is implemented as objects of the Business Object Repository (BOR).

In this Cadaxo development tip I will give an overview of the e-mail dispatch via BCS.

Class CL_BCS

Via BCS different objects with attachments and notes for several receivers can be sent also in different communication ways. Consequently the interface – the class CL_BCS – is constructed complex. In this development tip we therefore concentrate on sending an e-mail with attachment only.

A sending process breaks down into the following steps:

  • Generation of a sending task
  • Attaching an object
  • Choice of receivers
  • Sending of the mail

For all those tasks the class CL_BCA provides the following methods:

  • CREATE_PERSISTENT Compilation of a sending task
  • SET_DOCUMENT Attaching a text, data or other objects
  • ADD_RECIPIENT Add the receiver
  • SEND Sending of e-mail

Method CREATE_PERSISTENT – Compilation of a sending order

This method generates a sending task and returns an object of the class CL_BCS. All further steps are used upon that object.

Method SET_DOCUMENT – Attachment oft ext, data and other objects

With this method the content, meaning the actual text and data attachments of the e-mail is committed. The method expects an object with the interface IF_DOCUMENTS_BCS. Attachments are committed via this object too.

Via the statistic method CREATE_DOCUMENT of the class CL_DOCUMENT_BCS a respective object can be created.

The method expects the following parameters:

I_TYPE: Type of committed data, e.g. HTM für eine HTML Datei, TXT for text data, BIN for binary data like PDFs

I_TEXT/I_HEX: A chart with the actual text resp. the binary data according to the choosen type

I_SUBJECT: subject of the e-mail

Method ADD_ATTACHMENT of class CL_DOCUMENT_BCS

This method is similarly used to the CREATE_DOCUMENT:

I_ATTACHMENT_TYPE: Type of committed data, e.g. HTM for HTML data, TXT for text data, BIN for binary data like PDFs

I_ATTACHMENT_TEXT/

I_ATTACHMENT_HEX: An internal table with the actuall text resp. the binary data according to the choosen type

I_ATTACHMENT_SUBJECT: Name of the attachment file

Method ADD_RECIPIENT – Transfer of receiver

Depending on the way of communication and type of the sent object different receivers can be transferred to the mail. E.g. no business object relation can be per e-mail.

The method expect at least one object which implements the interface IF_RECIPIENT_BCS:

I_RECIPIENT: receiver address (Interface IF_RECIPIENT_BCS)

I_EXPRESS: Express message; if the receiver is a SAP user, a pop-up appears at the next processing of the PBO event with the notice of a new message

I_COPY: The receiver receives the message as a copy

I_BLIND_COPY: The receiver receives the message as a blind copy

I_NO_FORWARD: no forwarding; if the receiver is a SAP user, he cannot forward the message

The two most important receiver types are probably e-mail addresses and SAP users. The respective objects are generated by the following statistic methods:

CL_SAPUSER_BCS=>CREATE For SAP users

CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS For e-mail addresses

Method SEND – Sending of an e-mail

The message is passed on to SAPconnect and sent via the respective interface. The actual sending process is usually scheduled by a batch job with the report RSCONN01, which periodically sends all upcoming messages. In order to avoid the waiting perioduntil the next job performance, the message can be tagged as “to be sent immediately”: Method SET_SEND_IMMEDIATELY( abap_true ) of the sending task.

Method SHORT_MESSAGE

With this method the SAPOffice dialogue opens itself for new messages, on which the user can maintain receivers, texts, attachments and their settings himself. Via parameters suggestion values for the respective fields and objects, e.g. receiver addresses, can be taken with at the time of selection, which later will be displayed in the message.

ABAP® – Das gibt’s ja nicht!

Ich wollte schon länger einmal über ein paar seltsame Dinge in ABAP schreiben. Es gibt nämlich ein paar Sachen in ABAP bei denen man sich einfach nur wundert. Na dann, fangen wir mal an:

BSEG, MARA oder DMBTR

Wer kennt sie nicht, die berühmten SAP ECC Tabellen BSEG oder MARA. Auch die Felder DMBTR oder GSBER sind sicher jedem bekannt.

Aber warum gibt es eigentlich solche komischen Kürzel, haben die Entwickler hier einfach ein paar Buchstabenwürfel verwendet? Natürlich nicht, das sind ganz einfach Relikte
aus R/2. Übrigens, DMBTR steht für „Deutsche Mark Betrag“!dmbtr

In R/2 waren nur 4stellige Tabellennamen und 5stellige Feldnamen erlaubt. SAP hat zwar damals mit R/3 eine völlig neue Technologie geliefert, aber viele ABAP Codes, Tabellen und Prozesse wurden einfach 1:1 übernommen. Und bis dato hat sich bei SAP offensichtlich niemand getraut hier einzugreifen.

Das älteste Programm das ich in einem aktuellen ECC gefunden habe, weißt Kommentare aus dem Jahr 1989 auf!

Bin schon jetzt gespannt, ob wir die Tabellen in S/4 HANA wiederfinden.

 

FOR ALL ENTRIES

Manche ABAP Entwickler schwören auf den FOR ALL ENTRIES Zusatz, manche verteufeln ihn. Ich bin da gespalten denn eigentlich mag ich das Zeug überhaupt nicht, aber andererseits komme auch ich manchmal nicht darum herum.

Aber was ich wirklich – sagen wir mal bescheiden – finde ist, wie ein SELECT mit FOR ALL ENTRIES reagiert, wenn die FOR ALL ENTRIES-Tabelle leer ist. Es werden einfach alle sonstigen Selektionsbedingungen komplett ignoriert und ein kompletter Tablescan durchgeführt. Ohne ersichtlichen Grund.

Hier ein Auszug aus der SAP Online Original Dokumentation:

Before using an internal table itab after FOR ALL ENTRIES, always check that the internal table is not initial. In an initial internal tables, all rows are read from the database regardless of any further conditions specified after WHERE. This is not usually the required behavior.

Nicht zu vergessen ist, dass FOR ALL ENTRIES auf unterschiedlichen Datenbanken teilweise ganz unterschiedlich performant ist. Es gäbe noch viele weitere Argumente (Bufferung, .. ) FOR ALL ENTRIES nicht zu verwenden, aber belassen wir es erst einmal dabei.

Man merke sich jedenfalls: Immer die Größe der FOR ALL ENTRIES Tabelle vor dem SELECT überprüfen – oder noch besser, über Alternativen wie JOINs oder Subselects nachdenken.

 

POOL/Cluster Tabellen

Oh, wie ich diese POOL und CLUSTER Tabellen liebe. Von der Technologie her betrachtet meiner Meinung nach einfach ein ziemlicher Schwachsinn. – Aber auch für diese Technologie gibt es einen triftigen Grund: Wie oben erwähnt waren in R/2 Tabellen nur max. 4stellig. Irgendwann ist SAP dann mit der 4stellen Limitierung einfach an Grenzen gestoßen und hat daher versucht hinter einer Tabelle mehrere Tabellen abzubilden. Das war die Geburt der POOL/CLUSTER Tabellen!

Aber es gibt Hilfe! Wenn wir dann einmal alle auf SAP Hana umstellen bekommen die POOL/CLUSTER Tabellen nach so vielen Jahren endlich ihren verdienten Ruhestand.

Es wäre aber nicht SAP wenn sie für den Vorgang nicht auch einen Namen gefunden hätte: „Depooling/Declustering“.

 

ABAP Open SQL und SQL92

SAP hat mit den aktuellen NetWeaver Releases 7.40 SP5, SP8 und SP12 bzw. NetWeaver 7.50 ein paar wichtige Erweiterungen in das ABAP Open SQL aufgenommen und nähert sich so nach und nach dem Standard SQL92. Manche ABAP Entwickler sind deswegen (SQL Expressions, CDS Views, … ) in heller „Juhu!“ Aufregung!

Liebe Entwickler, bitte vergesst nicht – das 92 hinter SQL Steht für das Jahr! Im Jahr 1992 wurde der Standard definiert. Diese jetzt aufgenommenen Erweiterungen werden von allen namhaften Datenbanken bereits seit Jahrzehnten unterstützt.

Ich meine, eine Erweiterung von ABAP Open SQL war seit Jahren längst überfällig!

 

TCURX

In der TCURX ist gecustomized, wie die Dezimalstelle von Währungen in einem SAP zu interpretieren sind. Wieso das?

Geboren wurde die Tabelle noch im R/2, als auch noch Währungen wie die italienische Lira existiert haben. Die Lira waren teilweise so „groß“ dass die Betragsfelder im R/2 nicht mehr ausgereicht hätten. Also hat man kurzerhand die Kommastellen laut Datenbank außer Kraft gesetzt und dafür die Tabelle TCURX erschaffen. Erst wenn eine Währung nicht in der TCURX enthalten ist, gelten für die Währung die 2 Nachkommastellen.

Im Bereich von Schnittstellen ist das immer wieder ein extra Aufwand – nur um die Betragfelder hin und her zu konvertieren. Beispielswiese für YEN.

Ob man hier nicht irgendwann einmal eine besser Lösung hätte finden können?

 

Jetzt also doch, CODE PUSH DOWN

Jahrelang hat SAP ihren Kunden und uns Entwickler gesagt, DB Nahe Operationen (EXEC SQL, DB Hints, … ) nur in begründeten Fällen und mit Vorsicht zu verwenden. Man verliere so die Unabhängigkeit zur Datenbank oder hat natürlich einen Adaptierungsaufwand wenn gleiches Coding mit verschiedenen Backend-Datenbanken laufen soll.

Nun, da SAP jetzt mit SAP Hana ja eine eigene tolle Datenbank hat, sieht die Sache natürlich etwas anders aus. Jetzt empfiehlt SAP sogar direkter auf der Datenbank „operieren“ um deren Vorteile auch wirklich nutzen zu können. Das Modewort dafür ist „Code Push Down“. Aus ABAP Sicht werden darunter die CDS Views, die AMDB Prozeduren und die SQL Expressions verstanden. Auf der SAP Hana ist darunter z.B. SQL Script zu verstehen.

Nicht falsch verstehen, ich bin ein großer Fan von SAP Hana. Die ist einfach – sorry für den Ausdruck – Sauschnell!

Ich find es halt einfach nur interessant.

 

ABAP® 7.02 New Features – Neue Stringfunktionen

SAP hat mit SAP NetWeaver 7.02 im ABAP Stack einige neue, interessante Stringfunktionen hinzugefügt. Die neuen Funktionen ersetzen einerseits bestehende ABAP Kommandos, andererseits liefern die Funktionen teilweise völlig neue Funktionalitäten. Nachfolgend gehe ich auf die einzelnen Stringfunktionen näher ein und zeige anhand von Beispielen die Anwendung der Funktionen.

cmax/cmin – Zeichenartige Extremwertfunktion

Mit den neuen Extremwertfunktionen cmax bzw. cmin können bis zu 9 zeichenartige Argumente verglichen werden und man erhält die größte oder das kleinste der übergebenen Zeichen als Ergebnis. Verglichen werden die Zeichen auf Basis der verwendeten Codepage von links nach rechts.

Beispiele:

Ergebnis: AAAD

Ergebnis: AZAB

Ergebnis: AAAB

Ergebnis: 0AAC

condense – Verdichtungsfunktion

Die Zeichenkettenfunktion condense verdichtet den Inhalt einer Zeichenkette. Im Gegensatz zum ABAP Kommando bietet die Funktion darüber hinaus jedoch noch einige weitere Möglichkeiten. Beispielsweise können mit der Funktion auch führende oder endende Zeichen entfernt werden.

Nachfolgendes Beispiel entfernt die führenden und endenden X und verdichtet die X zwischen abc und def auf ein X:

Ergebnis: abcXdef

concat_lines_of – Verkettungsfunktion

Diese Funktion verkettet die Zeilen einer internen Tabelle in eine Zeichenkette. Mit dem Zusatz sep kann ein Separator als Trenner zwischen den Zeilen eingefügt werden. Mit dem folgenden Beispiel werden alle Zeilen der Tabelle TAB in einen String, getrennt durch einen Strichpunkt verkettet:

escape – Fluchtsymbolfunktion

Die Funktion escape ermöglicht das regelbasierte Ersetzen eines Strings durch Fluchtsymbole. Die möglichen Regeln sind in cl_abap_format als Konstanten definiert.

Ergebnis:

insert – Einfügefunktion

Diese Funktion ermöglicht das Einfügen einer Zeichenkette an der ersten oder einer bliebigen Stelle einer anderen Zeichenkette. Nachfolgend ein Beispiel mit dem an der bestehenden Zeichenkette an einer spezifischen Stelle eine andere Zeichenkette eingefügt wird. Nach Ausführen der folgenden Zeilen enthält l_string den Wert ‘News in ABAP‘.

match – Abgleichfunktion

Die Funktion match durchsucht einen Text nach einer bestimmten Regex-Übereinstimmung und liefert die gefundene Teilmenge zurück. Groß-/Kleinschreibung wird standardmäßig berücksichtigt, kann jedoch übersteuert werden. Für weitere Informationen zu Regex in SAP bitte die SAP Online Dokumentation verwenden.

repeat – Wiederholfunktion

Hier wird eine Zeichenkette zurückgegeben, welche den Inhalt einer anderen Zeichenkette beliebig oft wiederholt. Mir fällt aktuell keine sinnvolle Anwendung ein, aber hier jedenfalls ein Beispiel, welches die Zeichenkette ‘ABC‘ 5-mal wiederholt und in das Feld l_string stellt:

replace – Ersetzungsfunktion

Mit replace wird ein Teilbereich einer Zeichenkette durch eine Übergebene Zeichenkette ersetzt. Einerseits besteht die Möglichkeit den Teilbereich über eine Offset- bzw. Längenangabe oder über ein Regex zu ermitteln.

Beispiele:

Ergebnis: ‘ABAP xISx GOOD‘

Ergebnis: ‘ABAPISGOOD‘

reverse – Umdrehfunktion

Auch diese Funktion klingt zwar sehr interessant, aber in meinem bisherigen ABAP Leben hab ich so eine Funktion noch nicht vermisst. Trotzdem hier kurz ein Beispiel, welches als Ergebnis den Inhalt einer Zeichenkette komplett umdreht:

Ergebnis: ABAP

Für ältere SAP Systeme existiert der Funktionbaustein STRING_REVERSE welcher den gleichen Zweck erfüllt.

shift_left/shift_right – Verschiebefunktion

Diese neuen Funktionen ersetzen im Prinzip das Kommando SHIFT bieten aber mit dem SUB-Zusatz (Substring) eine zusätzliche Funktion.

Beispiele:

Ergebnis: ‘CD‘

Ergebnis: ‘CDAB‘

Ergebnis: ‘CD‘

substring, substring_… – Teilfeldfunktion

Mit Hilfe dieser neuen Funktionen kann aus einer übergebenen Zeichenkette ein Teilfeld ermittelt werden. Ein wesentlicher Vorteil dieser neuen Funktion liegt darin, dass hier auch Regular Expressions verwendet werden können. Nachfolgend Beispiele für alle vorhandenen Substring-Funktionen:

Ergebnis: ‘DEFG‘ – Bei dieser Variante ist es jedoch sinnvoller (und schneller) mit l_result = l_field+3(4) zu arbeiten.

Ergebnis: ‘DEFGH‘

Ergebnis: ‘GH‘

Ergebnis: ‘ABC‘

Ergebnis: ‘ABCDEF‘

to_upper, to_lower, to_mixed, from_mixed – Groß-/Kleinschreibungsfunktionen

Auch hier handelt es sich um Funktionen, die teilweise bestehende Kommandos ersetzen. „to_upper“ und „to_lower“ wandeln die Inhalte einer Zeichenkette in Groß- bzw. Kleinbuchstaben um. Völlig gleiches Ergebnis wie bei dem Kommando TRANSLATE TO UPPER/LOWER CASE.

Neu und interessant sind die beiden Funktionen to_mixed bzw. from_mixed. „to_mixed“ setzt alle Buchstaben ab der 2. Position in Kleinbuchstaben um. „from_mixed“ fügt von links nach rechts ab der 2. Position das erste im Zusatz sep angegebene Zeichen ein. Durch die Zusätze sep, case und min kann auf das Verhalten beider Funktionen Einfluss genommen werden.

Beispiel:

Ergebnis: ‘Cadaxo gmbh‘

translate – Umsetzfunktion

Auch hier wieder eine Funktion, die ähnlich zum bekannten ABAP Kommando TRANSLATE … USING … ist. Die Funktion liefert eine Zeichenkette zurück, bei der die Zeichen, die in FROM vorkommen durch das Zeichen ersetzt werden, welche in TO an der gleichen Stelle wie in FROM vorkommen. (Sorry für den verwirrenden Satz, einfach ein paar Mal durchlesen, dann wird’s klarer J )

Beispiel:

Ergebnis: ‘YBZD‘

distance – Ähnlichkeitsfunktion

Diese Funktion ist sehr interessant. Sie gibt den Editierabstand (Levenshtein-Distanz) zweier Zeichenketten zurück. Das ist die minimale Anzahl von Einfüge-, Lösch- oder Ersetzungsvorgängen, die notwendig sind, um die eine Zeichenkette in die andere Zeichenkette zu überführen. Mit dem Zusatz max kann ein Wert angegeben werden, der die Berechnung abbricht, sobald die Anzahl der Änderungsvorgänge größer wird. Die Verwendung der Funktion könnte z. B. bei Doublettenprüfungen interessant sein.

Beispiele:

Ergebnis: 2 (Ein „C“ und ein Leerzeichen müssen eingefügt werden)

Ergebnis: 4 (Alle Zeichen müssen ausgetauscht werden)

Erklärung und Anwendung von TIMESTAMPs in ABAP®/SAP®

Allgemeines zu den Timestamps

Gerade SAP Kunden sind meist global agierende Unternehmen, mit Mitarbeitern in verschiedenen Kontinenten bzw. Zeitzonen. Da leider immer noch viele Entwicklungen – auch im SAP Standard – nach wie vor nur mit sy-uzeit bzw. sy-datum arbeiten, habe ich mich entschlossen, hier ein paar Informationen zu Timestamps in ABAP bzw. SAP niederzuschreiben.

Die bereits erwähnten Systemfelder sy-datum und sy-uzeit sind für viele Anwendungen nicht ausreichend:

  • bei sy-datum und sy-uzeit handelt es sich um lokale Zeitangaben. Global agierende Unternehmen, mit Standorten in verschiedenen Zeitzonen müssen den Anwendern Zeiten in deren Zeitzone darstellen können.
  • sy-uzeit enthält die Zeit lediglich auf Sekunden genau.

Erzeugung eines Timestamps in ABAP bzw. SAP mit GET TIME STAMP

Für die Erzeugung eines aktuellen Timestamps in einem SAP System wird das ABAP Kommando get time stamp … verwendet. Das Kommando erzeugt einen Zeitstempel für die UTC-Zeit des aktuellen ABAP Systems. Entsprechend der Definition des Zielfeldes wird der Timestamp entweder in der Kurz- oder Langform erstellt. Üblicherweise werden für die Felddefinition der Timestamp-Felder die Datenelemente timestamp bzw. timestampl verwendet.

Im nachfolgenden Beispiel werden beide Timestamp-Formate erstellt:

Hinweis: Ein Timestamp ist nicht immer „eindeutig“. Sprich, ein Programm dass in kurzer Zeit mehrere Timestamps zieht, könnte unter Umständen die gleichen Timestamps ziehen.

Konvertierung/Umrechnung von Timestamps

Timestamps können mit Hilfe des Kommandos convert time stamp … in bzw. von Datum- bzw. Uhrzeitfeld (type d und t) konvertiert werden. Für die Konvertierung eines Timestamps in ein Datum- bzw. Uhrzeitfeld ist mit dem Zusatz time zone die Zeitzone anzugeben. Wie oben erwähnt, erhält man bei get time stamp den Zeitstempel in UTC Zeit. Bei der Konvertierung eines Datums bzw. Uhrzeit in einen Timestamp kann mit dem Zusatz time zone die Zeitzone für das Datum- bzw. Uhrzeitfeld mitgegeben werden.

Nachfolgendes Beispiel konvertiert einen Timestamp in ein Datum- bzw. Uhrzeitfeld. Als Ziel-Zeitzone wird die Zeitzone des Anwenders sy-zonlo verwendet. Die Zeitzone kann in den persönlichen Einstellungen am Userstamm eingestellt werden.

Nachfolgend das Gegenstück, ein Beispiel zur Konvertierung eines Datum- bzw. Uhrzeitfeldes in einen Timestamp:

Manchmal besteht die Anforderung darin, ein Datum/Zeit von einer Zeitzone in eine andere Zeitzone zu konveriteren. Ich verwende dazu als Hilfe die Konvertierung in einen Timestamp. Sprich, zuerst Konvertierung von Datum/Uhrzeit der Ausgangszeitzone in einen Timestamp, dann Konvertierung des Timestamps in Datum/Uhrzeit der Zielzeitzone.

Zusatz DAYLIGHT SAVING TIME field

Mit diesem Zusatz erhält man die Information, ob sich der Zeitstempel für die angegebene Zeitzone in der Sommerzeit befindet.

Klasse cl_abap_tstmp – Berechnungen von Timestamps

Für verschiedene Berechnungen, Prüfungen oder Konvertierungen steht in einem ABAP System die Klasse cl_abap_tstmp zur Verfügung. Die Klasse bietet verschiedene Methoden an, nachfolgende Methoden sind hervorzuheben:

  • add Addition von x Sekunden zu einem Timestamp
  • subtract Subtraktion eines Timestamps von einem anderen Timestamp
  • subtractsec Subtraktion von x Sekunden von einem Timestamp
  • compareVergleich von zwei Timestamps

Für weitere Informationen zu den restlichen Methoden bitte direkt in die Klasse/Methode einsteigen und die Dokumentation aufrufen.

Weitere Informationen stehen auch in der SAP Hilfe unter https://help.sap.com/docs/SAP_NETWEAVER_700/109dcbed6c531014bc94b876083bbe59/4d591ec163e444b4e10000000a42189e.html?locale=de-DE zur Verfügung

Ab 7.53 gibt es einen neuen Timestamp ABAP-Typ UTCLONG. – Details dazu unter  https://www.cadaxo.com/high-class-development/abap-7-54-neuer-timestamp-utclong/

ABAP-Klasse CL_BCS – Mailversand aus ABAP

Verwendung der Klasse CL_BCS zum Versenden von eMails aus ABAP™ Anwendungen über das Business Communication Service.

Mit unseren Development Tipps behandeln wir spezielle, praxisbezogene Themen rund um das spannende und unerschöpfliche Thema Softwareentwicklung.
Gültig für: SAP NetWeaver ABAP Web AS ab 6.10

Inhalt

  • Allgemeines
  • Mail versenden aus SAP bzw. ABAP
  • Klasse CL_BCS
    • Methode CREATE_PERSISTENT: Anlegen eines Sendeauftrags
    • Methode SET_DOCUMENT: Anfügen von Text, Dateien und anderen Objekten
    • Methode ADD_ATTACHMENT: der Klasse CL_DOCUMENT_BCS
    • Methode ADD_RECIPIENT: Übergabe der Empfänger 4
    • Methode SEND: Senden der E-Mail
  • Anwendungsfälle

Allgemeines

Oft ist es wichtig, benötigte Informationen schnell zur Verfügung zu haben, um rasch und richtig reagieren zu können. Besonders, wenn die Informationsbeschaffung, etwa ein Report, lange dauert und nicht ständig überwacht werden kann, ist es sinnvoll nach Beendigung eine Aktion auszulösen. Das kann z. B. eine eMail mit dem Status eines Batchjobs oder gar schon der fertigen ABAP-Liste sein.

Mail versenden aus SAP bzw. ABAP

SAP hat mit dem Web AS 6.10 (6.20) die Business Communication Services (BCS) zum Versenden von Objekten aus ABAP Anwendungen zur Verfügung gestellt. Dieses objektorientierte Interface ist der Nachfolger des Business Communication Interface (BCI), das über Objekte des Business Object Repository (BOR) realisiert ist.

In diesem CADAXO Development Tipp werde ich einen kurzen Überblick zum E-Mail Versand mittels BCS geben.

Klasse CL_BCS

Über das BCS können unterschiedlichste Objekte mit Anhängen und Notizen an mehrere Empfänger und auf unterschiedliche Kommunikationsarten geschickt werden. Dementsprechend komplex ist das Interface – die Klasse CL_BCS – auch aufgebaut. In diesem Development Tipp beschränken wir uns auf das Versenden einer E-Mail mit Anhang.

Ein Sendevorgang gliedert sich üblicherweise in folgende Schritte.

  1. Erzeugen des Sendeauftrags
  2. Anfügen eines Objekts
  3. Auswahl der Empfänger
  4. Versenden der Nachricht

Für all diese Aufgaben stellt die Klasse CL_BCS Methoden zu Verfügung:

  • CREATE_PERSISTENT Anlegen eines Sendeauftrags
  • SET_DOCUMENT Anfügen von Text, Dateien und anderen Objekten
  • ADD_RECIPIENT Übergabe der Empfänger
  • SEND Senden der E-Mail

Methode CREATE_PERSISTENT – Anlegen eines Sendeauftrags

Diese Methode erzeugt einen Sendeauftrag und liefert diesen als Objekt der Klasse CL_BCS zurück. Alle weiteren Schritte werden auf dieses Objekt angewendet.

Methode SET_DOCUMENT – Anfügen von Text, Dateien und anderen Objekten

Mit dieser Methode wird der Content, also der eigentliche Text und Dateianhänge der E-Mail, übergeben. Die Methode erwartet ein Objekt mit dem Interface IF_DOCUMENT_BCS. Auch Attachments werden über dieses Objekt übergeben.

Über die statische Methode CREATE_DOCUMENT der Klasse CL_DOCUMENT_BCS kann man sich ein entsprechendes Objekt erzeugen lassen. Die Methode erwartet zumindest folgende Parameter:

  • I_TYPE: Typ der übergebenen Daten, z. B. HTM für eine HTML Datei, TXT für Textdateien, BIN für Binärdaten, etwas PDFs
  • I_TEXT/I_HEX: Eine Tabelle mit dem eigentliche Text bzw. den Binärdaten, je nach gewähltem Typ
  • I_SUBJECT: Betreff der E-Mail

Methode ADD_ATTACHMENT der Klasse CL_DOCUMENT_BCS

Diese Methode ist ähnlich der CREATE_DOCUMENT zu verwenden:

  • I_ATTACHMENT_TYPE: Typ der übergebenen Daten, z. B. HTM für eine HTML Datei, TXT für Textdateien, BIN für Binärdaten, etwas PDFs
  • I_ATTACHMENT_TEXT/I_ATTACHMENT_HEX: Eine Tabelle mit dem eigentliche Text bzw. den Binärdaten, je nach gewähltem Typ
  • I_ATTACHMENT_SUBJECT: Name der Attachmentdatei

Methode ADD_RECIPIENT – Übergabe der Empfänger

Je nach Kommunikationsart und Typ der versendeten Objekte können unterschiedliche Empfänger an die Nachricht übergeben werden. Es kann zum Beispiel keine Business Objekt Verknüpfung per E-Mail verschickt werden.

Die Methode erwartet zumindest ein Objekt, das das Interface IF_RECIPIENT_BCS implementiert:

  • I_RECIPIENT: Empfängeradresse (Interface IF_RECIPIENT_BCS)
  • I_EXPRESS: Expressnachricht; ist der Empfänger ein SAP Benutzer, so erhält er bei der nächsten Prozessierung des PBO-Events eine Pop-up mit dem Hinweis auf eine neue Nachricht
  • I_COPY: Der Empfänger erhält die Nachricht als Kopie
  • I_BLIND_COPY: Der Empfänger erhält die Nachricht als Blindkopie
  • I_NO_FORWARD: keine Weiterleitung; ist der Empfänger ein SAP Benutzer, so kann dieser die Nachricht nicht weiterleiten

Die beiden wichtigsten Empfängertypen sind wahrscheinlich E-Mailadressen und SAP Benutzer. Die entsprechenden Objekte werden durch folgende statische Methoden erzeugt:

  • CL_SAPUSER_BCS=>CREATE Für SAP Benutzer
  • CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS Für E-Mailadressen

Methode SEND – Senden der eMail

Die Nachricht wird an SAPconnect übergeben und über das entsprechende Interface verschickt. Der eigentliche Sendeprozess wird üblicherweise durch einen Batchjob mit dem Programm RSCONN01 eingeplant, der periodisch alle anstehenden Nachrichten verschickt. Um die Wartezeit bis zur nächsten Jobausführung zu umgehen, kann die Nachricht als „sofort zu verschicken“ gekennzeichnet werden: Methode SET_SEND_IMMEDIATELY( abap_true ) des Sendeauftrags.

Methode SHORT_MESSAGE

Mit dieser Methode öffnet sich der SAPOffice Dialog für neue Nachrichten, auf dem der Benutzer selbst Empfänger, Text, Attachments und deren Einstellungen pflegen kann. Über Parameter können Vorschlagswerte für die entsprechenden Felder und Objekte, z. B. Empfängeradressen beim Aufruf mitgegeben werden, die dann in der Nachricht angezeigt werden.

Anwendungsfälle

Wo ist nun eine Anwendung der Klasse CL_BCS denkbar und sinnvoll?

  • Anwender können informiert werden, oder bereits Ergebnisse zugeschickt bekommen, wenn eine Auswertung, die als Hintergrundjob eingeplant war, fertig ist.
  • In Fehlersituationen bei kritischen Anwendungen oder Schnittstellen können die zuständigen Personen sofort benachrichtigt werden und somit viel schneller reagieren.