comment utiliser %scan et %replace en V5R3 ?

RPG (3 et 4, free), CL, SQL, etc...
Répondre
germor
Messages : 75
Enregistré le : lun. 06 juin 2011, 08:01:43

comment utiliser %scan et %replace en V5R3 ?

Message par germor »

Bonjour, :D
a l'éxécution de mon RPGLE j'ai le message :
longueur ou position de départ hors limites pour opération sur chaine
en ligne 106
le %scanrpl n'existant pas dans ma version j'utilise un %scan puis un %replace.
quelqu'un voit il une grosse bourde dans mon code :

Code : Tout sélectionner

 
1    H debug alwnull(*Usrctl)

    * Définition parm pgm.
     D P_CodePays      S              2
     D P_ClefIban      S              2
     D P_CodeBban      S             30
     D P_Retour        S              2
     D Z1              S             10

  10    * Déclaration variables locales.
     D  L_CompLeNu     C                   'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456+
     D                                     789'
     D
     D L_IbanAvant     S             34

      * au maximum il y a 66 car car si iban est tout en lettres il y a 34 - 2 p
      * qui sont doublés donc (32*2)+2
      01* mais la limite est de 63 donc tester le nbre de caracteres de l'iban pou
      * RNF0503E L'élément numérique comporte plus de 63 chiffres (63 pris par d
     D L_IbanApres     S             66
     D L_IbanAsNum     S             63  0

     D L_CodePaysA     S              2
     D L_ClefIbanA     S              2
     D L_CodeBbanA     S             30

     D L_I             S              2  0
     D L_Pos           S              2  0

     D                 DS
     D L_TblLet                             Dim(26)
     D L_TzoLet                       1     Overlay(L_TblLet:*next)
     D L_Let           C                    'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
     D L_ZonLet        S              1

     D                 DS
     D L_TblChi                             Dim(26)
     D L_TzoChi                       2  0  Overlay(L_TblChi:*next)
     D L_ZonChi        S              2


     C     *Entry        Plist
     C                   Parm                    P_CodePays
     C                   Parm                    P_ClefIban
     C                   Parm                    P_CodeBban
     C                   Parm                    P_Retour

     C                   Eval      P_Retour = 'KO'

      * enlever les blancs
     C                   EvalR     L_CodePaysA = %Trim(P_CodePays)
     C                   EvalR     L_ClefIbanA = %Trim(P_ClefIban)
     C                   EvalR     L_CodeBbanA = %Trim(P_CodeBban)

      * concatener de l'iban
     C                   Eval      L_IbanAvant = L_CodeBbanA + L_CodePaysA
     C                                          + L_ClefIbanA

      * Tous les caractères autres que chiffres et lettres sont invalides pour u
     C                   If        Not ( %Check(L_CompLeNu:L_IbanAvant) = 0 )
     C                   EVAL      *inlr = *on
     C                   EndIf

      * charger des lettres
     C                   Eval      L_TblLet = L_Let

      * charger des chiffres
     C                   Eval      L_I = 1
     C                   Dow       L_I <= 26
     C                   Eval      L_TzoChi&#40;L_I&#41; = L_I + 9
     C                   Eval      L_I = L_I + 1
     C                   Enddo

      * stocker l'iban dans la zone de travail a parcourir
     C                   Eval      L_IbanApres = L_IbanAvant

      * initialiser les indices et compteur de positions
     C                   Eval      L_I = 1
     C                   Eval      L_Pos = 1

      * looper tant qu'il y a des lettres a chercher &#40;l'alphabet&#41;
     C                   Dow       L_I <= 26
     C                   Eval      L_ZonLet = L_TzoLet&#40;L_I&#41;
     C                   Eval      L_ZonChi = %char&#40;L_TzoChi&#40;L_I&#41;&#41;

      * looper jusqu'a aucune occurence de lettre trouvee
     C                   Dou       %check&#40;L_ZonLet&#58; L_IbanApres&#41; = 0

      * prendre la position de la lettre car le replace de champs de longueur
      * differentes impose de connaitre la position suivante de la lettre de dep
l.105     C                   Eval      L_Pos = %scan&#40;L_ZonLet &#58; L_IbanApres&#41;
l.106     C                   Eval      L_IbanApres = %replace&#40;L_ZonChi&#58;L_IbanApres
     C                                         &#58;L_Pos&#58;L_Pos + 1&#41;
     C                   Enddo

     C                   Eval      L_I = L_I + 1
     C                   Enddo

      * Les zones du IBAN sont complétées avec des 0 à la place des blancs &#58;

     C                   Move      L_IbanApres   L_IbanAsNum

      * Les valeurs du N° de IBAN doivent former un multiple de 97 &#58;
     C                   If        L_IbanAsNum <> 0 And
     C                             %Rem&#40;L_IbanAsNum&#58;97&#41; = 1
     C                   Eval      P_Retour = 'OK'
     C                   EndIf

     C                   EVAL      *inlr = *on                                     
Merci d'avance

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

%scan et %replace

Message par cmasse »

OUi je vois un problème

si le %SCAN ne trouve pas la chaîne recherchée, dans L_Pos il y a 0.

et 0 est invalide en tant que position de début de remplacement.


il faut ajouter un IF l_Pos > 0 .....
Christian Massé (Volubis.fr)

germor
Messages : 75
Enregistré le : lun. 06 juin 2011, 08:01:43

(sans texte)

Message par germor »

Merci pour la réponse :D
De plus, le Dou imbriqué dans un Dow a été changé ainsi qu'un eval dans la DS et les C dans les cartes D :?

Répondre