a l'éxécution de mon RPGLE j'ai le message :
le %scanrpl n'existant pas dans ma version j'utilise un %scan puis un %replace.longueur ou position de départ hors limites pour opération sur chaine
en ligne 106
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(L_I) = 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 (l'alphabet)
     C                   Dow       L_I <= 26
     C                   Eval      L_ZonLet = L_TzoLet(L_I)
     C                   Eval      L_ZonChi = %char(L_TzoChi(L_I))
      * looper jusqu'a aucune occurence de lettre trouvee
     C                   Dou       %check(L_ZonLet: L_IbanApres) = 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(L_ZonLet : L_IbanApres)
l.106     C                   Eval      L_IbanApres = %replace(L_ZonChi:L_IbanApres
     C                                         :L_Pos:L_Pos + 1)
     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 :
     C                   Move      L_IbanApres   L_IbanAsNum
      * Les valeurs du N° de IBAN doivent former un multiple de 97 :
     C                   If        L_IbanAsNum <> 0 And
     C                             %Rem(L_IbanAsNum:97) = 1
     C                   Eval      P_Retour = 'OK'
     C                   EndIf
     C                   EVAL      *inlr = *on