Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ronaldo Faria Storck Eler

Função ficou maluca (ou eu)

Recommended Posts

Olá pessoa,

 

Estou com um problema, aparentemente, muito simples, mas depois de olhar trocentas vezes para o código e printar todas as linhas (rs) já não se enxerga mais nada...

 

Bem, fiz a função para calcular o digito verificador da chave ASBACE (aquela dos boletos) de acordo com o código do banco BANESTES, ocorre que está tudo correto, mas na última linha ao invés de retornar 6, retorna 0. O pior, até coloquei um response que me mostra que o D2 final é 6, mas essa linha é printada novamente e troca para zero... não estou conseguindo entender...

Function CalculaD2(chave, D1)
            D2 = 0
            peso = 7
            P = 0
            S = 0

            chaveD1 = chave & D1
			
			w "<hr><br>Entrando no calculo D2...<br><br>chaved1...: "& chr(11) & chaved1 
			w "<br>D1......:" & D1
			w "<br>D2......:" & d2

			For i = 1 to Len(chaveD1) Step 1
                N = cint(mid(chaveD1,i, 1))
                P = N * (peso)
				' atençaõ redobrada aqui:
				' como a expressao original era: P = N * peso--
				' se eu fazia 
				'      N* (peso-1) ou
				'      se fazia a conta primeiro: peso = peso -1 e depois jogar N * peso, também dava erro, e o motivo, fui entender com o javascript
				' onde a precedência do operador (http://www.vbsedit.com/html/49eaf4cf-8818-478d-a429-cdd2ece20811.asp). 
				' Nesse caso o -- estava depois de peso, portanto, deveria ser feito a conta e depois decrementado
				' então passe a N* peso e depois peso=peso-1, e funcionou
				' 
				peso = peso -1
                S = S + P
				if peso = 1 then 
					peso = 7 
				end if
            Next
			w "<br>Soma..............: " & chr(11) & S
            resto = S mod 11
			'response.write "<br>D1-----: " & D1
			w "<br>" & S & "/11....: " & chr(11) & resto
			w "<br>testa o valor do RESTO...................................."
			
			if (resto = 0) then
				w "<br>Resto = 0"
                D2 = 0
				
            elseif (resto = 1) then
				w "<br>Resto = 1..................................................."
				response.write "<br><br>resto = 1 --> recalcula..."
				response.write "<br>D1 Atual....: " & d1
                D1 = D1 + 1
				response.write "<br>D1 + 1....: " & d1
                if (D1 = 10) then D1 = 0 end if
				response.write "<br>D1 + enviado para recalculo....: " & d1
                CalculaD2 chave, D1
			elseif (resto > 1) then
				w "<br>Resto > 1"
                D2 = 11 - resto
				d3 = D2
			end if
			w "<br>d2 final...." & D2
            CalculaD2 = D2
End function

Para testar, passem o valor da chave (14000006000065971322021) e o valor de D1(9)... se der tudo certo, na primeira passagem, vai dar 1, então irá recalcular, e o valor final tem que ser 6.

 

Se alguém puder ajudar, agradeço antecipadamente...

 

No meu debug, aparece assim:

Entrando no calculo D2...

chaved1...: 140000060000659713220219
D1......:9
D2......:0
Soma..............: 276
276/11....: 1
testa o valor do RESTO....................................
Resto = 1...................................................

resto = 1 --> recalcula...
D1 Atual....: 9
D1 + 1....: 10
D1 + enviado para recalculo....: 0

Entrando no calculo D2...

chaved1...: 140000060000659713220210
D1......:0
D2......:0
Soma..............: 258
258/11....: 5
testa o valor do RESTO....................................
Resto > 1
d2 final....6
d2 final....0

O que não estou entendendo são as duas últimas linhas, era para aparecer apenas a que contém o número 6

 

sds

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal, alguém fez teste na função... a função (calculo) está correta, no entanto, após aparecer

d2 final....: 6

imediatamente repete a mesma linha e o valor passa a ser zero... como pode isso? se tivesse repassado na função teria que aparecer as linhas de debug, mas nada! apenas duplica a linha e assumindo outro valor, como pode isso?

 

Agradeço se alguém puder dar pelo menos alguma dica, se já passou por algo parecido, etc...

 

sds

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem pessoal, acho que consegui resolver (em partes), colocando, ao invés de chamar a recorrência quando o resto = 1 assim:

CalculaD2 chave, D1

crei uma nova variável e passei a utilizá-la assim:

D3 = CalculaD2(chave, D1)

Talvez não seja o ideal, pois ainda continua repetindo a última linha, mas agora, pelo menos, repete com o valor correto.

 

sds

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpe no tive tempo de ver aquela parada pra você, estou nuns projetos com urgência. Podemos descartar a conversa off-line

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.