Recherche…


Symboles sur le terrain

Les symboles de champ sont équivalents aux pointeurs, sauf que les symboles de champ sont toujours déréférencés (il n'est pas possible de changer l'adresse en mémoire).

Déclaration

Pour déclarer un champ-symbole, le mot FIELD-SYMBOLS clé FIELD-SYMBOLS doit être utilisé. Les types peuvent être génériques ( ANY [... TABLE] ) pour traiter une grande variété de variables.

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

Attribuer

Les symboles de champ ne sont pas unassigned lors de la déclaration, ce qui signifie qu'ils ne pointent vers rien. L'accès à un symbole de champ non attribué entraînera une exception et, s'il n'est pas capturé, un vidage rapide. Par conséquent, l'état doit être vérifié avec IS ASSIGNED :

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

Comme ce ne sont que des références, aucune donnée réelle ne peut être stockée à l'intérieur. Ainsi, les DATA déclarées sont nécessaires dans tous les cas d'utilisation.

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

Désassigner

Parfois, il peut être utile de réinitialiser un symbole de champ. Cela peut être fait en utilisant UNASSIGN .

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

Utiliser pour les tables internes

Les symboles de champ peuvent être utilisés pour modifier des tables internes.

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.

Attention! Les symboles de champ restent assignés même après avoir quitté la boucle. Si vous souhaitez les réutiliser en toute sécurité, désélectionnez-les immédiatement.

Références de données

L'essentiel pour les références de données est l'ajout de REF TO après TYPE .

Création dynamique de structures

Si le type d'une structure doit être décidé lors de l'exécution, nous pouvons définir notre structure cible comme référence aux data type génériques.

DATA wa TYPE REF TO data.

Pour donner un type wa nous utilisons l'instruction CREATE DATA . L'addition TYPE peut être spécifiée par:

Référence:

CREATE DATA wa TYPE kna1

  • Les contrôles statiques sont actifs, il est donc impossible de créer un type inconnu

Prénom:

CREATE DATA wa TYPE (lw_name_as_string)

  • Les parenthèses sont nécessaires et lw_name_as_string contient le nom des types sous forme de chaîne.
  • Si le type n'a pas été trouvé, une exception de type CX_SY_CREATE_DATA_ERROR sera lancée

Pour l'instanciation de types créés dynamiquement, l'ajout HANDLE peut être spécifié. HANDLE reçoit un objet qui hérite de CL_ABAP_DATADESCR .

CREATE DATA dref TYPE HANDLE obj

  • obj peut être créée en utilisant un R T ime T ype S ervices
  • comme dref est toujours un datareference, il doit être déréférencé ( ->* ) pour être utilisé comme conteneur de données (normalement via les symboles de champ)

RunTime Type Services

RunTime Type Services ( short: RTTS ) sont utilisés pour:

  • créer des types (RunTime Type Creation; short: RTTC )
  • analyse des types (RunTime Type Identification; short: RTTI )

Des classes

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 est la classe de base. Il implémente les méthodes nécessaires pour décrire:

  • 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow