Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Nosso Numero do Bradesco


Alberto Mota
 Share

Question

Prezados colegas, o cálculo do nosso numero do Bradesco é diferente dos demais,

requer que seja colocada a letra P quando o resto da divisão for 1.

Tentei um case, mas não funcionou, dá erro de conversão:

CASE WHEN resto = 1 THEN 'P' ELSE resto END AS dvresto

se eu colocar

CASE WHEN resto = 1 THEN 0 ELSE resto END AS dvresto, então a consulta é executada.

Há algum tempo Fulvio me passou um script do modulo 11 que esta ok para outros bancos,

mas para o Bradesco tambem não consegui adapta-lo, pois é justamente em cima do resto:

No manual

----------------------------------------------------------------------------------

Obs.: Se o resto da divisão for “1”, desprezar a diferença entre o divisor

menos o resto que será “10” e considerar o dígito como “P”.

----------------------------------------------------------------------------------

2- Se o resto da divisão for “0”, desprezar o cálculo de subtração entre

divisor e resto, e considerar o “0” como dígito.

----------------------------------------------------------------------------------

Abaixo segue o script

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Modulo11Base7](@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 = 7
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

-----------------

Desde já, obrigado.

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Bom dia Alberto,

O CASE está dando erro porque se o RESTO for igual a 1, você tenta colocar um caracter. Mas caso ela seja diferente de 1, você colocará o valor contido na coluna RESTO, q é um inteiro.

Segue a alteração do script para retorno do DV=P. Olhe se assim funciona:

ALTER FUNCTION [dbo].[Modulo11Base7](@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 = 7
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 NOT IN  (9, 10)) 
        SET  @RETORNO = @DIGITO
    IF (@DIGITO = 9) 
        SET @RETORNO = 0
    IF (@DIGITO = 10) 
        RETURN 'P'
END
RETURN @RETORNO
END

OBS.: alterei o script. Agora está ok.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.5k
×
×
  • Create New...