Sök…


Fält Symboler

Fältsymboler är ABAP: s likvärdiga med pekare, förutom att fältsymboler alltid avbryts (det går inte att ändra den faktiska adressen i minnet).

Deklaration

För att deklarera en FIELD-SYMBOLS måste nyckelordet FIELD-SYMBOLS användas. Typer kan vara generiska ( ANY [... TABLE] ) för att hantera en mängd olika variabler.

FIELD-SYMBOLS: <fs_line>     TYPE any,    "generic
               <fs_struct>   TYPE kna1.   "non-generic

tilldela

Fältsymboler unassigned vid deklarationen, vilket betyder att de pekar på ingenting. Att komma åt en otilldelad fältsymbol kommer att leda till ett undantag, och, om inte fångat, till en kort dumpning. Därför bör staten kontrolleras med IS ASSIGNED :

IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.

Eftersom de bara är referenser, kan inga verkliga data lagras inuti. Så deklarerade DATA behövs i alla fall av användning.

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

Unassigning

Ibland kan det vara användbart att återställa en fältsymbol. Detta kan göras med UNASSIGN .

UNASSIGN <fs>.
* Access on <fs> now leads to an exception again

Används för interna tabeller

Fältsymboler kan användas för att modifiera interna tabeller.

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.

Uppmärksamhet! Fält-symboler förblir tilldelade även efter att ha lämnat slingan. Om du vill återanvända dem på ett säkert sätt, tilldela dem omedelbart.

Data referenser

Väsentlig för datahänvisningar är tillägget REF TO efter TYPE .

Dynamisk skapande av strukturer

Om typ av struktur bör avgöras på runtime, kan vi definiera vår målstruktur som referens till generisk typ data .

DATA wa TYPE REF TO data.

För att ge wa en typ använder vi uttalandet CREATE DATA . TYPE kan specificeras av:

Referens:

CREATE DATA wa TYPE kna1

  • Statiska kontroller är aktiva så det är inte möjligt att skapa en okänd typ

Namn:

CREATE DATA wa TYPE (lw_name_as_string)

  • Parenteserna behövs och lw_name_as_string innehåller lw_name_as_string namn som sträng.
  • Om typen inte hittades kommer ett undantag från typen CX_SY_CREATE_DATA_ERROR att kastas

För inställning av dynamiskt skapade typer kan HANDLE tillägget specificeras. HANDLE tar emot ett objekt som ärver från CL_ABAP_DATADESCR .

CREATE DATA dref TYPE HANDLE obj

  • obj kan skapas med R un T ime T ype S ervices
  • Eftersom dref fortfarande är en datareferens, måste den förflyttas ( ->* ) för att användas som datakontainer (normalt görs via fältsymboler)

RunTime Type Services

RunTime Type Services ( kort: RTTS ) används antingen för:

  • skapa typer (RunTime Type Creation; kort: RTTC )
  • analys av typer (RunTime Type Identification; kort: RTTI )

Klasser

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 är basklassen. Den implementerar de metoder som behövs för att beskriva:

  • 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow