Vous avez 2 problèmes.
COBOL possède plusieurs structures de données numériques. Chacun a son propre ensemble de règles.
• Les composants numériques de la clause PIC doivent TOUJOURS correspondre à un numéro ODD. • Le marqueur décimal "V" détermine le placement de la virgule décimale. • Les fonctions MOVE et mathématique de l'élément maintiennent l'alignement de la valeur décimale - une troncature de niveau haut et bas est possible • La conversion de type de données numérique (zone décimale à & binaire en paquet) est gérée pour vous.
par exemple. S9 (5) V9 (2) COMP-3.
y compris les 2 positions décimales> longueur est calculée comme ROUND UP [(7 + 1)/2] = 4 octets
S9(6)V9(2) COMP-3.
y compris les deux positions décimales> longueur est calculée comme ROUND UP [(8 + 1)/2] = 5 octets
Le dernier ½ octet des champs COMP-3 est la représentation HEXIDECIMAL du signe.
Les valeurs du signe ½ octet sont C = signé positif D = signé négatif F = non signé (non COBOL).
S9 (6) V9 (3) VALEUR COMP-3 123,45. La longueur est calculée comme ROND UP [(9 + 1)/2] = 5 octets
Contient X'00 01 23 45 0C '
Notez l'alignement décimal & Rembourrage zéro.
Groupe MOVE Niveau règles
COBOL structures de terrain sont données définissent comme des structures hiérarchiques.
Le 01 HL champ de groupe - & un champ de niveau sous-groupe -
- est presque toujours une valeur de chaîne de caractères implicite
- Si un champ d'élément individuel est un niveau 01 ou 77 - il peut être numérique.
- Les champs d'élément individuels définis comme numériques sous un niveau de groupe ou de sous-groupe seront traités comme numériques s'ils sont référencés comme champ d'élément individuel.
- Des règles numériques s'appliquent. o Droit justifier o alignement décimale o tampon H-L (½ bytes) avec des zéros o conversion de type de données numériques
Le champ de réception d'un calcul de déplacement ou mathématique détermine si une conversion de données numériques se produise. Si vous déplacez ou effectuez un calcul mathématique en utilisant un type de champ d'envoi (groupe ou élément) dans un champ d'élément individuel de réception défini à l'aide d'une clause PIC numérique --- alors la conversion de données numériques se produira pour la réception champ. S0C7 s'annonce lorsque des données non numériques sont déplacées vers un champ numériquement défini OU lorsque des calculs mathématiques sont tentés en utilisant des données non numériques.
Non Conversion de données numériques Si vous déplacez un type de champ (groupe ou élément) vers un champ de niveau de groupe ou de sous-groupe, il n'y aura AUCUNE conversion de données numériques.
• Les règles MOVE de caractères s'appliquent.
• Gauche Justifier & pad avec des espaces.
Ceci est l'une des principales causes des données non numériques dans un champ défini numériquement. L'une des principales utilisations d'un MOVE de niveau groupe d'envoi contenant des champs d'éléments numériques à un niveau de groupe récepteur contenant des champs d'éléments numériques (mappés de manière identique) consiste à réinitialiser des champs d'éléments numériques en utilisant l'instruction 1 MOVE.
Un masque d'effacement ou une propagation de données MOVE est également possible pour les effacements de tables - où le niveau de groupe de tables est supérieur à 255 octets.
Homme, ça me ramène. Je me souviens quand nous voulions regarder le dernier octet des champs décimaux compressés, car un "04" signifiait que quelqu'un avait déplacé une valeur avec un espace EBCDIC. –
@David Thornley. Fermer ... L'espace EBCDIC est hexadécimal "40". Aujourd'hui, nous utilisons un test 'IF NUMERIC' sur des champs décimaux condensés pour vérifier ce genre de chose. Quelque chose qui confond beaucoup de programmeurs est que le 'MOVE' ne gonfle pas, mais n'importe quelle référence de calcul au champ après que cela finisse par donner une exception d'exception de données (SOC7 dans la terre d'IBM). La plupart des gens s'attendent à ce que le "MOVE" les fasse exploser. – NealB
Pas seulement à proximité: à l'époque, lorsque nous comptions des champs, le dernier octet faisait basculer les nœuds, de sorte qu'une chaîne se terminant par 404040 hexagone se terminait par une décimale condensée terminant 4404 hex. (Ce n'était pas réellement COBOL, mais l'IBM 360 a été spécifiquement conçu pour exécuter COBOL, ayant une seule instruction ASM qui a fait un MOVE formaté, donc je pense que mon expérience ASM est légèrement pertinente ici.) –