Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Cobol
Cobol Forum d'entraide sur la programmation en langage Cobol
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/10/2011, 19h58   #1
Membre du Club
 
Inscription : juillet 2004
Messages : 106
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 106
Points : 44
Points : 44
Par défaut Conversion d'un PIC X(variable) dans un PIC S9(variable) via un MOVE type position VAR-CIBLE[position:lgr]

Bonjour,

Objectif:

Je cherche à savoir
  • si nativement le langage COBOL propose une conversion PIC X -> PIC S9 COMPé avec le choix de la longueur de la variable cible
  • ou alors si vous avez une technique?


Pourquoi?

Exemple: j'ai une variable source alphanumérique PIX X(10) nommé
J'ai une variable cible CCCCCC de 100 caractères (cette zone mémoire est défini par une Clause Copy)

Code :
1
2
3
4
5
CCCCCCC.
   CCCCCCC-BLABLA1                       PIC X(30)
   CCCCCCC-BLABLA2                       PIC X(15)
   CCCCCCC-MAZONECIBLE               PIC S9(10)
   CCCCCCC-AUTREBLABLA                PIC X(38)
Je désire convertir le XXXXXX en PIC S9(10). Cette valeur je veux pouvoir la mouvementer dans le CCCCCC en position 56 sur une longueur de 6:
  • sans utiliser le champ de la clause copy
  • sans passer par une variable intermédiaire W-TEMP au format exacte de la cible, soit un PIC S9(10).


J'ai besoin de quelque chose qui s'applique à toutes les longueurs possibles. J'ai pas envi d'avoir en WORKING un tableau avec

Code :
1
2
3
4
5
W-TEMP-PICS9-10   PIC S9(10)
W-TEMP-PICS9-11   PIC S9(11)
W-TEMP-PICS9-12   PIC S9(12)
W-TEMP-PICS9-13   PIC S9(13)
...
J'ai besoin d'une fonction de convertisseur qui me converti mon PIC X(10) en PIC S9 lors d'un MOVE dans une position. Mais je vois vraiment pas comment faire.

S'il y avait quelque chose comme ça:
Code :
MOVE CCCCCCC TO XXXXXXX [56:6] AFTER CONVERT INTO PIC S9(10)
En réalité, je pourrais utiliser, mais je ne peux pas.
Code :
MOVE CCCCCC TO XXXXXXX-MAZONECIBLE
où XXXXXXX-MAZONECIBLE est déclaré PIC S9(10).

Mes idéess (à valider):
  • Soit la solution d'avoir tous les combinaisons possibles en WORKING et faire le move de CCCCCCC dans le bon W-TEMP-PICxxx. ==> il faut quasiment avoir toutes les valeurs possibles...
  • Soit je me suis dis que je créais un énorme ENORMEPICS9 PIC S9(1000) et je fais

Code :
1
2
MOVE CCCCCC TO ENORMEPICS9
MOVE ENORMEPICS9[990:10] TO XXXXXXX [56:6]
Je ne sais pas si cela fonctionne...

Avez-vous d'autres idées?

En vous remerciant par avance !

Cordialement,
Fantomasmusic
fantomasmusic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 09h55   #2
Expert Confirmé
 
Inscription : décembre 2007
Messages : 1 908
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 908
Points : 3 708
Points : 3 708
Je me sers abondamment de LENGTH OF, qui donne la longueur de ta variable(et pas de la chaine qu'il y a dedans).

Exemple, pour générer un .txt(une seule chaine énorme) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(.../...)
MOVE   LENGTH OF EX-TEXTE      TO WS-LONGUEUR-MAX
(.../...)

ECR-LIG-REGR-0.                                          
    MOVE LENGTH OF LIG-REGR-0              TO WS-LONGUEUR
    PERFORM CONTROLE-LONGUEUR-TEXTE                      
    MOVE LIG-REGR-0                                      
      TO EX-TEXTE ( WS-POSITION : WS-LONGUEUR )          
    ADD  WS-LONGUEUR                       TO WS-POSITION                       
    .                                                    
ECR-LIG-REGR-1.                                          
    MOVE LENGTH OF LIG-REGR-1              TO WS-LONGUEUR
    PERFORM CONTROLE-LONGUEUR-TEXTE                      
    MOVE LIG-REGR-1                                      
      TO EX-TEXTE ( WS-POSITION : WS-LONGUEUR )          
    ADD  WS-LONGUEUR                       TO WS-POSITION                          
    .             
                                                                        
 CONTROLE-LONGUEUR-TEXTE.                                    
                                 
     ADD WS-LONGUEUR TO WS-POSITION GIVING WS-POSITION-FINALE
     IF WS-POSITION-FINALE > WS-LONGUEUR-MAX                 
        STRING 'MESSAGE TROP LONG, NE DOIT PAS DéPASSER '    
                WS-LONGUEUR-MAX                              
        DELIMITED BY SIZE INTO LIBELLE-ERREUR                    
        PERFORM TRAITEMENT-REJET                             
     END-IF                                                  
     .
etc...... pour toutes les lignes.

Le jour ou LIG-REGR-1 change de longueur, je recompile, et ça marche comme avant, avec la nouvelle longueur.
__________________
Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
3)le temps de comprendre toutes les exigences, le projet est terminé
4)le temps de terminer le projet, les exigences ont changé
Et le serment de non-allégiance :
Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.
el_slapper est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 10h08   #3
Membre du Club
 
Inscription : juillet 2004
Messages : 106
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 106
Points : 44
Points : 44
Bonjour el_slapper,

Merci pour ta réponse.

Effectivement, c'est très pratique pour du texte.
Mais celà ne fonctionne pas pour tout ce qui est COMP-3.

Ou alors, je me trompe.

Merci en tout cas.
Fantomasmusic
fantomasmusic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 14h25   #4
Expert Confirmé
 
Inscription : décembre 2007
Messages : 1 908
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 908
Points : 3 708
Points : 3 708
ah, euhhhhh.....Je voudrais être bien sur de ce que tu as et de ce que tu n'as pas.

Tu as quoi en entrée? un paqué dont tu ne connais pas la longueur dans un texte? Dans ce cas, il faut scanner caractère par caractère ta chaine en entrée, detecter un 'C', 'D' ou 'F' sur le deuxième demi-octet pour identifier la fin du nombre signé et-ou packé. Une fois que tu as ça, tu as le début et la fin de ton nombre. Ensuite, tu le mets dans un PIC X(18) qui a un redefines en PIC S9(18), et ton S9(18) est porteur du nombre au bon format. NB : il fau avoir au préalable mis LOW-VALUE dans le X(18).

De mémoire, les numériques ne peuvent pas dépasser 18.

Ca marche si le package compris dans ton X est le même que celui de ton S9(18). Comp-3 sur Comp-3.

Quand à identifier les demi-octets, je crains qu'il ne faille comparer le caractère avec X'0F', X'1F',...X'9F', X'0C',...,X'9C', X'0D',....,X'9D', soit 30 caractères.
__________________
Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
3)le temps de comprendre toutes les exigences, le projet est terminé
4)le temps de terminer le projet, les exigences ont changé
Et le serment de non-allégiance :
Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.
el_slapper est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 21h17   #5
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
Plusieurs questions :

1) sur quel OS es tu ?

2) quel est le format (au sens USAGE du COBOL) de tes zones numériques cibles ?
Au début, tu indique un format COMP, mais dans tes exemples, le COMP a disparu ...

3) pourquoi tu ne veux pas utiliser la description fournie par la clause COPY ?
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h10.


 
 
 
 
Partenaires

Hébergement Web