Um das Shared Objects Memory (SOM) zu nutzen benötigen wir zunächst eine Wurzelklasse. Diese Wurzelklasse beschreibt die Instanzobjekte, welche später im SOM abegelegt werden. Die Wurzelklasse muss Shared-Memory-fähig sein. Dazu muss in den Eigenschaften der Klasse das entsprechende Häkchen gesetzt werden. Diese Klasse kann weitere Referenzen auf andere Objekte halten, welche widerrum Shared-Memory-fähig sein muss.
Die Verwaltung der im SOM abgelegten Daten erfolgt über sogenannte Gebiete. Jedes Gebiet ist mit einer Wurzelklasse verknüpft. Gebiete werden über die Transaktion SHMA angelegt bzw. bearbeitet. Über das Gebiet werden verschiedene Einstellungen unter anderem zum Laufzeitverhalten des SOM Gebiets definiert. Beim Anlegen eines Gebiets wird automatisch eine Klasse mit dem Namen des Gebiets generiert, die sogenannte Gebietsklasse. Diese Klasse erbt von Klasse CL_SHM_AREA.
Zudem kann ein Gebiet eine Kunstruktorklasse besitzen, diese Klasse implementiert das Interface IF_SHM_BUILD_INSTANCE und dient u.a. zum Aufbau der Gebietsinstanzen. Außerdem kann diese Klasse dazu genutzt werden beim erstmaligen Aufruf alle benötigten Daten zu ermitteln und zu berechnen. Soll dies automatisch geschehen, muss in den Einstellungen zum Gebiet die Option „Automatischer Aufbau“ gesetzt sein.
Anlegen eines Gebiets
Transaktion SHMA, als Name des Gebiets wählen wir ZCL_SFLIGHT_AREA. Der Präfix ZCL ist empfehlenswert da im Hintergrund die Gebietsklasse mit selbigen Namen generiert wird.
Nach einem Klick auf „Anlegen“ müssen verschiedene Angaben zum Gebiet gemacht werden. Ein Pflichtfeld ist die Angabe der Wurzelklasse des Gebiets.
Anlegen der Wurzelklasse
Die Wurzelklasse kann per Vorwärtsnavigation angelegt werden. Dazu tragen wir den Namen der Klasse in das Feld Wurzelklasse im Bereich Grundeigenschaften ein.
Nach der Bestätigung unserer Eingabe mit „Enter“ werden wir gefragt, ob wir die Klasse anlegen wollen.
Nachdem die Klasse angelegt wurde, muss sie in den Eigenschaften als Shared-Memory-fähig markiert werden.
Zur Veranschaulichung implementieren wir 2 Methoden und definieren eine Attribut als Tabelle, welche die gelesenen Daten hält.
Methode SET_SFLIGHT
liest die Daten von der Datenbank und legt sie im Attribut OTO_SFLIGHT ab.
METHOD set_sflight. CLEAR oto_sflight[]. SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE me->oto_sflight[]. ENDMETHOD.
Methode GET_SFLIGHT_BY_ID
liefert zur ID der Fluglinie alle Einträge aus der Tabelle OTO_SFLIGHT.
METHOD get_sflight_by_id. FIELD-SYMBOLS: <line> TYPE sflight. CLEAR et_sflight[]. LOOP AT me->oto_sflight[] ASSIGNING <line> WHERE carrid EQ iv_carrid. APPEND <line> TO et_sflight[]. ENDLOOP. ENDMETHOD.
Nach dme Aktivieren der Klasse ZCL_SFLIGHT_AREA_ROOT kehren wir mit F3 zurück in die Transaktion SHMA. Dort werden wir nun aufgefordert die Konstruktorklasse anzulegen.
Anlegen der Konstruktorklasse
Da wir unter Grundeigenschaften die Option „Automatischer Aufbau“ aktiviert haben, müssen wir die Konstruktorklasse benennen. Als Namen geben wir ZCL_SFLIGHT_AREA_LOAD an und bestätigen mit „Enter“. Da hier kein Anlegen per Vorwärtsnavigation möglich ist, öffnen wir einen weiteren Modus und starten die Transaktion SE24 (bzw. SE80). Dort legen wir die Klasse ZCL_SFLIGHT_AREA_LOAD an und implementieren das Interface IF_SHM_BUILD_INSTANCE.
Die Methode BUILD muss implementiert werden.
METHOD if_shm_build_instance~build. DATA: lo_sflight_area TYPE REF TO zcl_sflight_area, lo_sflight_root TYPE REF TO zcl_sflight_area_root, lx_root_exception TYPE REF TO cx_root. TRY. lo_sflight_area = zcl_sflight_area=>attach_for_write( ). CREATE OBJECT lo_sflight_root AREA HANDLE lo_sflight_area. lo_sflight_area->set_root( lo_sflight_root ). lo_sflight_root->set_sflight( ). lo_sflight_area->detach_commit( ). CATCH cx_shm_error INTO lx_root_exception. RAISE EXCEPTION TYPE cx_shm_build_failed EXPORTING previous = lx_root_exception. ENDTRY. ENDMETHOD.
Beim Aktivieren der Klasse tritt der Fehler auf, dass die Gebietsklasse noch nicht vorhanden ist. Dies liegt daran, dass wir das Gebiet und somit die Gebietsklasse in Transaktion SHMA noch nicht gespeichert haben. Entweder wir wählen beim Aktivieren die Option „Dennoch Aktivieren“ oder wir speichern das Gebiet nachdem wir die Option „Automatischer Aufbau“ herausgenommen und das Feld Konstruktorklasse gelöscht haben. Danach können wir die Konstruktorklasse aktivieren. Nach der Aktivierung müssen wir dann die Option „Automatischer Aufbau“ wieder setzen und können nun die Konstruktorklasse im entsprechendne Feld hinterlegen.
Da wir die Option „Automatischer Aufbau“ gewählt haben müssen wir im Bereich Laufzeiteinstellung die Option Gebietsaufbau entweder auf „Autostart bei Leseanfrage“ oder „Autostart bei Leseanfrage und jeder Invalidierung“ setzen. Ich empfehle die letztere Option, damit ist gewährleistet, dass auch nach einer Invalidierung der Gebietsinstanz eine automatische Erzeugung aller Instanzen und Daten ausgelöst wird.
Aufruf des Shared Objects
Der Zugriff auf das Shared Objects Memory und speziell auf das angelegte Gebiet ZCL_SFLIGHT_AREA könnte wie folgt aussehen. Dazu legen wir ein kleines Testprogramm an.
*&---------------------------------------------------------------------* *& Report ZTEST_SFLIGHT_AREA *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ztest_sflight_area. DATA: lo_sflight_area TYPE REF TO zcl_sflight_area, lt_sflight TYPE sflight_tab1, ls_sflight TYPE sflight. TRY. lo_sflight_area = zcl_sflight_area=>attach_for_read( ). lo_sflight_area->root->get_sflight_by_id( EXPORTING iv_carrid = 'AA' IMPORTING et_sflight = lt_sflight ). lo_sflight_area->detach( ). CATCH cx_shm_attach_error. * should do something ENDTRY. CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING i_structure_name = 'SFLIGHT' TABLES t_outtab = lt_sflight EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF.
Weitere Informationen
Im SAP Community Network findet man einige nützliche Informationen und Tutorials wie das Shared Objects Memory genutzt werden kann.
Pingback: Shared Objects Memory als Datenpuffer (Teil 1) | Michael Korkisch - IT-Beratung