Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá gente.
Tenho uma pequena dúvida:
Gostaria q um Select Case retornasse valores personalizados. Assim: imaginemos que no campo SECAO o valor 'video' seja capturado. Então, o Case irá colar o link lá no ASP. Se o Case retornar como 'artigo'... o Case irá gerar no geralink, o link correspondente.
Abaixo tem a minha idéia. Por favor vejam aí :)
<%
WHILE not rs.eof Do Until
Select Case rs("secao")
Case "video"
geralink = "java script:abre_vplayer('video_player.asp?id=<%=rs("id")%>');"
Case "artigo"
geralink = "artigo.asp?id=<%=rs("id")%>"
Case "banco de textos"
geralink = "vertexto.asp?id=<%=rs("id")%>"
End Select
%>
<h2><%=rs("secao")%></h2>
<h1><a href="<%=geralink%>" target="_parent"><%=rs("titulo")%></a></h1>
<p><a href="<%=geralink%>" target="_parent"><%=rs("descricao")%></a></p>
<% RS.MoveNext %>Select case é melhor que o IF em termos de performance e, caso se trabalhe com functions, até mais simples de se adicionar parâmetros posteriormente.
se o valor é sempre o mesmo para qualquer video, é mais simples, logico, facil de implementar e de alta performace se estivese uma coluna com o link completo, ai você faz um replace do id
Com o Select Case você tem praticidade na atualização de seções, pois não se precisa alterar o código do design, o que é mais complicado e pode causar problemad,porém o código fica maior, como é o mesmo para todas as páginas. Se o servidor for lento, os visitantes podem ter alguma queda de desempenho.
case ou if, nada tem a ver com design
nenhum dos casos precisa mudar o layout
Olha só, a intenção é de ser um mecanismo simples de busca. Como serão consultas em 3 tabelas.... então cada seção precisa ter um link específico.
EX: para uma ocorrência na tabela ARTIGOS o link deve ser
artigo.asp?id=<%=rs("id")%> para uma ocorrência na tabela BANCO_TEXTOS o link deve ser vertexto.asp?id=<%=rs("id")%> e para uma ocorrência na tabela VIDEOS o link deve ser java script:abre_vplayer('video_player.asp?id=');
Se a busca retornar uma ocorrência na tabela ARTIGOS, o nome de <%=rs("secao")%> deve retornar artigo
Se a busca retornar uma ocorrência na tabela BANCO_TEXTOS o nome de <%=rs("secao")%> deve retornar banco de textos e assim por diante.
Fiz uma rápida modificação no code e joguei o <%=rs("id")%> lá no xHtml. E então o pensamento é mais ou menos esse gente?
<%
'Vamos recuperar a variável do formulário:
busca = Request.Form("busca")
Sql = "SELECT * FROM Artigos, Banco_textos, Videos WHERE titulo, descricao LIKE '%" & busca & "%' AND status = 'ativo' ORDER BY id DESC"
Set rs = Server.CreateObject("ADODB.Recordset")
Set rs = Conexao.Execute(Sql)
%>
<%
WHILE not rs.eof Do Until
Select Case rs("secao")
Case "video"
geralink = "java script:abre_vplayer('video_player.asp?id=');"
Case "artigo"
geralink = "artigo.asp?id="
Case "banco de textos"
geralink = "vertexto.asp?id="
End Select
%>
<h2><%=rs("secao")%></h2>
<h1><a href="<%=geralink%><%=rs("id")%>" target="_parent"><%=rs("titulo")%></a></h1>
<p><a href="<%=geralink%><%=rs("id")%>" target="_parent"><%=rs("descricao")%></a></p>
<% RS.MoveNext %>>
Set rs = Conexao.Execute(Sql)
%>
<%
WHILE not rs.eof Do Until
...
End Select
%>
<h2><%=rs("secao")%></h2>
<h1><a href="<%=geralink%>**<%=rs("id")%>**" target="_parent"><%=rs("titulo")%></a></h1>
<p><a href="<%=geralink%>**<%=rs("id")%>**" target="_parent"><%=rs("descricao")%></a></p>
<% RS.MoveNext %>
evite abrir e fechar diversas vezes, faca tudo com response.write, melhora o desempenho
Bom gente a coisa tá muito complicada quando envolve o geralink com javascript. Decidi criar um buscador só para vídeos e outro só para textos. Só que não consigo colocar mais de uma tabela em FROM. Quando coloco FROM Artigos, Banco_textos dá erro. O mesmo acontece se eu colocar WHERE titulo, descricao
Da forma abaixo dá certo... mas apenas com uma tabela em FROM e apenas um valor em WHERE
E agora?
ps: fiz um resumo no code pra facilitar.
<%
'recupera a variavel do formulario
busca = Request.Form("busca")
Sql = "SELECT titulo, secao, descricao, status, id FROM Artigos WHERE titulo LIKE '%" & busca & "%' AND status = 'ativo' ORDER BY id DESC"
Set rs = Conexao.Execute(Sql)
%>
<p class="txtbusca">Exibindo resultado(s) da busca por: <u><%=busca%></u></p>
<%
Select Case rs("secao")
Case "Artigo"
geralink = "artigo.asp?id="
gerasecao = "Artigo"
Case "banco de textos"
geralink = "vertexto.asp?id="
gerasecao = "Banco de Textos"
End Select
%>
<h2><%=gerasecao%></h2>
<h1 class="titulo"><a href="<%=geralink%><%=rs("id")%>" target="_parent"><%=rs("titulo")%></a></h1>
<p><a href="<%=geralink%><%=rs("id")%>" target="_target"><%=rs("descricao")%></a></p>usa o INNER JOIN
xanburzum fiz o tal INNER JOIN mas retornou o erro:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
Column 'titulo' in field list is ambiguous
/buscadortxt.asp, line 95
<%
'recupera a variavel do formulario
busca = Request.Form("busca")
Sql = "SELECT titulo, secao, descricao, status, id FROM Artigos INNER JOIN Banco_textos WHERE titulo LIKE '%" &
busca & "%' AND status = 'ativo' ORDER BY id DESC"
Set rs = Conexao.Execute(Sql)
%>
<p class="txtbusca">Exibindo resultado(s) da busca textual por: <u><%=busca%></u></p>
</div>
<%
Select Case rs("secao")
Case "Artigo"
geralink = "artigo.asp?id="
gerasecao = "Artigo"
Case "banco de textos"
geralink = "vertexto.asp?id="
gerasecao = "Banco de Textos"
End Select <h2><%=gerasecao%></h2>
<h1 class="titulo"><a href="<%=geralink%><%=rs("id")%>" target="_parent"><%=rs("titulo")%></a></h1>
<p><a href="<%=geralink%><%=rs("id")%>" target="_parent"><%=rs("descricao")%></a></p>
<%Fiz uma pesquisa aqui pelo INNER JOIN e aí depois de ler algumas coisas, fiz uma alteração na string do SQL.
ficou assim:
<%
'recupera a variavel do input do formulario
busca = Request.Form("busca")
Sql = "SELECT Artigos.titulo, Banco_textos.titulo FROM Artigos INNER JOIN Banco_textos WHERE Artigos.titulo, Banco_textos.titulo LIKE '%" & busca & "%' AND status = 'ativo' ORDER BY Artigos.id, Banco_textos.id DESC"
Set rs = Conexao.Execute(Sql)
%>
Retornou o erro:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' Banco_textos.titulo LIKE '%a%' AND status = 'ativo' ORDER BY Artigos.id, Banco_' at line 1
/buscadortxt.asp, line 104
----------------------------------------
Tentei colocar no SELECT os campos que uso no xhtml para imprimir os dados coletados no banco, mas deu pau. Campos: "secao" , "id" , "titulo" , "descricao", "status"
Onde estou errando?
O INNER JOIN está errado.
É FROM Artigos A INNER JOIN Banco_textos B ON A.codigoEmComum = B.codigoEmComum
hargon, com a sua dica ficaria assim o code?
Sql = "SELECT Artigos.titulo, Banco_textos.titulo FROM Artigos titulo INNER JOIN Banco_textos titulo ON Artigos.titulo = Banco_textos.titulo WHERE Artigos.titulo, Banco_textos.titulo LIKE '%" & busca & "%' AND status = 'ativo' ORDER BY Artigos.id, Banco_textos.id DESC"
Não... o ideal é usar códigos em comum no INNER JOIN
Sql = "SELECT A.titulo FROM Artigos A INNER JOIN Banco_textos B ON A.id = B.id WHERE (A.titulo LIKE '%" & busca & "%' Or B.titulo LIKE '%" & busca & "%') AND status = 'ativo' ORDER BY A.id DESC"Se der errado, posta o nome da tabela e os campos delas...
hargon, fiz aqui o teste e deu erro:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
Not unique table/alias: 'titulo'
/buscadortxt.asp, line 103
----------------------------------
Utilizei o code:
Sql = "SELECT Artigos.titulo, Banco_textos.titulo FROM Artigos titulo INNER JOIN Banco_textos titulo ON Artigos.titulo = Banco_textos.titulo WHERE Artigos.titulo, Banco_textos.titulo LIKE '%" & busca & "%' AND status = 'ativo' ORDER BY Artigos.id, Banco_textos.id DESC"
O que estou querendo é o seguinte: que a busca pesquise ocorrências nas tabelas ARTIGOS e BANCO_TEXTOS. E dentro dessas tabelas, ele pesquise os campos TITULO e DESCRICAO mas que exiba apenas ocorrências onde status = 'ativo'
É isso.
voce esta dando o mesmo alias para duas tabelas
mude um
FROM Artigos titulo INNER JOIN Banco_textos titulo
Você não fez conforme eu postei por último.
Como o Mario disse, você está duplicando o nome das tabelas e ainda colocando o mesmo nome de um campo. Faça o teste com a SQL que postei.
Poxa, utilizei o code que você tinha passado mas deu erro novamente.
De acordo com a descrição do erro, o trauma agora é com 'status'
:(
código sugerido:
Sql = "SELECT A.titulo FROM Artigos A INNER JOIN Banco_textos B ON A.id = B.id WHERE (A.titulo LIKE '%" & busca & "%' Or B.titulo LIKE '%" & busca & "%') AND status = 'ativo' ORDER BY A.id DESC"
Erro retornado:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
Column 'status' in where clause is ambiguous
/buscadortxt.asp, line 101
Você tem o campo status em duas tabelas? É necessário que ele seja verdadeiro nas duas para exibir os dados?
O que falta é você referenciar a qual tabela ele pertence.
O campo status pertence tanto à tabela Artigos quanto à tabela Banco_textos
E em ambos os casos tem valor como ativo
Ou seja, a busca só exibirá resultados onde o status estiver como 'ativo'
:(
mas voce precisa colocar o nome da tabela junto para nao dar ambiguidade
Cara tenta assim
Sql = "SELECT A.titulo FROM Artigos AS A INNER JOIN Banco_textos AS B ON A.id = B.id WHERE (A.titulo LIKE '%" & busca & "%' Or B.titulo LIKE '%" & busca & "%') AND status = 'ativo' ORDER BY A.id DESC"
Caro Marcus tentei a sua dica, mas deu erro:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
Column 'status' in where clause is ambiguous
/buscadortxt.asp, line 102
Mario Monteiro, colocar o nome da tabela junto de 'status' ficaria assim?
Sql = "SELECT Artigos.titulo, Banco_textos.titulo FROM Artigos titulo INNER JOIN Banco_textos titulo ON Artigos.titulo = Banco_textos.titulo WHERE Artigos.titulo, Banco_textos.titulo LIKE '%" & busca & "%' AND [b]A.status = 'ativo' B.status = 'ativo'[/b] ORDER BY Artigos.id, Banco_textos.id DESC"
Tentei dessa forma e deu pau novamente.
Experimentei arrancar a condicional de status = 'ativo' e aí retornou isso quando faço qualquer busca:
ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.
/buscadortxt.asp, line 122
Verifique se você não esta tentando trabalhar com um RecordSet que não faz parte da coleção de registros. Isso acontece na maioria das vezes por que existe erro de ortogtafia e não confere com um campo da Base de Dados.
Bom, dei uma olhada aqui e fiz um scan visual pra ver se tinha alguma irregularidade.
Mas não detectei nada. Eis o meu ASP completo abaixo:
Ps: quando digito letras isoladas ele dá erro.... quando digito uma palavra completa, ele diz que "A busca não encontrou nenhuma ocorrência relacionada ao ítem pesquisado." Que loucura!
Ps 2: quando utilizo essa forma abaixo dá tudo certo, então, não se trata (aparentemente) de irregularidade no código, pois se houvesse daria pau também dessa forma:
Sql = "SELECT titulo, secao, descricao, status, id FROM Artigos WHERE titulo LIKE '%" & busca & "%' AND status = 'ativo' ORDER BY id DESC"
código ASP completo
<!--#include file="conectar.asp"-->
<!--#include file="cabecalho.asp"-->
<% AbreConexao %>
<head>
.
.
.
</head>
<body>
<div id="tudo">
<div id="topo">
</div>
<div id="conteudo">
<div id="identificador">
<h1><img src="arquivos/titulo_buscadortxt.gif" alt="" width="135" height="18" /></h1>
<p>acervo geral de textos: <strong></strong> arquivos disponíveis</p>
<%
Sql_conta = "SELECT count(id) as TOTAL FROM Artigos"
Set rs_contart = Server.CreateObject("ADODB.Recordset")
Set rs_contart = Conexao.Execute(Sql_conta)
%>
<h2>artigos <strong>(<%response.write rs_contart("TOTAL")%>)</strong>
<%
Sql_conta = "SELECT count(id) as TOTAL FROM Banco_textos"
Set rs_contabtx = Server.CreateObject("ADODB.Recordset")
Set rs_contabtx = Conexao.Execute(Sql_conta)
%>
- banco de textos <strong>(<%response.write rs_contabtx("TOTAL")%>)</strong></h2>
<div class="busca">
<form name="form" id="form" method="post" action="buscadortxt.asp">
<input name="busca" type="text" class="input" value="Faça uma
busca aqui"
onfocus="if(this.value=='Faça uma busca aqui')
{this.value='';}" size="30" />
<input name="submit" type="submit" class="bt" value="Buscar" />
</form>
</div>
</div>
<div id="buscapor">
<%
'recupera a variavel do formulario
busca = Request.Form("busca")
Sql = "SELECT A.titulo FROM Artigos AS A INNER JOIN Banco_textos AS B ON A.id = B.id WHERE (A.titulo LIKE '%" & busca & "%' Or B.titulo LIKE '%" & busca & "%') AND status = 'ativo' ORDER BY A.id DESC"
Set rs = Conexao.Execute(Sql)
%>
<p class="txtbusca">Exibindo resultado(s) da busca textual por: <u><%=busca%></u></p>
</div>
<div id="resultados">
<%
IF not rs.eof AND busca <> "" THEN
%>
<%<%
Select Case rs("secao")
Case "Artigo"
geralink = "artigo.asp?id="
gerasecao = "Artigo"
Case "banco de textos"
geralink = "vertexto.asp?id="
gerasecao = "Banco de Textos"
End Select <h2><%=gerasecao%></h2>
<h1 class="titulo"><a href="<%=geralink%><%=rs("id")%>" target="_parent"><%=rs("titulo")%></a></h1>
<p><a href="<%=geralink%><%=rs("id")%>" target="_parent"><%=rs("descricao")%></a></p>
<% <h1 class="titulo">A busca não encontrou nenhuma ocorrência relacionada ao ítem pesquisado.</h1>
<%
END IF
%>
</div>
</div>
<div id="rodape">
</div>
</div>
<%
rs.Close
set rs =nothing
rs_contart.close
set rs_contart = nothing
rs_contabtx.close
set rs_contabtx = nothing
FechaConexao %>
</body>
</html>
ja vi
sacanagem
qual a duvida?
deu erro? quer saber se é viavel?
e normal case dentro de loop, nao ha problema
em termos de desempenho, nao sei se ha vantagens entre aplicar 'select case' ou 'if'
sera que alguem sabe?
use case else
eu sempre uso case else com redir
[]s