Foros del Web » Programando para Internet » ASP Clásico »

Error en la busqueda

Estas en el tema de Error en la busqueda en el foro de ASP Clásico en Foros del Web. Buenas gente He sacado de diferentes posts un método de búsqueda y lo he adaptado a mis necesidades. La cuestión es que funciona todo perfecto ...
  #1 (permalink)  
Antiguo 21/08/2005, 01:00
 
Fecha de Ingreso: julio-2003
Mensajes: 43
Antigüedad: 20 años, 10 meses
Puntos: 0
Error en la busqueda

Buenas gente
He sacado de diferentes posts un método de búsqueda y lo he adaptado a mis necesidades. La cuestión es que funciona todo perfecto si en el formulario paso 1 sola palabra (EJ: web). Si paso 2 palabras (EJ: actualizar web) no funciona y me da el siguiente error.

Tipo de error:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E10)
[Microsoft][Controlador ODBC Microsoft Access] Pocos parámetros. Se esperaba 1.
/workflow/search.asp, línea 40

este es el código:

Código:
 <%
 busqueda=Split(Replace(Request.Form("nombre"),"'","''"))
 sql="SELECT * FROM workflow WHERE nombre_wf LIKE '%"&busqueda(0)&"%' "
 For i=1 to Ubound(busqueda)
 sql=sql&" OR NOMBRE LIKE '%"&busqueda(i)&"%' "
 Next
 
 Set rs = Conn.Execute(sql) 'LINEA 40, LA DEL ERROR!
 %>
<%do while not rs.eof%>
<TR>
<td><%=rs("id_wf")%></td><td><%=rs("nombre_wf")%></td>
</TR>
<%
rs.movenext
loop
%>
Agradecería si me pueden dar una mano a ver en que me estoy equivocando. Desde ya muchas gracias.
  #2 (permalink)  
Antiguo 21/08/2005, 01:09
Avatar de macedo  
Fecha de Ingreso: enero-2002
Ubicación: Madrid
Mensajes: 124
Antigüedad: 22 años, 4 meses
Puntos: 0
Hola JAvoGEVP.

Creo que el problema está en el Split.

No le estás indicando el separador y cuando hay más de una palabra te mete todas seguidas en el primer like (no hace el bucle).

Para asegurarte haz un

response.write(Ubound(busqueda))
response.flush()

despues del split.

Si te sale cero es eso.

Además si la cadena empieza con ' con el replace estas poniendo '' al principio lo que también te va a dar problemas y si no empieza así te faltan la comilla del principio. Aunque viendo la consulta yo me cargaría las comillas porque no deberían estar dentro del like y tal como lo planteas van a estar.

Yo cambiaría

busqueda=Split(Replace(Request.Form("nombre"),"'", "''"))

por

busqueda=Split(Trim(Replace(Request.Form("nombre") ,"'"," ")))

De este modo te cambia las ' por espacios que es el delimitador por defecto de Split y te quita los espacios al principio y al final.

Es como yo lo veo pero a lo mejor no he entendido bien lo que quieres hacer.

Espero que te sirva.

Saludos
__________________
"Hay que simplificar las cosas tanto como sea posible, pero no más".
Albert Einstein.

Última edición por macedo; 21/08/2005 a las 01:24
  #3 (permalink)  
Antiguo 21/08/2005, 07:55
 
Fecha de Ingreso: julio-2003
Mensajes: 43
Antigüedad: 20 años, 10 meses
Puntos: 0
Buenismo ahora funciona de maravilla!!!
Lo único q despues de hacerle un par de pruebas e encontrado otro error. El mismo sucede cuando pongo nada en el campo. Si el campo está vacio y envio el formulario me aparece el siguiente error:

Tipo de error:
Error de Microsoft VBScript en tiempo de ejecución (0x800A0009)
El subíndice está fuera del intervalo: '[number: 0]'
/workflow/search.asp, línea 35

Esta es la línea 35:

sql="SELECT * FROM workflow WHERE nombre_wf LIKE '%"&busqueda(0)&"%' "
  #4 (permalink)  
Antiguo 21/08/2005, 08:03
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Fijate en el bucle. Estás comenzando con 1, cuando en realidad tendrías que comenzar por 0, es por eso que dice que está fuera del intervalo, se refiere a los elementos del array que formas con el split. Lo mismo te pasaría si tenés un array con 10 elementos, y haces un bucle que lo recorra desde 0 hasta el 50, cuando i (o la variable que utilices para el bucle) no se corresponda con uno de los indices del array, te va a saltar ese error.
Slaudos!.
__________________
Add, never Remove
  #5 (permalink)  
Antiguo 21/08/2005, 08:17
Avatar de macedo  
Fecha de Ingreso: enero-2002
Ubicación: Madrid
Mensajes: 124
Antigüedad: 22 años, 4 meses
Puntos: 0
Hola de nuevo.

El problema creo que no está en el bucle "El subíndice está fuera del intervalo: '[number: 0]' "

Si un bucle tiene un índice final mayor que el inicial ni siquiera entra en él.

Es decir que el error, si no me equivoco, se lo da en la linea

sql="SELECT * FROM workflow WHERE nombre_wf LIKE '%"&busqueda(0)&"%' "

Para eso comprueba antes la longitud de la cadena:

If len(Trim(Replace("'"&Request.Form("nombre"),"'"," ")))>0 then
busqueda=Split(Trim(Replace(Request.Form("nombre") ,"'"," ")))
sql="SELECT * FROM workflow WHERE nombre_wf LIKE '%"&busqueda(0)&"%' "
For i=1 to Ubound(busqueda)
sql=sql&" OR NOMBRE LIKE '%"&busqueda(i)&"%' "
Next
Else
sql="SELECT * FROM workflow WHERE nombre_wf = Null OR NOMBRE = Null"
End if

Nota1: pongo "'"&Request.Form("nombre") en vez de Request.Form("nombre") porque si el campo es verdaderamente nulo, te va a dar un error el replace.

Nota2: Dependiendo de como tengas la base de datos Puede ser que tengas que cambiar =Null por =''

Saludos
__________________
"Hay que simplificar las cosas tanto como sea posible, pero no más".
Albert Einstein.
  #6 (permalink)  
Antiguo 21/08/2005, 08:28
Avatar de macedo  
Fecha de Ingreso: enero-2002
Ubicación: Madrid
Mensajes: 124
Antigüedad: 22 años, 4 meses
Puntos: 0
Perdón

"Si un bucle tiene un índice final mayor que el inicial ni siquiera entra en él."

Al reves

Si un bucle tiene un índice inicial mayor que el final ni siquiera entra en él a no ser que pongas un step negativo.

Saludos
__________________
"Hay que simplificar las cosas tanto como sea posible, pero no más".
Albert Einstein.
  #7 (permalink)  
Antiguo 21/08/2005, 08:51
 
Fecha de Ingreso: julio-2003
Mensajes: 43
Antigüedad: 20 años, 10 meses
Puntos: 0
Bien!
Funciona a la perfección! :D
Por último y con esto finalizaría mi buscador :D ...
La búsqueda q acabo de hacer es para un solo campo. Como debería hacer si quiero buscar en 3 campos de la tabla, teniendo en cuenta que en el form los 3 campos están separados al igual que en la tabla de la base. (Ej: nombre, descripcion, area) y que la persona q realiza la busqueda puede no completar algun campo, dejandolo en blanco. Soy claro?

Código:
<TR>
 <TD width="90">Nombre</TD>
 <TD width="258"><input name="nombre" size="30"></TD>
</TR>
<TR>
 <TD>Descripci&oacute;n</TD>
 <TD><input name="descripcion" size="30"></TD>
</TR>
<TR>
 <TD>Referencia</TD>
 <TD><input name="referencia" size="30"></TD>
</TR>
  #8 (permalink)  
Antiguo 21/08/2005, 09:00
Avatar de macedo  
Fecha de Ingreso: enero-2002
Ubicación: Madrid
Mensajes: 124
Antigüedad: 22 años, 4 meses
Puntos: 0
Hola de nuevo.

Pues haces la misma operación (es decir tres condicionales con tres bucles) lo que pasa es que los OR de cada campo deben ir entre paréntesis p.e. (campo1=a or campo1=b or...) and (campo2=c or campo2=d or...) etc.. (Quien dice "igual a" dice "Like")
Además el "select campo1,..., campoX Where" lo tienes tienes que poner antes de los condicionales y los bucles y solo ir añadiendo las condicones en función de las variables.

En cuanto a lo de comprobar si los campos han sido rellenados, te aconsego una funcion de javascript asociada el evento onsend del formulario.

Espero haberme explicado.

Saludos
__________________
"Hay que simplificar las cosas tanto como sea posible, pero no más".
Albert Einstein.
  #9 (permalink)  
Antiguo 21/08/2005, 09:05
 
Fecha de Ingreso: julio-2003
Mensajes: 43
Antigüedad: 20 años, 10 meses
Puntos: 0
Mira lo que he hecho y funciona:

Código:
 <%
 sql="SELECT * FROM workflow WHERE "
 'Compruebo que el campo NOMBRE no esté vacio
 If len(Trim(Replace("'"&Request.Form("nombre"),"'"," ")))>0 then
   bnombre=Split(Trim(Replace(Request.Form("nombre"),"'"," ")))
   sql=sql&"nombre_wf LIKE '%"&bnombre(0)&"%' "
    For i=1 to Ubound(bnombre)
     sql=sql&" OR nombre_wf LIKE '%"&bnombre(i)&"%' "
    Next
  orand="AND "
 Else
  orand=" "
 End If 
 'Compruebo que el campo DESCRIPCION no esté vacio
 If len(Trim(Replace("'"&Request.Form("descripcion"),"'"," ")))>0 then
   bdescripcion=Split(Trim(Replace(Request.Form("descripcion"),"'"," ")))
   sql=sql&orand&"descripcion_wf LIKE '%"&bdescripcion(0)&"%' "
    For i=1 to Ubound(bdescripcion)
     sql=sql&" OR descripcion_wf LIKE '%"&bdescripcion(i)&"%' "
    Next
 Else
  Response.Write("No ingreso parámetro de búsqueda")
 End If
Jaja, quizás no sea lo mas óptimo pero va bien no?
Como valido y pongo un mensaje de q no se encontraron resultados?
  #10 (permalink)  
Antiguo 21/08/2005, 09:17
Avatar de macedo  
Fecha de Ingreso: enero-2002
Ubicación: Madrid
Mensajes: 124
Antigüedad: 22 años, 4 meses
Puntos: 0
De nuevo por aquí.

Lo malo es que cuando quiera volver al fomulario deberá rellenarlo de nuevo (creo). Además estas hacendo trabajar al servidor para nada. Mejor que lo compruebe el ordenador del cliente.

Prueba esto en la página del formulario:

<Script>

Function Comprobar(){
if (document.all['nombre'].value=='' && document.all['descripcion'].value=='' && document.all['referencia'].value==''){
alert('Faltan campos por rellenar')
return false
}
else{
return true
}
}
</script>

Y en el tag form <Form ..... onsubmit="javascript:Comprobar()">

Nota: Si quieres que todos los campos esten rellenos usa || en vez de && (son el OR y el AND en javascript)
Tal como está tienen que faltar todos para que te rechace el formulario.
__________________
"Hay que simplificar las cosas tanto como sea posible, pero no más".
Albert Einstein.
  #11 (permalink)  
Antiguo 21/08/2005, 09:44
 
Fecha de Ingreso: julio-2003
Mensajes: 43
Antigüedad: 20 años, 10 meses
Puntos: 0
No consigo hacer funcionar ese javascript.
No valida, pasa directamente al action del form.
Revisé nombres de campos y estan perfecto.
Lo iba a cambiar pero es bastante sencillo el jscript q me acabas de enviar y no quería meter un choclo!
  #12 (permalink)  
Antiguo 21/08/2005, 10:10
Avatar de macedo  
Fecha de Ingreso: enero-2002
Ubicación: Madrid
Mensajes: 124
Antigüedad: 22 años, 4 meses
Puntos: 0
No sé donde tengo la cabeza.
Fallos tontos.

Parentesis:

if (document.all['nombre'].value=='' && document.all['descripcion'].value=='' && document.all['referencia'].value==''){

deberías ser

if ((document.all['nombre'].value=='' ) && (document.all['descripcion'].value=='') && (document.all['referencia'].value=='')){

Evento.
Cambia

onsubmit="javascript:Comprobar()"

por

onsubmit="return Comprobar()"

En fin... las prisas.

Saludos.
__________________
"Hay que simplificar las cosas tanto como sea posible, pero no más".
Albert Einstein.
  #13 (permalink)  
Antiguo 29/08/2006, 10:42
 
Fecha de Ingreso: agosto-2006
Mensajes: 1
Antigüedad: 17 años, 9 meses
Puntos: 0
Ayuda por favor

Hola a mi me sale el mismo error pero no con las soluciones que ustedes dan no ha podido hacer que funcione todavia, me ayudan por favor!!!!!!
Les pongo la linea que tiene el error.


El error:
Tipo de error:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E10)
[Microsoft][Controlador ODBC Microsoft Access] Pocos parámetros. Se esperaba 1.
/Aceites/molist.asp, línea 115


Mi codigo:
<html>

<head>
<title></title>
</head>

<BODY leftmargin="0">
<%
%>
<%
' BEGIN USER CONSTANTS
Dim CONN_STRING
Dim CONN_USER
Dim CONN_PASS
CONN_STRING = "DSN=Aceites;"
CONN_STRING = CONN_STRING & "Driver={Microsoft Access Driver (*.mdb)};"

CONN_USER = ""
CONN_PASS = ""

' BEGIN RUNTIME CODE
' Declare our vars
Dim iPageSize 'How big our pages are
Dim iPageCount 'The number of pages we get back
Dim iPageCurrent 'The page we want to show
Dim strOrderBy 'A fake parameter used to illustrate passing them
Dim strSQL 'SQL command to execute
Dim objPagingConn 'The ADODB connection object
Dim objPagingRS 'The ADODB recordset object
Dim iRecordsShown 'Loop controller for displaying just iPageSize records
Dim I 'Standard looping var
Dim myfecha

iPageSize = 24 ' You could easily allow users to change this


If Request.QueryString("page") = "" Then
iPageCurrent = 1
Else
iPageCurrent = CInt(Request.QueryString("page"))
End If

If Request.QueryString("order") = "" Then
strOrderBy = "codigo"
Else
strOrderBy = Request.QueryString("order")
End If
wer=""
If Request.Form("codigo") <>"" Then
codi = Request.Form("codigo")
Else
codi = Request.QueryString("tcodi")
End If
If Request.Form("field1") <>"" Then
field11 = Request.Form("field1")
Else
field11 = Request.QueryString("f1")
End If
If Request.Form("Ciudad") <>"" Then
emer = Request.Form("Ciudad")
Else
emer = Request.QueryString("temer")
End If
If Request.Form("field6") <>"" Then
field66 = Request.Form("field6")
Else
field66 = Request.QueryString("f6")
End If
If Request.Form("fechaini") <>"" Then
fini = Request.Form("fechaini")
Else
fini = Request.QueryString("tfini")
End If
If Request.Form("fechafin") <>"" Then
fin = Request.Form("fechafin")
Else
fin = Request.QueryString("tfin")
End If
If Request.Form("field7") <>"" Then
field77 = Request.Form("field7")
Else
field77 = Request.QueryString("f7")
End If
strSQL = "SELECT Analisis_resumido.Movil,Analisis_resumido.Cliente FROM Analisis_resumido"
strSQL= strSQL & " WHERE (Analisis_resumido.mantl<>" & cHR(39) & wer & Chr(39)
If field11="cod" then
strSQL= strSQL & " AND Analisis_resumido.Movil=" & cHR(39) & codi & Chr(39)
End If
If field66="eme" then
strSQL= strSQL & " AND Analisis_resumido.Cliente=" & cHR(39) & emer & Chr(39)
End If
strSQL= strSQL & ")"
If field77="fec" then
strSQL= strSQL & " AND (Analisis_resumido.Fecha_Analisis>" & ("#") & day(fini) & "/" & month(fini) & "/" & year(fini) & ("#")

strSQL= strSQL & " AND Analisis_resumido.Fecha_Analisis<" & ("#") & day(fin) & "/" & month(fin) & "/" & year(fin) & ("#")

strSQL= strSQL & ")"
End If
strSQL = strSQL + "ORDER BY " & strOrderBy & ";"



Set objPagingConn = Server.CreateObject("ADODB.Connection")
objPagingConn.Open CONN_STRING, CONN_USER, CONN_PASS

Set objPagingRS = Server.CreateObject("ADODB.Recordset")
objPagingRS.PageSize = iPageSize

objPagingRS.CacheSize = iPageSize

objPagingRS.Open strSQL, objPagingConn, adOpenStatic, adLockReadOnly, adCmdText ' La linea del error

' Get the count of the pages using the given page size
iPageCount = objPagingRS.PageCount

' If the request page falls outside the acceptable range,
' give them the closest match (1 or max)
If iPageCurrent > iPageCount Then iPageCurrent = iPageCount
If iPageCurrent < 1 Then iPageCurrent = 1

' Check page count to prevent bombing when zero results are returned!
%>
<%
If iPageCount = 0 Then
Response.Write "No hay registros. Revise los criterios de selección!"
Else
' Move to the selected page
objPagingRS.AbsolutePage = iPageCurrent

' Start output with a page x of n line
%>
<%=myfecha%>
<center><FONT SIZE="+1">Reporte Analisis de Aceites Pagina <B><%= iPageCurrent %></B> de <B><%= iPageCount %></B>
</FONT>
</center>
<% End If %>
<center>
<table border="1" bordercolor="#000000" style="font-family: Arial; font-size: 8 pt; font-weight: bold" bgcolor="#99C8EA">
<tr>
<td bgcolor="#99C8EA">Movil</td>
<td bgcolor="#99C8EA">Ciudad</td>

</tr>
<%
' ' Loop through our records and ouput 1 row per record
' iRecordsShown = 0
' Do While iRecordsShown < iPagesize And Not objPagingRS.EOF%>
<TR>
<TD ALIGN=LEFT BGCOLOR=white>
<%=objpagingRS("otnumero")%>

</td><TD ALIGN=LEFT BGCOLOR=white>

<a href="javascript:void(window.open('Wcodigo.asp?cod igo=<%=objpagingRS("Movil")%>','_blank','height=50 ,width=435'))">

<%=objpagingRS("Movil")%></a>
</TD></TR>
<%
iRecordsShown = iRecordsShown + 1
objPagingRS.MoveNext
' Loop %>
</table>
<%
' Show "previous" and "next" page links which pass the page to view
' and any parameters needed to rebuild the query. You could just as
' easily use a form but you'll need to change the lines that read
' the info back in at the top of the script.
If iPageCurrent <> 1 Then
%>
<INPUT TYPE=BUTTON VALUE="<%=imaxrecords%> |< "
ONCLICK="document.location.href='molist.asp?page=< %=1%>&order=<%= Server.URLEncode(strOrderBy) %>&tcodi=<%=codi%>&f1=<%=field11%>&temer=<%=emer%> &f6=<%=field66%>&f7=<%=field77%>&tfini=<%=fini%>&t fin=<%=fin%>'">


<INPUT TYPE=BUTTON VALUE="<%=imaxrecords%> << "
ONCLICK="document.location.href='molist.asp?page=< %=IPagecurrent-1%>&order=<%= Server.URLEncode(strOrderBy) %>&tcodi=<%=codi%>&f1=<%=field11%>&temer=<%=emer%> &f6=<%=field66%>&f7=<%=field77%>&tfini=<%=fini%>&t fin=<%=fin%>'">


<%
' Above spacing is inside the If so we don't get it unless needed
End If

If iPageCurrent < iPageCount Then
%>
<INPUT TYPE=BUTTON VALUE="<%=imaxrecords%> >> "
ONCLICK="document.location.href='molist.asp?page=< %=IPagecurrent+1%>&order=<%= Server.URLEncode(strOrderBy) %>&tcodi=<%=codi%>&f1=<%=field11%>&temer=<%=emer%> &f6=<%=field66%>&f7=<%=field77%>&tfini=<%=fini%>&t fin=<%=fin%>'">


<INPUT TYPE=BUTTON VALUE="<%=imaxrecords%> >| "
ONCLICK="document.location.href='molist.asp?page=< %=IPagecount%>&order=<%= Server.URLEncode(strOrderBy) %>&tcodi=<%=codi%>&f1=<%=field11%>&temer=<%=emer%> &f6=<%=field66%>&f7=<%=field77%>&tfini=<%=fini%>&t fin=<%=fin%>'">


<%
End If
%>
</center>
<%



' Close DB objects and free variables
objPagingRS.Close
Set objPagingRS = Nothing
objPagingConn.Close
Set objPagingConn = Nothing

' END RUNTIME CODE
%>
</XMP>
</BODY>
</html>
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:24.