
Innerhalb eines ABAP-Proxy-Typs können Sie nicht feststellen, ob ein bestimmter Wert initial ist oder ob kein Wert angegeben wurde. Der XDS-Standard legt fest, wie mit Standardwerten umgegangen wird. Für Proxy-Objekte ergibt sich daraus folgendes Standardverhalten:
Serialisierung |
Optionale Elemente und Attribute, die initial sind, werden bei der Serialisierung von Proxy-Typen unterdrückt. |
Deserialisierung |
Bei der Deserialisierung setzt die ABAP-Proxy-Laufzeit den Standardwert, wenn ein Element leer ist oder ein Attribut fehlt. Wenn ein Element das Attribut xsi:nil="true" hat oder wenn ein Element komplett fehlt, wird der entsprechende Parameter initial gelassen. |
Optionale skalare Elemente ohne Default, die initial sind, werden in der Message zur Performance-Optimierung unterdrückt.
Dieses Standard-Verhalten können Sie übersteuern.
Wenn Sie dieses Standardverhalten ändern, kann dies die System-Performance beeinträchtigen. Der Grund dafür ist, dass zusätzliche Informationen für die Message-Einrichtung ausgewertet werden oder beim Parsing zur Verfügung gestellt werden müssen. Daher müssen Sie der ABAP-Proxy-Laufzeit explizit mitteilen, wenn Sie diesen Dienst nutzen wollen.
Das Payload-Protokoll ist eine Instanz des Interface IF_WSPROTOCOL_PAYLOAD. Im Abschnitt Protokolle wird beschrieben, wie Sie sich vor dem Proxy-Aufruf auf Senderseite beziehungsweise in der Inbound-Verarbeitung auf Empfängerseite diese Instanz besorgen. Um das erweitere XML-Handling zu aktivieren, gehen Sie folgendermaßen vor:
Um auf Senderseite der Proxy-Laufzeit mitzuteilen, dass Sie das Standardverhalten übersteuern möchten, rufen Sie vor dem Aufruf des Client-Proxys die Methode SET_EXTENDED_XML_HANDLING auf und setzen den Parameter EXTENDED_XML_HANDLING auf "X". Für die Felder, für die das Standardverhalten abweichen soll, füllen Sie eine Controller-Tabelle (siehe dazu den nächsten Abschnitt). Mit der Controller-Tabelle können Sie steuern, ob beziehungsweise wie ein Wert in der Payload der Message auftauchen soll.
Unabhängig davon, ob beim Sender der Parameter EXTENDED_XML_HANDLING gesetzt war oder nicht, können Sie beim Empfänger die ABAP-Proxy-Laufzeit dazu veranlassen, die Controller-Tabellen für Felder zu füllen. Rufen Sie dazu die Methode SET_EXTENDED_XML_HANDLING des Payload-Protokolls auf und setzen Sie den Parameter EXTENDED_XML_HANDLING auf "X". Die ABAP-Proxy-Laufzeit stellt dann beim Parsen von Messages zu diesem Proxy fest, ob das Feld in der Message übertragen wurde beziehungsweise ob das Feld einen initialen oder keinen Wert hatte. Entsprechend füllt die Proxy-Laufzeit wiederum eine Controller-Tabelle, die von der Anwendung ausgewertet werden kann.
Mit der Methode GET_EXTENDED_XML_HANDLING können Sie abfragen, ob das erweiterte XML-Handling von Ihnen aktiviert wurde.
Steuerung beim Sender
Die ABAP-Proxy-Generierung generiert zu jedem komplexen Typ eine Controller-Tabelle vom Typ PRXCTRLTAB (Zeilentyp PRXCTRL). Diese Komponente hat den Namen CONTROLLER. Mit Hilfe dieser Tabelle können Sie für jedes Feld individuell festlegen, wie und ob es in der Message auftauchen soll. Dazu setzen Sie für eine Tabellenzeile das Feld FIELD auf den ABAP-Feldnamen, das Feld VALUE auf einen Wert aus dem Typ-Pool sai und hängen die Zeile an die Tabelle an. Das Feld VALUE kann dabei folgende Werte haben:
Wert |
Bedeutung |
|---|---|
sai_ctrl_initial |
Das Feld erscheint mit typgerechtem Initialwert in der Message, übersteuert also die Standardbehandlung und die Performance-Optimierung. Der Wert wird für Strukturen beziehungsweise komplexe Typen ignoriert. |
sai_ctrl_nil |
Für das Feld wird der Wert xsi:nil in der Message gesendet. |
sai_ctrl_none |
Das Feld erscheint nicht in der Message, und zwar unabhängig von dessen Wert oder dem Standard. |
Interpretation der Controller-Tabelle auf Empfängerseite
Auch auf der Empfängerseite wird die Controller-Tabelle analog zu jeder Struktur generiert. Die Proxy-Laufzeit füllt sie in diesem Fall beim Parsen mit Werten, die von der Anwendung ausgewertet werden können:
Wert |
Bedeutung |
|---|---|
sai_ctrl_initial |
Für das Feld wurde der Initialwert gesendet |
sai_ctrl_nil |
Für das Feld wird der Wert xsi:nil in der Message gesendet. |
sai_ctrl_none |
Das Feld war nicht in der Message enthalten |