Ir para conteúdo

POWERED BY:

Arquivado

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

marvi

[Resolvido] Loop para testar se há algo no banco

Recommended Posts

Olá pessoal, vamos lá...

 

Como resolver essa lógica:

 

Tem um formulário que pode gerar vários campos e se a pessoa resolver gerar dois campos ocorre isso:

 

Nome:

Nome:

 

Aí a pessoa digita, por exemplo:

 

Nome: Ok

Nome: Ok1

 

E envia para o banco de vez.

 

Código:

 

<% for i=1 to session("qtfabri") 
%>

<tr>
<td width="24%" height="23">

Nome do fabricante:</td>
<td width="76%" height="23">
<input type="text" name="nome<%=i%>" size="72" style="font-family: Verdana; font-size: 10 px; color: #3A5278; border: 1px solid #3A5278; background-color:#EEEEEE" value="<%=request.form("nome"&i)%>"></td>
</tr>

<td width="24%" height="1" bgcolor="#BAC8DC">
<img border="0" src="imagens/linhatransparente1.gif" width="62" height="1"></td>
<td width="76%" height="1" bgcolor="#BAC8DC">
<img border="0" src="imagens/linhatransparente1.gif" width="62" height="1"></td>
</tr>
<%next%>

Até aí tudo bem, ele roda normal e insere normal no banco.

 

Mas aí a pessoa resolve gerar dois campos ou mais campos de novo do formulário e digita:

 

Nome: Ok (veja que esse nome já foi digitado antes e estar no banco)

Nome: ok 2

Nome: ok 3

 

Aí na hora de inserir criei esse teste antes para ver se já existe o nome no banco, se existe ele não insere.

 

Ele manda uma session com a quantidade de campos criados no formulário que é preenchido para inserir no banco e faz o teste:

 

for i=1 to session("novo") 

teste= "Select * from fabricantes where nome = '" & request.form("nome"&i)& "'"
Set rsfabricantesteste=Conexao.Execute(teste)

next

Só que aí é que está o problema... Se o nome Ok, que já foi digitado e inserido no campo, for o primeiro dos campos do formulário, como no exemplo acima, ele não reconhece neste teste que fiz.

 

Isso ocorre por esse motivo lógico: porque ele dará o loop... quando passa o nome Ok (que já foi digitado) ele ver que está no banco, mas terá que dar outro loop de novo para ver os nomes Ok 2 e Ok 3 que não foi digitado antes e assim ao acabar os loops ele irá considerar o último loop que foi com o nome Ok 3 e assim "esquece" que logo no inicio o nome Ok já está no banco e acaba cadastrando tudo: Ok (de novo), Ok 2, Ok 3.

 

Ele só funciona se o nome Ok foi digitado no último campo gerado no formulário, pois terá o loop testando Ok 2, Ok3 e o último será o Ok e assim ele irá considerar o ultimo loop que foi com o nome Ok (que já foi cadastrado antes) e verá que não pode cadastrá-lo e acusa que não pode cadastrar.

 

Então como resolver isso? Como fazer com que o teste reconheça o que já foi cadastrado, como esse nome Ok por exemplo, em qualquer posição do loop?

 

Tipo se ele foi cadastrado no primeiro campo, segundo ou terceiro campo do formulário, não importa, o importante é que ele reconheça que uma vez já foi cadastro esse nome Ok e em um determinado momento do Loop acusou isso (não importa se foi no ultimo loop ou o primeiro loop do teste).

 

Pois assim não deixo que a pessoa insira o mesmo nome já cadastrado juntos com outros nomes novos. Como resolver isso, alguém pode ver isso?

 

Já tentei aqui e nada...

 

Obrigado!!

 

Marcelo

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode fazer uma consulta antes de dar o INSERT no banco, ou seja,

Faz um SELECT nos campos

 

SQL=”SELECT campo,campo1 FROM tabela WHERE campo=’”&variável&”’, ....., .....
Recordset.OPEN,SQL,1,3
If NOT recordset.EOF then
‘ se não for final do arquivo, pq nome já existe, você pode redirecioná-lo, ou abrir um pop-up, etc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas é o que estou fazendo...

 

Veja:

 

Tenho uma página com o formulário que os campos geram de acordo com a quantidade que o usuário quer:

 

for i=1 to session("qtfabri")   
%>
				   
 <tr>
					  <td width="24%" height="23">
					  <font face="Verdana" style="font-size: 8pt" color="#2A2A2A">
					  Nome do fabricante:</font></td>
					  <td width="76%" height="23">
					  <input type="text" name="nome<%=i%>" size="72" style="font-family: Verdana; font-size: 10 px; color: #3A5278; border: 1px solid #3A5278; background-color:#EEEEEE" value="<%=request.form("nome"&i)%>"></td>
					</tr>
				   
					  <td width="24%" height="1" bgcolor="#BAC8DC">
					  <img border="0" src="imagens/linhatransparente1.gif" width="62" height="1"></td>
					  <td width="76%" height="1" bgcolor="#BAC8DC">
					  <img border="0" src="imagens/linhatransparente1.gif" width="62" height="1"></td>
					</tr>
					   <%next%>

Aí ele envia o formulário para outra página que faz:

 

for i=1 to session("qtfabri")


 teste= "Select * from fabricantes where nome = '" & request.form("nome"&i)& "'"
 Set rsfabricantesteste=Conexao.Execute(teste)

 next

 IF not rsfabricantesteste.EOF Then
ja tem algo cadastrado

else

INSERT

end if

Mas, a questão é:

 

Porque ele dará o loop... quando passa o nome Ok (que já foi digitado, por exemplo) ele ver que está no banco, mas terá que dar outro loop de novo para ver os nomes Ok 2 e Ok 3 que foi digitado no formulário mas não está no banco ainda e assim ao acabar os loops ele irá considerar o último loop que foi com o nome Ok 3 e assim "esquece" que logo no inicio o nome Ok já está no banco e acaba cadastrando tudo: Ok (de novo), Ok 2, Ok 3.

 

Entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tava tentando fazer algo do tipo:

 

 

 

teste= "Select * from fabricantes where nome = '" & request.form("nome"&i)& "'"

Set rsfabricantesteste=Conexao.Execute(teste)

 

IF rsfabricantesteste.EOF then

 

conta = 0

 

While Not rsfabricantesteste.EOF

 

nome = rsfabricantesteste("nome")

 

conta = conta +1

 

 

rsfabricantesteste.MoveNext

 

If Not rsfabricantesteste.EOF Then

If rsfabricantesteste("nome") <> nome Then

response.write("nome")

conta = 0

End If

End If

 

Wend

 

Mas não deu ainda... Alguém tem uma dica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha este exemplo, onde é verificado o cadastramento de login

<% 'incluir_action.asp => fazer a inclusao no BD, antes fazendo uma verificaçao
   'no BD através de SQL Select if not rs.eof then
   'redireciono para incluir_form.asp?msgeof=1 else
   'incluo no bd atraves da SQL Insert e redireciono para adiministraçao.asp?msg=1
   'e lá receberá um mensagem de sucesso
   
   Option explicit
   'declaro as var
   dim varlogin, varemail, varsenha, conexao, conDBQ, constring, rsselect, SQLselect, rsinsert, SQLinsert
   'recupero todos os dados
   varlogin=trim(request.form("login"))
   varsenha=trim(request.form("senha"))
   varemail=trim(request.form("email"))
   'crio a conexao
   %>
   <!--#include file="conn/conexao1.asp"-->
   <% 'abrir a conexao
   call abreconexao
   'crio o rsselect para verificar se os dados jah estaun cadastrados
   set rsselect=server.createobject("ADODB.Recordset")
   'crio o SQLselect
   SQLselect="SELECT login FROM login WHERE login='"&varlogin&"'"
   rsselect.open SQLselect,conexao,1,3
   if not rsselect.eof then
   		response.redirect("incluir_form.asp?msgeof=1")
		set rsselect=nothing
   else	
   		'crio o rsinsert para inseiri os dados no bd
   		 set rsinsert=server.createobject("ADODB.Recordset")
		'crio o SQLinsert pra incluir no bd
		SQLinsert="INSERT INTO login(login,senha,email) values('"&varlogin&"','"&varsenha&"','"&varemail&"')"
		rsinsert.open SQLinsert,conexao,1,3
		response.redirect("administracao.asp?msg=1")
		set rsinsert=nothing
	end if 
	call fechaconexao %>

Compartilhar este post


Link para o post
Compartilhar em outros sites

você não está entendo... Pois o meu já faz isso...

 

Veja com calma:

 

Primeiro o meu formulário é dinâmico, então o meu select * para ver tem que ser também

 

for i=1 to session("novo") 

teste= "Select * from fabricantes where nome = '" & request.form("nome"&i)& "'"
Set rsfabricantesteste=Conexao.Execute(teste)

next

Ele faz uma análise para ver se tem algo no banco com o loop, pois vem o campo "nome" repetido várias vezes do formulário. Se gerou 3 campos chamado nome no formulário, ele faz esse loop acima 3 vezes e ver se os conteúdos digitados nesse 3 campos do formulário existe no banco...

 

Mas o que acontece é que se nesses 3 campos, o primeiro campo do formulário tiver um conteúdo digitado que já tenha no banco de dados, ele ver, mas continua fazendo o loop até formar 3 loops (pois são 3 campos iguais do formulario) e assim o último loop é que vai ser considerado para ele (select *)... e se o ultimo loop, que corresponde ao ultimo campo "nome" do formulário, tiver um conteúdo que não está no banco, ele cadastra tudo, pois ele esquece que o primeiro loop tinha um conteúdo dentro do banco... mas como teve que continuar o loop, ele ignorou o primeiro loop e foi até o fim, que é o 3 loop e se o 3 loop não tem nada no banco ele cadastra tudo e não pode ser assim.

 

Neste caso não poderia cadastrar o primeiro loop, pois já tinha no banco... deveria cadastrar só o segundo (2) e o terceiro (3) loop... entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Recupere o contuedo da session e faça o Select * from fabricantes where nome = '" & request.form("nome"&i)& "'" separado dos outros, ou seja, trate cada instância gerada pelo usuário (por ex. 3 campos)individualmente, dae você usa

 

 

 

'crio o rsselect para verificar se os dados jah estaun cadastrados
   set rsselect=server.createobject("ADODB.Recordset")
   'crio o SQLselect
   SQLselect="SELECT login FROM login WHERE nome='"&varnome&"'"
   rsselect.open SQLselect,conexao,1,3
   if not rsselect.eof then
‘se não for final do arquivo, pq o nome já existe
		   response.redirect("incluir_form.asp?msgeof=1")
		set rsselect=nothing
   else	
		   'crio o rsinsert para inseiri os dados no bd
			set rsinsert=server.createobject("ADODB.Recordset")
		'crio o SQLinsert pra incluir no bd
		SQLinsert="INSERT INTO nome(nome) values('"& varnome &"')"
		rsinsert.open SQLinsert,conexao,1,3
...
...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi bem.

 

Quer que faça 3 teste separado, tipo:

 

1

 

SQLselect="SELECT login FROM login WHERE nome='"&varnome&"'"
   rsselect.open SQLselect,conexao,1,3
   if not rsselect.eof then

2

SQLselect="SELECT login FROM login WHERE nome='"&varnome&"'"
   rsselect.open SQLselect,conexao,1,3
   if not rsselect.eof then

3

 

SQLselect="SELECT login FROM login WHERE nome='"&varnome&"'"
   rsselect.open SQLselect,conexao,1,3
   if not rsselect.eof then

Compartilhar este post


Link para o post
Compartilhar em outros sites

Separado, mas não gerando 3 Instrucoes, você pode coloca-lo na mesma SQL, porem testando eles separadamente, e caso não existe você, da um INSERT, um loop

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque a verificação dentro do LAÇO de repetição que faz os inserts. Siga essa seqüencia lógica:

Recupere os dados
Abra o laço de repetição
Faça o SELECT pelo dado
Se não existir
	Faça o INSERT
Senão
	Marque em uma session, variável ou dê um Response.Write
Fim do se
Feche o SELECT
Fim da execução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estava tentando algo do tipo, mas da erro:

 

Objeto Response, ASP 0104 (0x80070057)

Operação não permitida

/vivo/inserirfabricantessql.asp

 

'aqui começa o loop para percorrer a consulta atras de registros repetidos
for i=1 to session("novo")

'aqui faz a consulta dentro do primeiro loop
teste= "Select * from fabricantes where nome = '" & request.form("nome"&i)& "'"

'setando o recordset
Set rsfabricantesteste=Conexao.Execute(teste)

'aqui você começa a percorrer os registros comparando o recordset com a variavel vinda do form
While Not rsfabricantesteste.EOF

'condicional comparativa
if request.form("nome"&i) <> rsfabricantesteste("nome") then


'se for igual não faz nada, indo para o próximo registro!
else
rsfabricantesteste.MoveNext


'fim das condicionais
end if

wend

'termino do primeiro loop
next

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basicamente assim:

'aqui começa o loop para percorrer a consulta atrás de registros repetidos
for i=1 to session("novo")

'aqui faz a consulta dentro do primeiro loop
teste= "Select * from fabricantes where nome = '" & request.form("nome"&i)& "'"

'setando o recordset
Set rsfabricantesteste=Conexao.Execute(teste)

'aqui verifica se veio algo no RecordSet
IF rsfabricantesteste.EOF THEN
	'Se não existir nada você faz o seu insert aqui
else
	'Aqui você pode exibir uma mensagem informando que o dado já existe
'fim das condicionais
end if

'termino do loop
next

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salgado,

 

Isso:

 

Recupere os dados

Abra o laço de repetição
	Faça o SELECT pelo dado
	Se não existir
		Faça o INSERT
	Senão
		Marque em uma session, variável ou dê um Response.Write
	Fim do se
	Feche o SELECT
Fim da execução.

Não seria isso:

 

for i=1 to session("novo") 
 
teste= "Select * from fabricantes where nome = '" & request.form("nome"&i)& "'"
Set rsfabricantesteste=Conexao.Execute(teste)

if rsfabricantesteste.eof

insert...

else

qualquer coisa

end if

next

Isso mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exato.

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.