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_string są potrzebne, a lw_name_as_string zawiera nazwę typu jako ciąg znaków.
  • Jeśli typ nie został znaleziony, CX_SY_CREATE_DATA_ERROR zostanie wyjątek typu CX_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

  • obj mogą być tworzone przy użyciu un Rt ime T yp S sługi
  • ponieważ dref wciąż 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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow