web-dev-qa-db-fra.com

Supprimer la ligne actuelle d'une table interne dans une boucle

Puis-je supprimer en toute sécurité la ligne active lors du bouclage sur une table interne?

À titre d'exemple, considérons ce code:

LOOP AT lt_itab INTO ls_wa.
    IF [...] . " A check that can't be done inside a 'DELETE lt_itab WHERE'
        DELETE lt_itab INDEX sy-tabix
        " OR
        DELETE lt_itab FROM ls_wa.
    ENDIF.
ENDLOOP.

Est-il sûr de supprimer des enregistrements comme celui-ci ou cette logique ne se comportera-t-elle pas comme prévu?

Dois-je plutôt stocker l'identifiant unique des lignes dans un itab temporaire et exécuter un DELETE lt_itab WHERE après la boucle?

Je suppose que les opérations de suppression sur des enregistrements autres que celui qui est chargé dans l'itération actuelle entraîneront certainement des problèmes, mais je ne suis pas sûr que ce soit une bonne pratique, et encore moins une bonne pratique.

15
Lilienthal

Qu'il soit sûr ou non dépend en grande partie de vos compétences en codage. Il a un résultat défini, et c'est à vous d'utiliser correctement les commandes. Il est généralement sûr que rien d'autre ne se produise après l'instruction DELETE dans la boucle. Vous pouvez émettre une instruction CONTINUE juste après la suppression pour vous assurer que c'est le cas.

Ne pas utiliser DELETE lt_itab INDEX sy-tabix. Si vous utilisez une déclaration dans votre chèque qui change sy-tabix comme effet secondaire (par exemple, en recherchant une entrée dans une table de contrôle - ou en appelant un module/méthode de fonction qui le fait), vous finirez par supprimer les mauvaises lignes.

Sachez que vous pouvez simplement utiliser l'instruction DELETE lt_itab. dans votre exemple car la ligne à supprimer est la ligne courante.

Si votre table peut avoir plusieurs lignes identiques, votre deuxième variante DELETE lt_itab FROM ls_wa. les supprimera tous, pas seulement l'actuel - si cela est prévu dépend de vos besoins.


EDIT: Pour réitérer le "résultat défini": La ligne courante est supprimée. Il n'y a pas de "continuer avec la ligne suivante" - avec l'ajout INTO var vous en fait copié toute la ligne dans votre variable. Cette variable ne sera pas touchée, elle est juste désynchronisée avec la table. Cela peut être intentionnel - le système n'a aucun moyen de le savoir. Si vous utilisez un symbole de champ à la place, ce sera UNASSIGNED, ce qui - encore une fois - pourrait être ce que vous vouliez - et puis peut-être pas.

19
vwegert