Vérification de la clé RIB avec Modulo 97, après recherche je n'ai trouvé que des bout de code en Visual ou C alors je suis parti d?une source posé ici en en langages C. Dans la conversion de chiffre en lettre je reformate les chiffres ca me permet de saisir un RIB que dans un champ avec des espaces ou tiret.
Source / Exemple :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Controls, Forms, Buttons, StdCtrls, ExtCtrls,
Classes;
type
TFiche = class(TForm)
EBANQUE: TEdit;
EGUICHET: TEdit;
ECOMPTE: TEdit;
ERIB: TEdit;
L1: TLabel;
L2: TLabel;
L3: TLabel;
L4: TLabel;
L5: TLabel;
BT1: TBitBtn;
VRIB: TLabel;
ECOMPTEENTIER: TEdit;
BT2: TSpeedButton;
Label1: TLabel;
Label2: TLabel;
procedure BT1Click(Sender: TObject);
function LettreEnChiffre(_In: string): string;
procedure EBANQUEKeyPress(Sender: TObject; var Key: Char);
procedure ERIBKeyPress(Sender: TObject; var Key: Char);
procedure ECOMPTEKeyPress(Sender: TObject; var Key: Char);
procedure BT2Click(Sender: TObject);
procedure ECOMPTEENTIERKeyPress(Sender: TObject; var Key: Char);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Fiche: TFiche;
implementation
{$R *.dfm}
//---- Conversion d'un numéro de compte chiffres et lettres en chiffres --------
function TFiche.LettreEnChiffre(_In: string): string;
var
i: Integer;
Chaine: string;
begin
for i := 1 to Length(_In) do
begin
Chaine := Copy(_In, i, 1);
case Chaine[1] of
// Le reformatage des chiffres sert à la solution 2
'0': Result := Result + '0'; // * table de conversion lettre-chiffre pour le RIB :
'1', 'A', 'J': Result := Result + '1'; // A, J = 1
'2', 'B', 'K', 'S': Result := Result + '2'; // B, K, S = 2
'3', 'C', 'L', 'T': Result := Result + '3'; // C, L, T = 3
'4', 'D', 'M', 'U': Result := Result + '4'; // D, M, U = 4
'5', 'E', 'N', 'V': Result := Result + '5'; // E, N, V = 5
'6', 'F', 'O', 'W': Result := Result + '6'; // F, O, W = 6
'7', 'G', 'P', 'X': Result := Result + '7'; // G, P, X = 7
'8', 'H', 'Q', 'Y': Result := Result + '8'; // H, Q, Y = 8
'9', 'I', 'R', 'Z': Result := Result + '9'; // I, R, Z = 9
end;
end;
end;
//------------------------------------------------------------------------------
procedure TFiche.BT1Click(Sender: TObject);
var Resultat: Int64;
Compte: string;
begin
try
//Convertir Lettre en Chiffre pour le Numéro de compte
Compte := LettreEnChiffre(ECOMPTE.Text);
//------------------------------------------------------------------------------
//Code Banque / 97
Resultat := StrToInt(EBANQUE.Text) mod 97;
//Resultat * 100000 + Code Guichet / 97
Resultat := ((Resultat * 100000) + StrToInt(EGUICHET.Text)) mod 97;
//Resultat * 1000000 + Numero de compte les 6 premier chiffres / 97
Resultat := ((Resultat * 1000000) + StrToInt(Copy(Compte, 0, 6))) mod 97;
//Resultat * 100000 + Numero de compte les 5 Dernier chiffres / 97
Resultat := ((Resultat * 100000) + StrToInt(Copy(Compte, 7, 11))) mod 97;
//Mod (97) - Resultat * 100 / 97 = Cle rib
Resultat := ((97 - Resultat) * 100) mod 97;
//------------------------------------------------------------------------------
// Mettre FormatFloat '00' au cas ou que la Cle rib soit inférieure à 10
VRIB.Caption := FormatFloat('00', Resultat);
if VRIB.Caption <> ERIB.Text then BT1.Caption := 'RIB False'
else BT1.Caption := 'RIB True';
except
BT1.Caption := 'Saisie Erroné';
Exit;
end;
end;
//----- Key Press --------------------------------------------------------------
procedure TFiche.EBANQUEKeyPress(Sender: TObject; var Key: Char);
begin
// Autoriser que des chiffres en saisie
if not (Key in ['0'..'9', #8, #13, #27]) then Key := #0;
// Focus suivant
if Key = #13 then
begin
if Getkeystate(VK_Shift) and $8000 <> 0 then
Postmessage(Handle, WM_NextDlgCtl, 1, 0)
else
Postmessage(Handle, WM_NextDlgCtl, 0, 0);
Key := #0;
end;
end;
procedure TFiche.ECOMPTEKeyPress(Sender: TObject; var Key: Char);
begin
// Autoriser des chiffres et lettres en saisie
if not (Key in ['0'..'9', 'a'..'z', 'A'..'Z', #8, #13, #27]) then Key := #0;
// Focus suivant
if Key = #13 then
begin
ERIB.SetFocus;
Key := #0;
end;
end;
procedure TFiche.ERIBKeyPress(Sender: TObject; var Key: Char);
begin
// Autoriser que des chiffres en saisie
if not (Key in ['0'..'9', #8, #13, #27]) then Key := #0;
// Clic sur BT Resultat
if Key = #13 then
begin
BT1.OnClick(nil);
Key := #0;
end;
end;
//------------------------------------------------------------------------------
//----- 2eme solutions saisie sur un seul champ avec des espaces ou tiret etc...
//------------------------------------------------------------------------------
procedure TFiche.BT2Click(Sender: TObject);
var Resultat: Int64;
Compte: string;
begin
try
//Convertir Lettre en Chiffre pour le Numéro de compte
//vous pouvez saisir des espaces des tiret etc...
Compte := LettreEnChiffre(ECOMPTEENTIER.Text);
//Vérification longueur de saisie si different de 23 on sort
if Length(Compte) <> 23 Then
begin
BT2.Caption := 'Saisie Erroné';
Exit;
end;
//------------------------------------------------------------------------------
//Code Banque / 97
Resultat := StrToInt(Copy(Compte, 1, 5)) mod 97;
//Resultat * 100000 + Code Guichet / 97
Resultat := ((Resultat * 100000) + StrToInt(Copy(Compte, 6, 10))) mod 97;
//Resultat * 1000000 + Numero de compte les 6 premier chiffres / 97
Resultat := ((Resultat * 1000000) + StrToInt(Copy(Compte, 11, 16))) mod 97;
//Resultat * 100000 + Numero de compte les 5 Dernier chiffres / 97
Resultat := ((Resultat * 100000) + StrToInt(Copy(Compte, 17, 21))) mod 97;
//Mod (97) - Resultat * 100 / 97 = Cle rib
Resultat := ((97 - Resultat) * 100) mod 97;
//------------------------------------------------------------------------------
// Mettre FormatFloat '00' au cas ou que la Cle rib soit inférieure à 10
VRIB.Caption := FormatFloat('00', Resultat);
// Du fait que compte se retrouve formaté en chiffre la position de la clé rib
// est forcément 22 et 23
if VRIB.Caption <> Copy(Compte, 22, 23) then BT2.Caption := 'RIB False'
else BT2.Caption := 'RIB True';
except
BT2.Caption := 'Saisie Erroné';
Exit;
end;
end;
//----- Key Press --------------------------------------------------------------
procedure TFiche.ECOMPTEENTIERKeyPress(Sender: TObject; var Key: Char);
begin
// Clic sur BT2 Resultat
if Key = #13 then
begin
BT2.OnClick(nil);
Key := #0;
end;
end;
//------------------------------------------------------------------------------
end.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.