Core Data Service Views – CDS Views – sind die neue Form der DDIC (SE11)-Datenbankview – aber absolut nicht vergleichbar!
CDS Views werden mit der Data Definition Language – DDL – in den Abap Development Tools definiert und können mit der Data Control Language – DCL – um Berechtigungen bzw. Zugriffsbeschränkungen erweitert werden.
Sie sind eine Möglichkeit des Code Push-Down im ABAP und zentraler Bestandteil des S/4 HANA ABAP-Programmiermodels (mehr Details gibt’s in den Folien zum Webinar).
Die hier gezeigten Beispiele wurden in unserem Webinar ABAP CDS Views verwendet und basieren auf Geschäftspartner-Beziehungen. Als System diente SAP NETWEAVER 750 SP1, bei niedrigeren Releases (ab 740 SP5/SP8) stehen manche Funktionen noch nicht zu Verfügung!
Und hier noch die Datenbasis aus der Geschäftspartnerpflege:
Schritt 1 – Ein erster CDS View mit JOIN
Definition eines CDS Views mittels DDL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@AbapCatalog.sqlViewName:'ZWB_BUT050_TX1D'
@AbapCatalog.compiler.compareFilter:true
@AccessControl.authorizationCheck:#NOT_REQUIRED
@ClientDependent:true
@EndUserText.label:'BUT050 with Texts'
define view Zwb_But050_Txt_E asselect from but050
left outer join tbz9a ascattx
on but050.reltyp=cattx.reltyp{
key but050.partner1,
key but050.partner2,
key but050.date_to,
key but050.reltyp,
but050.date_from,
@Semantics.language:true
@EndUserText.label:'Sprache'
cattx.spras,
cattx.bez50,
cattx.bez50_2
}
Wir haben hier einem LEFT OUTER JOIN der BUT050 mit TBZ9A (Alias cattx) und den Viewfeldern Partner1, Partner1, Date_to, Reltyp, Date_from aus der Tabelle BUT050 und Spras, Bez50 und Bez50_2 aus der Tabelle TBZ9A. Als Ergebnis erhalten wir alle Beziehungen aus der BUT050 und den entsprechenden Texten zum Beziehungstyp aus der TBZ9A.
Das ist jetzt noch nicht wirklich aufregend und, abgesehen vom Syntax, auch nicht neu. Das schafft man auch mittels SE11-Datenbankview.
Wir wollen dieses einfache Beispiel aber nutzen, um die verschiedenen Bereiche, Befehle und Tools genauer zu beschreiben.
DDL Bereiche
Objekte und Namen
CDS Entity Name (Datenquellenobjekt ): Die CDS Entity wird als Datenquelle z.B. im ABAP Open SQL Statement verwendet. CDS Datenbank View (generierter SE11 Datenbankview): Für jede Entity wird ein SE11 Datenbankview mit entsprechendem Namen generiert. CDS Viewname (Sourcecode): Name des DDL Sourcecode Objekt.
Generierter DDL View in der SE11:
Annotiations
Annotations bieten die Möglichkeit Eigenschaften, Einstellungen und Metadaten für einem CDS View zu definieren. Diese Werte werden z.B. von der ABAP Runtime oder diversen Frameworks (u.a. Gateway/OData Service, BOPF,…) ausgelesen und steuern deren Verhalten bzw. die Ausgabe.
Annotations gelten entweder für den gesamten View – View Annotations:
1
2
3
4
5
6
@AbapCatalog.sqlViewName:'ZWB_BUT050_TX1D'
@AbapCatalog.compiler.compareFilter:true
@AccessControl.authorizationCheck:#NOT_REQUIRED
@ClientDependent:true
@EndUserText.label:'BUT050 with Texts'
...
Oder für einzelne Elemente/Felder – Element Annotations:
1
2
3
4
5
6
7
8
9
10
11
...
key but050.reltyp,
but050.date_from,
@Semantics.language:true// Definition VOR dem Element
@EndUserText.label:'Sprache'
cattx.spras
@<EndUserText.quickInfo:'Sprache',// Definition NACH dem Element
cattx.bez50,
...
Natürlich gibt’s auch Code Completion:
Annotations zu CDS Entitäten bzw. deren Feldern können mit der API Klasse CL_DD_DDL_ANNOTATION_SERVICE ausgelesen werden. Es wird auch die Möglichkeit kundeneigener Annotations geben (derzeit noch nicht offiziell unterstützt).
Die Select Liste (Datenbankfelder, Literale, Parameter, Funktionen, Systemfelder,…) kann entweder VOR oder NACH den Datenquelle angegeben werden:
Datenquellen
Als Datenquellen können Datenbanktabellen, SE11-Datenbankviews und andere CDS Entitäten angegeben werden. Für ON-Bedingungen von Joins gelten ähnliche Regeln, wie im Open SQL. Vor allem ist auch hier noch kein CAST möglich.
Die Ergebnisse eines CDS Views kann in den ADT über die Data Preview angezeigt werden. Der Aufruf erfolgt über das Kontextmenü im DDL Code oder im Project Explorer oder direkt mittels F8:
Die Ausgabe der Data Preview:
Über Add filter kann, ähnlich der SE16, auf einzelne Feldwerte eingeschränkt werden:
In der SQL Console kann der abgesetzte SQL SELECT Befehl angezeigt und angepasst werden:
Cadaxo SQL Cockpit
Um den ABAP Open SQL Aufruf bzw. Syntax zu zeigen, wird das Cadaxo SQL Cockpit verwendet. Die angeführten SELECT Statement können genauso in ABAP Coding verwendet werden. Einzig der Befehl
1
...INTO TABLE@DATA(lt_but050_txt)...
muss an den entsprechenden Stellen eingefügt werden.
Die CDS Views biete eine ganze Fülle von eingebauten Funktionen, mit denen z.B. mathematische Funktionen und Stringopperationen ausgeführt, Währungs- und Mengeneinheiten umgerechnet, Zeit- und Datumsangaben geprüft oder Datumsintervalle berechnet werden können.
Hier wird die eingebaute Funktion DATS_DAYS_BETWEEN verwendet, um die Gültigkeit jeder Beziehung in Tagen zu berechen, und als Viewfeld Period bereitzustellen:
1
SELECT *FROM ZWB_BUT050_TEXT1_E."View mit eingebauter Funktion
Im Ergebnis sehen wir die unterschiedlich langen Gültigkeitsbereiche in der Spalte PERIOD.
Schritt 3 – Views mit Parametern
Für CDS Views können Parameter definiert werden, die beim SELECT übergeben bzw. befüllt werden müssen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@AbapCatalog.sqlViewName:'ZWB_BUT050_TX4D'
@AbapCatalog.compiler.compareFilter:true
@AccessControl.authorizationCheck:#CHECK
@EndUserText.label:'BUT050 with Texts with Parameter'
Der SELECT wurde um zwei JOINs auf die BUT000 erweitert, um Details zu den Partner zu ermitteln. Durch die beiden CASE Anweisungen werden auch Name_last bzw Name_org1 aus dem entsprechenden BUT000-Eintrag geliefert (natürlich sollte hier das Feld BUT000-TYPE zur Fallunterscheidung verwendet werden, zur Demonstration der Funktionalität reicht uns aber die Prüfung <> “).
Der interessante Teil ist aber die Definition des Parameters p_langu mit dem Datentype abap.lang (entspricht dem ABAP Dictionary Type LANG). Der Parameterwert wird in der ON-Bedingung des JOINs verwendnet, um die Einträge auf die gewünschte Sprache einzuschränken. Er kann aber genauso in die WHERE-Bedingung geschrieben werden. Die beiden Schreibweisen $parameters.p_langu und :p_langu sind gleichwertig und austauschbar.
Beim Aufruf der Data Preview erscheint jetzt zuerst ein Popup für die Parametereingabe:
Die Ergebniszeilen werden entsprechend eingeschränkt und auch die CASE Anweisung arbeitet richtig:
Der Open SQL Aufruf erfolgt ähnliche einem Methodenaufruf:
Über spezielle Parameter Annotations, die Environment Annotationen, können Systemfelder (z.B. SY-UNAME) als Defaultwerte für Parameter definiert werden. Wird der SELECT im ABAP ausgeführt, kann der Parameter weggelassen werden und wird auf den aktuellen Systemwert gesetzt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@AbapCatalog.sqlViewName:'ZWB_BUT050_TX4D'
@AbapCatalog.compiler.compareFilter:true
@AccessControl.authorizationCheck:#CHECK
@EndUserText.label:'BUT050 with Texts with Parameter'
Das ist zwar nett, kann aber auch über eine Where-Bedingung erreicht werden. Wirklich lustig werden Parameter aber, wenn man mit ihnen Logik in die CDS Views bring:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@AbapCatalog.sqlViewName:'ZWB_BUT050_TX5D'
@AbapCatalog.compiler.compareFilter:true
@AccessControl.authorizationCheck:#CHECK
@EndUserText.label:'BUT050 with Texts with Parameter 1'
Wir legen einen weiteren Parameter p_name_first an und verwenden ihn in einer CASE Anweisung. Wird der Parameter mit dem Wert ‚F‘ übergeben, soll für Personen der Vorname (name_first) geliefert werden. Bei jedem anderen Wert kommt wie bisher der Nachname (name_last):
Die Ergebnislisten der beiden Select enthalten die erwarteten Namen:
Schritt 4 – Associations
Associations sind am einfachsten als „JOINs On Demand“ zu beschreiben. Durch Associations können Abhängigkeiten zwischen CDS View Entitäten (also Datenbanktabellen) abgebildet und damit komplexe Datenmodelle definiert werden. Datenbankseitig entsprechen sie JOINs. Die JOIN Bedingung wird aber nur ausgeführt, wenn wirklich Daten über die Associations gelesen werden müssen, also ein Feld aus der Association in der Select-Liste oder Where-Klausel verwendet wird.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@AbapCatalog.sqlViewName:'ZWB_BUT050_TX6D'
@AbapCatalog.compiler.compareFilter:true
@AccessControl.authorizationCheck:#CHECK
@EndUserText.label:'BUT050 with Texts with Association'
define view Zwb_But050_Txt_Asso_E
with parameters@Environment.systemField:#SYSTEM_LANGUAGE p_langu:abap.lang
asselect from but050
// left outer join tbz9a as cattx
association[0..*]totbz9a as_cattx
on but050.reltyp=_cattx.reltyp
// and _cattx.spras = $parameters.p_langu // jetzt als FILTER!
// inner join but000 as partner1
association[1]tobut000 as_partner1
on but050.partner1=_partner1.partner
// inner join but000 as partner2
association[1]tobut000 as_partner2
on but050.partner2=_partner2.partner
{
key but050.partner1,
key but050.partner2,
key but050.date_to,
key but050.reltyp,
but050.date_from,
_cattx[spras=$parameters.p_langu].spras,
_cattx[spras=$parameters.p_langu].bez50,
_cattx[spras=$parameters.p_langu].bez50_2
_cattx[spras='D'].bez50 asbez50_d,
_cattx[spras='D'].bez50_2 asbez50_2_d,
_partner1,
_partner2
}
Zunächst modellieren wir unsere JOINs als Associations und definieren die entsprechende Kardinalität. In unserem Fall [1..1] für die Partner Beziehung und [0..*] für die Text Beziehung. Die Kardinalität dient derzeit noch hauptsächlich rein zur Abbildung des Datenmodells und wird durch die Syntaxprüfung nur teilweise berücksichtigt. Eine Ausnahme ist die Verwendung in der WHERE-Klausel, wo als Kardinalität nur [0..1] oder [1..1] erlaubt ist.
Wir verwenden hier einige Felder aus der Association _cattx mit einem FILTER auf das Feld Spras. Damit werden nur Einträge geliefert, die auch dem Filter entsprechen („Where-Klausel“). Die Texte zum Beziehungstyp werden einerseits zu übergebenen Sprache im Parameter p_langu gelesen, aber zusätzlich auch für Deutsch. Wir sehen hier auch eine Warnung bezüglich der Kardinalität ([0..*] für TBZ9A), können den View aber trotzdem ausführen:
Auch im ABAP:
Interessanterweise erhalten wir aber mehr Zeilen als über die JOIN-Verknüpfung in Schritt 3!?!
Das liegt daran, dass Associations standardmäßig als LEFT OUTER JOIN gebildet werden. Das kann aber übersteuert werden:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@AbapCatalog.sqlViewName:'ZWB_BUT050_TX6D'
@AbapCatalog.compiler.compareFilter:true
@AccessControl.authorizationCheck:#CHECK
@EndUserText.label:'BUT050 with Texts with Association'
define view Zwb_But050_Txt_Asso_E
with parameters p_langu:abap.lang@<Environment.systemField:#SYSTEM_LANGUAGE
asselect from but050
// left outer join tbz9a as cattx
association[0..*]totbz9a as_cattx
on but050.reltyp=_cattx.reltyp
// and _cattx.spras = $parameters.p_langu // jetzt als FILTER!
// inner join but000 as partner1
association[1]tobut000 as_partner1
on but050.partner1=_partner1.partner
// inner join but000 as partner2
association[1]tobut000 as_partner2
on but050.partner2=_partner2.partner
{
key but050.partner1,
key but050.partner2,
key but050.date_to,
key but050.reltyp,
but050.date_from,
_cattx[1:inner where spras=$parameters.p_langu].spras,
_cattx[1:inner where spras=$parameters.p_langu].bez50,
_cattx[1:inner where spras=$parameters.p_langu].bez50_2,
_cattx[1:inner where spras='D'].bez50 asbez50_d,
_cattx[1:inner where spras='D'].bez50_2 asbez50_2_d,
_partner1,
_partner2
}
Über die Angabe inner in den Filterwerten, mit dem Zusatz where, wird nun ein INNER JOIN generiert. Die ebenfalls neue Anweisung 1: setzt die Kardinalität für diese Verwendung auf [0..1]. Die Warnung wird nicht mehr angezeigt:
Das Ergebnis ist wieder gleich der JOIN Variante:
Associations veröffentlichen – Pfadzugriffe
Wer sich bisher gewundert hat, warum in der SELECT-Liste der Viewdefintion die beiden Associations _partner1 und _partner2 (Alisasnamen für Associations sollten mit ‚_‘ beginnen) angegeben sind, in der Ergebnisliste aber nicht wirklich aufscheinen: Damit wird Association nur veröffentlicht. Sie kann also „von außen“ durch einen Aufrufer verwendet werden. Der Zugriff auf Associations mittels Open SQL erfolgt über Pfade:
1
2
Select PARTNER,TYPE,NAME_ORG1,NAME_LAST,MC_NAME1
from Zwb_But050_Txt_Asso_E\_partner2
Hier wird über die Entität Zwb_But050_Txt_Asso_E selektiert, es werden aber nur Felder der Association _partner2 abgerufen, also Felder aus der Datenbanktabelle BUT000. Im SQL Trace (Transaktion ST05) ist der abgesetzte SELECT Befehl ersichtlich:
Es wird also zur Laufzeit ein JOIN mit der ON-Bedingung der Association gebildet.
Natürlich kann man auch nur einzelne Felder über Pfadausdrücke ansprechen:
1
2
3
4
5
Select Zwb_But050_Txt_Asso_E~*,
\_partner2-PARTNER asp2_partner,
\_partner2-TYPE asp2_type,
\_partner2-MC_NAME1 asp2_mc_name1
from Zwb_But050_Txt_Asso_E
Oder in der Where-Klausel verwenden:
1
2
3
4
5
6
SELECT zwb_but050_txt_asso_e~*,
\_partner2-partner ASp2_partner,
\_partner2-type ASp2_type,
\_partner2-mc_name1 ASp2_mc_name1
FROM zwb_but050_txt_asso_e
WHERE\_partner1-partner<>'0000000013'
Der Zugriff auf nicht veröffentlichte Associationen von außen ist nicht möglich:
Compare Filter
Wir haben bisher immer die View-Annotation
1
@AbapCatalog.compiler.compareFilter:true
verwendet, diese aber noch nicht erklärt. Um zu verstehen, was diese macht, müssen wir uns den generierten, technischen SQL Befehl anschauen. Das ist über das Kontextmenü möglich:
Wir erkennen, dass für die Association _cattx (technischer Alias A0) nur eine JOIN Verknüpfung angelegt wird.
Setzen wir den Annotationwert auf false und betrachten den technischen SQL Befehl erneut:
Jetzt wird für jedes Association-Feld eine JOIN-Bedingung definiert!
Kardinalitätsfehler in der Where-Klausel
Für das Beispiel wurde auch die Assiocation _cattx nach außen veröffentlicht.
Schritt 5 – Viewerweiterungen
SAP bietet auch die Möglichkeit CDS Views modifikationsfrei zu erweitern. Dazu kann über einen Extend View eine Entität um zusätzliche Assiciations und Felder erweitert werden:
1
2
3
4
5
6
7
8
9
10
11
12
@AbapCatalog.sqlViewAppendName:'ZWB_BUT050_TX7D'
@EndUserText.label:'View Extend'
extend view Zwb_But050_Txt_Asso_E with Zwb_But050_Txt_Ext1_E
association[0..*]tobut100 as_roles
on _roles.partner=but050.partner2
{
but050.relnr,
_roles
}
Die Entität Zwb_But050_Txt_Asso_E liefert jetzt auch das Feld Relnr der Tabelle BUT050 und es gibt die Association _roles:
Die Data Preview bietet auch die Möglichkeit auf Assiocaitions zuzugreifen:
Daten der hinzugefügten Association _roles für eine Ergebniszeile der Entität.
Und auch im ABAP:
1
2
3
4
5
SELECT partner2 aspartner,
reltyp asreltyp,
\_partner2-mc_name1 asname,
\_roles-rltyp asroletyp
FROM ZWB_BUT050_TXT_ASSO_E.
Schritt 6 – einfach ausprobieren
CDS Views erscheinen auf den ersten Blick vielleicht etwas fremd und komplex. Aber jeder ABAP Entwickler, der bereits über ein SELECT * FROM table hinausgekommen ist und etwas Erfahrung mit ADT hat, findet sich sehr schnell zurecht! Einfach mal ein paar Beispiele ausprobieren und die Templates zum Anlegen verwendet – dann wird man die CDS Views kennen und lieben lernen! Zumindest wars bei mir so 😉
Und spätestens mit S/4 HANA kommen wir an CDS Views nicht mehr vorbei…
Für die Version 3.2 unseres SQL Cockpits haben wir neben einigen kleineren Verbesserungen und Korrekturen ein paar sehr interessante Features eingebaut bzw. erweitert.
Vergleichen von Ergebnislisten
Der Vergleich von Ergebnislisten wurde komplett runderneuert. Nun können beliebige Ergebnislisten miteinander verglichen werden. Über eine komfortable Mappingoberfläche können die zu vergleichenden Felder verlinkt werden. Es spielt dabei keine Rolle, ob es sich dabei um neu erstellte Ergebnislisten oder um gespeicherte Listen handelt.
Tipp: Gespeicherte Listen können exportiert bzw. importiert werden. Dadurch ist ein systemübergreifender Ergebnislistenvergleich möglich!
Open SQL Features 7.50
SAP hat mit 7.40 SP5 / SP8 bzw. 7.50 umfangreiche Erweiterungen für den ABAP Open SQL Syntax aufgenommen. Das Cadaxo SQL Cockpit 3.2 unterstützt alle diese neuen SQL Features.
Nachfolgend eine Aufstellung der wichtigsten ABAP Open SQL Features:
Open SQL Expressions
Open SQL Functions
Host Expressions
Unions
Zugriff auf CDS Views
Pfadausdrücke für Assoziationen von CDS-Views
CDS-Views mit Eingabeparametern
Integration ADT
Über die Usersettings kann sich nun jeder Anwender einstellen, ob die Vorwärtsnavigation bei einem Doppelklick auf eine Tabelle wie bisher innerhalb des SAP Gui oder ob die Anzeige mit den ADT (ABAP Developer Tools = Eclipse!) erfolgen soll.
Beispielsweise können CDS Views nur mit den ABAP Developer Tools gepflegt werden. Innerhalb von SAP Gui ist lediglich eine Anzeige möglich.
Elementinfo für CDS Views
Die Anzeige der CDS Views wurde in die Elementinfo aufgenommen. Die Element Info sorgt für eine bessere Usability im SQL Cockpit. Notwendige Informationen zu einer DB-Tabelle werden einfach angezeigt, wenn man einen Moment mit dem Mauszeiger über einen Tabellen- oder CDS-View-Namen fährt.
Sie sehen gerade einen Platzhalterinhalt von Standard. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf den Button unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Frage: Kann man die Unit Tests soweit integrieren, dass ein Transport nur möglich ist wenn keine Fehler auftreten?
Antwort: Ja sicher, über CI (Code Inspector) Prüfungen bei der Freigabe
Info: So ein Update zum falschen Zeitpunkt ist einem Kollegen kurz vor einer Kundenpräsentation unlängst auch passiert. (Anm. Föß: Danke das hilft!)
Info: Ich denke, der Prozess des Übergangs ist schwierig und ein eigenes Webinar wert. (Anm. Föß: Stimmt vollkommen, bereits während der Vorbereitung hab ich mir die gleichen Gedanken gemacht. Ich denke ich greife genau das Thema nochmals auf)
Frage: „Gibt es eigentlich Kennzahlen mit denen man sinnvoll die Einführung von Unit Tests darstellen kann? (Anm. Föß: Ja gibt’s (von Google selber z.B. ), aber leider hab ich von/über SAP da nichts passendes gefunden)
Info: Martin Fowler hat unlängst in einem Blog geschrieben wie schwer es ist als erster mit Unit Tests anzufangen. Da ist es oft notwendig kreativ Lösungen zu finden. (Anm. Föß: Page von Martin Fowler: http://martinfowler.com )
Info: Interfaces ist eine Methode für Datenbankzugriffe, Paul Hardy nennt Unterklassen. Ich nutze manchmal einfach nur If-Statements dafür. (Anm. Föß: Stimmt, ist eine Lösung. In diesem Zusammenhang ein Hinweis auf 7.50 und auf die sogenannten Test seams bzw. Test injections: http://help.sap.com/abapdocu_750/en/index.htm?file=abennews-750-abap_unit.htm )
Info: Working Effectively with Legacy Code““ beschreibt sehr schön wie Tests nachträglich eingeführt werden können. (Anm. Föß: ISBN-13: 978-0131177055)
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_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.