Al igual que con los números de cuenta cada tipo de tarjeta de crédito tiene una configuración determinada, os voy a dejar un bloque de código donde se comprueban los formatos para los diferentes tipos de tarjetas de credito, Visa, MasteCard, American Express, Discover y Dinners Club. A ver si os vale
vDigito:=COPYSTR(NumeroTarjeta,1,1);
vDigito2:=COPYSTR(NumeroTarjeta,1,2);
vDigito4:=COPYSTR(NumeroTarjeta,1,4);
//American express
IF "Tipo Tarjeta"="Tipo Tarjeta"::"American Express" THEN BEGIN
IF (vDigito2 = '34') OR (vDigito2 = '37') THEN BEGIN
IF (STRLEN(NumeroTarjeta) <> 15) THEN
ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
END
ELSE
ERROR(TXT2,rPolizas.NumeroTarjeta,rPolizas."Tipo Tarjeta");
END;
//Visa
IF "Tipo Tarjeta"="Tipo Tarjeta"::Visa THEN BEGIN
IF vDigito = '4' THEN BEGIN
IF (STRLEN(NumeroTarjeta) <> 13) AND (STRLEN(NumeroTarjeta) <> 16) THEN
ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
END
ELSE
ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
END;
//MasterCard
IF "Tipo Tarjeta"="Tipo Tarjeta"::MasterCard THEN BEGIN
IF (vDigito2 >= '51') AND (vDigito2 <= '55') THEN BEGIN
IF (STRLEN(NumeroTarjeta) <> 16) THEN
ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
END
ELSE
ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
END;
//Discover
IF "Tipo Tarjeta"=."Tipo Tarjeta"::Discover THEN BEGIN
IF vDigito4 = '6011' THEN BEGIN
IF (STRLEN(NumeroTarjeta) <> 16) THEN
ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
END
ELSE
ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
END;
//Diners club
IF "Tipo Tarjeta"="Tipo Tarjeta"::"Diners club" THEN BEGIN
IF (vDigito2 = '30') OR (vDigito2 = '36') OR (vDigito2 = '38') THEN BEGIN
IF (STRLEN(NumeroTarjeta) <> 14) THEN
ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
END
ELSE
ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
END;
//Comprobar numeración de tarjeta
vNuevoNT:='';
FOR vIndex:=1 TO STRLEN(NumeroTarjeta) DO BEGIN
vNuevoNT:='';
IF vIndex MOD 2 <> 0 THEN BEGIN
EVALUATE(vNoperar,FORMAT(NumeroTarjeta[vIndex]));
IF vNoperar * 2 > 9 THEN BEGIN
vNuevoNT:=FORMAT((vNoperar*2)-9);
END
ELSE BEGIN
vNuevoNT:=FORMAT((vNoperar*2));
END
END
ELSE BEGIN
vNuevoNT:=FORMAT(NumeroTarjeta[vIndex]);
END;
EVALUATE(vConvert,vNuevoNT);
vResultado+=vConvert;
END;
IF (vResultado MOD 10 <> 0) AND (vResultado > 150) THEN
ERROR('El numero de tarjeta %1 no es correcto',NumeroTarjeta);
END;
viernes, 4 de noviembre de 2011
Sacar el dígito control de numero cuenta para comprobar si es correcto
Voy a dejar un bloque de código donde se realiza la comprobación del dígito de control de un número de cuenta para saber si este es correcto.
//Comprobar longitud y numero de cuenta
Suma1Int:=0;
Suma2Int:=0;
IF vTXTNumCuenta <> '' THEN BEGIN
FOR vIndex:=1 TO 10 DO BEGIN
Suma1:=0;
Suma2:=0;
EVALUATE(Digit1,COPYSTR(vTXTNumCuenta,9,1));
EVALUATE(Digit2,COPYSTR(vTXTNumCuenta,10,1));
CASE vIndex OF
1: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,1,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,11,1));
Suma1Int:=Suma1*4;
Suma2Int:=Suma2*1;
END;
2: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,2,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,12,1));
Suma1Int+=Suma1*8;
Suma2Int+=Suma2*2;
END;
3: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,3,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,13,1));
Suma1Int+=Suma1*5;
Suma2Int+=Suma2*4;
END;
4: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,4,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,14,1));
Suma1Int+=Suma1*10;
Suma2Int+=Suma2*8;
END;
5: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,5,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,15,1));
Suma1Int+=Suma1*9;
Suma2Int+=Suma2*5;
END;
6: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,6,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,16,1));
Suma1Int+=Suma1*7;
Suma2Int+=Suma2*10;
END;
7: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,7,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,17,1));
Suma1Int+=Suma1*3;
Suma2Int+=Suma2*9;
END;
8: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,8,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,18,1));
Suma1Int+=Suma1*6;
Suma2Int+=Suma2*7;
END;
9: BEGIN
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,19,1));
Suma2Int+=Suma2*3;
END;
10: BEGIN
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,20,1));
Suma2Int+=Suma2*6;
END;
END;
END;
//Primer dígito de control entidad+sucursal
Parc1:=0;
Parc1:= 11 - (Suma1Int MOD 11);
IF Parc1 > 9 THEN
Parc1:=11 - Parc1;
//Segundo dígito de control Numero Cuenta
Parc2:=0;
Parc2:=11 - (Suma2Int MOD 11);
IF Parc2 > 9 THEN
Parc2:=11 - Parc2;
IF (Digit1 = Parc1) AND (Digit2 = Parc2) THEN BEGIN
END
ELSE BEGIN
ERROR('Número cuenta erroneo, no corresponde el DC: %1%2',Parc1,Parc2);
END;
END;
//Comprobar longitud y numero de cuenta
Suma1Int:=0;
Suma2Int:=0;
IF vTXTNumCuenta <> '' THEN BEGIN
FOR vIndex:=1 TO 10 DO BEGIN
Suma1:=0;
Suma2:=0;
EVALUATE(Digit1,COPYSTR(vTXTNumCuenta,9,1));
EVALUATE(Digit2,COPYSTR(vTXTNumCuenta,10,1));
CASE vIndex OF
1: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,1,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,11,1));
Suma1Int:=Suma1*4;
Suma2Int:=Suma2*1;
END;
2: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,2,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,12,1));
Suma1Int+=Suma1*8;
Suma2Int+=Suma2*2;
END;
3: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,3,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,13,1));
Suma1Int+=Suma1*5;
Suma2Int+=Suma2*4;
END;
4: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,4,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,14,1));
Suma1Int+=Suma1*10;
Suma2Int+=Suma2*8;
END;
5: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,5,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,15,1));
Suma1Int+=Suma1*9;
Suma2Int+=Suma2*5;
END;
6: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,6,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,16,1));
Suma1Int+=Suma1*7;
Suma2Int+=Suma2*10;
END;
7: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,7,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,17,1));
Suma1Int+=Suma1*3;
Suma2Int+=Suma2*9;
END;
8: BEGIN
EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,8,1));
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,18,1));
Suma1Int+=Suma1*6;
Suma2Int+=Suma2*7;
END;
9: BEGIN
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,19,1));
Suma2Int+=Suma2*3;
END;
10: BEGIN
EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,20,1));
Suma2Int+=Suma2*6;
END;
END;
END;
//Primer dígito de control entidad+sucursal
Parc1:=0;
Parc1:= 11 - (Suma1Int MOD 11);
IF Parc1 > 9 THEN
Parc1:=11 - Parc1;
//Segundo dígito de control Numero Cuenta
Parc2:=0;
Parc2:=11 - (Suma2Int MOD 11);
IF Parc2 > 9 THEN
Parc2:=11 - Parc2;
IF (Digit1 = Parc1) AND (Digit2 = Parc2) THEN BEGIN
END
ELSE BEGIN
ERROR('Número cuenta erroneo, no corresponde el DC: %1%2',Parc1,Parc2);
END;
END;
Suscribirse a:
Entradas (Atom)