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

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.

So erleichtern Sie die Entscheidungsfindung und gewinnen einen umfassenden Überblick über Ihr Geschäft! Mit meinem neuen Buch lernen Sie, SAP für die Unternehmensplanung einzurichten, zu nutzen und zu erweitern.

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.


SAP Analysis for Microsoft Office: Reporting leicht gemacht

Planung und Reporting mit SAP Analysis leicht gemacht!

Lernen Sie, wie Sie mit SAP Analysis for Microsoft Office professionelle Berichte erstellen. Dieses Praxishandbuch erklärt Ihnen, wie Sie Ihre Daten auf vielfältige Weise auswerten und darstellen. Schritt-für-Schritt-Anleitungen mit zahlreichen Screenshots unterstützen Sie – von der Implementierung bis zur Anwendung.

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.

0 Kommentare

Hinterlasse ein Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.