ABAP - BOPF Abfragen
Nach Anlage der Testdaten hatten wir kleinere Schwierigkeiten beim Lesen der Daten. Heute zeigen wir dir die Lösung des Problems.
Inhaltsverzeichnis
In diesem Artikel beschäftigen wir uns mit der Frage, wie wir die Daten einfach abfragen können. Denn wir wir bereits im letzten Artikel festgestellt haben, gibt es nur einfache Zugriffe über den Schlüssel, doch dieser muss auch erst einmal ermittelt werden.
Abfragen
Dafür gibt es Abfragen, die wir Anlegen und Verwenden können. Die Definition einer Abfrage erfolgt in der Transaktion BOBX, wo wir auch das Modell anlegen. Mit einem Rechts-Klick auf Abfragen, können wir eine neue Abfrage definieren.
Ohne viel Aufwand können wir zwei Grundabfragen anlegen, die das System bereits vorsieht. SELECT_ALL ermittelt alle Schlüssel aus dem BOPF und gibt diese ohne Einschränkungen zurück. SELECT_BY_ELEMENT übernimmt die Selektionskriterien und schränkt die Menge der Schlüssel ein. Dafür verlangt diese Abfrage eine Struktur oder ein Feld nach dem gefiltert wird.
Aus Erfahrung können wir dir sagen, dass die Hinterlegung der Tabelle der beste Weg ist. Es fehlen zwar die transienten Felder aus den Daten, doch es können auch die Schlüssel für PARENT abgefragt werden, wenn man zum Beispiel über eine untere Entität in die Suche einsteigt.
BOBT
Nach Definition und Aktivierung im Modell, stehen nun auch in der Testumgebung die beiden neuen Abfragen zur Verfügung. Diese können nun für die Selektion herangezogen werden. Möchte man einfach alle Elemente aus den Tabellen lesen, reicht die Abfrage SELECT_ALL.
Wenn du über die Elemente einschränken möchtest, bekommst du wieder ein Popup zur Verfügung gestellt. Dieses mal sind alle Felder aus der Struktur zur Eingabe verfügbar, was dir die Eingrenzung der Daten erleichtern sollte. Nun kannst du auch über den Kreditor einschränken.
Technische Abfrage
Sicherlich fragst du dich, wie man die Abfrage auch technisch durchführen kannst? In diesem Abschnitt zeigen wir dir ein Codebeispiel, wie du das Beispiel oben umsetzen kannst.
Im ersten Schritt benötigst du eine Instanz des Service-Managers, um eine Aktion im BOPF durchführen zu können. Dann befüllst du die Selektionstabelle mit den Einschränkungen und übergibst im letzten Schritt alles an die QUERY Methode des Service-Managers. Du bekommst ein Nachrichtenobjekt zurück, dass du noch auf Fehler prüfen solltest, ebenso die Schlüsseltabelle ob Einträge enthalten sind. Da du nur die Schlüssel erhalten hast, müsst du noch über die RETRIEVE Methode die Daten anfordern.
DATA:
lt_sel TYPE /bobf/t_frw_query_selparam,
lt_data TYPE ztest_t_contract.
" Service Manager Instanz
DATA(lo_smgr) = /bobf/cl_tra_serv_mgr_factory=>get_service_manager( zif_tst_bopf_c=>sc_bo_key ).
" Selektion befüllen
APPEND VALUE #(
attribute_name = zif_tst_bopf_c=>sc_node_attribute-contract-creditor
sign = 'I'
option = 'EQ'
low = '0000123456'
) TO lt_sel.
" Lesen des Schlüssels
lo_smgr->query(
EXPORTING
iv_query_key = zif_tst_bopf_c=>sc_query-contract-select_by_elements
it_selection_parameters = lt_sel
IMPORTING
eo_message = DATA(lo_msg_query)
et_key = DATA(lt_key)
).
" Prüfung der Fehler
IF lo_msg_query->check( ) = abap_true OR lt_key IS INITIAL.
RETURN.
ENDIF.
" Lesen der Daten
lo_smgr->retrieve(
EXPORTING
iv_node_key = zif_tst_bopf_c=>sc_node-contract
it_key = lt_key
IMPORTING
eo_message = DATA(lo_msg)
et_data = lt_data
).
Hinweis: Wie dir sicherlich aufgefallen ist, verwenden wir das Konstanten-Interface des BOPF Modells für die Erzeugung des Service-Managers, aber auch bei den Zugriffen. An diesen Stellen niemals die Werte als Literale hinterlegen, da diese sich beim Neugenerieren des Interfaces ändern könnten.
Fazit
Mit Hilfe der Abfragen kannst du nun gezielt an die Daten gelangen und die Rückgabemengen einschränken. Ab hier ist das Datenmodell bereits für Auswertungen einsetzbar. Du siehst, dass mit den Standard Abfragen bereits viel möglich ist und du nicht immer eigene Einschränkungen benötigst.