IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

AS/400 Discussion :

SQLRPG: Comptage des enreg.


Sujet :

AS/400

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 21
    Points
    21
    Par défaut SQLRPG: Comptage des enreg.
    Bonjour,

    Le comptage du nombre d'enregistrements en million en RPG étant trop long en durée, soit plus de 15 minutes, je compte le faire en source SQLRPG.

    Le comptage en Query 400 dure 1 minute, mais en source, je n'arrive pas à récupérer le compteur que crée si bien Query 400 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    Exec
    sql Select count(*) into CPT from *libl/TABLE group by CODSOCIETE;
    Endexec
    Je compte ensuite l'écrire dans une table DDS le résultat des compteurs par code société.

    Avez-vous ecxpérimenté une telle requête pourtant simple ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Bonjour,
    Déjà ta requête pose problème puisque tu fais un group by sans indiquer la zone de regroupement dans la liste des zones sélectionnées. Ce serait plutôt :
    Select CODSOCIETE, count(*) into CPT from *libl/TABLE group by CODSOCIETE
    Ensuite dans un RPG la variable CPT sera forcément une variable interne au programme et non au SQL, donc à noter ":CPT".
    Et comme tu as plusieurs résultats, il va falloir passer par un Declare du curseur, et une boucle Fetch.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Voici la syntaxe qui fonctionne dans ce source SQLRPG :

    Code : 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
    
    C                   Z-ADD     *ZEROS        CPT              12 0          
    C*                                                                         
    C     *IN20         DOWEQ     '0'                                          
    C                      READ        FICSOC                                20    
    C                      MOVE        COMPT           CODESTE            2            
    C*                                                                         
    C/EXEC SQL                                                                 
    C+ SELECT COUNT(*) INTO :CPT FROM FICAGENCE WHERE COMPT = :CODESTE GROUP BY COMPT          
    C/END-EXEC                                                               
    C                   MOVE       CPT             FIC_COMPT                   
    C                   UPDATE    FICSOC                                     
    C                   Z-ADD     *ZEROS        CPT                          
    C                   ENDIF                                                
    C*                                                                       
    C                   ENDDO
    Ainsi je boucle sur la lecture du fichier FICSOC et la met à jour du nombre de comptage en RPG.

    Déclarer des curseurs en SQL semble ardue, car cela sous-entendrait qu'il faille connaître à l'avance le nombre de codes société différent du fichier pour les allouer au nombre de curseurs pour le comptage séparé.

    Mais j'aimerais savoir comment fonctionne une telle syntaxe SQL avec surtout le bouclage sur le fichier pour le mettre à jour.

    S'il y a un courageux dans l'assistance, je suis preneur...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Alors déjà ton group by Compt ne sert pas à grand chose vu que tu sélectionnes les enregs pour un seul...
    Ensuite, il n'y a rien à savoir à l'avance pour utiliser un declare. Exemple :
    Je reprends ta requête, il suffit de déclarer la variable REQ (chaine longue, 2000 caractères par exemple). Je ne fais aucun traitement avec le compteur récupéré, tu en feras ce que tu veux...
    Code : 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
    Eval REQ = 'Select COMPT, Count(*) From FICAGENCE Group by COMPT Order by COMPT';
    Exec sql
       Prepare S1 from :REQ;                            
    Exec sql                                             
       Declare C1 Cursor For S1;                       
    Exec sql                                             
       Open C1;
    Exsr GetNextRcd;
    DoW SQLCOD = 0;
       Exsr GetNextRcd;
    EndDo;
    Close C1;
    
    BegSr GetNextRcd;
    Exec sql                   
       Fetch Next From C1 Into
         :CODESTE,              
         :CPT;              
    EndSr;

  5. #5
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Points : 275
    Points
    275
    Par défaut
    Ton exemple SQL est en dynamique, mais il n'y a pas de plus value à le faire de cette manière : autant le faire en statique, l'optimiseur sera encore plus efficace.
    Pas de prépare, juste un déclare cursor for la_requête, un open, des fetch et un close.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Je n'en suis pas certain.
    Il a une boucle de lecture sur un autre fichier, et à chaque lecture il a une requête avec sélection d'enregistrements.
    Dans le dynamique, il n'y aura qu'une seule et unique requête. D'un point de vue efficacité je pense que çà se sentira.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Merci Hurricane

    J'ai testé cette requête dans mon SQLRPG dans les cartes C+
    La syntaxe avec ";" à chaque fin de commande est étonnante.
    Donc je lis tout le fichier avec un compteur pour chaque société trouvée.

    Si je veux écrire ou mettre à jour un fichier/table , je fais le "WRITE" ou "UPDAT" dans la boucle juste après l'appel à la sous-routine EXSR et avant le ENDDO;

    Mais à la compilation, ces commandes SQL en C+ ne passent pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    *RNF7030 30     90 003700  Le nom ou l'indicateur C n'est pas défini.    
    *RNF7030 30     93 004000  Le nom ou l'indicateur C1 n'est pas défini.   
    *RNF7030 30    101 004800  Le nom ou l'indicateur DO n'est pas défini.   
    *RNF7030 30    107 005400  Le nom ou l'indicateur DESTE n'est pas défini. 
    *RNF7030 30     93 004000  Le nom ou l'indicateur LARE n'est pas défini. 
    *RNF7030 30     95 004200  Le nom ou l'indicateur N n'est pas défini.        
    *RNF7030 30     96 004300  Le nom ou l'indicateur R n'est pas défini.        
    *RNF7030 30    102 004900  Le nom ou l'indicateur SE n'est pas défini.       
    *RNF7030 30     90 003700  Le nom ou l'indicateur SQL n'est pas défini.      
    *RNF7030 30    104 005100  Le nom ou l'indicateur SR n'est pas défini.       
    *RNF7030 30    108 005500  Le nom ou l'indicateur T n'est pas défini.        
    *RNF7030 30    100 004700  Le nom ou l'indicateur TE n'est pas défini.
    Je pense qu'il y a un décalage dans la manière d'écrire ces commandes sur les cartes C+ ...

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 940
    Points : 1 409
    Points
    1 409
    Par défaut
    Les points virgules à chaque ligne viennent de la notation en format libre.
    Mais as-tu ajouté les lignes /Free et /End-Free ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Non, mais en rajoutant /FREE et /END-FREE au début des commandes SQL et à la fin, la compilation signale :

    Code : 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
    
    Message . . . . :   La précompilation SQL n'a pas abouti.                 
    Cause . . . . . :   Le précompilateur SQL a rencontré des erreurs lors du 
                            traitement du programme source.
    
    ======================================
    
    MSG ID  SEV  RECORD  TEXT                                                         
    SQL0010  35      35  Position 20 String constant beginning 'SELECT C' not         
                         delimited.                                                   
    SQL0010  35      35  Position 20 String constant beginning 'SELECT C' not         
                         delimited.                                                   
    SQL0104  30      37  Position 7 Token + was not valid. Valid tokens: ( CL END     
                         GET SET CALL DROP FREE HOLD LOCK OPEN WITH ALTER BEGIN.      
    SQL0104  30      39  Position 7 Token + was not valid. Valid tokens: ( CL END     
                         GET SET CALL DROP FREE HOLD LOCK OPEN WITH ALTER BEGIN.      
    SQL0104  30      41  Position 7 Token + was not valid. Valid tokens: ( CL END     
                         GET SET CALL DROP FREE HOLD LOCK OPEN WITH ALTER BEGIN.      
    SQL0104  30      52  Position 7 Token + was not valid. Valid tokens: ( CL END     
                         GET SET CALL DROP FREE HOLD LOCK OPEN WITH ALTER BEGIN.      
                        Message Summary                                               
      Total     Info   Warning      Error   Severe  Terminal                          
          6        0         0          0        6         0                          
    35 level severity errors found in source
    J'ai l'impression que la carte C+ n'accepte pas cette syntaxe de commandes

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 940
    Points : 1 409
    Points
    1 409
    Par défaut
    /free ne concerne pas que les instructions SQL.
    Il faut un /Free avant la première ligne C et un /End-free après la dernière ligne EndSR

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Oui , au début et à la fin :

    Code : 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
    
    C/FREE
    C+ EVAL REQ = 'SELECT COMPT, COUNT(*) FROM FICAGENCE Group by COMPT';   
    C+ EXEC SQL                                                                     
    C+ PREPARE S1 FROM :REQ;                                                        
    C+ EXEC SQL                                                                     
    C+ DECLARE C1 CURSOR FOR S1;                                                    
    C+ EXEC SQL                                                                     
    C+ OPEN C1;                                                                     
    C+ EXSR LECTURE;                                                                
    C*                                                                              
    C+ DOW SQLCOD = 0;                                                              
    C+ EXSR LECTURE;                                                                
    C+ WRITE FICSOC;                                                                
    C+ ENDDO;                                                                       
    C+ CLOSE C1;                                                                    
    C*                                                                              
    C+ BEGSR LECTURE;                                                               
    C+ EXEC SQL                                                                     
    C+ FETCH NEXT FROM C1 INTO                                                      
    C+ :CODESTE,                                                                     
    C+ :CPT;                                                                        
    C+ ENDSR;    
    C/END-FREE
    Et la compile se plante toujours sur ces instructions.

  12. #12
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Heu, les C en début de ligne... pas entre les balises /Free et /End-Free !

  13. #13
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 940
    Points : 1 409
    Points
    1 409
    Par défaut
    La syntaxe avec free-formest plutôt celle-ci :
    Code : 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
    C/FREE
    C REQ = 'SELECT COMPT, COUNT(*) FROM FICAGENCE Group by COMPT';   
    C EXEC SQL PREPARE S1 FROM :REQ;          
    C EXEC SQL DECLARE C1 CURSOR FOR S1;
    C EXEC SQL OPEN C1;
    C EXSR LECTURE;                                                                
    C*                                                                              
    C DOW SQLCOD = 0;                                                              
    C EXSR LECTURE;                                                                
    C WRITE FICSOC;                                                                
    C ENDDO;                                                                       
    C EXEC SQL CLOSE C1;                                                                    
    C*                                                                              
    C BEGSR LECTURE;                                                               
    C EXEC SQL                                                                     
    C FETCH NEXT FROM C1 INTO                                                      
    C :CODESTE,                                                                     
    C :CPT;                                                                        
    C ENDSR;    
    C/END-FREE
    Mais je viens de me rendre compte que ça ne marche pas sur une machine V5R3. Ca a du apparaître en V5R4

    Voici le code refait sans Free-form :
    Code : 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
     *                                                         
     *  Compte le nombre d'enregistrements par société         
     *                                                         
    D Req             S            512    Varying              
    D CodeSte         S              2                         
    D CptSte          S              5  0                      
    C                   Eval      Req='Select COMPT,Count(*)'  
    C                   Eval      Req=Req+' from FICAGENCE'    
    C                   Eval      Req=Req+' group by COMPT'    
    C                   Eval      Req=Req+' order by COMPT'    
    C/Exec SQL                                                 
    C+ Prepare S1 from :Req                                    
    C/End-Exec                                                 
    C/Exec SQL                                                 
    C+ Declare C1 Cursor For S1                                
    C/End-Exec                                                 
    C/Exec SQL                                                 
    C+ Open C1                                                 
    C/End-Exec                                                 
    C                   Eval      SQLCOD = 0                   
    C                   Dow       SQLCOD = 0      
    C/EXEC SQL                                    
    C+ Fetch Next From C1 Into :CODESTE, :CPTSTE  
    C/End-Exec                                    
    C*****                                        
    C***** ici, CODESTE et CPTSTE sont à traiter  
    C*****                                        
    C                   Enddo                     
    C/Exec SQL                                    
    C+ Close C1                                   
    C/End-Exec                                    
    C                   Eval      *INLR = *ON
    Et là ça compile en V5R1

  14. #14
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Heu non... ta syntaxe format libre n'est pas bonne... Elle ne compilera avec rien, toujours ces cartes C dans un format libre...

    Citation Envoyé par FORMULARY Voir le message
    La syntaxe avec free-formest plutôt celle-ci :
    Code : 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
    C/FREE
    C REQ = 'SELECT COMPT, COUNT(*) FROM FICAGENCE Group by COMPT';   
    C EXEC SQL PREPARE S1 FROM :REQ;          
    C EXEC SQL DECLARE C1 CURSOR FOR S1;
    C EXEC SQL OPEN C1;
    C EXSR LECTURE;                                                                
    C*                                                                              
    C DOW SQLCOD = 0;                                                              
    C EXSR LECTURE;                                                                
    C WRITE FICSOC;                                                                
    C ENDDO;                                                                       
    C EXEC SQL CLOSE C1;                                                                    
    C*                                                                              
    C BEGSR LECTURE;                                                               
    C EXEC SQL                                                                     
    C FETCH NEXT FROM C1 INTO                                                      
    C :CODESTE,                                                                     
    C :CPT;                                                                        
    C ENDSR;    
    C/END-FREE
    C'est plutôt çà :
    Code : 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
    C/Free
    
      REQ = 'SELECT COMPT, COUNT(*) FROM FICAGENCE Group by COMPT';   
      Exec SQL Prepare S1 From :REQ;          
      Exec SQL Declare C1 Cursor For S1;
      Exec SQL Open C1;
      ExSr LECTURE;                                                                
                                                                                  
      DoW SQLCOD = 0;                                                              
        ExSr LECTURE;                                                                
        Write FICSOC;                                                                
       EndDo;
      Exec SQL Close C1;                                                                    
                                                                                  
      BegSr LECTURE;                                                               
        Exec SQL                                                                     
        Fetch Next From C1 Into :CODESTE, :CPT;
      EndSr;    
    
    C/End-Free

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Merci pour vos deux solutions intéressantes, et si ça fonctionne car vous les avez testé, c'est encore mieux

    Toutefois, si je comprend bien, il n'est plus besoin de déclarer aucun fichier dans la carte F ni besoin de d'effectuer la boucle sur la lecture du premier fichier FICAGENCE...Tout en SQL

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Au fait ma question était dans le cas de l'exemple de FORMULARY pour du SQL dynamique, faut-il déclarer le fichier en écriture dans une carte F pour pouvoir effectuer un WRITE du fichier ?
    Pour reprendre la boucle du DO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    C                   Eval       SQLCOD = 0                   
    C                   Dow       SQLCOD = 0  
    C/EXEC SQL                                    
    C+ Fetch Next From C1 Into :CODESTE, :CPTSTE  
    C/End-Exec                                    
    C*    
    C                   Move     CODESTE         FIC_CODSOC                            
    C                   Move     CPTSTE            FIC_COMPT  
    C                   Write     FICSOC                 
    C*                                   
    C                   Enddo
    Ou ne pas déclarer le fichier en carte F et passer en SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    C                   Dow       SQLCOD = 0      
    C/EXEC SQL                                    
    C+ Fetch Next From C1 Into :CODESTE, :CPTSTE  
    C/End-Exec                                    
    C*                                        
    C/EXEC SQL
    C+ Insert into FICSOC (Code societe, Compteur) values (:CODESTE, :CPTSTE) 
    C/End-Exec 
    C*                                        
    C                   Enddo                     
    C/Exec SQL

  17. #17
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 940
    Points : 1 409
    Points
    1 409
    Par défaut
    Si on veut utiliser l'instruction write, on doit bien sûr déclarer le fichier en carte F. Du coup, on a une ouverture du fichier au début du programme et une fermeture du fichier à la fin.
    La boucle avec insert ouvre et ferme le fichier à chaque exécution.
    Ce n'est pas important si il y a 4 sociétés au total, ça peut le devenir si la boucle insert est exécutée des milliers de fois.
    Note : Je ne pense à ça que maintenant, mais on peut faire une seule instruction SQL plutôt qu'une boucle !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C/EXEC SQL
    C+ Insert into FICSOC (Code societe, Compteur)
    C+ Select code société, count(*) from ficagence
    C+ group by code société order by code société
    C/End-Exec
    J'ai même tendance à dire que la ligne group by est inutile ...

  18. #18
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Personnellement je mettrais tout en SQL.
    Une seule logique dans la mesure du possible. Et comme dans le cas présent, l'utilisation de SQL pour la récupération du compteur semble évidente...

    Edit :
    Ah une autre réponse entre temps.
    Le group by est obligatoire, sinon tu auras le compteur total, pas celui de chaque société. Mais bien vu le coup de la requête unique. Mais j'y pense j'espère que le fichier FICSOC est vide avant l'appel du programme...

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    En tout SQL, la compilation pose un souci au niveau de la fin de programme, alors j'ai r'ajouté le SETON = *ON
    Mais les balises Free posent soucis. Voici les dernières lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    C/END-FREE                                                    
                                                                  
    C                   EVAL      *INLR = *ON                     
                                                                  
    C/FREE                                                        
       BEGSR LECTURE;                                             
       EXEC SQL FETCH NEXT FROM C1 INTO :CMP_CODCMP, :CMP_CODC05; 
       ENDSR;                                                     
    C/END-FREE
    Pour faaire passer le *INLR = *ON avant la sous-routine, j'ai remis les balises Free, et cela pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
       146 C/END-FREE                                                                      
    ======>aa                                                                              
    *RNF5505 30 a      003000  Positions 6-7 are not blank in a free-format calculation specification.
    Comment terminé un source SQL proprement sans souci de balises Free ?

  20. #20
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Vire moi ces cartes C devant les ordres /Free et /End-Free !
    Et puis, franchement tu pouvais laisser la ligne en Free...
    Eval *InLR = *On;

Discussions similaires

  1. Problème avec fListeFichier : comptage des fichiers
    Par Cazaux-Moutou-Philippe dans le forum WinDev
    Réponses: 2
    Dernier message: 23/10/2006, 21h09
  2. affichage des enreg. dans sous-formulaire
    Par OBIWAN64 dans le forum Access
    Réponses: 5
    Dernier message: 27/04/2006, 08h10
  3. Unlock des enreg lockés sous une session inconnue
    Par Maglight dans le forum Oracle
    Réponses: 7
    Dernier message: 16/02/2006, 11h36
  4. Unlock des enreg lockés sous une session inconnue
    Par Maglight dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/02/2006, 16h44
  5. [STATS] Outils de comptage des E/S
    Par BiM dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 08/08/2005, 12h00

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