Wiki source code of Modulo 97 d'un IBAN
Last modified by Francis Longhitano on 2012/02/17 23:10
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | Ce code permet de faire le calcul du modulo 97 pour un code IBAN. | ||
| 2 | Le code IBAN en entrée est déjà au format numérique et ce après remplacement des caractères dans la chaîne initiale par les valeurs de substitution. | ||
| 3 | |||
| 4 | Avec l'exemple ci-dessous, le modulo résultant doit fournir la valeur '03'. | ||
| 5 | |||
| 6 | Le programme fait appel à une fonction VBScript pour réaliser le calcul. | ||
| 7 | |||
| 8 | |||
| 9 | |||
| 10 | {{code title="DECL" language="none"}} | ||
| 11 | ALPHA(36) W_IBAN_A /* Valeur en entrée | ||
| 12 | ALPHA(2) R_CLE_IBAN /* Valeur en retour | ||
| 13 | |||
| 14 | ALPHA(36) ParamS | ||
| 15 | NUM_BIN_4 NbElts | ||
| 16 | NUM_BIN_4 CodeRetour | ||
| 17 | NUM_BIN_4 Indice | ||
| 18 | NUM_BIN_4 Wlg_Chaine | ||
| 19 | |||
| 20 | {{/code}} | ||
| 21 | |||
| 22 | |||
| 23 | |||
| 24 | {{code title="INIT_PGM" language="none"}} | ||
| 25 | W_IBAN_A = '37100110002007502831333159152700' | ||
| 26 | |||
| 27 | |||
| 28 | CHARGER_DLL 'VaToCom' | ||
| 29 | * Initialisation de la DLL (un seul appel est utile) | ||
| 30 | APPELER_DLL 'VaToCom' 'Initialize' CodeRetour | ||
| 31 | |||
| 32 | * Chargement du script | ||
| 33 | APPELER_DLL 'VaToCom' 'AddScript' 'Calculmodulo.vbs' CodeRetour | ||
| 34 | |||
| 35 | * Indication du nombre de paramètres d’entrée | ||
| 36 | APPELER_DLL 'VaToCom' 'CreateParameters' 1 CodeRetour | ||
| 37 | |||
| 38 | * Remplissage des paramètres d’entrée | ||
| 39 | ParamS = W_IBAN_A | ||
| 40 | APPELER_DLL 'VaToCom' 'SetStringParameter' 0 ParamS CodeRetour | ||
| 41 | |||
| 42 | * Exécution d’une fonction contenue dans le script | ||
| 43 | APPELER_DLL 'VaToCom' 'Execute' 'Calcul' CodeRetour | ||
| 44 | |||
| 45 | * Récupération de la taille du tableau global | ||
| 46 | APPELER_DLL 'VaToCom' 'GetParameterSize' -1 NbElts CodeRetour | ||
| 47 | |||
| 48 | * Récupération des éléments du tableau | ||
| 49 | Indice = 0 | ||
| 50 | TANT_QUE Indice < NbElts | ||
| 51 | |||
| 52 | * Récupération élément du tableau | ||
| 53 | Wlg_Chaine = 2 | ||
| 54 | APPELER_DLL 'VaToCom' 'GetStringParameter' Indice 0 R_CLE_IBAN Wlg_Chaine CodeRetour | ||
| 55 | |||
| 56 | Indice = Indice + 1 | ||
| 57 | |||
| 58 | REFAIRE | ||
| 59 | |||
| 60 | DECHARGER_DLL 'VaToCom' | ||
| 61 | |||
| 62 | TERMINER | ||
| 63 | |||
| 64 | {{/code}} | ||
| 65 | |||
| 66 | |||
| 67 | |||
| 68 | Le fichier vbs doit être positionné avec les objets "client" afin de pouvoir être appelé par le programme. | ||
| 69 | |||
| 70 | |||
| 71 | {{code title="Calculmodulo.vbs" language="none"}} | ||
| 72 | '********************************************************************* | ||
| 73 | ' | ||
| 74 | ' HARDIS - Calcul Moudlo 97 d'un IBAN VBScript - 2012 | ||
| 75 | ' | ||
| 76 | '********************************************************************* | ||
| 77 | ' | ||
| 78 | Option Explicit 'All variables have to be declared before use | ||
| 79 | ' | ||
| 80 | ' Global Declare | ||
| 81 | Dim TreturnValue() 'Output array | ||
| 82 | ' | ||
| 83 | ' | ||
| 84 | '********************************************************************* | ||
| 85 | ' | ||
| 86 | ' | ||
| 87 | '********************************************************************* | ||
| 88 | Dim tConcat | ||
| 89 | Dim in_i | ||
| 90 | ' | ||
| 91 | Dim sRetenue | ||
| 92 | Dim sCle | ||
| 93 | Dim iNbInterm | ||
| 94 | Dim sStrInterm | ||
| 95 | ' | ||
| 96 | Dim iCodeNum | ||
| 97 | Dim sCodeStr | ||
| 98 | ' | ||
| 99 | Dim tIBAN | ||
| 100 | ' | ||
| 101 | Dim maval | ||
| 102 | ' | ||
| 103 | Public Function Calcul(siban) | ||
| 104 | Calcul = "" | ||
| 105 | sRetenue = "" | ||
| 106 | sStrInterm = "" | ||
| 107 | in_i = 1 | ||
| 108 | iNbInterm = 0 | ||
| 109 | sCle = 0 | ||
| 110 | iCodeNum = 0 | ||
| 111 | ' | ||
| 112 | tConcat = siban | ||
| 113 | ' | ||
| 114 | Do While in_i <= Len(tConcat) | ||
| 115 | ' | ||
| 116 | If in_i = 1 Then | ||
| 117 | sStrInterm = sRetenue & Mid(tConcat, in_i, 9) | ||
| 118 | Else | ||
| 119 | sStrInterm = sRetenue & Mid(tConcat, in_i, 7) | ||
| 120 | End If | ||
| 121 | ' | ||
| 122 | iNbInterm = CDbl(sStrInterm) | ||
| 123 | ' | ||
| 124 | sCle = CalculateModulo(iNbInterm, 97) | ||
| 125 | ' | ||
| 126 | sRetenue = CStr(sCle) | ||
| 127 | ' | ||
| 128 | If in_i = 1 Then | ||
| 129 | in_i = in_i + 9 | ||
| 130 | Else | ||
| 131 | If sCle < 10 Then | ||
| 132 | in_i = in_i + 8 | ||
| 133 | Else | ||
| 134 | in_i = in_i + 7 | ||
| 135 | End If | ||
| 136 | End If | ||
| 137 | ' | ||
| 138 | Loop | ||
| 139 | ' | ||
| 140 | iCodeNum = 98 - CalculateModulo(sCle, 97) | ||
| 141 | ' | ||
| 142 | If iCodeNum < 10 Then | ||
| 143 | sCodeStr = "0" & CStr(iCodeNum) | ||
| 144 | Else | ||
| 145 | sCodeStr = CStr(iCodeNum) | ||
| 146 | End If | ||
| 147 | ' | ||
| 148 | Calcul = sCodeStr | ||
| 149 | Exit Function | ||
| 150 | End Function | ||
| 151 | |||
| 152 | Function CalculateModulo(x, y) | ||
| 153 | CalculateModulo = x - (Int(x / y) * y) | ||
| 154 | End Function | ||
| 155 | |||
| 156 | |||
| 157 | {{/code}} | ||
| 158 |