Show TOC

Details zur Implementierung der InvertierungsroutineLocate this document in the navigation structure

Verwendung

Das Mengenobjekt

Aufgabe der inversen Transformation ist es, Selektionsbedingungen aus der Query, die auf dem Ziel der Transformation (Outbound) formuliert sind in Selektionsbedingungen für die Quelle (Inbound) zu übersetzen. Zu diesem Zweck werden die Selektionsbedingungen in ein so genanntes multidimensionales Mengenobjekt (in ABAP Objects sind das Instanzen der Klasse CL_RSMDS_ST) konvertiert. Der Vorteil dieser Darstellung ist die einfache Verarbeitung von Mengenoperationen (Schnittmenge, Vereinigung, Komplement), die auf der sonst üblichen RANGE-Tabellen-Darstellung nur mit hohem Aufwand möglich sind.

Das Universe

Es gibt immer zwei eindeutig bestimmte triviale Instanzen der Klasse CL_RSMDS_SET, die die leere Menge und die Gesamtmenge (also alle Werte) repräsentieren. Diese Instanzen können Sie über das Ergebnis RSMDS_C_BOOLEAN-TRUE der funktionalen Methoden IS_EMPTY bzw. IS_UNIVERSAL erkennen. Alle anderen Instanzen sind immer einem so genannten Universe (Instanz der Klasse CL_RSMDS_UNIVERSE) zugeordnet und liefern für die zuvor genannten Methoden das Ergebnis RSMDS_C_BOOLEAN-TRUE. Die Referenz des zugeordneten Universe bekommen Sie für nicht-triviale Instanzen der Klasse CL_RSMDS_SET über die Methode GET_UNIVERSE. Für die beiden trivialen Instanzen liefert diese Methode eine initiale Referenz zurück, da das Universe in diesem Fall nicht eindeutig bestimmt ist.

Ein Universe repräsentiert die Gesamtheit aller Dimensionen (repräsentiert durch Instanzen des Interface IF_RSMDS_DIMENSION). Eine Dimension ist im Universe immer eindeutig über einen Dimensionsnamen bestimmt. Über die Methode GET_DIMENSION_BY_NAME in der Klasse CL_RSMDS_UNIVERSE können Sie sich über den eindeutigen Dimensionsnamen eine Dimensionsreferenz besorgen. In der Regel ist der Dimensionsname gleich dem Feldnamen in einer Struktur. Es gibt im System unterschiedliche Typen (Unterklassen der Klasse CL_RSMDS_UNIVERSE) von Universes. Die Dimensionen haben darin unterschiedliche Bedeutung. Z.B. entspricht in der Klasse CL_RS_INFOOBJECT_UNIVERSE eine Dimension einem InfoObject. Im Falle der InfoObjects finden Sie die beiden Methoden IOBJNM_TO_DIMNAME und DIMNAME_TO_IOBJNM, um einen InfoObject-Namen in einen Dimensionsnamen bzw. einen Dimensionsnamen in einen InfoObject-Namen zu transformieren. Für eine InfoObject-basiertes Universe gibt es immer nur genau eine Instanz (Singleton), die (fast) alle im System aktiven InfoObjects als Dimensionen enthält (bis auf InfoObjects in InfoSets). Diese Instanz bekommen Sie mit der Methode GET_INSTANCE der Klasse CL_RS_INFOOBJECT_UNIVERSE geliefert.

Im Falle einer DataSource gibt es für jede Kombination aus logischen Systemnamen (I_LOGSYS), DataSource-Namen (I_DATASOURCE) und Segment-ID (I_SEGID) ein eindeutig bestimmtes Universe, dessen Referenz Sie über die Methode CREATE_FROM_DATASOURCE_KEY der Klasse CL_RSDS_DATASOURCE_UNIVERSE bekommen. Die initiale Segment-ID liefert dabei immer das primäre Segment, welches in der Regel das einzige Segment ist, auf dem Selektionsbedingungen für eine Quelle formuliert werden können und von ihr akzeptiert werden. Alle Felder im DataSource-Segment, die für den Direktzugriff markiert sind, bilden die gleichnamigen Dimensionen eines DataSource-Universe. Auch hier bekommen Sie eine Dimensionsreferenz (Instanz zum Interface IF_RSMDS_DIMENSION) über die Methode GET_DIMENSION_BY_NAME des Universe.

Wenn Sie aus einer allgemeinen Selektion, also für eine beliebige Instanz der Klasse CL_RSMDS_SET eine Selektion zu einer bestimmten Dimension heraus projizieren möchten, dann benötigen Sie zunächst eine Referenz auf das Universe, zu dem die Instanz gehört (Methode GET_UNIVERSE, s.o.). Von der Referenz auf das Universe bekommen Sie dann die Dimensionsreferenz über den Dimensions-/Feldname aus der Methode GET_DIMENSION_BY_NAME. Mit der Dimensionsreferenz können Sie dann über die Methode TO_DIMENSION_SET eine Repräsentanz für eine eindimensionale Bedingung "herausprojizieren". Die eindimensionale Projektion können Sie dann über die Methoden TO_STRING und TO_RANGES in eine Open-SQL- bzw. RANGE-Bedingung für das entsprechende Feld umwandeln. Umgekehrt können Sie auch mit Hilfe der Methode CREATE_SET_FROM_RANGES auf der Dimensionsreferenz eine Instanz für ein eindimensionales Mengenobjekt aus einer RANGE-Tabelle erzeugen. Dabei werden die SIGNs 'I' und 'E' und die OPTIONs 'EQ', 'NE', 'BT', 'NB', 'LE', 'GT', 'LT', 'GE', 'CP' und 'NP' unterstützt. Nur bei 'CP' und 'NP' gibt es Einschränkungen. Diese dürfen nur für zeichenartige Dimensionen/Felder verwendet werden und dürfen nur das Maskierungszeichen '*' enthalten, das immer am Ende der Zeichenkette stehen muss. Z.B. ist 'E' 'NP' 'ABC*' eine zulässige Bedingung, aber 'I' 'CP' '*A+C*' ist es nicht.

Über die Methode GET_DIMENSIONS in der Klasse CL_RSMDS_SET gibt es die Möglichkeit, sich eine Tabelle mit den Referenzen aller Dimensionen zu beschaffen, die in der entsprechen Mengenobjekt-Instanz eingeschränkt sind. Für jede Dimensionsreferenz in der zurückgegebenen Tabelle können Sie sich über die Methode GET_NAME den eindeutigen Dimensionsnamen beschaffen. Damit kann man ebenfalls überprüfen, ob es für ein bestimmtes InfoObject oder Feld eine Einschränkung gibt. Diese lässt sich dann wie zuvor beschrieben herausprojizieren.

Über die Universe-Referenz können Sie auch aus einem Open-SQL-Ausdruck eine Instanz für ein Mengenobjekt (insbesondere auch mehrdimensionale Mengenobjekte) erzeugen. In dem übergegebenen Open-SQL-Ausdruck müssen die "Feldnamen" dann gültige Dimensionsnamen im Universe sein. In dem Open-SQL-Ausdruck dürfen Sie elementare Bedingungen über die Vergleichsoperatoren '=', '<>', '<=', '>', '<' und '>=' benutzen. Auf der linken Seite muss ein gültiger Dimensionsnamen stehen und auf der rechten Seite ein Literal, das kompatibel zum Datentyp der Dimension ist. Weiterhin dürfen Sie elementare Bedingungen mit 'BETWEEN', 'IN' und 'LIKE' mit entsprechender Syntax verwenden. Elementare Bedingungen dürfen beliebig über die logischen Operatoren 'NOT', 'AND' und 'OR' zu zusammengesetzten Bedingungen verknüpft werden. Außerdem sind Klammern zulässig, um die normale Auswertungsreihenfolge ('NOT' bindet stärker als 'AND', 'AND' bindet stärker als 'OR') zu verändern.

Über die Methode CREATE_SET_FROM_RANGES der Universe-Referenz können Sie auch direkt ein Mengenobjekt für eine mehrdimensionale Bedingung erzeugen. Dazu muss die in I_T_RANGES übergebene interne Tabelle in ihrer Zeilenstruktur eine RANGE-Struktur (mit den Komponenten SIGN, OPTION, LOW und HIGH) enthalten und eine zusätzliche Komponente für einen Dimensionsnamen besitzen. Der Name dieser Komponente muss dann der Methode CREATE_SET_FROM_RANGES über den Parameter I_FIELDNAME_DIMENSION mitgeteilt werden.

Für eine beliebige Instanz der Klasse CL_RSMDS_SET können Sie über die funktionale Methode COMPLEMENT immer eine Instanz für die komplementäre Bedingung erzeugen.

Wenn zwei Instanzen der Klasse CL_RSMDS_SET zum gleichen Universe gehören, dann kann über den Aufruf der funktionalen Methode INTERSECT oder UNITE für eine Instanz mit Übergabe der anderen Instanz als Parameter I_R_SET eine Instanz für die Schnittmenge bzw. die Vereinigungsmenge erzeugt werden.

Mit der Methode TRANSFORM können Sie auch eine Instanz eines Mengenobjektes in eine Instanz eines Mengenobjektes zu einem anderen Universe transformieren. Bei Bedarf können Sie damit auch eine Projektion durchführen oder Dimensionsnamen anders zuordnen. Diese Methode empfiehlt sich z.B., wenn sich innerhalb der Transformation der Name des Quellfeldes von Namen des Zielfeldes unterscheidet. Der Methode kann im optionalen Parameter I_R_UNIVERSE eine Referenz auf das Ziel-Universe der übergeben werden. Bleibt der Parameter initial, wird angenommen, dass Quell- und Ziel-Universe identisch sind. Im Parameter I_TH_DIMMAPPINGS können Sie die Dimensionsnamen aus dem Quell-Universe (Komponente DIMNAME_FROM) in abweichende Dimensionsnamen auf dem Ziel-Universe (Komponenten DIMNAME_TO) abbilden. Wenn die Komponente DIMNAME_TO initial bleibt, wird eine Einschränkung zur Quell-Dimension (in DIMNAME_FROM) in keine Einschränkung auf dem Ziel-Universe transformiert. Dadurch findet eine Projektion statt. Z.B. wird mit der folgenden Mapping-Tabelle

DIMNAME_FROM

DIMNAME_TO

AIRLINEID

CARRID

CONNECTID

CONNID

FLIGHTDATE

ein Mengenobjekt, das der Open-SQL-Bedingung

AIRLINEID = 'LH' AND CONNECTID = '0400' AND FLIGHTDATE = '20070316' OR

AIRLINEID = 'DL' AND CONNECTID = '0100' AND FLIGHTDATE = '20070317'

entspricht, in ein Mengenobjekt transformiert, welches der Open-SQL-Bedingung

CARRID = 'LH' AND CONNID = '0400' OR

CARRID = 'DL' AND CONNID = '0100'

entspricht.

Start- und Endroutine

Zur Transformation der Selektionsbedingungen werden der Start- und der Endroutine die beiden Parameter I_R_SELSET_OUTBOUND und I_R_SELSET_OUTBOUND_COMPLETE übergeben. Für einfache Queries sind die in beiden Parametern übergebenen Referenzen identisch und der Parameter I_IS_MAIN_SELECTION wird mit der Konstanten RS_C_TRUE versorgt. Für komplexe Queries, die z.B. eingeschränkte Kennzahlen oder Strukturelemente mit Selektionen enthalten, wird die inverse Startroutine mehrmals aufgerufen. Beim ersten Mal wird I_R_SELSET_OUTBOUND mit den Einschränkungen aus dem globalen Filter und den Einschränkungen, die alle Strukturelemente gemeinsam haben, aufgerufen. Bei diesem Aufruf ist dann der Parameter I_IS_MAIN_SELECTION ebenfalls auf RS_C_TRUE gesetzt. Es folgen dann weitere Aufrufe mit Strukturelement-spezifischen Selektionen, die allerdings so zusammengefasst werden, dass sie keine Überlappungen mehr besitzen. In diesen Aufrufen ist I_IS_MAIN_SELECTION auf RS_C_FALSE gesetzt. In I_R_SELSET_OUTBOUND_COMPLETE ist bei allen Aufrufen die komplette Selektionsbedingung enthalten. Um die Selektionen in Start- und Endroutine exakt zu transformieren, muss die Transformation von I_R_SELSET_OUTBOUND in ein Mengenobjekt C_R_SELSET_INBOUND auf dem Universe der Quellstruktur (wird als Referenz über Parameter I_R_UNIVERSE_INBOUND übergeben) für jeden Aufruf exakt erfolgen, was durch Rückgabe des Wertes RS_C_TRUE im Parameter C_EXACT dokumentiert werden muss.

Die Expertenroutine

Die Expertenroutine bekommt mit dem Parameter I_R_SELSET_OUTBOUND immer die vollständigen Selektionen des Ziels übergeben und muss in C_R_SELSET_INBOUND eine vollständige Selektion für die Quelle zurückliefern. Hier kann es ebenfalls von Vorteil sein, eine komplexe Selektion S, wie zuvor bei Start- und Endroutine beschrieben, in eine globale Selektion G und mehrere disjunkte Teilselektionen Ti ( i = 1...n ) zu zerlegen. Diese Zerlegung kann für die übergebene Referenz mit der Methode GET_CARTESIAN_DECOMPOSITION erfolgen. Die globale Selektion können Sie dem Parameter E_R_SET entnehmen, die Teilselektionen sind Einträge der internen Tabelle, die im Parameter E_TR_SETS zurückgeliefert wird. Für die Zerlegung gilt immer

und

Sie sollten dann die globale Selektion und jede Teilselektion einzeln invertieren

und die invertierten Ergebnisse in der Form

wieder zusammensetzen. In der Regel können Sie nur über eine solche Zerlegung eine exakte Invertierung einer komplexen Selektionsbedingung gewährleisten. Wenn die Methode GET_CARTESIAN_DECOMPOSITION mit I_REDUCED = RSMDS_C_BOOLEAN-FALSE aufgerufen wird, gilt für die Zerlegung bereits

Beim Aufruf mit I_REDUCED = RSMDS_C_BOOLEAN-TRUE gilt das nicht mehr und

ist in der Regel eine Obermenge von S. Dafür sind die Selektionen Ti dann in der Regel einfacher.

Übergabe der Selektionsbedingungen

Wenn die transformierten Selektionsbedingungen für die Quelle aus dieser genau die Datensätze liefern, die nach Durchlaufen der Transformation die Selektionsbedingungen auf dem Ziel erfüllen, dann gilt die inverse Transformation als exakt. Im Allgemeinen wird das nicht immer möglich sein. Daher darf eine nicht-exakte Transformation auch mehr Datensätze liefern, als zur Erfüllung der Selektionsbedingungen auf dem Ziel erforderlich sind. Das exakte Ergebnis muss dann durch Nachfiltern mit den Selektionsbedingungen des Ziels gewährleistet werden. Eine inverse Transformation sollte allerdings nie eine Selektionsbedingung für die Quelle erzeugen, die weniger Datensätze aus der Quelle selektiert, als zur Erfüllung der Selektionsbedingung im Ziel erforderlich sind.

Eine nicht-exakte inverse Transformation wird durch den Rückgabewert RS_C_FALSE im Parameter C_EXACT für mindestens einen inversen Routinenaufruf gekennzeichnet. Bei Queries auf dem Analytic Manager (OLAP) hat das nur Performance-Auswirkungen, da in jedem Fall dort noch einmal nachgefiltert wird. In der RSDRI-Schnittstelle, in der Transaktion LISTCUBE und in der Funktion Daten anzeigen im Kontextmenü eines VirtualProviders findet allerdings kein Nachfiltern mehr statt und es werden die überzähligen Sätze auch zurückgeliefert bzw. angezeigt. Die Eigenschaft einer inversen Transformation, exakt zu sein, hat sonst nur Auswirkungen, wenn sie innerhalb der Bericht-Bericht-Schnittstelle aufgerufen wird. Eine nicht-exakte Invertierung bewirkt immer eine Anzeige des Selektionsbildes, bevor die Zieltransaktion ausgeführt wird, um dem Anwender die Möglichkeit zu geben, die Selektionen noch einmal zu überprüfen und ggf. zu korrigieren.

Eine nicht implementierte inverse Routine verhält sich immer so, dass für alle Quellfelder dieser Routine alle Werte angefordert werden. Dementsprechend enthalten die Parameter C_R_SELSET_INBOUND und C_EXACT beim Aufruf immer eine Instanz für die "Alle Werte"-Bedingung bzw. den Wert RS_C_FALSE.

Hinweis

Zum Abschluss noch ein Hinweis. In einem Mengenobjekt werden Selektionen in einer normierten Darstellung abgelegt. Das bedeutet z.B. dass die beiden OpenSQL-Audrücke

CARRID = 'LH' AND FLDATE < '20070101'

und

CONNID <= '20061231' AND CARRID = 'LH'

die gleiche Darstellung als Mengenobjekt haben. Wenn Sie alle Methoden, die zur Erzeugung eines Mengenobjektes als Ergebnis führen, mit dem Parameter I_FINAL = RSMDS_C_BOOLEAN-TRUE (sollte in der Regel der Default sein) aufrufen, ist auch zu gewährleisten, dass im obigen Fall die beiden Objekte identisch sind (d.h. gleiche Referenzen haben). Um zu prüfen, ob zwei Instanzen der Klasse CL_RSMDS_SET die gleiche Selektionsbedingung repräsentieren, sollten Sie allerdings trotzdem die Methode IS_EQUAL benutzen und auf das Ergebnis RSMDS_C_BOOLEAN-TRUE prüfen.