ABAP - BOPF Ermittlung
Wie sieht es mit abgeleiteten Daten aus die nicht auf der Datenbank stehen? Dieser Frage wollen wir im heutigen Artikel nachgehen.
Inhaltsverzeichnis
Mit der Datenermittlung kannst du zur Laufzeit beim Zugriff auf BOPF zusätzliche Daten lesen. Diese transiente Daten hatten wir bereits mit dem Datenmodell vorgestellt und möchten dir heute an einem Beispiel zeigen, wie die Daten einfach dazugelesen werden können.
Anlage der Ermittlung
Die Ermittlung wird auf dem jeweiligen Knoten angelegt, dazu muss wieder die Transaktion BOBX aufgerufen werden. Auf dem entsprechenden Knoten legst du nun eine Ermittlung an.
Dazu werden die einzelnen Felder befüllt, wobei der Name der Verarbeitungsklasse wieder über "Zusätze -> Repository-Namen vorschlagen" generiert werden kann. Als Kategorie wählst du Transient, da wir zusätzliche Daten zu diesem Knoten lesen wollen.
Im nächsten Schritt muss eingestellt werden, wann die Ermittlung durchlaufen werden soll. Für transiente Daten reicht in den meisten Fällen die Ermittlung beim "Laden".
Der Zeitpunkt ist hier direkt nach dem Laden der Daten aus der Datenbank, damit die Daten vollständig sind. Abhängigkeiten gibt es hierbei keine.
Implementierung
Die Implementierung der Logik erfolgt in einer eigenen Klasse die das Interface /BOBF/IF_FRW_DETERMINATION implementiert. In der Methode EXECUTE bekommt man alle selektierten Knoten übergeben, in diesem Fall nur die Tabelle mit Schlüsseln. Wie die Implementierung aussehen könnte, erfährst du im folgenden Code-Beispiel:
DATA:
lt_head TYPE ztest_t_contract.
io_read->retrieve(
EXPORTING
iv_node = is_ctx-node_key
it_key = it_key
iv_fill_data = abap_true
IMPORTING
et_data = lt_head
).
LOOP AT lt_head REFERENCE INTO DATA(lr_head).
SELECT SINGLE name1
FROM lfa1
WHERE lifnr = @lr_head->creditor
INTO @lr_head->creditor_name.
IF sy-subrc = 0.
io_modify->update(
EXPORTING
iv_node = is_ctx-node_key
iv_key = lr_head->key
iv_root_key = lr_head->root_key
is_data = lr_head
).
ENDIF.
ENDLOOP.
Über die Retrieve-Methode liest du zu den Schlüsseln noch die entsprechenden Daten, dazu wird der Kombi-Tabellentyp verwendet, der die Daten entgegen nimmt. Dann ein Loop über die Kopfdaten per Referenz, Lesen der Zusatzeigenschaften aus dem Stammsatz des Lieferanten und Aktualisierung der Daten mit der Update-Methode, wobei du die neuen Daten als Referenz übergibst. Durch den Loop per Referenz hast du dieses Problem bereits gelöst.
Test
Beim Lesen des Knotens werden nun automatisch zum richtigen Zeitpunkt auch die Daten nachgelesen und die Struktur angereichert. Dies kannst du am einfachsten über die Test-Transaktion BOBT probieren. Wenn du dir nun die Beispieldaten anschaust, wird das Feld CREDITOR_NAME nun befüllt.
Fazit
Nicht alle Daten müssen immer im Datenmodell auf den Tabellen persitiert werden. Mit dem gezeigten Beispiel bekommst du einen Einblick, wie leicht weitere abhängige Daten zu deinem Datenbestand geladen werden können. Du solltest bei der Implementierung darauf achten, dass die Datenermittlung bei jedem Lesezugriff aufgerufen wird, was die Einzelzugriffe langsamer machen kann.