-- 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');
DBA, MySql, Oracle, Postgres, SQL Server, DB2, BI, TI, Business Intelligence, Data Science, Machine Learning, IoT, Arduino
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
Assinar:
Postar comentários (Atom)
Não funcionou. Só retorna 0.
ResponderExcluirNos testes que efetuei, dando entrada como string, funcionou.
ExcluirPoderia ser mais específico?