segunda-feira, 12 de março de 2012

Validando Cadastro Específico do INSS - CEI em SQL Server

Validando Cadastro Específico do INSS - CEI em SQL Server, como validar CEI em SQL Server usando functions do TRANSACT SQL
-- Nome Artefato/Programa..: usf_valida_cei.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 11/03/2012
-- Data Atualizacao........: 11/03/2012
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function) para validar numero de CEI (Cadastro Especifico de INSS) 
-- OBS.....................: A entrada é um varchar e o retorno é um bit, 1 para válido, 0 para inválido e null para nulos 
-- ........................: 
--
IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N'[dbo].[usf_valida_cei]') 
               AND type IN (N'FN')
           )
 DROP FUNCTION usf_valida_cei;
GO
CREATE FUNCTION  usf_valida_cei(@number varchar(max)) RETURNS bit AS
/*
CEI - Cadastro Específico do INSS 
O algorítmo abaixo demonstra como obter o dígito verificador da matricula CEI.
Formato : EE.NNN.NNNNN/AD
Onde:
EE - Número
NNNNNNNN - Número
A - Atividade
D - Dígito Verificador
a) Multiplicar os últimos 11 algarismos pelos seus respectivos pesos, conforme abaixo:
Pesos: 7,4,1,8,5,2,1,6,3,7,4
Algarismos: EENNNNNNNNA

Cálculo
7 * E = X1
4 * E = X2
1 * N = X3
8 * N = X4
5 * N = X5
2 * N = X6
1 * N = X7
6 * N = X8
3 * N = X9
7 * N = X10
4 * A = X11
D (posição do dígito)


b) Somar todos os produtos obtidos no item "a"

Soma = X1+2+X3+X4+X5+X6+X7+X8+X9+X10+X11

c) Com o total obtido no item "b", somar o algarismo da unidade com o algarismo da dezena.

Total = Dezena de soma + Unidade de soma

d) Subtrair de 10 o algarismo da unidade do obtido no item "c".

Resultado = 10 - Unidade de Total

O algarismo da unidade do resultado da subtração será o dígito verificador.

Digito verificador = Unidade de Resultado
*/  

BEGIN


 DECLARE @weight   varchar (11)
 DECLARE @total   int
 DECLARE @c    int
 DECLARE @result   int
 DECLARE @r    bit
 DECLARE @number_dig  int
 DECLARE @number_dig_c int
 DECLARE @number_dig_x varchar(2) 

 SET @weight = '74185216374'  -- peso estabelecido para gerar CEI 
 SET @total = 0 
 SET @c  = 1  
 SET @number_dig = substring(@number,len(@number),1) -- ultimo digito extraido do parametro informado

 --fazendo um uma pre-validação do CEI, validação 1 se é nulo
 IF @number IS NULL BEGIN
  SET @r = NULL
  RETURN (@r) 
 END --fim_se   

 --fazendo um uma pre-validação do CEI, validação 2 se o tamanho é diferente de 12 digitos 
 IF LEN(@number) > 12  BEGIN
  SET @r = 0
  RETURN (@r)
 END  --fim_se

 --fazendo um uma pre-validação do CEI, validação 3 se não for nulo e for mair que 12,
 -- ainda pode ser uma string 
 IF (SELECT CASE WHEN patindex('%[^0-9]%', @number) > 0 THEN 1 ELSE 0 END) = 1 BEGIN
  SET @r = 0
  RETURN (@r)
 END --fim_se   

 --fazendo um uma pre-validação do CEI, validação 4 se está vindo c/ 12 dig zerados
 IF CAST(@number AS bigint)=0 BEGIN
  SET @r = 0
  RETURN (@r)
 END  --fim_se  


 WHILE (@c<=11) BEGIN
  SET @result = cast (substring(@number, @c, 1) AS int) * cast(substring(@weight,@c, 1) AS int) 
  SET @total  = @total + @result
  SET @c = @c + 1 
 END -- fim_enquanto, neste caso, while simulando for 

 SET @number_dig_x = right(left(cast (@total as varchar(max)), 12), 2)
 SET @number_dig_c = (cast(left(@number_dig_x, 1) as int)) + (cast(right(@number_dig_x, 1) as int))
 SET @number_dig_c = 10 - (cast (Right(Left(@number_dig_c, 12), 1) as int))


 IF (@number_dig_c > 9) BEGIN
  SET @number_dig_c = 0
 END ELSE BEGIN 
  SET @number_dig_c = 10 - @number_dig_c
 END 

 IF (@number_dig <> @number_dig_c) BEGIN 
  SET @r = 0
 END ELSE BEGIN
  SET @r = 1 
 END 
    
 RETURN (@r)

END;
GO
-- Exemplo de chamada da function 
-- SELECT dbo.usf_valida_cei('741852163748');

2 comentários:

  1. Respostas
    1. Nos testes que efetuei, dando entrada como string, funcionou.
      Poderia ser mais específico?

      Excluir