Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > AS/400
AS/400 Le Forum d'entraide sur IBM AS/400 - iSeries. RPG.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/03/2011, 21h02   #1
Invité régulier
 
Inscription : février 2010
Messages : 23
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 23
Points : 8
Points : 8
Par défaut SQL CLI: sqlBindCol(: SQL_NUMERIC:) -> sqlFetch() -> MCH5003

Bonjour,

Voici quelques temps que j'obtiens une erreur système, MCH5003, sans jamais êtres parvenus à identifier la cause et donc de corriger le problème.

En effet j'utilise les APIs SQL CLI en RPG ile pour éviter d'écrire en SQLRPGLE.
Tant que mes champs sélectionnés sont de type caractère (SQL_CHAR) aucun problème mais dès que je souhaite faire un select sur un champs numérique étendu (SQL_NUMERIC) j'obtiens un MCH5003 lors du fetch de la requête!

Si quelqu'un a déjà été confronté a ce problème et qu'il connaisse un moyen autre que de convertir ce champ en caractère, je serais heureux d'avoir un peu d'aide.

Par avance merci beaucoup.
Kiko93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 00h17   #2
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Colle ici stp toute l'instruction SQLBindCol et la totalité de l'instruction Fetch avec les définitions RPG des zones fetchées.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 00h31   #3
Invité régulier
 
Inscription : février 2010
Messages : 23
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 23
Points : 8
Points : 8
Je pense que je suis sur une piste. Cela concerne la manière de documenter les paramètres de la fonction SQLBindCol(). En fait il faut indiquer à la fois la partie entière et fractionnaire de la zone qui reçoit les données du Fetch pour une zone numérique.

La valeur de ces paramètres est issue du petit calcul décrit à l'url suivante:

http://www-03.ibm.com/systems/i/soft...b2/clifaq.html
à la rubrique Working with DECIMAL and NUMERIC Column Types

Je testerais demain @+.
Kiko93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 00h29   #4
Invité régulier
 
Inscription : février 2010
Messages : 23
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 23
Points : 8
Points : 8
Salut Mercure,

Apparemment je ne sait pas exploiter la piste.

Voici une partie du code,

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*---*/
Variables fetchées :

d SrcSeq          s              6s 0                               
d rlength1        s                         Like(SQLINTEGER_t)      
 *                                                                  
d SrcDate         s              6s 0                               
d rlength2        s                         Like(SQLINTEGER_t)      
 *                                                                  
d SrcCode         s            120a                                 
d rlength3        s                         Like(SQLINTEGER_t)      


SqlBind :

c                   Eval      rlength1 = 256 * %Size(SrcSeq)           
c                   If        SQLBindCol(hstmt:                        
c                             1:                                       
c                             SQL_NUMERIC:                             
c                             %addr(SrcSeq):                           
c                             %Size(SrcSeq):                           
c                             %Addr(rlength1)) = SQL_SUCCESS           
 *                                                                     
c                   Eval      rlength2 = 256 * %Size(SrcDate)          
c                   If        SQLBindCol(hstmt:                        
c                                        2:                            
c                                        SQL_NUMERIC:                  
c                                        %addr(SrcDate):               
c                                        %Size(SrcDate):               
c                                        %Addr(rlength2)) = SQL_SUCCESS
 *                                                                     
c                   Eval      rlength3 = 0                             
c                   If        SQLBindCol(hstmt:                        
c                                        3:                            
c                                        SQL_CHAR:                     
c                                        %addr(SrcCode):               
c                                        %Size(SrcCode):               
c                                        %Addr(rlength3)) = SQL_SUCCESS

Fetch :

c                   DoW       SQLFetch(hstmt) = SQL_SUCCESS 
/*---*/
Merci pour ton aide.
Kiko93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 10h05   #5
Invité régulier
 
Inscription : février 2010
Messages : 23
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 23
Points : 8
Points : 8
Bonjour,

ça y est, ça marche, j'avais inversé le calcul du 5ièm et 6ièm paramettre et le SQLBindCol se fait comme ça maintenant:

Code :
1
2
3
4
5
6
7
c                   Eval      rlength1   = %Size(SrcSeq)               
c                   If        SQLBindCol(hstmt:                        
c                                        1:                            
c                                        SQL_NUMERIC:                  
c                                        %addr(SrcSeq):                
c                                        256 * %Size(SrcSeq):                   
c                                        %Addr(rlength1)) = SQL_SUCCESS
Kiko.
Kiko93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 12h43   #6
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Tu ferais bien d'écrire

Code :
1
2
3
4
5
6
c                   If        SQLBindCol(hstmt:                        
c                                        1:                            
c                                        SQL_NUMERIC:                  
c                                        %addr(SrcSeq):                
c                                        %Len(SrcSeq) * 256 + %DecPos(SrcSeq):
au lieu de
car un jour ou l'autre, tu tomberas sur une zone qui contiendra des décimales.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 21h39   #7
Invité régulier
 
Inscription : février 2010
Messages : 23
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 23
Points : 8
Points : 8
Salut,

merci du conseil, effectivement le %Len et plus précis pour une zone packé ainsi que le %DecPos pour ne pas oublier des petits en route.

Une question concenant la fonction QSLBindCol() que je trouve fastidieuse lorsqu'il y a une trentaine de zones a Binder, y à t-il un moyen d'avoir une meilleure visibilité au niveau du code car le FETCH INTO du SQLRPGLE est bien meilleur sur ce plan là je trouve (?).

Kiko.
Kiko93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 00h40   #8
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Citation:
Envoyé par Kiko93
... y à t-il un moyen d'avoir une meilleure visibilité au niveau du code ...
Pas que je sache.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 22h44   #9
Membre Expert
 
Patrick
Inscription : mai 2008
Messages : 821
Détails du profil
Informations personnelles :
Nom : Patrick
Âge : 42
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : mai 2008
Messages : 821
Points : 1 041
Points : 1 041
Citation:
Envoyé par Kiko93 Voir le message
Salut,

merci du conseil, effectivement le %Len et plus précis pour une zone packé ainsi que le %DecPos pour ne pas oublier des petits en route.

Une question concenant la fonction QSLBindCol() que je trouve fastidieuse lorsqu'il y a une trentaine de zones a Binder, y à t-il un moyen d'avoir une meilleure visibilité au niveau du code car le FETCH INTO du SQLRPGLE est bien meilleur sur ce plan là je trouve (?).

Kiko.
Question :

Dans quel cas utilises-tu le SQLCLI :
- Pour lire des résults sets ?
- Pour lire une autre base que DB2 à travers une driver JDBC ?
- ... ?
K2R400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h16.


 
 
 
 
Partenaires

Hébergement Web