Alberto Mota Postado Janeiro 21, 2010 Denunciar Share Postado Janeiro 21, 2010 Estou usando o sql server e o delphi 7.Devido a imprecisão do manual de boleto bancário da caixa.Depois de 6000 impressões, 2 clientes ligaram dizendo que não conseguiramefetuar o pagamento. A coincidência é que o dv geral do código de barras dos dois é 0.Liguei para lá e disseram que não pode ser 0 no dv geral. Agora é que dizem isso.Abaixo segue a função que uso para saber o dv geral do módulo 11.Se o resto for 0, 10 ou 1 o dv geral será 1.Como adequo essa função? Desde já agradeço.USE [secraso]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION [dbo].[Modulo11](@VALOR varchar(60))RETURNS CHAR(1)ASBEGIN 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 RETURN @RETORNOEND Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Janeiro 21, 2010 Denunciar Share Postado Janeiro 21, 2010 elimine o dv pois ele não é necessario quando é feita a leitura do código de barraSe o resto for 0, 10 ou 1 o dv geral será 1.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 RETURN @RETORNO END onde voce está testanto o resto 0 e 10 ? 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 (@RESTO = 0) OR (@RESTO = 10) SET @RETORNO = 1 RETURN @RETORNO ENDabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Alberto Mota Postado Janeiro 21, 2010 Autor Denunciar Share Postado Janeiro 21, 2010 Jhonas, havia colocado meu problema também no forum de sql server,e a resposta foi igual a sua. Resolveu e agradeço novamente a ajuda.Um abraço.Segue o código corrigido:USE [secraso]GO/****** Object: UserDefinedFunction [dbo].[Modulo11] Script Date: 01/21/2010 21:49:02 ******/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...
Pergunta
Alberto Mota
Estou usando o sql server e o delphi 7.
Devido a imprecisão do manual de boleto bancário da caixa.
Depois de 6000 impressões, 2 clientes ligaram dizendo que não conseguiram
efetuar o pagamento.
A coincidência é que o dv geral do código de barras dos dois é 0.
Liguei para lá e disseram que não pode ser 0 no dv geral.
Agora é que dizem isso.
Abaixo segue a função que uso para saber o dv geral do módulo 11.
Se o resto for 0, 10 ou 1 o dv geral será 1.
Como adequo essa função?
Desde já agradeço.
USE [secraso]
GO
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
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.