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/12/2010, 13h30   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 5
Points : 0
Points : 0
Par défaut Modif du '.' en ',' dans une zone de saisie

Bonjour,

Dans un DSPF, j'utilise une zone numérique définie de la façon suivante :

Name++++++RLen++TDpBLinPos
YC_PRXVIG 6 2B 13 17

Cette zone est en saisie et j'aimerais savoir s'il existe une astuce afin que lors de la saisie du prix, la saisie d'un point ou d'une virgule soit considérée comme un séparateur décimal.

Actuellement, seule la virgule fonctionne, avec le point ça ne fonctionne pas.
Par exemple, si je saisis 4.75 , dans la zone je me retrouve avec 475 ...

Si ce n'est pas possible que le point et la virgule soient définies comme séparateur décimal simultanément, comment définir le point comme séparateur pour une seul RPG ?

Merci d'avance pour vos idées.
pc400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 13h44   #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
Citation:
Envoyé par pc400
Si ce n'est pas possible que le point et la virgule soient définies comme séparateur décimal simultanément...
En effet, ce n'est pas possible.
Citation:
Envoyé par pc400
...comment définir le point comme séparateur
Pas de zéro avant le point - Exemple : .123
Avec un zéro avant le point - Exemple : 0.123
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 16h51   #3
Invité de passage
 
Inscription : décembre 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 5
Points : 0
Points : 0
J'ai testé en rajoutant DECEDIT('.') en carte H , le résultat reste le même, lors de la saisie de la zone, le point n'est pas pris en compte et mon fichier est alimenté avec une valeur fausse. (idem avec DECEDIT('0.')

Par contre en faisant un CHGJOB DECFMT(*BLANK) avant l'appel de mon RPGLE et un CHGJOB DECFMT(J) après l'appel, j'obtiens bien le résultat voulu ... mais cette solution ne me plait pas trop.
pc400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 17h04   #4
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
Il faut que tu indiques un Edit Code dans les DDS de ton écran :

Code :
A            YC_PRXVIG      6Y 2B 13 17EDTCDE(L)
Ici, j'ai choisi le code édition " L " pour afficher le cas échéant un zéro avant la virgule ou le point et le signe à droite (0,123-), mais tu peux en choisir un autre à ta convenance parmi ceux qui suivent :
Code :
1
2
3
4
5
6
7
8
9
10
11
Edit Code                No    CR   -Sign  -Sign 
Description              Sign  Sign  (R)    (L)  
                                                 
Commas and zero balances    1    A    J    N     
Commas                      2    B    K    O     
Zero balances               3    C    L    P     
No commas or zero balances  4    D    M    Q     
User-defined edit codes     5-9                  
Date edit (4 digits)        W                    
Date edit                   Y                    
Suppress leading zeros      Z
Il faut laisser la spécif H dans ton programme codée comme je te l'ai indiqué précédemment.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 17h35   #5
Invité de passage
 
Inscription : décembre 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 5
Points : 0
Points : 0
Merci pour tes réponses Mercure,
je ne me suis pas très bien expliqué alors rien de tel que des images parlantes.
J'ai bien un EDTCDE(4) dans mon DSPF

j'ai testé sur un prog avec juste une zone et voici ce que ça me donne :

Description DSPF
Code :
1
2
3
4
5
6
7
                                                                                
.....AAN01N02N03T.Name++++++RLen++TDpBLinPosFunctions+++++++++++++++++++++++++++
     A                                      DSPSIZ(24 80 *DS3)                  
     A****************************************************************          
     A          R DISPLAY_C                                                     
     A            YC_PRXVIG      6Y 2B 13 17                                    
     A                                      EDTCDE(4)
DESCRIPTION PROG :
Code :
1
2
3
4
5
6
7
8
                                                                                               
HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Comments++++++++++++
H DECEDIT('.')                                                                                 
FPOINTFM   CF   E             WORKSTN                                                          
 *===============================================================*                             
C                   eval      YC_PRXVIG = 3,89                                                 
C                   EXFMT     Display_C                                                        
C                   seton                                        LR
et voici l'exécution du DEBUG :

Dans la zone s'affichant, je saisis 4.01. A l'écran, j'ai bien 4.01 qui s'affiche mais voici ce que je récupère dans ma zone à la sortie du EXFMT :

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
                              Source d'un module                               
                                                                               
Programme:   POINTP         Biblio:   PCLEQUIN       Module:   POINTP          
     1           *MODULE ENTRY AND MAIN PROCEDURE ENTRY                        
     2          1 H DECEDIT('.')                                               
     3          2 FPOINTFM   CF   E             WORKSTN                        
     4          3  *========================================================== 
     5          4=IDISPLAY_C                                                   
     6          5=I                             S    1    6 2YC_PRXVIG         
     7          6 C                   eval      YC_PRXVIG = 3,89               
     8          7 C                   EXFMT     Display_C                      
     9          8 C                   seton                                    
    10          9=ODISPLAY_C                                                   
    11         10=O                       YC_PRXVIG            6S ZONE      6, 
    12           *MAIN PROCEDURE EXIT                                          
                                                                               
                                                                               
                                                                               
                                                                           Fin 
Débogage                                                                       
                                                                               
F3=Arrêter programme           F6=Ajouter/Effacer pt arrêt   F10=Pas à pas     
F11=Variable   F12=Reprendre   F17=Guet de variable   F24=Autres touches       
YC_PRXVIG = 0401.00
le 4.01 de l'écran s'est transformé en 0401.00
Mon boss va être OK de multiplier le prix par 100 mais les clients risquent de pleurer
pc400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 18h06   #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
Mais c'est parce que tu te contredis ! En effet, dans ton programme, tu as spécifié c'est à dire que tu vas employer le point décimal dans tout le programme, y compris lors de la saisie écran.

et tu saisis la valeur avec une virgule au lieu d'un point.

Il faut que tu sois cohérent et fasses ta saisie en conformité avec la spécif H.

Remarque
Qu'est ce que c'est que cet "eval YC_PRXVIG = 3,89" au beau milieu du programme ?
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 18h18   #7
Invité de passage
 
Inscription : décembre 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 5
Points : 0
Points : 0
Non non, j'ai bien saisi 4 point 01 dans la zone

Le 3,89 c'est pour simuler l'initialisation de la zone, vu que dans le "vrai" programme, cette zone est initialisée à partir d'un fichier.

Mais même en supprimant cette ligne, j'obtiens le même résultat.
pc400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 18h41   #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
Je viens de tester sur un iSeries V5R3 avec EDTCDE(4) et DECEDIT('.') et ça marche à tous les coups. J'ai vérifié sous debug. Mais évidemment, si tu tapes 4,01 (avec virgule), tu obtiens bien 401.00 car la virgule n'est plus significative à cause de la spécif H.

Refais un test, tu dois te tromper quelque part.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h46.


 
 
 
 
Partenaires

Hébergement Web