In ABAP kann man bei einem initialen Schnittstellen-Parameter nicht erkennen, ob der Parameter nicht mit einem Wert belegt wurde oder ob ein initialer Wert übergeben wird. Zudem gibt der XSD-Standard vor, wie mit Defaultwerten umgegangen wird. Für die Proxy-Generierung ergibt sich daraus folgendes Standard-Verhalten:
Standardverhalten der Defaultbehandlung
Consumer-Proxy |
Beim Erzeugen des XML-Datenstroms wird in allen initialen Feldern der Defaultwert gesetzt |
Provider-Proxy |
Die Eingangsverarbeitung auf Server-Seite der ABAP-Proxy-Laufzeit setzt für Parameter den Defaultwert vor Aufruf der Anwendung, wenn Element-Tags leer sind oder Attribut-Tags fehlen. Wenn Elemente ein Attribut nil = "true" haben oder das Element-Tag ganz fehlt, wird der zugehörige 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.
Die Übersteuerung des Standard-Verhaltens wirkt sich auf die Performance aus, denn die Zusatzinformationen müssen beim Aufbau der Message ausgewertet beziehungsweise beim Parsen beschafft werden. Aus diesem Grund 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 Protokoll ist beschrieben, wie Sie sich vor dem Aufruf eines Proxy 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 Standard-Verhalten übersteuern möchten, rufen Sie vor dem Aufruf des Client-Proxies die Methode SET_EXTENDED_XML_HANDLING auf und setzen den Parameter EXTENDED_XML_HANDLING (auf 'X'). Für die Felder, für die das Standard-Verhalten abweichen soll, füllen Sie eine Controller-Tabelle (wie ist im folgenden Abschnitt erläutert). 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 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.
Die ABAP-Proxy-Generierung generiert zu jedem komplexen Typ eine Kontroll-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 Type-Pool sai und hängen die Zeile an die Tabelle an. Das Feld VALUE kann dabei folgende Werte haben:
Wertebereich für Feld VALUE der Tabelle CONTROLLER
Wert |
Bedeutung |
sai_ctrl_initial |
Das Feld erscheint mit typgerechtem Initialwert in der Message, übersteuert also die Defaultbehandlung 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 Default |
Auch auf der Empfänger-Seite wird die Kontroll-Tabelle analog zu jeder Struktur generiert. Die Proxy-Laufzeit füllt sie in diesem Fall beim Parsen mit Werten, die die Anwendung auswerten kann:
Mögliche Werte des Feldes VALUE der CONTROLLER-Tabelle auf Inbound-Seite
Wert |
Bedeutung |
sai_ctrl_initial |
Für das Feld wurde der Initialwert gesendet |
sai_ctrl_nil |
Für das Feld wurde der Wert xsi:nil in der Message gesendet. |
sai_ctrl_none |
Das Feld war nicht in der Message enthalten |