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.










