Newsletter            Wir rufen zurück            Impressum

Decoupled Infotype Framework – Infotypen lesen und schreiben (Teil 2)

Im zweiten Teil der Blog Serie geben wir einige Beispiele, wie Infotypoperationen über das Decoupled Infotype Framework durchgeführt werden.

Infotypen lesen

Fangen wir mit dem einfachsten Fall an: Infotypen lesen. Alles was man hierzu benötigt, ist eine Klasse, die das Interface IF_HRPA_READ_INFOTYPE implementiert. Eine passende Instanz hierzu kann über die folgende Factory-Methode erzeugt werden:

DATA: lr_infty_reader TYPE REF TO if_hrpa_read_infotype.
 CALL METHOD cl_hrpa_read_infotype=>get_instance
     IMPORTING
     infotype_reader   =  lr_infty_reader.

Schaut man sich die Methoden des Interfaces an, sieht der Lesezugriff sehr simpel aus. Nutzen wir die Methode ~READ:


Auch die Methodenparameter sind einfach zu befüllen.

Als IMPORT müssen im Wesentlichen nur die Infotypschlüsselfelder bereitgestellt werden. Das Ergebnis erhält man in der Tabelle INFOTYPE_TAB. Ein Beispiel hierzu kann wie folgt aussehen.

DATA: lt_prelp        TYPE        hrpad_prelp_tab.

CALL METHOD lr_infty_reader->read
  EXPORTING
    tclas          = 'A'
    pernr          = '1020'
    infty          = '0002'
    begda          = sy-datum
    endda          = sy-datum
    no_auth_check  = SPACE
   IMPORTING
   infotype_tab   = lt_prelp.

Schaut man sich die Ergebnisse des Aufrufs im Debugger an, erkannt man die Infotypschlüsselfelder sowie einige Spalten mit den Infotypdaten im Rohformat.

Man ist also mit dem Lesen fast fertig. Die PRELP Struktur überführt die Infotypdaten in ein generisches Format. Dieses muss man nun in die infotypspezifische Struktur P0002 überführen (casting). Klasse CL_HR_PNNNN_TYPE_CAST stellt diese Funktionalität mittels einer statischen Methode bereit.

Für das Beispielprogramm fügen wir das folgende Coding hinzu:

CAll METHOD cl_hr_pnnnn_type_cast=>prelp_to_pnnnn_tab
  EXPORTING
   prelp_tab = lt_prelp
 IMPORTING
   pnnnn_tab = lt_p0002.

Das Ergebnis sieht nun so aus, wie man dies von einer Leseoperation erwartet.

Infotypen schreiben

Infotypen zu schreiben ist etwas komplexer als das Lesen. Um Daten zu ändern, führt man zwei Schritte durch:

  • Zunächst werden die Updates auf einen temporären Container durchgeführt. Diesen kann man sich wie eine Arbeitskopie der Infotypen vorstellen.
  • Die Updates erfolgen also nicht direkt auf der Datenbank. Erst nach einem ausdrücklichen Commit werden die Containeroperationen verbucht.

Dieser Ansatz dient der Konsistenz der Daten. Wenn eine Operation auf dem Container wegen bspw. fehlgeschlagener Plausibilitätsprüfung oder fehlender Berechtigung scheitert, findet man keine korrupten Daten im System vor. Man muss sich also nicht selbst um einen Rollback kümmern und kann sich darauf verlassen, dass das DCIF die Problembehandlung durchführt.

Wir erweitern unser Beispielprogram derart, dass wir einige Dummydaten vorhalten, die wir verändern wollen. Dazu erweitern wir das obige Beispiel zum Lesen von Daten. Als erstes sperren wir die Personalnummer:

DATA:  l_ok                      TYPE         xfeld,
        lw_p0002                LIKE LINE OF lt_p0002,
         lr_message_handler  TYPE REF TO  cl_hrpa_message_list.

READ TABLE lt_p0002 INTO lw_p0002 INDEX 1.
 lw_p0002-vorna = 'DCIF was here'.
 CREATE OBJECT lr_message_handler.
CALL METHOD cl_hrpa_masterdata_enq_deq=>enqueue_by_pernr
     EXPORTING
     tclas            =  'A'
     pernr            =  lw_p0002-pernr
     message_handler  =  lr_message_handler
     IMPORTING
     is_ok            =  l_ok.

Im nächsten Schritt erzeugen wir eine Containerinstanz. Dies sieht auf den ersten Blick kryptisch aus, da mit einigen Typcasts gearbeitet wird. Wir benötigen zunächste eine Klasse, die Zugang zu den Infotypen gibt (IF_HRPA_MASTERDATA_BL), dann einen Container (IF_HRPA_INFOTY_CONTAINER) und zuletzt auch einen Message Handler für das Logging (IF_HRPA_MESSAGE_HANDLER).

DATA: lr_masterdata_bl TYPE REF TO  if_hrpa_masterdata_bl,
       lr_container        TYPE REF TO  if_hrpa_infty_container.

IF l_ok IS NOT INITIAL.

CALL METHOD cl_hrpa_masterdata_factory=>get_business_logic
IMPORTING
business_logic = lr_masterdata_bl.

CALL METHOD lr_masterdata_bl->get_infty_container
EXPORTING
tclas           = ‚A‘
pskey           = lw_p0002-pskey
no_auth_check   = space
message_handler = lr_message_handler
IMPORTING
container       = lr_container
is_ok           = l_ok.

Der Container allein erlaubt jedoch keine Operation. Hierzu muss man diesen in IF_HRPA_INFTY_CONTAINER_DATA „down-casten“. In dieser Klassenbeschreibung findet man auch die geeigneten Methoden zum Schreiben.

DATA: lr_container_data   TYPE REF TO  if_hrpa_infty_container_data.
 
    IF l_ok IS NOT INITIAL.      
 
      lr_container_data ?= lr_container.

Nun kann man einfach die neue Version des P0002 Satzes übergeben:

lr_container ?= lr_container_data->modify_primary_record( lw_p0002 ).

Hiervon könnten nurn verschiedene Operationen wiederholt werden, um komplexe Geschäftslogik abzubilden. Für unser Beispiel soll dies aber genügen. Die Operation muss nun noch verbucht sowie die Personalnummer wieder freigegeben werden:

CALL METHOD lr_masterdata_bl->insert
          EXPORTING
          no_auth_check   = space
          message_handler = lr_message_handler
          IMPORTING
          is_ok           = l_ok
     CHANGING
         container       = lr_container.

IF l_ok IS NOT INITIAL.

CALL METHOD lr_masterdata_bl->flush
EXPORTING
no_commit = space.
ELSE.
“ Evaluate messages
ENDIF.
ELSE.
“ Evaluate messages
ENDIF.

CALL METHOD cl_hrpa_masterdata_enq_deq=>dequeue_by_pernr
EXPORTING
tclas = ‚A‘
pernr = lw_p0002-pernr.

ENDIF.

Schaut man sich die Personalnummer an, war die Änderung produktiv wirksam.

Aber nicht nur das Feld VORNA wurde angepasst, verschiedene Felder wurden automatisch von der IT2 Logik mit angepasst. Zum Beispiel findet man den aufbereiteten Namen entsprechend aktualisert sowie den letzten Änderer und das Datum.

Zum guten Stil gehört es, Meldungen, die während der Infotypverarbeitung erzeugt werden, zu prozessieren. Hierzu kann man die Nachrichten des Message Handlers auswerten. Die Instanz wird mit allen Meldungen gefüllt, die von der Infotyplogik erzeugt werden.

Zusammenfassung

Wie man sieht, erlaubt die API einen guten Weg, Infotypen zu lesen und zu schreiben. Dies umfasst Berechtigungsprüfung, Datenpuffer oder Plausibilitätsprüfungen. In einem Implementierungsprojekt kann es sinnvoll sein, die obigen Funktionen weiter zu schachteln. Ergebnis sollte sein, dass man eine Methode im Stil von READ und WRITE nutzt. Hierdurch reduzieren sich die Lines of Code erheblich. Im Ergebnis kann das dann wie folgt aussehen.

DATA: lr_pa_assist TYPE REF TO zcl_hr_pa_assist,
        lf_ok        TYPE        xfeld.
 
  CREATE OBJECT lr_pa_assist.
 
  CALL METHOD lr_pa_assist->read_infotype
      EXPORTING
      i_infty         = '0002'
      i_subty         = '*'
      i_pernr         = '1020'
      i_begda         = sy-datum
      i_endda         = sy-datum
    CHANGING
      ct_pnnnn        = lt_p0002.
 
  READ TABLE lt_p0002 INTO lw_p0002 INDEX 1.
  lw_p0002-vorna = 'DCIF was here.'.
 
  CALL METHOD lr_pa_assist->write_infotype
      EXPORTING
      iw_pskey         = lw_p0002-pskey
      iw_pnnnn         = lw_p0002
    IMPORTING
      e_return         = lf_ok.