IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usf_calcula_dv_nfe]') AND type IN (N'FN') ) DROP FUNCTION usf_calcula_dv_nfe; GO CREATE FUNCTION usf_calcula_dv_nfe(@number varchar(max)) RETURNS bit -- Nome Artefato/Programa..: usf_calcula_dv_nfe.sql -- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) -- Data Inicio ............: 29/03/2012 -- Data Atualizacao........: 29/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) que calcula o digito verificador da chave de acesso NFe usando o modulo 11 -- OBS.....................: A entrada é um varchar e o retorno é um bit 1 para valido e 0 para invalido -- ........................: -- AS BEGIN DECLARE @i int, @ix int, @c int, @keyx int, @numberx varchar(44), @r int SET @c = 2 SET @i = 1 SET @ix = 43 SET @keyx = 0 -- Pre-validacao 1, se e nulo, entao retorna nulo IF @number IS NULL BEGIN SET @r = NULL RETURN (@r) END --fim_se -- Pre-validacao 2, se e maior que 44 digitos , entao retorna 0 IF LEN(@number) < 44 BEGIN SET @r = 0 RETURN (@r) END --fim_se -- Pre-validacao 3, se e tem alguma letra, entao retorna 0 IF (SELECT CASE WHEN patindex('%[^0-9]%', @number) > 0 THEN 1 ELSE 0 END) = 1 BEGIN SET @r = 0 RETURN (@r) END --fim_se -- Pre-validacao 4, se e menor que 44 digitos , pode ser oriundo de bigint, então fazer tratamento de zeros SET @numberx = @number IF LEN(@number) < 44 BEGIN SET @numberx = REPLICATE('0',44-LEN(@number))+@number END --fim se -- Loop por cada numero mutiplicando-o pelos valores de @c -- Simulando o for invertido com passo -1 WHILE (@i <= (len(@numberx)-1)) BEGIN --Verifica se o valor de @c for maior que nove, entao passa o valor pra 2 IF @c > 9 BEGIN SET @c = 2 END --fim_se --Soma os valores mutiplicados SET @keyx = @keyx + (convert(int,substring(@number,@ix,1)) * @c) --Controle de contadores SET @c = @c + 1 SET @i = @i + 1 SET @ix = @ix - 1 END --fim_enquanto --Obtem o digito verificador IF ((@keyx % 11) = 0 OR (@keyx % 11) = 1) BEGIN SET @r = 0 END ELSE BEGIN --senao SET @r = 11 - (@keyx % 11) END --fim_se IF @r = convert(int,substring(@numberx,len(@numberx),1)) BEGIN SET @r = 1 END ELSE BEGIN --senao SET @r = 0 END --fim_se RETURN (@r) END; GO -- Chamada da function SELECT dbo.usf_calcula_dv_nfe('24110509540525000194550010000007091242050760'); SELECT dbo.usf_calcula_dv_nfe('24110509540525000194550010000007071681710981'); -- Habilitando no campo da CHAVE de NFE (chave_nfe) /* ALTER TABLE nota_fiscal_eletronica ADD CONSTRAINT ck_nota_fiscal_eletronica_usf_calcula_dv_nfe CHECK (dbo.usf_calcula_dv_nfe(chave_nfe)=1); */ GO
DBA, MySql, Oracle, Postgres, SQL Server, DB2, BI, TI, Business Intelligence, Data Science, Machine Learning, IoT, Arduino
quinta-feira, 29 de março de 2012
Store Function SQL Server para validar CHAVE de NFE
Store Function SQL Server para validar CHAVE de NFE
Store function para validar CHAVE de NFE em SQL do MSSQL SERVER 2005 e 2008.
Essa function serve para validar Nota Fiscal Eletrônica, a entrada de parametro é um varchar
retorna 1 para CHAVE de NFE válida e 0 para CHAVE de NFE inválida e NULL quanto for NULO.
Segue a function....
Assinar:
Postar comentários (Atom)
Muito bom obrigado por compartilhar
ResponderExcluirSeja Feliz! :)
ExcluirValeu!!!
ResponderExcluirValeu
ExcluirMuito bom... funcionou maravilha.
ResponderExcluirObrigado. Junior.
Tem essa função para Oracle?
ResponderExcluirOlá Evandro, não tenho ainda!
Excluir