ABAP
Programowanie dynamiczne
Szukaj…
Symbole pola
Symbole pól są odpowiednikami wskaźników ABAP, z tym wyjątkiem, że symbole pól są zawsze wyłuskiwane (nie można zmienić rzeczywistego adresu w pamięci).
Deklaracja
Aby zadeklarować symbol pola, należy użyć słowa kluczowego FIELD-SYMBOLS . Typy mogą być ogólne ( ANY [... TABLE] ) do obsługi szerokiej gamy zmiennych.
FIELD-SYMBOLS: <fs_line> TYPE any, "generic
<fs_struct> TYPE kna1. "non-generic
Przypisywanie
Symbole pola są unassigned w deklaracji, co oznacza, że nie wskazują na nic. Dostęp do nieprzypisanego symbolu pola spowoduje wyjątek, a jeśli go nie złapie, krótki zrzut. Dlatego stan należy sprawdzić za pomocą IS ASSIGNED :
IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.
Ponieważ są to tylko odniesienia, w środku nie można przechowywać żadnych rzeczywistych danych. Tak więc, zadeklarowana DATA jest potrzebna w każdym przypadku użycia.
DATA: w_name TYPE string VALUE `Max`,
w_index TYPE i VALUE 1.
FIELD-SYMBOLS <fs_name> TYPE any.
ASSIGN w_name TO <fs_name>. "<fs_name> now gets w_name
<fs_name> = 'Manni'. "Changes to <fs_name> now also affect w_name
* As <fs_name> is generic, it can also be used for numbers
ASSIGN w_index TO <fs_name>. "<fs_name> now refers to w_index.
ADD 1 TO <fs_name>. "w_index gets incremented by one
Cofnięcie przypisania
Czasami przydatne może być zresetowanie symbolu pola. Można to zrobić za pomocą UNASSIGN .
UNASSIGN <fs>.
* Access on <fs> now leads to an exception again
Użyj do wewnętrznych tabel
Symbole pól mogą być używane do modyfikowania wewnętrznych tabel.
LOOP AT itab INTO DATA(wa).
* Only modifies wa_line
wa-name1 = 'Max'.
ENDLOOP.
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
* Directly refers to a line of itab and modifies its values
<fs>-name1 = 'Max'.
ENDLOOP.
Uwaga! Symbole pól pozostają przypisane nawet po opuszczeniu pętli. Jeśli chcesz bezpiecznie ich ponownie użyć, natychmiast cofnij przypisanie.
Referencje danych
Istotnym dla odniesień danych jest dodanie REF TO po TYPE .
Dynamiczne tworzenie struktur
Jeśli o typie struktury decydować będzie środowisko wykonawcze, możemy zdefiniować naszą strukturę docelową jako odniesienie do data typu ogólnego.
DATA wa TYPE REF TO data.
Aby dać wa rodzajem używamy oświadczenie CREATE DATA . Dodatek TYPE można określić przez:
Odniesienie:
CREATE DATA wa TYPE kna1
- Kontrole statyczne są aktywne, więc nie można utworzyć nieznanego typu
Nazwa:
CREATE DATA wa TYPE (lw_name_as_string)
lw_name_as_stringsą potrzebne, alw_name_as_stringzawiera nazwę typu jako ciąg znaków.- Jeśli typ nie został znaleziony,
CX_SY_CREATE_DATA_ERRORzostanie wyjątek typuCX_SY_CREATE_DATA_ERROR
W przypadku instancji typów tworzonych dynamicznie można określić dodanie HANDLE . HANDLE odbiera obiekt, który dziedziczy po CL_ABAP_DATADESCR .
CREATE DATA dref TYPE HANDLE obj
objmogą być tworzone przy użyciu un Rt ime T yp S sługi- ponieważ
drefwciąż jest odwołaniem do danych, należy go wyrejestrować (->*), aby można go było używać jako kontenera danych (zwykle odbywa się to za pomocą symboli pól)
Usługi typu RunTime
Usługi typu RunTime (w skrócie: RTTS ) są używane do:
- tworzenie typów (RunTime Type Creation; short: RTTC )
- analizowanie typów (RunTime Type Identification; short: RTTI )
Klasy
CL_ABAP_TYPEDESCR
|
|--CL_ABAP_DATADESCR
| |
| |--CL_ABAP_ELEMDESCR
| |--CL_ABAP_REFDESCR
| |--CL_ABAP_COMPLEXDESCR
| |
| |--CL_ABAP_STRUCTDESCR
| |--CL_ABAP_TABLEDESCR
|
|--CL_ABAP_OBJECTDESCR
|
|--CL_ABAP_CLASSDESCR
|--CL_ABAP_INTFDESCR
CL_ABAP_TYPEDESCR jest klasą podstawową. Implementuje potrzebne metody opisywania:
-
DESCRIBE_BY_DATA -
DESCRIBE_BY_NAME -
DESCRIBE_BY_OBJECT_REF -
DESCRIBE_BY_DATA_REF