BTP - Mehrere Communication Systems
Wie können wir verschieden Verbindungen im gleichen Communication Scenario unterscheiden und die richtige für uns ableiten? Mehr dazu hier.
Inhaltsverzeichnis
In diesem Artikel schauen wir uns näher an, wie wir die verschiedenen Verbindungen an einem Communication Arrangement voneinander unterschieden können und so über den ABAP Code das richtige System ansprechen können.
Einleitung
In verschiedenen Szenarien kann es vorkommen, dass wir das gleiche Communication Scenario für verschiedene Verbindungen nutzen möchten. Wenn zum Beispiel der Anwender per Principal Propagation zugreifen soll, der Service dann im Application Job aber einen technischen User per Basic Authentication benötigt. In so einem Fall müssen wir im System für das Communication Scenario zwei Varianten mit jeweils einem eigenen Communication System anlegen. Je nach Namenskonvention, wollen wir das System aber nicht hart im Coding hinterlegen, da es pro Stage (DEV, TEST, PROD) unterschiedlich sein kann und die Abbildung im Coding keinen Sinn macht.
Parameter
Bevor wir die Systeme und Verbindungen hart im Coding hinterlegen, gibt es die Möglichkeit der zusätzlichen Eigenschaften an einem Communication Scenario. Auf dem Reiter "Overview" wirst du im Bereich "Additional Properties" weitere Merkmale finden.
Über den "Hinzufügen" Button kannst du neue Eigenschaften aufnehmen. Was du benötigst, ist ein eigenes Datenelement, welches nicht unbedingt eine eigene Domäne benötigt, nur wenn du eine Wertehilfe erzeugen möchtest. Wichtig ist hier erst einmal der Datentyp und die Texte zur Anzeige. Über die Eigenschaften im hinteren Bereich kannst du noch einige Dinge steuern:
- Is Multiple - Es ist eine Mehrfacheingabe von Werten in diesem Feld möglich, wenn verschiedene Eigenschaften abgebildet werden sollen.
- Is Secure - Das Feld wird sicher abgelegt und in der UI nicht angezeigt. Hier können Informationen wie Zugänge und Passwörter gespeichert werden.
- Value Help - Die Wertehilfe der Domäne wird zur Anzeige in der App verwendet.
Wenn du einen Parameter markierst und auf den Button "Value Help" klickst, werden dir die aktuellen Werte der Suchhilfe angezeigt. In diesem Beispiel werden die Festwerte der Domäne herangezogen.
Pflege
Legen wir nun über die App "Communication Arrangements" ein neues Arrangement mit unserem Communication Scenario an, sehen wir unsere drei zusätzlichen Eigenschaften in einem neuen Bereich.
Entsprechend der Konfiguration wurde für "System" bereit der Wert TEST vorbelegt. Für "Application Type" gibt es eine definierte Suchhilfe, um den Wert nicht manuell eingeben zu müssen. In das Feld "Multiple Values" können wir nun per Freitext verschiedene Werte eintragen. Wenn du mit dem Wert fertig bist, musst du ENTER drücken, damit dieser in ein Element der Liste umgewandelt wird. Hier einmal ein Beispiel für die Eingabe von mehreren Werten.
Implementierung
Nachdem wir nun die Merkmale hinterlegt haben und drei Beispielszenarien implementiert haben, geht es nun um die Ermittlung des richtigen Systems zur Laufzeit. Dazu stellt SAP eine Factory zur Verfügung. Im ersten Schritt definieren wir die Query für die Suchanfrage, dort sollte mindestens CSCN_ID_RANGE mit unserem Communication Scenario befüllt sein, da wir dafür die Systeme suchen. Über CA_PROPERTY können wir weitere Abgrenzungen definieren, um die Verbindung weiter einzuschränken.
DATA(ls_query) = VALUE if_com_arrangement_factory=>ty_query(
cscn_id_range = VALUE #( ( sign = 'I' option = 'EQ' low = 'ZBS_DEMO_CS_PARAM' ) )
ca_property = VALUE #( ( name = 'MULTIPLE' values = VALUE #( ( 'OTHERS' ) ) ) ) ).
Im nächsten Schritt erzeugen wir die Factory zur Ermittlung der gepflegten Systeme. Dieser übergeben wir nun die Query und erhalten eine Tabelle von Systemen zurück. Je nach Eingrenzung können das alle gepflegten Systeme sein oder nur genau ein System, so wie wir es benötigen.
DATA(lo_factory) = cl_com_arrangement_factory=>create_instance( ).
lo_factory->query_ca( EXPORTING is_query = ls_query
IMPORTING et_com_arrangement = DATA(lt_systems) ).
Zum Abschluss lassen wir uns über die Methode GET_COMM_SYSTEM_ID den Namen des Communication Systems geben, damit wir diesen für die Instanziierung des Proxys verwenden können.
lo_system->get_comm_system_id( )
Hier einmal ein Stück Beispielcode, wie wir uns über den Destination Provider eine Destination erstellen und dabei das Communication System über die Factory ableiten. Damit musst du nur noch die spezifischen Eigenschaften der Query übergeben und kannst die Steuerung über das Communication Arrangement machen, ohne weitere Werte hart im Code zu hinterlegen.
DATA(lo_destination) = cl_http_destination_provider=>create_by_comm_arrangement(
comm_scenario = 'ZBS_DEMO_CS_PARAM'
service_id = 'ZBS_TEST'
comm_system_id = lo_system->get_comm_system_id( ) ).
Vollständiges Beispiel
Hier findest du den Beispielcode zum Lesen der Systeme über die Factory Klasse und der Ausgabe des Ergebnisses in die Konsole.
CLASS zcl_bs_demo_read_systems DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS zcl_bs_demo_read_systems IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA(ls_query) = VALUE if_com_arrangement_factory=>ty_query(
cscn_id_range = VALUE #( ( sign = 'I' option = 'EQ' low = 'ZBS_DEMO_CS_PARAM' ) )
ca_property = VALUE #( ( name = 'MULTIPLE' values = VALUE #( ( 'OTHERS' ) ) ) ) ).
DATA(lo_factory) = cl_com_arrangement_factory=>create_instance( ).
lo_factory->query_ca( EXPORTING is_query = ls_query
IMPORTING et_com_arrangement = DATA(lt_systems) ).
LOOP AT lt_systems INTO DATA(lo_system).
out->write( lo_system->get_comm_system_id( ) ).
ENDLOOP.
ENDMETHOD.
ENDCLASS.
Fazit
Wenn du für ein Communication Scenario nur ein Communication Arrangement anlegst, benötigst du diesen Aufwand nicht. Hast du allerdings mehrere Verbindungen und möchtest diese nicht hart im Code hinterlegen, dann bieten sich die zusätzlichen Parameter an.
Quelle:
SAP Help - Specific Properties