2010-06-02 13 views
5

Parfois ABAP me rend fou des tâches très simples telles que incrémenter un entier dans une boucle ...Incrémenter un entier

Voici mon essai:

METHOD test. 

    DATA lv_id TYPE integer. 

    lv_id = 1. 

    LOOP AT x ASSIGNING <y>. 
    lv_id = lv_id+1. 
    ENDLOOP. 

ENDMETHOD. 

Il en résulte dans le message d'erreur Type de champ "I" ne permet pas l'accès au sous-champ.

Répondre

12

Vous voulez dire comme:

ADD 1 to lv_id. 

Soit dit en passant, quand vous en boucle sur une interne SY-TABIX a le compteur de boucle.

+0

Merci, très utile! – Ben

+0

Méfiez-vous des boucles dans les boucles. Oh, et si vous êtes en boucle avec un 'DO..TIMES x', alors le compteur de boucle sera' SY-INDEX'. Oui, ABAP est un langage terriblement incohérent. – Marius

+0

SY-TABIX ne contient pas le compteur de boucles, il contient l'index de la table. Ce sont souvent des valeurs différentes. Par exemple, si j'écris 'messages LOOP AT dans msg WHERE type = 'E', la première fois que la boucle s'exécute peut être sur la quatrième ligne, et la valeur de sy-tabix sera 4. – Eric

5

Euh, j'ai compris. Il est le f ****** espaces ...

lv_id = lv_id + 1 

œuvres ...

+0

... mais s'il y a un moyen plus élégant, je serais intéressé;) – Ben

17

Vous avez déjà répondu à la question vous-même, mais pour faire des choses un peu plus clair:

variable + 1 

est une expression arithmétique - ajouter 1 à la valeur de la variable.

variable+1 

est une opération de décalage sur une variable de caractère. Par exemple, si la variable contient ABC, variable+1 est BC.

Cela peut être particulièrement déroutant en cas de NUMC. Par exemple, avec variable = '4711', variable + 1 est évalué à 4712, tandis que variable+1 est '711' (une séquence de caractères).

L'erreur que vous avez détectée s'est produite car il n'est pas possible d'effectuer l'opération d'index sur une variable sans caractère.

+0

Merci pour le explication Je suis sûr que je ne fais pas cette erreur encore une fois;) – Ben

1

Simple

DONNÉES: type I gv_inc.

lieu cette déclaration dans la boucle

gv_inc = gv_inc + 1.

0

Si vous comptez incrémenter chaque cycle de boucle, vous obtiendrez directement la taille de la table.

describe table x lines data(lv_id). "Out side of the loop.