2 votes

déclaration de mouvement cobol

Disons que j'ai une variable de niveau 02 dans cobybook (testcopy).

02 level-1-var
   05 var-1
   05 var-2
   05 var-3
   05 var-4

J'utilise ce cahier deux fois dans mon programme.

01  usage-1.
    copy testcopy.

01  usage-2.
    copy testcopy.

Je veux maintenant déménager seulement 2 niveau 05 varibale de l'usage-1 à l'usage-2. Y a t-il un moyen d'éviter 2 move statements ?

et utiliser quelque chose comme

 MOVE (var-2, var-3) of usage-1   TO 
 (var-2, var-3) of usage-2

Je suis nouveau en Cobol et je me demandais si cela pouvait être fait cela peut économiser beaucoup d'instructions move dans mon programme (améliorer les performances).

5voto

paxdiablo Points 341644

Non, pas dans le COBOL standard, bien que certaines implémentations puissent avoir des extensions pour ce genre de choses. Si la concision du code est l'une de vos exigences, je n'aurais probablement pas choisi le COBOL comme langage idéal :-)

Vous devrez probablement le faire en deux fois :

move var-2 of usage-1 to var-2 of usage-2.
move var-3 of usage-1 to var-3 of usage-2.

Si vous êtes prêt à modifier quelque peu votre cahier des charges, quelque chose comme (a) :

02  level-1-var
    05  var-1
    05  var-2-and-3
        09  var-2
        09  var-3
    05  var-4

vous trouverez peut-être que vous pouvez le faire avec :

move var-2-and-3 of usage-1 to var-2-and-3 of usage-2.

(a) Évidemment, je n'ai fait que refléter ce que vous aviez dans la question. Vous aurez certainement besoin de pic sur ces données (et probablement d'autres clauses . caractères).

2voto

zarchasmpgmr Points 1250

Ce type d'exigence trouve une réponse directe dans le verbe MOVE CORRESPONDING. MOVE CORRESPONDING prend les niveaux de groupe pour ses opérandes et déplace les éléments élémentaires de même nom de l'un à l'autre, avec plusieurs restrictions, dont les classes de données similaires (c'est-à-dire pas de mélange alphanumérique et numérique). Le Fine Manual de votre implémentation contient toutes les restrictions.

Si je me souviens bien, la fonction MOVE CORRESPONDING est également facultative, de sorte que certains compilateurs peuvent ne pas la prendre en charge.

MOVE CORRESPONDING et votre demande est l'une de ces choses qui déclenchent de fortes opinions dans le monde COBOL. Certains disent que vous devriez utiliser COPY REPLACING pour générer des noms de données uniques et coder tous les MOVEs. D'autres disent que ce que vous faites est très bien. Pour ma part, je pense que "cela dépend". S'il s'agit d'un programme très simple, je peux opter pour le MOVE CORRESPONDING, mais s'il y a une logique commerciale importante, je préfère tout coder.

0voto

Bill Woodger Points 4469

La meilleure solution consiste à créer un livre de copie qui permette d'avoir un "préfixe" pour chaque champ, puis d'utiliser REPLACING pour fournir des préfixes différents pour les différentes instructions COPY. Vous n'aurez alors pas à coder OF/IN pour tous les champs, et le programme et le listing seront plus clairs.

La méthode de Paxdiablo est la plus efficace pour faire ce que vous voulez, même si la raison pour laquelle vous voulez le faire aurait été intéressante.

Je suis surpris que personne n'ait mentionné la "modification de la référence" :

MOVE usage-1 ( 3 : 5 ) TO usage-2 ( 3 : 5)

Où 3 est la position de départ dans les données et 5 la longueur. Je préfère de loin la définition de Paxdiablo à celle-ci.

Il n'est pas si surprenant que personne n'ait proposé de RENAMES.

   01  A-TABLE. 
       05  A-T-1 PIC XX. 
       05  A-T-2 PIC X. 
       05  A-T-3 PIC 9. 
       05  A-T-4 PIC XXX. 
       05  A-T-5 PIC X(4). 
       66 A-TABLE-EXTRA RENAMES A-T-2 THRU A-T-3. 
   01  B-TABLE. 
       05  B-T-1 PIC XX. 
       05  B-T-2 PIC X. 
       05  B-T-3 PIC 9. 
       05  B-T-4 PIC XXX. 
       05  B-T-5 PIC X(4). 
       66 B-TABLE-EXTRA RENAMES B-T-2 THRU B-T-3. 

       MOVE A-TABLE-EXTRA TO B-TABLE-EXTRA

Comme le MOVE CORRESPONDING, il est à éviter (pour les mêmes raisons que mon commentaire, et en plus personne n'utilise les Level 66, donc personne ne sait ce qu'ils font).

Une autre solution consiste à redéfinir chacun de vos niveaux 01, mais pourquoi se donner cette peine ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X