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 06/01/2012, 22h21   #1
Invité régulier
 
Inscription : novembre 2006
Messages : 19
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 19
Points : 6
Points : 6
Par défaut Conversion d'une date en texte et chiffre

Bonjour,

Je récupère une date dans ma base de données DB2.

Je veux ensuite manipuler les chiffres à l'intérieur de cette date (le jour, le mois, l'année) pour faire des soustractions et multiplications.

Bref, j'ai déclaré une variable comme suit, mais ça ne compile pas lors d'un calcul (ex. SUBTRACT 1 FROM WS-TEMP-DD)

Code :
1
2
3
4
5
6
7
   
     01  WS-DAT-TEMP.
           05  WS-TEMP-MM                    PIC  X(02).
           05  FILLER                        PIC  X(01)   VALUE '/'.
           05  WS-TEMP-DD                    PIC  X(02).                    
           05  FILLER                        PIC  X(01)   VALUE '/'.
           05  WS-TEMP-YR                    PIC  X(04).
J'ai essayé avec des PIC 9 pour chacun, mais ça ne compile pas au niveau du Select pour récupérer la date dans la BD.

Code :
1
2
3
4
5
6
7
 
     01  WS-DAT-TEMP.
           05  WS-TEMP-MM                    PIC  9(02).
           05  FILLER                        PIC  X(01)   VALUE '/'.
           05  WS-TEMP-DD                    PIC  9(02).                    
           05  FILLER                        PIC  X(01)   VALUE '/'.
           05  WS-TEMP-YR                    PIC  9(04).
J'ai également essayé de reféfinir ma structure. Mais, soit je ne l'ai pas fait de la bonne manière, soit ce n'est pas permis.

Code :
1
2
3
4
5
6
7
       
       01  WS-DAT-TEMP-NUM REDEFINES WS-DAT-TEMP.
           05  WS-TEMP-MM-NUM                PIC  9(02).
           05  FILLER                        PIC  X(01)   VALUE '/'.
           05  WS-TEMP-DD-NUM                PIC  9(02).                   
           05  FILLER                        PIC  X(01)   VALUE '/'.
           05  WS-TEMP-YR-NUM                PIC  9(02).
Finalement, en essayant de redéfinir à l'intérieur de la structure date, ça ne compile pas non plus au niveau du Select.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
       
       01  WS-DAT-TEMP.
           05  WS-TEMP-MM                    PIC  X(02).
           05  WS-TEMP-MM-NUM                PIC  9(02) 
                  REDEFINES WS-TEMP-MM.
           05  FILLER                        PIC  X(01)   VALUE '/'.
           05  WS-TEMP-DD                    PIC  X(02).
           05  WS-TEMP-DD-NUM                PIC  9(02)             
                  REDEFINES WS-TEMP-DD.           
           05  FILLER                        PIC  X(01)   VALUE '/'.
           05  WS-TEMP-YR                    PIC  X(04).
           05  WS-TEMP-YR-NUM                PIC  9(04)             
                  REDEFINES WS-TEMP-YR.
Avez-vous une idée comment je peux faire ?

Merci et bonne journée
Zandes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 09h51   #2
Membre Expert
 
Avatar de Hédhili Jaïdane
 
Homme Hédhili Jaïdane
Consultant/Assistant/Formateur/Développeur Indépendant AS/400 Cobol
Inscription : juin 2007
Messages : 1 673
Détails du profil
Informations personnelles :
Nom : Homme Hédhili Jaïdane
Localisation : Tunisie

Informations professionnelles :
Activité : Consultant/Assistant/Formateur/Développeur Indépendant AS/400 Cobol

Informations forums :
Inscription : juin 2007
Messages : 1 673
Points : 2 174
Points : 2 174
Envoyer un message via Skype™ à Hédhili Jaïdane
Bonjour.

Si tu veux faire des opérations arithmétiques sur les dates tu peux utiliser les fonctions ADD-DURATION, SUBTRACT-DURATION et FIND-DURATION si tu les as dans ton compilo. Il y a toute une batterie de fonctions et d'API qui peuvent t'aider. Regarde les discussions post-it plus haut :

- http://www.developpez.net/forums/d64...obol-for-z-os/

- http://www.developpez.net/forums/d61...ues-ile-cobol/

Cependant en restant sur ton exemple, je pense qu'il faudrait redéfinir toute la structure comme tu l'as fait mais en supprimant les VALUE dans le REDEFINES (ce n'est pas autorisé). Même les VALUE dans l'objet du REDEFINES ne doivent pas tellement servir, je pense qu'ils doivent être écrasés par les séparateurs de la variable type DATE au moment du transfert.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
01  WS-DAT-TEMP.
           05  WS-TEMP-MM                    PIC  X(02).
           05  FILLER                        PIC  X(01)   VALUE '/'.
           05  WS-TEMP-DD                    PIC  X(02).                    
           05  FILLER                        PIC  X(01)   VALUE '/'.
           05  WS-TEMP-YR                    PIC  X(04).
01  WS-DAT-TEMP-NUM REDEFINES WS-DAT-TEMP.
           05  WS-TEMP-MM-NUM                PIC  9(02).
           05  FILLER                        PIC  X(01).
           05  WS-TEMP-DD-NUM                PIC  9(02).                   
           05  FILLER                        PIC  X(01).
           05  WS-TEMP-YR-NUM                PIC  9(02).
__________________

Hédhili Jaïdane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 13h09   #3
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
Citation:
Envoyé par Zandes Voir le message
... Je récupère une date dans ma base de données DB2.
1) quel DB2 ?

2) comment est déclaré la colonne DATE dans la table ?
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 19h39   #4
Invité régulier
 
Inscription : novembre 2006
Messages : 19
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 19
Points : 6
Points : 6
Cobol

* Micro Focus SQL External Compiler Module for IBM DB2 UDB
* Version 4.0.05 (C) copyright 1997-2008 Micro Focus (IP) Ltd.

DB2

DB2 v9.5

-------------------

Sinon ça a l'air de fonctionner en enlevant le "value" du redefine. Je peux effectivement faire mes calculs avec les valeurs "redéfinies" comme numérique.

Avant de marquer la discussion comme résolue...

Là, j'essaie de soustraire deux dates ensemble et j'ai une erreur de compile : "Invalid FUNCTION name FIND-DURATION"

Le traitement

Code :
1
2
3
COMPUTE WS-NB-JOURS-DELAI-TRAIT = 
                 FUNCTION FIND-DURATION (WS-DAT-DISTR-TRANSF-FONDS 
                    WS-DAT-DER-JOUR-RECEP-DECL DAYS)
Et la déclaration

Code :
1
2
3
4
5
6
01  WS-WORK-ITEMS.
      05  WS-NB-JOURS-DELAI-TRAIT PIC S9(08) COMP-5 VALUE 0.

01  WS-DAT-DISTR-TRANSF-FONDS         PIC  X(10).
01  WS-DAT-DER-JOUR-RECEP-DECL         PIC  X(10).
Est-ce que ma version de Cobol accepte la fonction FIND-DURATION ? Ou est-ce que je l'ai mal utilisé ?

Citation:
si tu les as dans ton compilo
Comment je sais si je les ai ou non dans mon compilateur ?

Merci
Zandes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 21h09   #5
Membre Expert
 
Avatar de Hédhili Jaïdane
 
Homme Hédhili Jaïdane
Consultant/Assistant/Formateur/Développeur Indépendant AS/400 Cobol
Inscription : juin 2007
Messages : 1 673
Détails du profil
Informations personnelles :
Nom : Homme Hédhili Jaïdane
Localisation : Tunisie

Informations professionnelles :
Activité : Consultant/Assistant/Formateur/Développeur Indépendant AS/400 Cobol

Informations forums :
Inscription : juin 2007
Messages : 1 673
Points : 2 174
Points : 2 174
Envoyer un message via Skype™ à Hédhili Jaïdane
Bonjour.

Je ne connais pas tes compilateurs, mais tu ne peux pas utiliser les fonctions intrinsèques des dates sur des données qui ne sont pas de type date. Il faut les convertir, exemple sur ILE Cobol for Iseries :

Code :
1
2
3
4
0047.00            compute nbj = function find-duration              
0048.00                (function convert-date-time(wdate0 date)      
0049.00                 function convert-date-time(wdate1 date) days)
Pour ce qui est de savoir si une fonction, une instruction ou tout autre élément existe dans le compilateur, il n'y a que sa doc d'origine qui pourrait le dire.
__________________

Hédhili Jaïdane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 22h59   #6
Invité régulier
 
Inscription : novembre 2006
Messages : 19
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 19
Points : 6
Points : 6
Après avoir vérifier (avoir trouvé ma version et la doc surtout) dans la doc, j'ai vu que cette fonction n'est pas présente pour MF Server Express V5.1.

Je vais donc utiliser les fonctions NUMVAL, INTEGER-OF-DATE et DATE-OF-INTEGER.

Pour info, le typage en "date" n'est pas non plus admis.

Je vais faire quelques tests et je vous revient avec la solution concrète.
Zandes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 23h15   #7
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
Citation:
Envoyé par Zandes Voir le message
... Je vais donc utiliser les fonctions NUMVAL, INTEGER-OF-DATE et DATE-OF-INTEGER.
C'est ce que je ferais en COBOL z/OS ...

1) INTEGER-OF-DATE convertit en entier une date
2) opération arithmétique sur les entiers ainsi convertis
3) DATE-OF-INTERGER convertit en date un entier

Par contre, je ne pense pas que tu aies besoin de NUMVAL.
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 06h02   #8
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 503
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : octobre 2006
Messages : 503
Points : 688
Points : 688
Bonjour

As-tu essayer de faire faire le travail par SQL?

Pour un calcul de date, c'est plus simple que de coder soit même. Il existe pas mal de fonctions intégrées permettant divers calcul.

Pour des transformations de CHAR en NUM, tu laisses de coté les particularité de ton cobol.
bernard59139 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 04h32.


 
 
 
 
Partenaires

Hébergement Web