Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 448
    Points : 1 298
    Points
    1 298

    Par défaut Requete de comptage a envoyer dans un CSV

    Bonjour,

    Je m'arrache les cheveux depuis plusieurs jours pour envoyer le résultat d'un comptage sql dans un fichier CSV via du cobol . Le tout doit tourner exclusivement sous linux .

    Je dois sortir un classement par age et quantité de personne :

    Colonne 1 > classe d'age
    Séparateur > point virgule
    Colonne 2 > quantité de personne dans la classe d'age
    Extension du fichier > .csv

    A noter je ne sais pas comment découper les instructions SQL venant d'oracle . Elles sont longues. Faut il créer des chaines et demander à cobol une compilation de concaténation de chaines ? Faut il adapter le sql à "cobol" au même titre que sql sur MySQL ou PHPMyAdmin voir Oracle ?

    Voici ce que j'essaie de faire :

    Code cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
           IDENTIFICATION DIVISION.
           PROGRAM-ID. calcs218.
          *programme de calcul du S2 2018
           ENVIRONMENT DIVISION.
           CONFIGURATION SECTION.
           SPECIAL-NAMES.
               DECIMAL-POINT IS COMMA.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
    
          * declaratif du fichier de resultat
              SELECT ficresah18      ASSIGN TO DISK.
    
           DATA DIVISION.
           FILE SECTION.     
        
           FD  ficresah18            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/dossierdesortie/calcs218.csv".
           01  ENR-ficseq.                            
               02 ficseq-age         PIC 9(4).
               02 sep1               PIC X value ";".        
               02 ficseq-qte         Pic s99999.        
    
           WORKING-STORAGE SECTION.
    
          * bibliotheque sql pour cobol
               Exec sql include sqlca end-exec.
          * debut des declaratifs sql 
               Exec sql begin declare section end-exec.
     
          * wdbase pour ouverture bdd et environnement de travail
           01  wdbase          pic x.
          * pour avoir message erreur avec debugage
           01  ws-erreur       pic -(6)9.
           01  where-error       pic x(72).
    
           01  wscli           pic X(8) value space.
           01  CODE-RET        pic s9(9) comp-5 value 0.
           
          * fin de declaratif sql
               Exec sql end declare section end-exec.
               
          * declaratif des variables autres que sql
                 
          * debut du programme
           PROCEDURE DIVISION.             
          * ouverture d'environnement de la bdd
               MOVE "R" TO WDBASE.
               call "opendb" using wdbase.
    
               OPEN output ficresah18.
    
           GENERAL.
                      
               exec sql declare CurseurA cursor for           
           
               select
          * calcul de difference de date dans oracle
          * probleme ligne longue comment la faire passer dans cobol limité à 72 caractere ?
               trunc( ((to_date('20181001','YYYYMMDD')-to_date(datenaiss,'YYYYMMDD'))/365.25) , 0 ) into :ficseq-age ,
          * comptage de quantite  
               count ( distinct (pcle)) into :ficseq-qte  
               from fr.client
          * lien entre table client et commande  
               inner join fr.tabcommande on tabcommande.c1clte = client.pcle
          * date correspondant au S2 2018
               where c1datcde between 20180701 and 20181231
          * dans la chaine texte au format AAAAMMJJ MM et JJ 
          * ne doivent pas etre egale a zero
               and substr(datenaiss,7,2) not like '00' 
               and substr(datenaiss,5,2) not like '00'
          * annee differente de 9999 
               and substr(datenaiss,1,4) != 9999
          * annee superieur a 1900
               and substr(datenaiss,1,4) > 1900 
          * la ligne n'est pas un doublon
               and Pnom3 not like '%DBL%'
          * la difference des dates est superieur strictement a 50 ans
          * probleme ligne longue comment la faire passer dans cobol limité à 72 caractere ?
               and trunc( ((to_date('20181001','YYYYMMDD')- to_date(datenaiss,'YYYYMMDD'))/365.25) , 0 ) > 50
          * groupage du comptage par age
          * probleme ligne longue comment la faire passer dans cobol limité à 72 caractere ?
               group by trunc( ((to_date('20181001','YYYYMMDD')-to_date(datenaiss,'YYYYMMDD'))/365.25) , 0 )
          * ordonancement du comptage par age
          * probleme ligne longue comment la faire passer dans cobol limité à 72 caractere ?
               order by trunc( ((to_date('20181001','YYYYMMDD')- to_date(datenaiss,'YYYYMMDD'))/365.25) , 0 )  asc
               
               END-EXEC.
               
               exec sql open CurseurA end-exec.
               
               exec sql fetch CurseurA into :ENR-ficseq end-exec.
                           
          * probleme ligne longue comment la faire passer dans cobol limité à 72 caractere ?
          * comment faire comprendre a cobol , qu'il doit recuperer le resultat de la colonne 1 de la requete sql pour le stocker l'element 1 du descriptif du format de fichier ?
          * move un_truc_sql_???? to le_meme_champ_dans_le_fichier
               move trunc( ((to_date('20181001','YYYYMMDD')- o_date(datenaiss,'YYYYMMDD'))/365.25) , 0 ) to ficseq-age .
          * j'envoi le separateur a lui meme qui est deja declare et dispose deja d'un symbole dans le descriptif du format de fichier
          * si on ne met rien de move a sep1 cela me semble illogique ????? en gros il se recupere lui meme
               move sep1 to sep1.
          * meme chanson comment recupere le comptage sql dedans ?           
               move count ( distinct (pcle)) to ficseq-qte.
          * j'ecris dans le fichier csv de sortie
               write ENR-ficseq before 1.
     
           FIN-GENERAL.
           
           CLOSE ficresah18.
           STOP RUN.

    Merci de m'aiguiller

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 448
    Points : 1 298
    Points
    1 298

    Par défaut

    Re ,

    J'ai refait d'autres tests en rajoutant des étapes de traitements. Toujours rien , Cobol rechigne à effectuer une malheureuse requête sql ... la requête a été au préalable testé sur ORACLE . Celle ci FONCTIONNE sur ORACLE preuve à l'appuie ... Dois je en déduire que le compilateur a été codé par une vraie bande charlot et de pied nickelé ? A croire que oui !

    Test 1

    Code cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
           IDENTIFICATION DIVISION.
           PROGRAM-ID. calcah18.
          *programme de calcul de l'ah18 
           ENVIRONMENT DIVISION.
           CONFIGURATION SECTION.
           SPECIAL-NAMES.
               DECIMAL-POINT IS COMMA.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
    
          * declaratif du fichier de resultat
              SELECT ficresah18   ASSIGN TO DISK.
              
              SELECT ficstockcli  ASSIGN TO DISK
                     ORGANIZATION INDEXED
                     ACCESS DYNAMIC
                     RECORD KEY idcli.
                     
              SELECT ficstockcliinsert  ASSIGN TO DISK
                     ORGANIZATION INDEXED
                     ACCESS DYNAMIC
                     RECORD KEY idcli.
                     
           DATA DIVISION.
           FILE SECTION.     
        
           FD  ficresah18            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/calcah18.csv".
           01  ENR-ficseq.                            
               02 ficseq-age         PIC 9(4).
               02 sep1               PIC X value ";".        
               02 ficseq-qte         Pic 9(6).
               
           FD  ficstockcli            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/ficstockcli.csv".
           01  ENR-ficix.                            
               02 idcli     PIC X(10).
               02 sep1      PIC X value ";".        
               02 age       Pic 9(4).
               02 sep2      PIC X value ";".
               02 qte       Pic 9(6).                 
    
           WORKING-STORAGE SECTION.
    
          * bibliotheque sql pour cobol
               Exec sql include sqlca end-exec.
               exec sql include '/fr/cobol/fichier/client' end-exec.
               exec sql include '/fr/cobol/fichier/comande1' end-exec.
          * debut des declaratifs sql 
               Exec sql begin declare section end-exec.
     
          * wdbase pour ouverture bdd et environnement de travail
           01  wdbase          pic x.
          * pour avoir message erreur avec debugage
           01  ws-erreur       pic -(6)9.
           01  where-error       pic x(72).
    
           01  wscli           pic X(8) value space.
           01  CODE-RET        pic s9(9) comp-5 value 0.
           
          * fin de declaratif sql
               Exec sql end declare section end-exec.
               
          * declaratif des variables autres que sql
                 
          * debut du programme
           PROCEDURE DIVISION.
           GENERAL.             
          * ouverture d'environnement de la bdd
               MOVE "R" TO WDBASE.
               call "opendb" using wdbase.
    
               OPEN output ficresah18.
               OPEN output ficstockcli.
    
               
           * selection des clients avec age et quantite a 1 par defaut 
               exec sql declare CurseurB cursor for           
           
               select 
               distinct pcle into :idcli ,
               trunc(
               (
               (to_date('20181001','YYYYMMDD')-to_date(pdatnais,'YYYYMMDD'))
               /365.25)
               ,0
               ) into :age ,
               1 into :qte
               from fr.client
               inner join fr.comande1 on comande1.c1clte = client.pcle
               where c1datcde between 20180701 and 20181231
               and substr(pdatnais,7,2) not like '00' 
               and substr(pdatnais,5,2) not like '00'
               and substr(pdatnais,1,4) != 9999                     
               and substr(pdatnais,1,4) > 1900
               and Pnom3 not like '%DBL%'
               and trunc(
               (
               (to_date('20181001','YYYYMMDD')-to_date(pdatnais,'YYYYMMDD'))
               /365.25)
               ,0
               ) > 80
               group by trunc(
               (
               (to_date('20181001','YYYYMMDD')-to_date(pdatnais,'YYYYMMDD'))
               /365.25)
               ,0
               )
               order by trunc(
               (
               (to_date('20181001','YYYYMMDD')-to_date(pdatnais,'YYYYMMDD'))
               /365.25)
               ,0
               )  asc
               
               END-EXEC.
               
               exec sql open CurseurB end-exec.                                 
                            
               exec sql fetch CurseurB into :ENR-ficix end-exec.
               
               move pcle to idcli.
               
               move trunc(
               (
               (to_date('20181001','YYYYMMDD')-to_date(pdatnais,'YYYYMMDD'))
               /365.25)
               ,0
               ) to age.
               
               move 1 to qte.
               
               write ENR-ficix before 1.
               
           * fichier de sortie avec le nombre de client par age          
               exec sql declare CurseurC cursor for
               
               select age , count(qte)
               from ficstockcli
               group by age
               order by age as
               
               END-EXEC.  
               
               exec sql open CurseurC end-exec.
                            
               exec sql fetch CurseurC into :ENR-ficseq end-exec.
               
               move age to ficseq-age.
               
               move count(qte) to  ficseq-qte.
               
               write ENR-ficix before 1.           
    
           FIN-GENERAL.
           
           CLOSE ficresah18 ficstockcli. 
           STOP RUN.

    Test 2

    Code cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
           IDENTIFICATION DIVISION.
           PROGRAM-ID. calcah18.
          *programme de calcul de l'ah18 
           ENVIRONMENT DIVISION.
           CONFIGURATION SECTION.
           SPECIAL-NAMES.
               DECIMAL-POINT IS COMMA.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
    
          * declaratif du fichier de resultat
              SELECT ficresah18      ASSIGN TO DISK.
    
           DATA DIVISION.
           FILE SECTION.     
        
           FD  ficresah18            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/calcah18.csv".
           01  ENR-ficseq.                            
               02 ficseq-age         PIC 9(4).
               02 sep1               PIC X value ";".        
               02 ficseq-qte         Pic s99999.        
    
           WORKING-STORAGE SECTION.
    
          * bibliotheque sql pour cobol
               Exec sql include sqlca end-exec.
               exec sql include '/fr/cobol/fichier/client' end-exec.
               exec sql include '/fr/cobol/fichier/comande1' end-exec.
          * debut des declaratifs sql 
               Exec sql begin declare section end-exec.
     
          * wdbase pour ouverture bdd et environnement de travail
           01  wdbase          pic x.
          * pour avoir message erreur avec debugage
           01  ws-erreur       pic -(6)9.
           01  where-error       pic x(72).
    
           01  wscli           pic X(8) value space.
           01  CODE-RET        pic s9(9) comp-5 value 0.
           
          * fin de declaratif sql
               Exec sql end declare section end-exec.
               
          * declaratif des variables autres que sql
                 
          * debut du programme
           PROCEDURE DIVISION.             
          * ouverture d'environnement de la bdd
               MOVE "R" TO WDBASE.
               call "opendb" using wdbase.
    
               OPEN output ficresah18.
    
           GENERAL.
                      
               exec sql declare CurseurA cursor for           
           
               select
          * calcul de difference de date dans oracle
          * probleme ligne longue comment la faire passer dans cobol limité à 72 caractere ?
               trunc( ((to_date('20181001','YYYYMMDD')-
               to_date(pdatnais,'YYYYMMDD'))
               /365.25) , 0 ) into :ficseq-age ,
          * comptage de quantite  
               count ( distinct (pcle)) into :ficseq-qte  
               from fr.client
          * lien entre table client et commande  
               inner join fr.comande1 on comande1.c1clte = client.pcle
          * date correspondant au S2 2018
               where c1datcde between 20180701 and 20181231
          * dans la chaine texte au format AAAAMMJJ MM et JJ 
          * ne doivent pas etre egale a zero
               and substr(pdatnais,7,2) not like '00' 
               and substr(pdatnais,5,2) not like '00'
          * annee differente de 9999 
               and substr(pdatnais,1,4) != 9999
          * annee superieur a 1900
               and substr(pdatnais,1,4) > 1900 
          * la ligne n'est pas un doublon
               and Pnom3 not like '%DBL%'
          * la difference des dates est superieur strictement a 50 ans
          * probleme ligne longue comment la faire passer dans cobol limité à 72 caractere ?
               and trunc( ((to_date('20181001','YYYYMMDD')- 
               to_date(pdatnais,'YYYYMMDD'))/365.25) , 0 ) > 80
          * groupage du comptage par age
          * probleme ligne longue comment la faire passer dans cobol limité à 72 caractere ?
               group by trunc( ((to_date('20181001','YYYYMMDD')-
               to_date(pdatnais,'YYYYMMDD'))/365.25) , 0 )
          * ordonancement du comptage par age
          * probleme ligne longue comment la faire passer dans cobol limité à 72 caractere ?
               order by trunc( ((to_date('20181001','YYYYMMDD')- 
               to_date(pdatnais,'YYYYMMDD'))/365.25) , 0 )  asc
               
               END-EXEC.
               
               exec sql open CurseurA end-exec.
               
               exec sql fetch CurseurA into :ENR-ficseq end-exec.
                           
          * probleme ligne longue comment la faire passer dans cobol limité à 72 caractere ?
          * comment faire comprendre a cobol , qu'il doit recuperer le resultat de la colonne 1 de la requete sql pour le stocker l'element 1 du descriptif du format de fichier ?
          * move un_truc_sql_???? to le_meme_champ_dans_le_fichier
               move trunc( ((to_date('20181001','YYYYMMDD')- 
               to_date(pdatnais,'YYYYMMDD'))/365.25) , 0 ) to ficseq-age .
          * j'envoi le separateur a lui meme qui est deja declare et dispose deja d'un symbole dans le descriptif du format de fichier
          * si on ne met rien de move a sep1 cela me semble illogique ????? en gros il se recupere lui meme
               move sep1 to sep1.
          * meme chanson comment recupere le comptage sql dedans ?           
               move count ( distinct (pcle)) to ficseq-qte.
          * j'ecris dans le fichier csv de sortie
               write ENR-ficseq before 1.
     
           FIN-GENERAL.
           
           CLOSE ficresah18.
           STOP RUN.

    Résultat débugage programme 1 :

    Code rapport compilateur cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Pro*COBOL: Release 12.1.0.2.0 - Production on Mar. Mars 12 16:28:53 2019
    
    Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.
    
    Valeurs des options système par défaut extraites de : /app/oracle/client/precomp/admin/pcbcfg.cfg
    
    PCB-S-0004:  UNSAFE_NULL=YES doit être utilisé avec DBMS=V7 ou V8 et MODE=ORACLE
    Erreur à la ligne 82, colonne 17 dans le fichier 20190312_ah18_cobol.eco
               trunc(
    ................1
    PCB-S-00400, Symbole "(" rencontré à la place d'un des symboles suivants :
    
       . , : INDICATOR FROM
    
    Erreur à la ligne 87, colonne 14 dans le fichier 20190312_ah18_cobol.eco
               ) into :age ,
    .............1
    PCB-S-00400, Symbole "into" rencontré à la place d'un des symboles suivants :
    
       + - * / = > < NOTEQ_ <= >= AND OR IN AT NOT BETWEEN DAY IS
       LIKE RETURNING YEAR || ^= ANGLE_BRK_
    
    PCB-I-0556:  Erreur irrécupérable. Corrigez les erreurs précédentes et recompilez
    Erreur à la ligne 141, colonne 25 dans le fichier 20190312_ah18_cobol.eco
               order by age as
    ........................1
    PCB-S-00400, Symbole "as" rencontré à la place d'un des symboles suivants :
    
       + - * / . , ( END-EXEC AT ASC DAY DESC ORDER YEAR FOR || @
    Symbole "+" a été substitué à "as" pour continuer.
    
    PCB-I-0556:  Erreur irrécupérable. Corrigez les erreurs précédentes et recompilez
    Erreur à la ligne 118, colonne 26 dans le fichier 20190312_ah18_cobol.eco
               exec sql open CurseurB end-exec.                                 
    .........................1
    PCB-S-00225, Identificateur SQL "CURSEURB" non déclaré
    Erreur à la ligne 120, colonne 27 dans le fichier 20190312_ah18_cobol.eco
               exec sql fetch CurseurB into :ENR-ficix end-exec.
    ..........................1
    PCB-S-00225, Identificateur SQL "CURSEURB" non déclaré
    Erreur à la ligne 145, colonne 26 dans le fichier 20190312_ah18_cobol.eco
               exec sql open CurseurC end-exec.
    .........................1
    PCB-S-00225, Identificateur SQL "CURSEURC" non déclaré
    Erreur à la ligne 147, colonne 27 dans le fichier 20190312_ah18_cobol.eco
               exec sql fetch CurseurC into :ENR-ficseq end-exec.
    ..........................1
    PCB-S-00225, Identificateur SQL "CURSEURC" non déclaré
    * 244-S*****************                                                     **
    **    FD missing for file FICSTOCKCLIINSERT
       399 * selection des clients avec age et quantite a 1 par defaut
    * 301-S*                                                                     **
    **    Unrecognized verb
       400     exec sql declare CurseurB cursor for
    * 149-S********                                                              **
    **    No SQL directives have been set
       478     move trunc(
    *  12-S**************                                                        **
    **    Operand TRUNC is not declared
       481     /365.25)
    * 641-S***********                                                           **
    **    '.' missing following procedure name declaration, or unrecognized verb
       487     write ENR-ficix before 1.
    * 301-S**************************                                            **
    **    Unrecognized verb
       489 * fichier de sortie avec le nombre de client par age
    * 301-S*                                                                     **
    **    Unrecognized verb
       490     exec sql declare CurseurC cursor for
    * 149-S********                                                              **
    **    No SQL directives have been set
       537     move count(qte) to  ficseq-qte.
    *  14-S**************                                                        **
    **    Invalid operand
       539     write ENR-ficix before 1.
    * 301-S**************************                                            **
    **    Unrecognized verb
    cob64: error(s) in compilation: 20190312_ah18_cobol.cob

    Résultat débugage programme 2 :

    Code rapport compilateur cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Pro*COBOL: Release 12.1.0.2.0 - Production on Mar. Mars 12 16:31:57 2019
    
    Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.
    
    Valeurs des options système par défaut extraites de : /app/oracle/client/precomp/admin/pcbcfg.cfg
    
    PCB-S-0004:  UNSAFE_NULL=YES doit être utilisé avec DBMS=V7 ou V8 et MODE=ORACLE
    Erreur à la ligne 66, colonne 18 dans le fichier 20190312_calcul_ah18.eco
               count ( distinct (pcle)) into :ficseq-qte  
    .................1
    PCB-S-00400, Symbole "(" rencontré à la place d'un des symboles suivants :
    
       . , : INDICATOR FROM
    
    Erreur à la ligne 66, colonne 37 dans le fichier 20190312_calcul_ah18.eco
               count ( distinct (pcle)) into :ficseq-qte  
    ....................................1
    PCB-S-00400, Symbole "into" rencontré à la place d'un des symboles suivants :
    
       + - * / = > < NOTEQ_ <= >= AND OR IN AT NOT BETWEEN DAY IS
       LIKE RETURNING YEAR || ^= ANGLE_BRK_
    
    PCB-I-0556:  Erreur irrécupérable. Corrigez les erreurs précédentes et recompilez
    Erreur à la ligne 97, colonne 26 dans le fichier 20190312_calcul_ah18.eco
               exec sql open CurseurA end-exec.
    .........................1
    PCB-S-00225, Identificateur SQL "CURSEURA" non déclaré
    Erreur à la ligne 99, colonne 27 dans le fichier 20190312_calcul_ah18.eco
               exec sql fetch CurseurA into :ENR-ficseq end-exec.
    ..........................1
    PCB-S-00225, Identificateur SQL "CURSEURA" non déclaré
       349     exec sql declare CurseurA cursor for
    * 149-S********                                                              **
    **    No SQL directives have been set
       428     move trunc( ((to_date('20181001','YYYYMMDD')-
    *  12-S**************                                                        **
    **    Operand TRUNC is not declared
       429     to_date(pdatnais,'YYYYMMDD'))/365.25) , 0 ) to ficseq-age .
    * 641-S****************************************                              **
    **    '.' missing following procedure name declaration, or unrecognized verb
       434     move count ( distinct (pcle)) to ficseq-qte.
    *  14-S**************                                                        **
    **    Invalid operand
    cob64: error(s) in compilation: 20190312_calcul_ah18.cob

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    novembre 2012
    Messages
    1 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2012
    Messages : 1 246
    Points : 7 810
    Points
    7 810

    Par défaut

    Bonjour,
    essaie de remplacer les simple quote par des double quote dans le SQL.
    Sinon, le problème n'est pas dans le précompilateur DB2 COBOL mais dans le fait que tu n'as pas le droit de faire un into dans le select d'un declare cursor (tu fais un simple select de tes variables) si tu passes par des fetch. Le into "host variables" se fait au moment du fetch.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 448
    Points : 1 298
    Points
    1 298

    Par défaut

    Bonjour

    Citation Envoyé par Darkzinus Voir le message
    essaie de remplacer les simple quote par des double quote dans le SQL.
    Correction faite , tout ce qui a du ' a été remplacé par " .

    Citation Envoyé par Darkzinus Voir le message
    Sinon, le problème n'est pas dans le précompilateur DB2 COBOL mais dans le fait que tu n'as pas le droit de faire un into dans le select d'un declare cursor (tu fais un simple select de tes variables) si tu passes par des fetch. Le into "host variables" se fait au moment du fetch.
    J'ai éjecté les into :nom_de_la_variable.

    Le compilateur persiste et signe au niveau de l'instruction select . "select n'est pas une instruction valide" , les parenthèses demandent a être remplacé par un autre symbole . Une norme en SQL cobol existe pour qu'on utilise un autre symbole que ( et ) ? Genre il faut mettre : ou ; ?

    Code cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
           IDENTIFICATION DIVISION.
           PROGRAM-ID. calcah18.
          *programme de calcul de l'ah18 
           ENVIRONMENT DIVISION.
           CONFIGURATION SECTION.
           SPECIAL-NAMES.
               DECIMAL-POINT IS COMMA.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
    
          * declaratif du fichier de resultat
              SELECT ficresah18      ASSIGN TO DISK.
                                     access is sequential.
    
           DATA DIVISION.
           FILE SECTION.     
        
           FD  ficresah18            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/calcah18.csv".
           01  ENR-ficseq.                            
               02 ficseq-age         PIC 9(4).
               02 sep1               PIC X value ";".        
               02 ficseq-qte         Pic s99999.        
    
           WORKING-STORAGE SECTION.
    
          * bibliotheque sql pour cobol
               Exec sql include sqlca end-exec.
               exec sql include '/fr/cobol/fichier/client' end-exec.
               exec sql include '/fr/cobol/fichier/comande1' end-exec.
               
          * debut des declaratifs sql 
               Exec sql begin declare section end-exec.
     
          * wdbase pour ouverture bdd et environnement de travail
           01  wdbase          pic x.
          * pour avoir message erreur avec debugage
           01  ws-erreur       pic -(6)9.
           01  where-error       pic x(72).
    
           01  wscli           pic X(8) value space.
           01  CODE-RET        pic s9(9) comp-5 value 0.
           
          * fin de declaratif sql
               Exec sql end declare section end-exec.
               
          * declaratif des variables autres que sql
                 
          * debut du programme
           PROCEDURE DIVISION.             
          * ouverture d'environnement de la bdd
               MOVE "R" TO WDBASE.
               call "opendb" using wdbase.
    
               OPEN output ficresah18.
    
          * programme principal
           GENERAL.
        
          * execution de code sql
                      
               exec sql declare CurseurA cursor for           
           
               select
               (round(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
               TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
               0 MODE ROUND_DOWN)) 
               ,
               (count ( distinct (pcle)))   
               from fr.client
                inner join fr.comande1 on comande1.c1clte = client.pcle
                where c1datcde between 20180701 and 20181231
                and substr(pdatnais,7,2) not like "00" 
                and substr(pdatnais,5,2) not like "00"
                and substr(pdatnais,1,4) != 9999
                and substr(pdatnais,1,4) > 1900 
                and Pnom3 not like '%DBL%'
                and (round(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
                TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
                0 MODE ROUND_DOWN)) > 80
                group by (round(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
                TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
                0 MODE ROUND_DOWN))
                order by (round(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
                TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
                0 MODE ROUND_DOWN)) 
                asc
               END-EXEC.
               
          * envoi du code sql dans le curseur
          
               exec sql open CurseurA end-exec.
          
          * envoi du curseur vers le fichier csv de sortie via le modèle 
          * déclaré plus haut dans le programme     
               exec sql fetch CurseurA into :ENR-ficseq end-exec.
                 
               move (round(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
               TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
               0 MODE ROUND_DOWN)) 
               to ficseq-age.
               move ";" to sep1.
               move (count ( distinct (pcle))) to ficseq-qte.
               write ENR-ficseq before 1.
     
           FIN-GENERAL.
           
           CLOSE ficresah18.
           STOP RUN.

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    novembre 2012
    Messages
    1 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2012
    Messages : 1 246
    Points : 7 810
    Points
    7 810

    Par défaut

    Ceci est incorrect (mélange de SQL et de COBOL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    move (round(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
               TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
               0 MODE ROUND_DOWN)) 
               to ficseq-age.
    Dans ton fetch into, mets une variable par champ retourné par la requête (séparés par des ',').

    Peux-tu envoyer le résultat de compilation ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 448
    Points : 1 298
    Points
    1 298

    Par défaut

    Bonjour

    Citation Envoyé par Darkzinus Voir le message
    Ceci est incorrect (mélange de SQL et de COBOL) :

    Code cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    move (round(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
               TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
               0 MODE ROUND_DOWN)) 
               to ficseq-age.
    J'ai repris mes archives cobol il y est noté mot pour mot :

    "Passer des infos du sql a cobol se fait avec fetch"

    Code cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec sql fetch "nom_du_curseur" into :"descrioption_de_la_ligne_en_cobol" end-exec
    
    move "nom_du_champ_sql" to "nom_du_champ_dans_le_modele_d'organisation_du_fichier".

    "nom_du_champ_sql" > peut être logiquement une colonne d'une , une chaine entre quote genre " 'toto' as colonne_fixe " , un nombre " 12 as valeur_fixe " ou une expression mathématique

    Si le champ est une expression mathématique , que l'on ne peut pas retourner a cobol ni via son as alors je ne vois pas comment vous comptez récuperer les données en BDD ???

    Citation Envoyé par Darkzinus Voir le message
    Dans ton fetch into, mets une variable par champ retourné par la requête (séparés par des ',').
    J'ai changé par les champs au lieu du nom du descriptif de ligne.

    Par contre par quoi remplacer les "?????" lors du passage de sql a cobol ???

    Citation Envoyé par Darkzinus Voir le message
    Peux-tu envoyer le résultat de compilation ?
    Voici le programme modifié et les logs d'erreurs :

    Code cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
           IDENTIFICATION DIVISION.
           PROGRAM-ID. calcah18.
          *programme de calcul de l'ah18 
           ENVIRONMENT DIVISION.
           CONFIGURATION SECTION.
           SPECIAL-NAMES.
               DECIMAL-POINT IS COMMA.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
    
          * declaratif du fichier de resultat
              SELECT ficresah18      ASSIGN TO DISK.
                                     access is sequential.
    
           DATA DIVISION.
           FILE SECTION.     
        
           FD  ficresah18            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/calcah18.csv".
           01  ENR-ficseq.                            
               02 ficseq-age         PIC 9(4).
               02 sep1               PIC X value ";".        
               02 ficseq-qte         Pic s99999.        
    
           WORKING-STORAGE SECTION.
    
          * bibliotheque sql pour cobol
               Exec sql include sqlca end-exec.
               exec sql include '/fr/cobol/fichier/client' end-exec.
               exec sql include '/fr/cobol/fichier/comande1' end-exec.
               
          * debut des declaratifs sql 
               Exec sql begin declare section end-exec.
     
          * wdbase pour ouverture bdd et environnement de travail
           01  wdbase          pic x.
          * pour avoir message erreur avec debugage
           01  ws-erreur       pic -(6)9.
           01  where-error       pic x(72).
    
           01  wscli           pic X(8) value space.
           01  CODE-RET        pic s9(9) comp-5 value 0.
           
          * fin de declaratif sql
               Exec sql end declare section end-exec.
               
          * declaratif des variables autres que sql
                 
          * debut du programme
           PROCEDURE DIVISION.             
          * ouverture d'environnement de la bdd
               MOVE "R" TO WDBASE.
               call "opendb" using wdbase.
    
               OPEN output ficresah18.
    
          * programme principal
           GENERAL.
        
          * execution de code sql
                      
               exec sql declare CurseurA cursor for           
           
               select
               (TRUNCATE(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
               TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
               0 MODE ROUND_DOWN)) as l_age 
               ,
               (count ( distinct (pcle))) as nb_pers  
               from fr.client
                inner join fr.comande1 on comande1.c1clte = client.pcle
                where c1datcde between 20180701 and 20181231
                and substr(pdatnais,7,2) not like "00" 
                and substr(pdatnais,5,2) not like "00"
                and substr(pdatnais,1,4) != 9999
                and substr(pdatnais,1,4) > 1900 
                and Pnom3 not like '%DBL%'
                and (TRUNCATE(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
                TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
                0 MODE ROUND_DOWN)) > 80
                group by (TRUNCATE(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
                TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
                0 MODE ROUND_DOWN))
                order by (TRUNCATE(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
                TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),
                0 MODE ROUND_DOWN)) 
                asc
               END-EXEC.
               
          * envoi du code sql dans le curseur
          
               exec sql open CurseurA end-exec.
          
          * envoi du curseur vers le fichier csv de sortie via le modèle 
          * déclaré plus haut dans le programme     
          *     exec sql fetch CurseurA into :ENR-ficseq end-exec.
                exec sql fetch CurseurA into :ficseq-age, ficseq-qte end-exec.       
               move ????? 
               to ficseq-age.
               move ";" to sep1.
               move ????? to ficseq-qte.
               write ENR-ficseq before 1.
     
           FIN-GENERAL.
           
           CLOSE ficresah18.
           STOP RUN.


    Code log cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Pro*COBOL: Release 12.1.0.2.0 - Production on Mer. Mars 13 11:58:50 2019
    
    Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.
    
    Valeurs des options système par défaut extraites de : /app/oracle/client/precomp/admin/pcbcfg.cfg
    
    PCB-S-0004:  UNSAFE_NULL=YES doit être utilisé avec DBMS=V7 ou V8 et MODE=ORACLE
    Erreur à la ligne 67, colonne 14 dans le fichier 20190312_calcul_ah18.eco
               0 MODE ROUND_DOWN)) as l_age 
    .............1
    PCB-S-00400, Symbole "MODE" rencontré à la place d'un des symboles suivants :
    
       + - * / , ) AT DAY YEAR ||
    
    PCB-I-0556:  Erreur irrécupérable. Corrigez les erreurs précédentes et recompilez
    Erreur à la ligne 97, colonne 66 dans le fichier 20190312_calcul_ah18.eco
                exec sql fetch CurseurA into :ficseq-age, ficseq-qte end-exec.      
     
    .................................................................1
    PCB-S-00400, Symbole "end-exe" rencontré à la place d'un des symboles suivants :
    
       . , : END-EXEC INDICATOR
    
    Erreur à la ligne 108, colonne 1 dans le fichier 20190312_calcul_ah18.eco
    PCB-S-00400, Symbole "<end-of-source>" rencontré à la place d'un des symboles su
    ivants :
    
       . ; : id END-EXEC nstring random symbol
    Symbole "END-EXEC" a été substitué à "<end-of-source>" pour continuer.
    
    PCB-I-0556:  Erreur irrécupérable. Corrigez les erreurs précédentes et recompilez
    Erreur à la ligne 92, colonne 26 dans le fichier 20190312_calcul_ah18.eco
               exec sql open CurseurA end-exec.
    .........................1
    PCB-S-00225, Identificateur SQL "CURSEURA" non déclaré
        13                           access is sequential.
    *  71-S********************************                                      **
    **    PROCEDURE DIVISION missing or unknown statement
        15 DATA DIVISION.
    *  82-S****                                                                  **
    **    COBOL Division or Section header encountered in incorrect order
       339     exec sql declare CurseurA cursor for
    * 149-S********                                                              **
    **    No SQL directives have been set
       390      exec sql fetch CurseurA into :ficseq-age, ficseq-qte end-exec.
    * 149-S*********                                                             **
    **    No SQL directives have been set
       400 STOP RUN.
    *  77-S                                                                      **
    **    Unexpected end of source within EXEC
    cob64: error(s) in compilation: 20190312_calcul_ah18.cob

  7. #7
    Expert éminent
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    novembre 2012
    Messages
    1 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2012
    Messages : 1 246
    Points : 7 810
    Points
    7 810

    Par défaut

    Je rame un peu car je suis habitué à COBOL sur MAINFRAME et AS400. Mais je cherche !

    * envoi du curseur vers le fichier csv de sortie via le modèle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     * déclaré plus haut dans le programme     
          *     exec sql fetch CurseurA into :ENR-ficseq end-exec.
                exec sql fetch CurseurA into :ficseq-age, ficseq-qte end-exec.       
               move ????? 
               to ficseq-age.
               move ";" to sep1.
               move ????? to ficseq-qte.
               write ENR-ficseq before 1.
    Voilà ce que je mettrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          * déclaré plus haut dans le programme     
          *     exec sql fetch CurseurA into :ENR-ficseq end-exec.
                exec sql fetch CurseurA into :ficseq-age, :ficseq-qte end-exec.       
                        move ";" to sep1.
               write ENR-ficseq

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 448
    Points : 1 298
    Points
    1 298

    Par défaut

    Citation Envoyé par Darkzinus Voir le message
    Je rame un peu car je suis habitué à COBOL sur MAINFRAME et AS400.
    Je suis sur unix/linux en invite de commande. Cela change quelque chose niveau OS et notion ?

    Citation Envoyé par Darkzinus Voir le message
    Mais je cherche !
    Pas de souci

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    novembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur COBOL

    Informations forums :
    Inscription : novembre 2014
    Messages : 2
    Points : 2
    Points
    2

    Par défaut

    Bonjour,

    je suis peut-être à l'ouest mais à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRUNCATE(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),0 MODE ROUND_DOWN)
    ne vaudrait-il pas mieux utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ROUND(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),0,1)
    pour une troncature sans décimale ?

  10. #10
    Expert éminent
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    novembre 2012
    Messages
    1 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2012
    Messages : 1 246
    Points : 7 810
    Points
    7 810

    Par défaut

    C'est une bonne idée surtout que l'instruction ne semble pas passer au précompilateur.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 448
    Points : 1 298
    Points
    1 298

    Par défaut

    J'ai adapté le code avec un truncate en lieu et place (du trunc sql de ORacl) et du round comme l'indique cette documentation : https://www.ibm.com/support/knowledg...c/ak05400_.htm , https://www.ibm.com/support/knowledg...c/ak05290_.htm

    Citation Envoyé par Sebonemo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRUNCATE(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),0 MODE ROUND_DOWN)
    Pour cette proposition , apparemment "la même chose" que ceci : https://www.ibm.com/support/knowledg...bif_round.html , https://www.ibm.com/support/knowledg...s_sqs_1480.htm , https://www.ibm.com/support/knowledg...c/ak05380_.htm

    Citation Envoyé par Sebonemo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ROUND(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),0,1)
    Dans tous les cas je réessaie les deux solutions.

    Merci d'avance

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 448
    Points : 1 298
    Points
    1 298

    Par défaut

    J'ai refait des modifications. 2 choses à noter :

    * les alias en SQl sous cobol n'ont pas le droit d'avoir de - ou de _ . Genre "as toto " est correct , " as to_to " ou " as to-to " sont faux
    * les join n'existe pas en sql cobol et il faut réutiliser l'ancienne méthode avec table1.champ1=table2.champ2 . Très long et très lourd avec des grosses tables

    Voici une nième monture code avec encore moins d'erreurs par contre cette fois le compilateur en fume de la bonne :

    Code cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
        IDENTIFICATION DIVISION.
           PROGRAM-ID. calcah18.
          *programme de calcul de l'ah18 
           ENVIRONMENT DIVISION.
           CONFIGURATION SECTION.
           SPECIAL-NAMES.
               DECIMAL-POINT IS COMMA.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
    
          * declaratif du fichier de resultat
              SELECT ficresah18      ASSIGN TO DISK.
                                     access is sequential.
    
           DATA DIVISION.
           FILE SECTION.     
        
           FD  ficresah18            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/calcah18.csv".
           01  ENR-ficseq.                            
               02 ficseq-age         PIC 9(4).
               02 sep1               PIC X value ";".        
               02 ficseq-qte         Pic 9(7).        
    
           WORKING-STORAGE SECTION.
    
          * bibliotheque sql pour cobol
               Exec sql include sqlca end-exec.
               exec sql include '/fr/cobol/fichier/client' end-exec.
               exec sql include '/fr/cobol/fichier/comande1' end-exec.
               
          * debut des declaratifs sql 
               Exec sql begin declare section end-exec.
     
          * wdbase pour ouverture bdd et environnement de travail
           01  wdbase          pic x.
          * pour avoir message erreur avec debugage
           01  ws-erreur       pic -(6)9.
           01  where-error       pic x(72).
    
           01  wscli           pic X(8) value space.
           01  CODE-RET        pic s9(9) comp-5 value 0.
           
          * fin de declaratif sql
               Exec sql end declare section end-exec.
               
          * declaratif des variables autres que sql
                 
          * debut du programme
           PROCEDURE DIVISION.             
          * ouverture d'environnement de la bdd
               MOVE "R" TO WDBASE.
               call "opendb" using wdbase.
    
               OPEN output ficresah18.
    
          * programme principal
           GENERAL.
        
          * execution de code sql
                
               exec sql declare CurseurA cursor for     
               select
               ROUND(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
               TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),0,1) as lage ,
               count ( distinct (pcle)) as nbpers             
                from fr.client , fr.comande1 
                where comande1.c1clte = client.pcle
                and c1datcde between 20180701 and 20181231
                and substr(pdatnais,7,2) not like "00" 
                and substr(pdatnais,5,2) not like "00"
                and substr(pdatnais,1,4) != 9999
                and substr(pdatnais,1,4) > 1900 
                and Pnom3 not like '%DBL%'
                and ROUND(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
                TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),0,1) > 80
                group by 
                ROUND(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
                TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),0,1)
                order by
                ROUND(((TIMESTAMP_FORMAT("20181001","YYYYMMDD")-
                TIMESTAMP_FORMAT(pdatnais,"YYYYMMDD"))/365.25),0,1) asc
               END-EXEC.
               
          * envoi du code sql dans le curseur
          
               exec sql open CurseurA end-exec.
          
          * envoi du curseur vers le fichier csv de sortie via le modèle 
          * déclaré plus haut dans le programme     
               exec sql fetch CurseurA into :ENR-ficseq end-exec.
          *    exec sql fetch CurseurA into :ficseq-age , ficseq-qte end-exec.       
               move lage to ficseq-age.
               move ";" to sep1.
               move nbpers to ficseq-qte.
               write ENR-ficseq before 1.
     
           FIN-GENERAL.
           
           CLOSE ficresah18.
           STOP RUN.

    Des codes d'erreurs qui se baladent :

    Citation Envoyé par log cobol
    PCB-S-0004: UNSAFE_NULL=YES doit être utilisé avec DBMS=V7 ou V8 et MODE=ORACLE
    Erreur à la ligne 62, colonne 12 dans le fichier 20190312_calcul_ah18.eco
    exec sql declare CurseurA cursor for ^M
    ...........1
    Les admins réseaux ont fait des maintenance sur Oracle vendredi 8 mars. Le dernier script cobol qui a tourné le vendredi 1 mars ne m'a pas sorti cela. Je cherche aussi si des paramètres ont bougé .

    Citation Envoyé par log cobol
    PCB-S-00576, PLS-201: l'identificateur '00' doit être déclaré
    Erreur à la ligne 62, colonne 12 dans le fichier 20190312_calcul_ah18.eco
    exec sql declare CurseurA cursor for ^M
    ...........1
    Le seul "identificateur" à "00" est une condition obligatoire qui éjecte des chaine contenant "19990000" par exemple . Sinon la conversion de chaine a date crash (mois et jour) doivent être différent de 0.

    Citation Envoyé par log cobol
    PCB-S-00576, PLS-0: SQL Statement ignored
    Erreur à la ligne 91, colonne 42 dans le fichier 20190312_calcul_ah18.eco
    exec sql fetch CurseurA into :ENR-ficseq end-exec.^M
    .........................................1
    J'ai remplacé ' par " . C'est pas plutôt " par 2 ' collées ?

    Citation Envoyé par log cobol
    PCB-S-00223, Variable "ENR-FICSEQ" non déclarée
    13 access is sequential.
    * 71-S******************************** **
    ** PROCEDURE DIVISION missing or unknown statement
    15 DATA DIVISION.
    * 82-S**** **
    ** COBOL Division or Section header encountered in incorrect order
    446 move lage to ficseq-age.
    * 12-S************* **
    ** Operand LAGE is not declared
    448 move nbpers to ficseq-qte.
    * 12-S*************** **
    ** Operand NBPERS is not declared
    cob64: error(s) in compilation: 20190312_calcul_ah18.cob
    Dans ce cas présent je saute au plafond ! Ou le compilateur est complétement miro ou les développeurs de sont vraiment incompétents notoire

    La déclaration est parfaitement visible dans l'algorithme ... Pour preuve je cite monde cobol :

    * declaratif du fichier de resultat
    SELECT ficresah18 ASSIGN TO DISK.
    access is sequential.

    DATA DIVISION.
    FILE SECTION.

    FD ficresah18 LABEL RECORD STANDARD
    VALUE OF FILE-ID "/wrk/calcah18.csv".
    01 ENR-ficseq.
    02 ficseq-age PIC 9(4).
    02 sep1 PIC X value ";".
    02 ficseq-qte Pic 9(7).

  13. #13
    Membre émérite
    Homme Profil pro
    Ingénieur Exploitation Mainframe
    Inscrit en
    octobre 2005
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Exploitation Mainframe
    Secteur : Finance

    Informations forums :
    Inscription : octobre 2005
    Messages : 1 353
    Points : 2 827
    Points
    2 827

    Par défaut

    Bonjour,

    J'ai l'impression que tu as un problème de décalage de 3 caractères sur la première ligne de ton programme.

    IDENTIFICATION DIVISION devrait commencer en marge A de la ligne (au sens COBOL), c'est à dire en colonne 8.

    Vérifie aussi le cadrage des autres lignes ...

    EDIT : Si tu est sous LINUX, pourquoi vouloir faire ça en COBOL ? il doit y avoir plein d'autres langages sous LINUX, non ?

  14. #14
    Expert éminent
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    novembre 2012
    Messages
    1 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2012
    Messages : 1 246
    Points : 7 810
    Points
    7 810

    Par défaut

    Citation Envoyé par tanaka59 Voir le message
    J'ai refait des modifications. 2 choses à noter :

    * les alias en SQl sous cobol n'ont pas le droit d'avoir de - ou de _ . Genre "as toto " est correct , " as to_to " ou " as to-to " sont faux


    * les join n'existe pas en sql cobol et il faut réutiliser l'ancienne méthode avec table1.champ1=table2.champ2 . Très long et très lourd avec des grosses tables.
    => pour le "-" c'est certain par contre je n'ai jamais eu de problème avec les "_".
    => Le inner join, left outer join, exception join ... sont parfaitement supportés en COBOL sous MVS/AS400 (depuis bon nombres de versions des différents OS). Dans ce cas, c'est plutôt le compilateur sous LINUX qui est "obsolète".

    Les variables numériques réceptrices de données issues de SQL elles doivent être signées (je n'avais pas fait attention).

    Par contre comme Luc Orient, je m'interroge sur la nécessité d'écrire un programme. C'est le genre de chose que je mets dans une procédure SQL (avec un create table) puis un envoi vers un dépôt de données(sur l'AS400, j'imagine qu'il est possible de faire de même sous LINUX).

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 448
    Points : 1 298
    Points
    1 298

    Par défaut

    Bonjour

    Citation Envoyé par Luc Orient Voir le message
    J'ai l'impression que tu as un problème de décalage de 3 caractères sur la première ligne de ton programme.
    Je viens de repasser et de retravailler l'alignement de mon programme . Plus de souci de ce côté la avec les étiquettes et commentaire.

    Citation Envoyé par Luc Orient Voir le message
    IDENTIFICATION DIVISION devrait commencer en marge A de la ligne (au sens COBOL), c'est à dire en colonne 8.
    Correction faite

    Citation Envoyé par Luc Orient Voir le message
    EDIT : Si tu est sous LINUX, pourquoi vouloir faire ça en COBOL ? il doit y avoir plein d'autres langages sous LINUX, non ?
    C'est dans le cadre d'une reprise de portefeuille d'activité dans un service , les programmes sont en COBOL sous linux. La direction impose le COBOL qui y est historique . Surtout pour des raisons de maintenance les équipes ne font que du COBOL (marketing, informatique, compta ... ) .

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 448
    Points : 1 298
    Points
    1 298

    Par défaut

    Bonjour,

    Après de nombreux test une programme qui fonctionne , par contre loin d'être parfait :

    Code cobol : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
           IDENTIFICATION DIVISION.
           PROGRAM-ID. calcah18.
          *programme de calcul de l'ah18 
           ENVIRONMENT DIVISION.
           CONFIGURATION SECTION.
           SPECIAL-NAMES.
               DECIMAL-POINT IS COMMA.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
    
          * declaratif du fichier de resultat
              SELECT ficresah18      ASSIGN TO DISK.
          *    " access is sequential " est optionnel , sinon enelver 
          *    le point du dessus pour avoir les deux instructions
          *    et la balise de fin en .
          *                      access is sequential.
                       
           DATA DIVISION.
           FILE SECTION.     
        
           FD  ficresah18            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/calcah18.csv".
           01  ENR-ficseq.                            
               02 ficseq-age         PIC 9(4).
               02 sep1               PIC X value ";".        
               02 ficseq-qte         Pic 9(7). 
               02 sep2               PIC X value ";". 
               02 ficseq-chariot     PIC X(1).
                   
    
           WORKING-STORAGE SECTION.
    
          * bibliotheque sql pour cobol
               Exec sql include sqlca end-exec.
               Exec sql begin declare section end-exec.
               exec sql include '/fr/cobol/fichier/client' end-exec.
               exec sql include '/fr/cobol/fichier/comande1' end-exec.
               
          * debut des declaratifs sql 
               
     
          * wdbase pour ouverture bdd et environnement de travail
           01  wdbase          pic x.
          * pour avoir message erreur avec debugage
           01  ws-erreur       pic -(6)9.
           01  where-error       pic x(72).
    
           01  wscli           pic X(8) value space.
           01  CODE-RET        pic s9(9) comp-5 value 0.
           
           01 v-age   PIC 9(4) value 0.
           01 v-qte   Pic 9(7) value 0.
           01 v-agepass1   PIC 9(4) value 0.
           01 v-agepass2   PIC 9(4) value 0.
           01 v-sqlcode   PIC 9(4) value 0.
           
          * fin de declaratif sql
               Exec sql end declare section end-exec.
               
          * declaratif des variables autres que sql
    
                 
          * debut du programme
           PROCEDURE DIVISION.             
           DEBUT-TOUT.
          * ouverture d'environnement de la bdd
               MOVE "R" TO WDBASE.
               call "opendb" using wdbase.
    
               OPEN output ficresah18.
    
          * programme principal
           GENERAL.
        
          * execution de code sql
                
                exec sql declare CurseurA cursor for     
                select
                trunc(((to_date('20181001','YYYYMMDD')-
                to_date(pdatnais,'YYYYMMDD'))/365.25),0)
                ,
                count ( distinct (pcle))  
                from client,comande1             
                where  c1clte=pcle and
                c1datcde between 20180701 and 20181231
                and substr(pdatnais,7,2) not like '00' 
                and substr(pdatnais,5,2) not like '00'
                and substr(pdatnais,1,4) != '9999'
                and substr(pdatnais,1,4) > '1900' 
                and Pnom3 not like '%DBL%'
                and trunc(((to_date('20181001','YYYYMMDD')- 
                to_date(pdatnais,'YYYYMMDD'))/365.25),0) > 79
                group by 
                trunc(((to_date('20181001','YYYYMMDD')-
                to_date(pdatnais,'YYYYMMDD'))/365.25) , 0 )
                order by
                trunc( ((to_date('20181001','YYYYMMDD')-
                to_date(pdatnais,'YYYYMMDD'))/365.25) , 0 )  asc
               END-EXEC.
               
          * envoi du code sql dans le curseur
          
               exec sql open CurseurA end-exec.
          
          * envoi du curseur vers le fichier csv de sortie via le modèle 
          * déclaré plus haut dans le programme 
    
           looping.
           move v-age to v-agepass1.
               exec sql fetch CurseurA into :v-age,:v-qte end-exec.
               if sqlcode = 0
                  move v-age to ficseq-age
                  display v-age
                  move ";" to sep1
                  move v-qte to ficseq-qte
                  move ";" to sep2
                  move x"0A0D" to ficseq-chariot     
                  display v-qte
                  write ENR-ficseq
                  if v-agepass1 = v-age
                      go to end-looping
                  else go to looping.  
           end-looping.                    
    
           FIN-GENERAL.
           FIN-TOUT.
           
           CLOSE ficresah18.
           STOP RUN.

    Merci de donner votre avis.

  17. #17
    Expert éminent
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    novembre 2012
    Messages
    1 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2012
    Messages : 1 246
    Points : 7 810
    Points
    7 810

    Par défaut

    Si ça fonctionne c'est déjà une bonne progression ! le programme étant relativement basique je pense que c'est l'essentiel.

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 448
    Points : 1 298
    Points
    1 298

    Par défaut

    Bonjour,

    Citation Envoyé par Darkzinus Voir le message
    => pour le "-" c'est certain par contre je n'ai jamais eu de problème avec les "_".
    J'ai eu un message d'erreur lors du débogage qui stipulé que les tirets et underscore sont interdit.

    Citation Envoyé par Darkzinus Voir le message
    => Le inner join, left outer join, exception join ... sont parfaitement supportés en COBOL sous MVS/AS400 (depuis bon nombres de versions des différents OS). Dans ce cas, c'est plutôt le compilateur sous LINUX qui est "obsolète".
    Etrange que les "join" passent. Récemment j'ai vu passer une vieille doc Ocacle ou le bon vieux table1.champ1#=table2.champ2 (avec dièse) remplaçait le join ... D'ou le remplacement par un = au lieu du inner dans mon code Esql/COBOL/Informix.

    Citation Envoyé par Darkzinus Voir le message
    Les variables numériques réceptrices de données issues de SQL elles doivent être signées (je n'avais pas fait attention).
    Signer les variables c'est à dire ?

    Citation Envoyé par Darkzinus Voir le message
    Par contre comme Luc Orient, je m'interroge sur la nécessité d'écrire un programme. C'est le genre de chose que je mets dans une procédure SQL (avec un create table) puis un envoi vers un dépôt de données(sur l'AS400, j'imagine qu'il est possible de faire de même sous LINUX).
    La requête ici présente a surtout pour but de faire fonctionner a minima un requête SQL via un code COBOL. J'avais besoin de faire un test pour valider le bon fonctionnement d'une jointure entre table pour de la remonté de données .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete pour convertir en datetime dans CSV
    Par maxdata dans le forum Requêtes
    Réponses: 7
    Dernier message: 19/12/2013, 17h42
  2. Réponses: 1
    Dernier message: 28/08/2012, 16h15
  3. Réponses: 11
    Dernier message: 12/02/2009, 19h42
  4. Réponses: 1
    Dernier message: 24/08/2006, 22h07
  5. Comptage de mots dans une chaîne
    Par kikinou dans le forum Pascal
    Réponses: 10
    Dernier message: 01/01/2003, 03h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo