Alberto Mota Postado Janeiro 23, 2010 Denunciar Share Postado Janeiro 23, 2010 Analisando a função do módulo 11 do sql server que o Jhonas corrigiu resolvi constatar minuciosamente se havia alguma falha de interpretação.O que esta no manual da Caixa é o seguinte:Módulo "11", com peso de 2 a 9, utilizando o digito 1 para os restos 0, 10 ou 1 (regraexclusiva para cálculo do DV geral do código de barras);na função o que foi alterado foi a variavel @retorno e não a variavel @resto.Talvez esteja de fato resolvido, mas confesso que estou com dúvidas.Por isso gostaria de ter essa confirmação. Haviam 965 boletos cujos dv geral eram 0e com a função todos ficaram como 1. É isso mesmo?Desde já agradeço.Eis a função:USE [secraso]GO/****** Object: UserDefinedFunction [dbo].[Modulo11] Script Date: 01/23/2010 11:22:30 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION [dbo].[Modulo11](@VALOR varchar(60))RETURNS CHAR(1)ASBEGINDECLARE@SOMA INT,@CONTADOR INT,@PESO INT,@DIGITO INT,@RETORNO CHAR(1),@BASE INT,@RESTO BITSET @SOMA = 0SET @PESO = 2SET @BASE = 9SET @RESTO = 0SET @CONTADOR = Len(@VALOR)LOOP:BEGINSET @SOMA = @SOMA + (Convert(int, SubString(@VALOR, @CONTADOR, 1)) *@PESO)IF (@PESO < @BASE)SET @PESO = @PESO + 1ELSESET @PESO = 2SET @CONTADOR = @CONTADOR-1ENDIF @CONTADOR >= 1 GOTO LOOPIF (@RESTO = 1)BEGINSET @RETORNO = (@SOMA % 11)ENDELSEBEGINSET @DIGITO = 11 - (@SOMA % 11)IF (@DIGITO > 9) SET @DIGITO = 0SET @RETORNO = @DIGITOENDIF @RETORNO=0 or @RETORNO=10SET @RETORNO = 1RETURN @RETORNOEND Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Janeiro 23, 2010 Denunciar Share Postado Janeiro 23, 2010 Módulo "11", com peso de 2 a 9, utilizando o digito 1 para os restos 0, 10 ou 1 (regraexclusiva para cálculo do DV geral do código de barras);na função o que foi alterado foi a variavel @retorno e não a variavel @resto.Talvez esteja de fato resolvido, mas confesso que estou com dúvidas.Por isso gostaria de ter essa confirmação. Haviam 965 boletos cujos dv geral eram 0e com a função todos ficaram como 1. É isso mesmo?Veja o codigo que te passei usando a regra utilizando o digito 1 para os restos 0, 10 ou 1 (regra exclusiva para cálculo do DV geral do código de barras);IF (@RESTO = 1)BEGINSET @RETORNO = (@SOMA % 11)ENDELSEBEGINSET @DIGITO = 11 - (@SOMA % 11)IF (@DIGITO > 9) SET @DIGITO = 0SET @RETORNO = @DIGITOENDIF (@RESTO = 0) OR (@RESTO = 10)SET @RETORNO = 1RETURN @RETORNOENDVeja o seu codigoIF (@RESTO = 1)BEGINSET @RETORNO = (@SOMA % 11)ENDELSEBEGINSET @DIGITO = 11 - (@SOMA % 11)IF (@DIGITO > 9) SET @DIGITO = 0SET @RETORNO = @DIGITOENDIF @RETORNO=0 or @RETORNO=10SET @RETORNO = 1RETURN @RETORNOENDvoce esta testando o valor de retorno e o outro codigo esta testando o valor de restoentão pela regra se a variavel retorno recebe o valor do digito, então se o resto for 0, 10 ou 1 o dv obrigatoriamente devera ser 1abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Alberto Mota Postado Janeiro 25, 2010 Autor Denunciar Share Postado Janeiro 25, 2010 Jhonas, obrigado pela resposta. Então esta concluído. Só precisava ter essa certeza.Depois de um trabalho tão exaustivo, não poderia deixar de tomar cuidado.Resta a fazer esmiuçar essa função e estuda-la a fundo parareferencias futuras e avançar no meu conhecimento.Um abraço. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Alberto Mota
Analisando a função do módulo 11 do sql server que o Jhonas corrigiu resolvi constatar
minuciosamente se havia alguma falha de interpretação.
O que esta no manual da Caixa é o seguinte:
Módulo "11", com peso de 2 a 9, utilizando o digito 1 para os restos 0, 10 ou 1 (regra
exclusiva para cálculo do DV geral do código de barras);
na função o que foi alterado foi a variavel @retorno e não a variavel @resto.
Talvez esteja de fato resolvido, mas confesso que estou com dúvidas.
Por isso gostaria de ter essa confirmação. Haviam 965 boletos cujos dv geral eram 0
e com a função todos ficaram como 1. É isso mesmo?
Desde já agradeço.
Eis a função:
USE [secraso]
GO
/****** Object: UserDefinedFunction [dbo].[Modulo11] Script Date: 01/23/2010 11:22:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Modulo11](@VALOR varchar(60))
RETURNS CHAR(1)
AS
BEGIN
DECLARE
@SOMA INT,
@CONTADOR INT,
@PESO INT,
@DIGITO INT,
@RETORNO CHAR(1),
@BASE INT,
@RESTO BIT
SET @SOMA = 0
SET @PESO = 2
SET @BASE = 9
SET @RESTO = 0
SET @CONTADOR = Len(@VALOR)
LOOP:
BEGIN
SET @SOMA = @SOMA + (Convert(int, SubString(@VALOR, @CONTADOR, 1)) *
@PESO)
IF (@PESO < @BASE)
SET @PESO = @PESO + 1
ELSE
SET @PESO = 2
SET @CONTADOR = @CONTADOR-1
END
IF @CONTADOR >= 1 GOTO LOOP
IF (@RESTO = 1)
BEGIN
SET @RETORNO = (@SOMA % 11)
END
ELSE
BEGIN
SET @DIGITO = 11 - (@SOMA % 11)
IF (@DIGITO > 9) SET @DIGITO = 0
SET @RETORNO = @DIGITO
END
IF @RETORNO=0 or @RETORNO=10
SET @RETORNO = 1
RETURN @RETORNO
END
Link para o comentário
Compartilhar em outros sites
2 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.