Ricerca…


Field-Simboli

I simboli di campo sono equivalenti ai puntatori di ABAP, ad eccezione del fatto che i simboli di campo sono sempre dereferenziati (non è possibile modificare l'indirizzo reale in memoria).

Dichiarazione

Per dichiarare un campo-simbolo è necessario utilizzare la parola chiave FIELD-SYMBOLS . I tipi possono essere generici ( ANY [... TABLE] ) per gestire un'ampia varietà di variabili.

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

Assegnazione

I simboli di campo unassigned sono unassigned alla dichiarazione, il che significa che non indicano nulla. L'accesso a un campo-simbolo non assegnato causerà un'eccezione e, se non eseguito, a un breve dump. Pertanto, lo stato dovrebbe essere controllato con IS ASSIGNED :

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

Poiché sono solo riferimenti, non è possibile memorizzare dati reali all'interno. Quindi, dichiarato DATA è necessario in ogni caso di utilizzo.

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

Annullamento dell'assegnazione

A volte potrebbe essere utile resettare un Field-Symbol. Questo può essere fatto usando UNASSIGN .

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

Utilizzare per tabelle interne

I simboli di campo possono essere usati per modificare tabelle interne.

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.

Attenzione! I simboli di campo rimangono assegnati anche dopo aver lasciato il ciclo. Se vuoi riutilizzarli in sicurezza, annullali immediatamente.

Riferimenti di dati

Essenziale per i riferimenti dati è l'aggiunta REF TO dopo il TYPE .

Creazione dinamica di strutture

Se il tipo di una struttura deve essere deciso in runtime, possiamo definire la nostra struttura di destinazione come riferimento ai data tipo generico.

DATA wa TYPE REF TO data.

Per dare wa un tipo che usiamo la dichiarazione CREATE DATA . Il TYPE aggiunta può essere specificato da:

Riferimento:

CREATE DATA wa TYPE kna1

  • I controlli statici sono attivi quindi non è possibile creare un tipo sconosciuto

Nome:

CREATE DATA wa TYPE (lw_name_as_string)

  • Le parentesi sono necessarie e lw_name_as_string contiene il nome dei tipi come stringa.
  • Se il tipo non è stato trovato, verrà generata un'eccezione di tipo CX_SY_CREATE_DATA_ERROR

Per l'istanziazione di tipi creati dinamicamente è possibile specificare l'aggiunta di HANDLE . HANDLE riceve un oggetto che eredita da CL_ABAP_DATADESCR .

CREATE DATA dref TYPE HANDLE obj

  • obj possono essere creati utilizzando la R UN T empo T ipo S ervizi
  • perché dref è ancora un datareference, deve essere dereferenziato ( ->* ) per essere usato come datacontainer (normalmente fatto tramite Field-Symbols)

Servizi di tipo RunTime

RunTime Type Services ( abbreviazione: RTTS ) sono utilizzati per:

  • creazione di tipi (Creazione di tipo RunTime; corto: RTTC )
  • tipi di analisi (RunTime Type Identification; short: RTTI )

Classi

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 è la classe base. Implementa i metodi necessari per descrivere:

  • 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow