Ir para conteúdo

POWERED BY:

Arquivado

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

Carlos Moreira

[Resolvido] Chave Aleatória

Recommended Posts

Ola pessoal to usando este codigo abaixo para gerar um código aleatório para registros que vou colocar no banco.

 

Eis o Código

 

Function chave_aleatoria(nQuant,ref)
	For Cont = 1 to nQuant
		Randomize
		If (Int(rnd*10) Mod 2 = 0) Then
			sRand = sRand + Chr(rnd * 25 + 97)
		Else 
			sRand = sRand + Cstr(Int(rnd * 10))
		End If
	Next
chave_aleatoria = sRand & ref
End Function

POREM

 

preciso fazer o seguinte toda vez que for gravar preciso consultar no banco se ja existe algum cadastro IGUAL

porem se nao existir ELE GRAVA se EXISTIR ele gera outro e depois grava novamente.

 

Como posso fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cria uma função recursiva.

 

Ao criar a chave verifica no banco, se o retorno não for fim de arquivo a função recebe o valor da chave, caso contrário a função é executada novamente.

 

Se não conseguir, posta o código que verifica no banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

GERO A CHAVE = CHAVE

 

mysql = "SELECT * FROM TABELA where CHAVE='"&CHAVE&"'"

set RS = Conn.Execute(mysql)

 

If not RS.eof then

response.redirect "JÁ EXISTE"

response.end()

RS.Close

Set RS = Nothing

End If

 

GRAVO

 

Seria Isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

 

 

Consultar ="Select * From..."
Set Rs=Cnn.Execute(Consultar )
If Rs.Eof Then

Inserir="Insert Into..." 
Cnn.Execute(Inserir)

Response.Write("Cadastrado com sucesso!")
Else
Response.Write("ja existe!")
End If

 

at+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Idéia básica:

Function chave_aleatoria(nQuant,ref)
For Cont = 1 to nQuant
	Randomize
	If (Int(rnd*10) Mod 2 = 0) Then
		sRand = sRand + Chr(rnd * 25 + 97)
	Else
		sRand = sRand + Cstr(Int(rnd * 10))
	End If
Next
chave_aleatoria = sRand & ref
'Faça aqui seu SELECT para verificar no BD a existência do valor. Se já existir chame a mesma função novamente.
End Function

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salgado fiz assim veja se esta certo, aqui funcinou, mas nao sei se seria a maneira mais correta

 

 

NOME PAGINA = PAGE_add.asp

Function chave_aleatoria(nQuant,ref)
	For Cont = 1 to nQuant
	   Randomize
	  If (Int(rnd*10) Mod 2 = 0) Then
		  sRand = sRand + Chr(rnd * 25 + 97)
	 Else 
		   sRand = sRand + Cstr(Int(rnd * 10))
	   End If
  Next
chave_aleatoria = sRand & ref
End Function

Call abre_conexao1(ConnString,Conn)

sql = "SELECT * FROM TABELA where Chave='"&chave_aleatoria(10,login)&"'"
Set RS = Conn.Execute(sql)

If Not RS.eof then
Response.Redirect "PAGE_add.asp"
Response.end()

Else

sql = "Insert Into TABELA (ChaveAleatoria, CAMPO2, CAMPO3, CAMPO4) VALUES ('" & chave_aleatoria(10,login) & "', '" & xxx& "', '" & xxx& "', '" & xxx& "')"
Conn.Execute(sql)
Call fecha_conexao1() 

Response.Redirect "PAGE_list.asp"
End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se esse funciona corretamente:

Function chave_aleatoria(nQuant,ref)
For Cont = 1 to nQuant
	Randomize
	If (Int(rnd*10) Mod 2 = 0) Then
		sRand = sRand + Chr(rnd * 25 + 97)
	Else
		sRand = sRand + Cstr(Int(rnd * 10))
	End If
Next

chave_aleatoria = sRand & ref

Call abre_conexao1(ConnString,Conn)
sql = "SELECT Chave FROM TABELA where Chave='"& chave_aleatoria &"'"
Set RS = Conn.Execute(sql)
If Not RS.eof then
	Call Chave_Aleatoria(nQuant, Ref)
End If
Set RS = Nothing
Call fecha_conexao1() 
End Function


Call abre_conexao1(ConnString,Conn)
sql = "Insert Into TABELA (ChaveAleatoria, CAMPO2, CAMPO3, CAMPO4) VALUES ('" & chave_aleatoria(10,login) & "', '" & xxx& "', '" & xxx& "', '" & xxx& "')"
Conn.Execute(sql)
Call fecha_conexao1() 

Response.Redirect "PAGE_list.asp"
End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz desta forma Salgado porem perceba que coloquei para abrir o bando no começo do codigo e fecha somente la no final esta certo assim né, mas no post abaixo funcionou

 

Call abre_conexao1(ConnString,Conn)

Function chave(nQuant,ref)
	For Cont = 1 to nQuant
		Randomize
		If (Int(rnd*10) Mod 2 = 0) Then
			sRand = sRand + Chr(rnd * 25 + 97)
		Else
			sRand = sRand + Cstr(Int(rnd * 10))
		End If
	Next

	chave = sRand & ref	
	
	sql = "SELECT * FROM TABELA where Chave='"&chave&"'"
	Set RS = Conn.Execute(sql)
	If Not RS.eof then
		Call chave(nQuant, Ref)
	End If
	Set RS = Nothing
	
End Function

sql = "Insert Into TABELA (Chave) VALUES ('" & chave(10,login) & "')"
Conn.Execute(sql)
Call fecha_conexao1() 

Response.Redirect "PAGE_list.asp"

Outra coisa que percebi aqui porque eu tive que colocar

 

chave(10,login) na hora de gravar e quando consulto esta assim somente chave ?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Fiz desta forma Salgado porem perceba que coloquei para abrir o bando no começo do codigo e fecha somente la no final esta certo assim né, mas no post abaixo funcionou

 

Call abre_conexao1(ConnString,Conn)

Function chave(nQuant,ref)
For Cont = 1 to nQuant
	Randomize
	If (Int(rnd*10) Mod 2 = 0) Then
		sRand = sRand + Chr(rnd * 25 + 97)
	Else
		sRand = sRand + Cstr(Int(rnd * 10))
	End If
Next

chave = sRand & ref	

sql = "SELECT * FROM TABELA where Chave='"&chave&"'"
Set RS = Conn.Execute(sql)
If Not RS.eof then
	Call chave(nQuant, Ref)
End If
Set RS = Nothing

End Function

sql = "Insert Into TABELA (Chave) VALUES ('" & chave(10,login) & "')"
Conn.Execute(sql)
Call fecha_conexao1() 

Response.Redirect "PAGE_list.asp"

Sem problemas de fazer dessa forma, abrindo a conexão no início do código e fechando ao final.

 

Outra coisa que percebi aqui porque eu tive que colocar

 

chave(10,login) na hora de gravar e quando consulto esta assim somente chave ?

Fora da Função estamos usando o nome dela e passando os parâmetros que estava no seu exemplo. Na SQL dentro da função estamos usando a variável de saída (que tem o mesmo nome da função para isso mesmo) de sua função, ali ela já possui o valor gerado. No IF dentro da função estamos executando novamente a função usando os mesmos parâmetros de entrada para que sejam respeitadas as condições iniciais. Funções assim são chamadas de RECURSIVAS pois executam a si mesma caso alguma condição não seja atendida ou caso seja necessário "n" interações para se ter o resultado esperado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É que estranhei usar o login ali dentro sendo que na FUNÇÃO nao ha nenhum login.

 

E só a ultima coisa.

 

No codigo ele tem uma função IF ok. La diz que se ja existir ele chama Call chave(nQuant, Ref) novamente mas se quando ele chama a função Call chave(nQuant, Ref) tiver novamente o registro?

 

Ele volta na ação If?

 

Entendeu minha pergunta?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sua função recebe dois parâmetros: nQuant e Ref que são respectivamente os valores: 10 e a variável Login chamados na SQL de inserção. DENTRO da função só chamei os parâmetros novamente.

 

Sim ele fica em um "loop" interno até que não exista a Chave no banco de dados. Esse IF chama a mesma função novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, entendido a questão do "loop" essa era miha preocupação.

 

Agora dentro desse codigo se eu quisesse colocar uma chave com 20 caracteres, o que teria que mudar no código sendo os 20 caracteres LETRAS e NUMEROS como esta agora, mas com 20 ao inves de 10 caracteres?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É só chamar a função passando a quantidade de caracteres que quer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como ficaria o codigo abaixo para 20 caracteres?

 

Function chave_aleatoria(nQuant,ref)
	For Cont = 1 to nQuant
		Randomize
		If (Int(rnd*10) Mod 2 = 0) Then
			sRand = sRand + Chr(rnd * 25 + 97)
		Else 
			sRand = sRand + Cstr(Int(rnd * 10))
		End If
	Next
chave_aleatoria = sRand & ref
End Function

Compartilhar este post


Link para o post
Compartilhar em outros sites

nQuant é a quantidade de caracteres que você quer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como ficaria entao pq nao sei onde esta a varial da nQuant

 

Function chave_aleatoria(nQuant,ref)

For Cont = 1 to nQuant

Randomize

If (Int(rnd*10) Mod 2 = 0) Then

sRand = sRand + Chr(rnd * 25 + 97)

Else

sRand = sRand + Cstr(Int(rnd * 10))

End If

Next

chave_aleatoria = sRand & ref

End Function

 

o que entendo é que nquant é igual a 1 entao?

coloca no codigo pra mim como fica!!!

 

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

essa funcao eu que postei, e acho que explicava

Function chave_aleatoria(nQuant,ref)
	For Cont = 1 to nQuant
		Randomize
		If (Int(rnd*10) Mod 2 = 0) Then
			sRand = sRand + Chr(rnd * 25 + 97)
		Else 
			sRand = sRand + Cstr(Int(rnd * 10))
		End If
	Next
chave_aleatoria = sRand & ref
End Function

<%

chave_aleatoria("100","data")

%>

 

cria a chave com 100 caracteres

você nao precisa comparar no banco pois nunca vai haver igual,

 

com a variavel ref, você indica o final da chave

chave_aleatoria("10","teste")

a chave sera alertuaj8steste

 

por isso eu uso a data atual no valor do ref, assim é impossivel gerar uma chave de x digitos igual

precisaria de milhoes de cadastros criados no mesmo segundo pra passar perto de ter uma igual, mas nao te impede de comparar antes de gerar

 

qq coisa posta ai

[]s

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.