Montag, 31. August 2015

CATS - Kundenfelder in Selektion CATS_DA aufnehmen

Wenn man die Datenbanktabelle des Arbeitszeitblattes um Kundenfelder erweitern möchte so gelingt das relativ einfach über den User-Exit CATS0005. Hier kann man zusätzliche Felder in den Kunden-Include CI_CATSDB aufnehmen. Diese Felder stehen dann auch automatisch den Auswertungen - hier insbesondere der Transaktion CATS_DA - zu Verfügung.
Komplizierter ist es da schon wenn man auf diese Felder in der Auswertung auch selektieren möchte. Auch hier hat SAP Vorkehrungen getroffen, allerdings sind diese sehr gut versteckt.
Zunächst einmal sollen die Felder auf dem Selektionsbild erscheinen. Der Report RCATS_DISPLAY_ACTIVITIES bietet hierzu zwei Includes an, die mit dem Modifikationsassistenten bearbeitet werden müssen:
Für CATS_DA werden die Felder im ersten Include definiert mit PARAMETERS oder SELECT-OPTIONS und erscheinen nach Aktivierung auch prompt auf dem Selektionsbild.
Wer nun den Report ausführt und erwartet dass die Selektionen nun auch übernommen werden wird allerdings enttäuscht. Die Eingabe ist zwar möglich, bewirkt aber rein gar nichts.

Um die Selektionsoptionen oder Parameter tatsächlich im Programm zu benutzen muss man sie über das BADI CATS_REPORTING und den Umweg der freien Selektionen einschleusen.
Zu diesem BADI gibt es eine Beispielimplementierung. Die Dokumentation verrät dass die Methode BEFORE_CATS_DATA_SELECTION implementiert werden muss und die Methoden  GET_SELECTION_VALUE und SET_FREE_SELECTIONS der Klasse CL_DBSEL_CATS verwendet werden können.

Doch der erste Blick auf die Methode ist ernüchternd. Weder gibt es Import- noch Exportparameter. Wie soll also die Klasse CL_DBSEL_CATS - als Interfacekomponente GR_DBSEL_CATS überhaupt angesprochen werden? Die Antwort ist über ein Alias in der BADI-Implementierung.
Nun kann es losgehen. Die Rückgabe der Methode gr_dbsel_cats->get_selection_value ist eine Selektionstabelle in der Form:

  TYPES:   BEGIN OF selt1,
          selname(8TYPE c,
          kind(1TYPE c,
          sign(1TYPE c,
          option(2TYPE c,
          low(45TYPE c,
          high(45TYPE c.
  TYPESEND OF selt1.


Diese Werte müssen nun in die Tabelle vom Typ RSDS_EXPR_TAB der tiefen Strukur RSDS_TEXPR geschrieben werden.
Sollen mehr als eine Bdingung übergeben werden dann ist zu beachten dass die erste Zeile der Tabelle die logische Verknüpfung und die Anzahl der Argumente enthalten muss, also etwa:
....
  LOOP AT t_sel INTO wa_sel WHERE high <> space OR low <> space ).
    MOVE-CORRESPONDING wa_sel TO wa_zexptab.
    MOVE wa_sel-selname TO wa_zexptab-fieldname.
    APPEND wa_zexptab TO zexptab.
  ENDLOOP.

  CLEAR wa_zexptab.
  DATAlinnum TYPE i.
  DESCRIBE TABLE zexptab LINES linnum.
  IF linnum > 1.
    MOVElinnum TO wa_zexptab-arity'AND' TO wa_zexptab-logop.
    INSERT wa_zexptab INTO zexptab INDEX 1.
  ENDIF.

...

ZEXPTAB = Tabelle vom Typ RSDS_EXPR_TAB, alle Bedingungen mit AND verknüpft.

Keine Kommentare:

Kommentar veröffentlichen