-- 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?