How To SAP BI – Inverse Routinen (Invertierungsroutinen) in SAP BW

How To SAP BI - Inverse Routinen (Invertierungsroutinen) in SAP BW
How To SAP BI – Inverse Routinen (Invertierungsroutinen) in SAP BW
4.8 Sterne
4 Bewertungen


Bei Verwendung von Virtuellen InfoProvidern mit DTPs kann es, je nach Komplexität des Codings, notwendig sein mit inversen Routinen zu arbeiten. Diese ermöglichen es Selektionen zu übergeben oder auch zu erweitern. So ist es bei der Real Time Datenbeschaffung sinnvoll nur den aktuellen Tag aus der Quelle zu lesen, anstatt alle Daten abzufragen und erst bei der Anzeige in der Query zu filtern. Auch wenn verschiedene Objekte verwendet werden können inverse Routinen Abhilfe schaffen.

Betrachten wir die folgende Transformation.
Transformation zum Virtuellen InfoProvider

Das Ziel verwendet ein anderes Merkmal für die Brand. Außerdem fehlen die Merkmale Kalenderjahr und Version. Unser Ziel ist es, Selektionen von Z_BRAND und ZMNGBRND zu mappen. Darüber hinaus wollen wir das aktuelle Jahr und die Plan-Version extrahieren. Daher erweitern wir die Selektionskriterien mithilfe der Invertierungsroutine.

Folgende Parameter sind wichtig:
Importing

  • i_th_fields_outbound: Felder/InfoObjects für die Query-Struktur
  • i_r_selset_outbound: Selektionsbedingungen der Query

Changing

  • c_th_fields_inbound: Felder bzw. InfoObjects der Zielstruktur
  • c_r_selset_inbound: Selektionsbedingungen des Ziels
  • c_exact: Mit diesem Parameter bestimmen Sie, ob die Transformation der Selektionskriterien exakt durchgeführt wird. Dies ist vor allem beim Aufruf der Bericht-Bericht-Schnittstelle (RRI) wichtig. Falls die Invertierung exakt ist, kann der direkte Aufruf erfolgen. Ist die Invertierung nicht exakt, dann erhält der Benutzer ein Selektionsbild.

Ein einfaches Beispiel der inversen Routine könnte so aussehen:


 c_th_fields_inbound = i_th_fields_outbound.
 c_r_selset_inbound  = i_r_selset_outbound.
 c_exact             = rs_c_true.

Unser Beispiel ist jedoch ein wenig komplexer.
Zunächst lesen wir die Selektionen aus und konvertieren diese in eine flache Tabelle, mit der wir einfacher arbeiten können. Dabei werden die Selektionen für Z_BRAND von dem InfoObjekt ZMNGBRND übernommen. Außerdem erweitern wir die Selektion um das aktuelle Jahr und Version PLN.

Das komplette Coding sieht wie folgt aus. Dieses können Sie in der Startroutine der Transformation platzieren. Scrollen Sie dabei nach unten bis zum *$*$ begin of inverse routine Kommentar.

*$*$ begin of inverse routine - insert your code only below this line*-*

    TYPE-POOLS : sbiwa.

    TYPES:   BEGIN OF complexrange_type,
                   chanm TYPE rschanm,
                   simplerange_table TYPE RANGE OF rschavl,
                   END OF complexrange_type.

    DATA:       lt_complexrange_table TYPE STANDARD TABLE OF
    complexrange_type,
ls_complexrange_line LIKE LINE OF lt_complexrange_table,
                lt_dimension_table TYPE rsmds_tr_dimensions,
                lt_flatrange_table TYPE sbiwa_t_select,
                ls_flatrange_line LIKE LINE OF lt_flatrange_table.

    FIELD-SYMBOLS: <ls_dimension_line> LIKE LINE OF lt_dimension_table,
                   <ls_complexrange_line> LIKE LINE OF
                   lt_complexrange_table,
                   <ls_simplerange_line> TYPE LINE OF
                   complexrange_type-simplerange_table,
                   <fs_line> LIKE LINE OF lt_flatrange_table.


* read selections
    TRY.
        lt_dimension_table = i_r_selset_outbound->get_dimensions( ).

      CATCH cx_rsmds_dimension_unknown
             cx_rsmds_input_invalid
             cx_rsmds_input_invalid_type
             cx_rsmds_sets_not_compatible
             cx_rsmds_syntax_error.
    ENDTRY.

* convert to range
    LOOP AT lt_dimension_table ASSIGNING <ls_dimension_line>.
      CLEAR ls_complexrange_line.

      TRY.
          CALL METHOD i_r_selset_outbound->to_ranges
            EXPORTING
              i_r_dimension = <ls_dimension_line>
            CHANGING
              c_t_ranges    = ls_complexrange_line-simplerange_table.

          ls_complexrange_line-chanm = <ls_dimension_line>->get_name( ).
          APPEND ls_complexrange_line TO lt_complexrange_table.

        CATCH cx_rsmds_dimension_unknown
               cx_rsmds_input_invalid
               cx_rsmds_input_invalid_type
               cx_rsmds_sets_not_compatible
               cx_rsmds_syntax_error.
      ENDTRY.
    ENDLOOP.
* prepare range for inbound selection
    LOOP AT lt_complexrange_table ASSIGNING <ls_complexrange_line>.

      LOOP AT <ls_complexrange_line>-simplerange_table ASSIGNING
      <ls_simplerange_line>.

        ls_flatrange_line-sign = <ls_simplerange_line>-sign.
        ls_flatrange_line-low = <ls_simplerange_line>-low.
        ls_flatrange_line-high = <ls_simplerange_line>-high.
        ls_flatrange_line-option = <ls_simplerange_line>-option.
        IF <ls_complexrange_line>-chanm EQ '/BIC/Z_BRAND'.
          ls_flatrange_line-fieldnm =  '/BIC/ZMNGBRND'.
        ELSE.
          ls_flatrange_line-fieldnm = <ls_complexrange_line>-chanm.
        ENDIF.

        APPEND ls_flatrange_line TO lt_flatrange_table.
      ENDLOOP.

    ENDLOOP.
* enhance selections:
* only current year
      ls_flatrange_line-low     = sy-datum(4).
      ls_flatrange_line-sign    = 'I'.
      ls_flatrange_line-option  = 'EQ'.
      ls_flatrange_line-fieldnm =  'CALYEAR'.
      APPEND ls_flatrange_line TO lt_flatrange_table.
* only plan version
      ls_flatrange_line-low     = 'PLN'.
      ls_flatrange_line-sign    = 'I'.
      ls_flatrange_line-option  = 'EQ'.
      ls_flatrange_line-fieldnm =  'D_NW_VERS'.
      APPEND ls_flatrange_line TO lt_flatrange_table.

* convert range to inbound
    TRY.

        c_r_selset_inbound =
        i_r_universe_inbound->create_set_from_ranges(
        i_fieldname_dimension = 'FIELDNM'
        i_t_ranges = lt_flatrange_table ).

        c_exact                     = rs_c_true.

      CATCH cx_rsmds_dimension_unknown
             cx_rsmds_input_invalid
             cx_rsmds_input_invalid_type
             cx_rsmds_sets_not_compatible
             cx_rsmds_syntax_error.

* Normally, should not occur
*If the exception occurs request all values from source for this
*routine
*to be on the save side
        c_r_selset_inbound = cl_rsmds_set=>get_universal_set( ).
        c_exact = rs_c_false. "Inversion is no longer exact

    ENDTRY.
*$*$ end of inverse routine - insert your code only before this line *-*
 

Nun wollen wir testen, ob unsere Routine funktioniert.
In der Quelle haben wir folgende Daten.
Inverse Routine Source
Nach dem Aufruf liefert der virtuelle Cube folgende Werte.
Ausgabe Virtueller InfoCube
Und auch die Weitergabe der Selektionen funktioniert ohne Probleme.

Ihre User beklagen sich über langsame Berichte?

  • In meinem Newsletter lernen Sie, wie Sie Abhilfe schaffen.
  • Entdecken Sie die Möglichkeiten der Performanceoptimierung.
  • Praktische Anleitungen ermöglichen Ihnen schnelle Erfolge bei der Optimierung von SAP Systemen.
  • Viele Tipps und Tricks zu SAP BI Themen.
  • Holen Sie die maximale Performance aus Ihrem SAP BI!
  • Bei der Anmeldung zu meinem Newsletter erhalten Sie das Buch „High Performance SAP BI“ als Willkommensgeschenk.
Fordere SAP Performance Tricks an

Jetzt anfordern!

* Pflichtfeld
 
Kein SPAM. Ich hasse Spam genau so wie du.

Quellen und weiterführende Literatur:
SAP AG – Parameter der Invertierungsroutine
Falls Ihnen dieser Beitrag weitergeholfen hat, wäre es eine sehr nette Anerkennung meiner Arbeit wenn Sie z.B. Ihre Bücher über Amazon bestellen würden. Wenn Sie ein Produkt kaufen, erhalte ich dafür eine Provision. Für Sie ändert sich am Preis des Produktes gar nichts. Ich möchte mich an dieser Stelle jetzt schon für Ihre Unterstützung bedanken.

Denis Reis ist Business Intelligence Consultant und gibt als Buchautor sein Wissen rund um den SAP Projektalltag weiter. Wenn Sie tatkräftige Unterstützung bei Ihren SAP BI Projekten benötigen, können Sie ihn über Xing, LinkedIn oder Facebook kontaktieren.
Des Weiteren unterrichtet er Projektmanagement und Controlling an der Wiesbaden Business School. Der aus Düsseldorf stammende Familienmensch zählt zu denjenigen, die auf komplizierte Darstellungen verzichten und das Ganze auf den Punkt bringen.

0 Kommentare

Dein Kommentar

Want to join the discussion?
Feel free to contribute!

Kommentar verfassen