Entrar

OracleBR

Função

Inicial - Banco de Códigos

Calculo do CMC7 Por Fábio C. Donadon

Data de Inclusão: 02/09/2006 | Última Alteração: 02/09/2006
Tipo:Função | Enviada por: Moderador Oracle_br (moderador@oraclebr.com.br)


CREATE OR REPLACE FUNCTION FuncVeriCmc7 (xCmc7 IN VARCHAR) RETURN NUMBER IS
vRetorno NUMBER := 0;
vCalculo NUMBER := 0;
vTotal NUMBER := 0;
pCmc7 CHAR(34) := trim(xcmc7);
vPos2 NUMBER := 0; vPos3 NUMBER := 0; vPos4 NUMBER := 0;
vPos5 NUMBER := 0; vPos6 NUMBER := 0; vPos7 NUMBER := 0;
vPos8 NUMBER := 0; vPos9 NUMBER := 0; vPos11 NUMBER := 0;
vPos12 NUMBER := 0; vPos13 NUMBER := 0; vPos14 NUMBER := 0;
vPos15 NUMBER := 0; vPos16 NUMBER := 0; vPos17 NUMBER := 0;
vPos18 NUMBER := 0; vPos19 NUMBER := 0; vPos20 NUMBER := 0;
vPos22 NUMBER := 0; vPos23 NUMBER := 0; vPos24 NUMBER := 0;
vPos25 NUMBER := 0; vPos26 NUMBER := 0; vPos27 NUMBER := 0;
vPos28 NUMBER := 0; vPos29 NUMBER := 0; vPos30 NUMBER := 0;
vPos31 NUMBER := 0; vPos32 NUMBER := 0; vPos33 NUMBER := 0;
/* Função para verificação do CMC7 capturado para inclusão de cheques.
Caso esteja OK retorna 1, se houver qualquer problema retorna 0. */
BEGIN
IF length(pcmc7)=34 THEN
IF instr('0123456789',substr(pcmc7,2,1))>0 AND instr('0123456789',substr(pcmc7,3,1))>0 AND
instr('0123456789',substr(pcmc7,4,1))>0 AND instr('0123456789',substr(pcmc7,5,1))>0 AND
instr('0123456789',substr(pcmc7,6,1))>0 AND instr('0123456789',substr(pcmc7,7,1))>0 AND
instr('0123456789',substr(pcmc7,8,1))>0 AND instr('0123456789',substr(pcmc7,9,1))>0 AND
instr('0123456789',substr(pcmc7,11,1))>0 AND instr('0123456789',substr(pcmc7,12,1))>0 AND
instr('0123456789',substr(pcmc7,13,1))>0 AND instr('0123456789',substr(pcmc7,14,1))>0 AND
instr('0123456789',substr(pcmc7,15,1))>0 AND instr('0123456789',substr(pcmc7,16,1))>0 AND
instr('0123456789',substr(pcmc7,17,1))>0 AND instr('0123456789',substr(pcmc7,18,1))>0 AND
instr('0123456789',substr(pcmc7,19,1))>0 AND instr('0123456789',substr(pcmc7,20,1))>0 AND
instr('0123456789',substr(pcmc7,22,1))>0 AND instr('0123456789',substr(pcmc7,23,1))>0 AND
instr('0123456789',substr(pcmc7,24,1))>0 AND instr('0123456789',substr(pcmc7,25,1))>0 AND
instr('0123456789',substr(pcmc7,25,1))>0 AND instr('0123456789',substr(pcmc7,26,1))>0 AND
instr('0123456789',substr(pcmc7,27,1))>0 AND instr('0123456789',substr(pcmc7,28,1))>0 AND
instr('0123456789',substr(pcmc7,29,1))>0 AND instr('0123456789',substr(pcmc7,30,1))>0 AND
instr('0123456789',substr(pcmc7,31,1))>0 AND instr('0123456789',substr(pcmc7,32,1))>0 AND
instr('0123456789',substr(pcmc7,33,1))>0 THEN
vPos2 := to_number(substr(pcmc7,2,1)); vPos3 := to_number(substr(pcmc7,3,1)); vPos4 := to_number(substr(pcmc7,4,1));
vPos5 := to_number(substr(pcmc7,5,1)); vPos6 := to_number(substr(pcmc7,6,1)); vPos7 := to_number(substr(pcmc7,7,1));
vPos8 := to_number(substr(pcmc7,8,1)); vPos9 := to_number(substr(pcmc7,9,1)); vPos11 := to_number(substr(pcmc7,11,1));
vPos12 := to_number(substr(pcmc7,12,1)); vPos13 := to_number(substr(pcmc7,13,1)); vPos14 := to_number(substr(pcmc7,14,1));
vPos15 := to_number(substr(pcmc7,15,1)); vPos16 := to_number(substr(pcmc7,16,1)); vPos17 := to_number(substr(pcmc7,17,1));
vPos18 := to_number(substr(pcmc7,18,1)); vPos19 := to_number(substr(pcmc7,19,1)); vPos20 := to_number(substr(pcmc7,20,1));
vPos22 := to_number(substr(pcmc7,22,1)); vPos23 := to_number(substr(pcmc7,23,1)); vPos24 := to_number(substr(pcmc7,24,1));
vPos25 := to_number(substr(pcmc7,25,1)); vPos26 := to_number(substr(pcmc7,26,1)); vPos27 := to_number(substr(pcmc7,27,1));
vPos28 := to_number(substr(pcmc7,28,1)); vPos29 := to_number(substr(pcmc7,29,1)); vPos30 := to_number(substr(pcmc7,30,1));
vPos31 := to_number(substr(pcmc7,31,1)); vPos32 := to_number(substr(pcmc7,32,1)); vPos33 := to_number(substr(pcmc7,33,1));
/* Calculo da primeira parte */
vTotal := 0;
vCalculo := 2*vPos2;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos3;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos4;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos5;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos6;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos7;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos8;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
IF vPos22 = to_number(substr(trim(to_char((10-to_number(substr(trim(to_char(vTotal,'00')),2,1))),'00')),2,1)) THEN
/* Calculo da segunda parte */
vTotal := 0;
vCalculo := 1*vPos11;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos12;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos13;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos14;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos15;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos16;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos17;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos18;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos19;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos20;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
IF vPos9 = to_number(substr(trim(to_char((10-to_number(substr(trim(to_char(vTotal,'00')),2,1))),'00')),2,1)) THEN
/* Calculo da terceira parte */
vTotal := 0;
vCalculo := 1*vPos23;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos24;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos25;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos26;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos27;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos28;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos29;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos30;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 1*vPos31;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
vCalculo := 2*vPos32;
IF vCalculo>9 THEN vCalculo := to_number(substr(trim(to_char(vCalculo,'00')),1,1))+to_number(substr(trim(to_char(vCalculo,'00')),2,1)); END IF;
vTotal := vTotal + vCalculo;
IF vPos33 = to_number(substr(trim(to_char((10-to_number(substr(trim(to_char(vTotal,'00')),2,1))),'00')),2,1)) THEN
vRetorno := 1;
END IF;
END IF;
END IF;
END IF;
END IF;
RETURN vRetorno;
END;
/
show errors;
select funcvericmc7('>27500300>0090108845>500087055182>') from dual;
/