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

Se Puede O No Se Puede Utilizar??????????

Estas en el tema de Se Puede O No Se Puede Utilizar?????????? en el foro de ASP Clásico en Foros del Web. A ver, supongo que esto es rápido: se puede o no se puede utilizar el FINDFIRST en asp??? Es que el otro dia vi una ...
  #1 (permalink)  
Antiguo 27/05/2003, 03:08
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 21 años, 6 meses
Puntos: 8
Pregunta Se Puede O No Se Puede Utilizar??????????

A ver, supongo que esto es rápido: se puede o no se puede utilizar el FINDFIRST en asp??? Es que el otro dia vi una página donde se utilizaba, pero si lo pongo, me da el siguiente error:

Tipo de error:
Error de Microsoft VBScript en tiempo de ejecución (0x800A01B6)
El objeto no acepta esta propiedad o método: 'temporal.Findfirst'
/gestom/lis_emp_recibidas_evo2.asp, line 173


Aqui va el código (las lineas comentadas son el bucle anidado que me tocaria hacer si no se puede utilizar, y que quiero evitar a toda costa, por que si anido un bucle al buscar en esta tabla, apaga y vamonos, que son miles de registros y x lo tanto muuuuxo tiempo de espera:

Código PHP:
 else
        
temporal.Findfirst "npanelista = '" ola5.fields("npanelista") & "'"
            'While not temporal.eof
            '    
if temporal.fields("npanelista") <> ola5.fields("npanelista"then
            
'        temporal.movenext
            '    
else
                    
temporal.fields("npanelista") = ola5("npanelista")
                    
temporal.fields("FaxConllamadas5") = ola5("FaxConLlamadas")
                    
temporal.fields("FaxEspontaneo5") = ola5("FaxEspontaneo")
                    
temporal.fields("Telefono5") = ola5("Telefono"
                    
temporal.update
            
'    end if
            '
wend
        end 
if 
Asi que lo dicho, se puede utilizar el FINDFIRST, o cualquier otra forma que me evite el anidar el bucle ahi????
Muchas gracias por adelantado a tod@s, salu2
__________________
Vayamos por Partes :: Jack el Destripador
  #2 (permalink)  
Antiguo 27/05/2003, 03:36
Avatar de maestro  
Fecha de Ingreso: febrero-2002
Ubicación: España
Mensajes: 2.364
Antigüedad: 22 años, 4 meses
Puntos: 1
Creo que lo viste mal, en todo caso seria MOVEFIRST, eso te coloca en el primer registro del la tabla.

Findfirst seria una funcion definida en otra parte del codigo.
__________________
Jose Maria Fernandez
[email protected]
Http://www.expansionweb.net
  #3 (permalink)  
Antiguo 27/05/2003, 03:49
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 21 años, 6 meses
Puntos: 8
Lo vi en un artículo de este mismo foro, el enlace es este no se si quien lo puso se equivocó, o si lo puso mal, o cualquier otra cosa, pero como lo vi, pensé que tal vez serviría. De todas formas, si eso no se puede hacer, hay alguna otra forma de evitar el bucle anidado ese???????
__________________
Vayamos por Partes :: Jack el Destripador
  #4 (permalink)  
Antiguo 27/05/2003, 10:09
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 7 meses
Puntos: 5
Ummm....

No entiendo algo de tu código. ¿Quieres asignar solo el campo npanelista del primer registro de tu recordset?

Por otro lado, moverte hacia atrás en un recordset creo recordar que no es algo que permitan todas las bases de datos. Pero aun así, para que funcione creo que debes configurar tu conexión con unos parámetros determinados que permitan eso. (Consulta los parámetros que puede recibir una Conexión)

Por otro lado, en caso de que MoveFirst funcione en tu caso, el error que has puesto puede aparecer no solo por lo que te he comentado, sino también en el caso de que intentes hacer un MoveFirst de un recordset que no ha devuelto ninguna fila. Deberías asegurar también eso, de ahí que se haga la comprobación IF NOT temporal.EOF THEN ... END IF

No se si lo he liado un poco.. pero al menos cuéntame exactamente que quieres que haga tu código.

Un beso
  #5 (permalink)  
Antiguo 28/05/2003, 10:01
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 21 años, 6 meses
Puntos: 8
A ver, te explico lo que necesito y te pongo el código más ampliado, por cierto, la base es access, por lo que dices que en algunas bases no se puede hacer lo de mover en ambos sentidos, nunca me ha dado ningun problema, y creo q el movefirst tampoco:

en el apartado OLA1 hago una búsqueda y meto todos los resultado en una tabla temporal. Después, en las 5 siguientes (solo he puesto una, por que es todo el rato lo mismo) compruebo si el campo TMPNPANELISTA de la búsqueda está en blanco (If isnull(ola5.fields("tmpnpanelista")) then) Si está en blanco, es por que en OLA1 no se encontró ningún registro con ese identificador, asi que añado un registro nuevo a la tabla. Pero si ese campo no está en blanco, tengo que editar el registro y añadirle más valores. El problema está en llegar de forma rápida a ese registro dentro de la tabla temporal. He marcado donde tengo exactamente el problema, a ver si tu alguna vez has utilizado el método que quería utilizar ahi, por que a mi me da problemas.


Const adOpenKeyset = 1
Const adLockOptimistic = 3

'Creo la conexión con la base de datos
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\..\basesdatos\EncuestasObservator ioDATOS.mdb"))

set borrado=createobject("ADODB.Recordset")
borrado.CursorType = adOpenKeyset
borrado.LockType = adLockOptimistic
'Limpiamos la Tabla tmpEmpRecibidasEvolucion
sql_borrado="delete * from tmpEmpRecibidasEvolucion"
borrado.Open sql_borrado, conn

set temporal=createobject("ADODB.Recordset")
temporal.CursorType = adOpenKeyset
temporal.LockType = adLockOptimistic
sql_temporal="select * from tmpEmprecibidasEvolucion"
temporal.open sql_temporal, conn


'Ola 1
anyo1=request.Querystring("anyo1")
nola1=request.Querystring("nola1")
set ola1=createobject("ADODB.Recordset")
ola1.CursorType = adOpenKeyset
ola1.LockType = adLockOptimistic

sql_ola1="SELECT * from consEmpRecibidasEvolucion1 where año=" & anyo1 & " AND Nola='" & nola1 &"'"
ola1.Open sql_ola1, conn
i=1
Response.Write("<table width='95%' border='1'><tr><td valign='top'>")
Response.Write("Ola1<br>")
While Not ola1.eof

Response.Write (i & ". " & ola1("npanelista")&"<br>")
temporal.addnew
temporal.fields("npanelista") = ola1("npanelista")
temporal.fields("FaxConllamadas1") = ola1("FaxConLlamadas")
temporal.fields("FaxEspontaneo1") = ola1("FaxEspontaneo")
temporal.fields("Telefono1") = ola1("Telefono")
temporal.update
ola1.movenext
i = i + 1
wend
Response.Write("</td>")

'Ola 5
anyo5=request.querystring("anyo5")
nola5=request.querystring("nola5")
set ola5=createobject("ADODB.Recordset")
ola5.CursorType = adOpenKeyset
ola5.LockType = adLockOptimistic
sql_ola5="SELECT * from consEmpRecibidasEvolucion1 where año=" & anyo5 & " AND Nola='" & nola5 &"'"
ola5.Open sql_ola5, conn
i=1
Response.Write("<td valign='top'>Ola5<br>")
If not temporal.eof then temporal.movefirst
While Not ola5.eof
If isnull(ola5.fields("tmpnpanelista")) then
temporal.addnew
temporal.fields("npanelista") = ola5("npanelista")
temporal.fields("FaxConllamadas5") = ola5("FaxConLlamadas")
temporal.fields("FaxEspontaneo5") = ola5("FaxEspontaneo")
temporal.fields("Telefono5") = ola5("Telefono")
temporal.update
else

------------------------------------------------------------------------------------------------------------------------------------------------------
Aqui tengo ahora el problema
He visto en algun sitio que se puede utilizar el FindFirst, pero me da un error diciendo que no se acepta ese metodo o propiedad. Otra manera sería anidando el bucle (Que son las lineas que he comentado, asi ves las dos cosas que he intentado hacer ) pero no resulta eficiente por que la tabla tiene más de 8000 registros y al anidar el bucle imagina el tiempo que se tira procesando. Alguna vez has utilizado el Findfirst?? O sabes alguna manera de llegar a ese registro que no sea anidando el bucle??

temporal.Findfirst "npanelista = '" & ola5.fields("npanelista") & "'"
'While not temporal.eof
' if temporal.fields("npanelista") <> ola5.fields("npanelista") then
' temporal.movenext
' else

temporal.fields("npanelista") = ola5("npanelista")
temporal.fields("FaxConllamadas5") = ola5("FaxConLlamadas")
temporal.fields("FaxEspontaneo5") = ola5("FaxEspontaneo")
temporal.fields("Telefono5") = ola5("Telefono")
temporal.update
' end if
'wend

------------------------------------------------------------------------------------------------------------------------------------------------------
end if
Response.Write (i & ". " & ola5("npanelista")&"<br>")
ola5.movenext
i = i + 1
wend
Response.Write("</td>")


Por favor, es urgente, seguro q no hay ninguna otra manera que no sea anidando los bucles? Si es q no, q me lo diga alguien, asi ya puedo ir pegandome un tiro, xq el resto de la aplicación no valdrá gran cosa si no consigo sacar este informe de los @#~~{}]@|[]@!!!!!
__________________
Vayamos por Partes :: Jack el Destripador

Última edición por angel_dope; 28/05/2003 a las 10:00
  #6 (permalink)  
Antiguo 28/05/2003, 10:13
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 7 meses
Puntos: 5
No será..

Código PHP:
temporal.Findfirst["npanelista"] = ola5.fields("npanelista"
prueba a ver...

Un beso

Última edición por Helbira; 28/05/2003 a las 10:17
  #7 (permalink)  
Antiguo 28/05/2003, 10:18
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 21 años, 6 meses
Puntos: 8
Nop, sigue sacando el mismo error

Tipo de error:
Error de Microsoft VBScript en tiempo de ejecución (0x800A01B6)
El objeto no acepta esta propiedad o método: 'temporal.Findfirst'
/gestom/lis_emp_recibidas_evo2.asp, line 173
__________________
Vayamos por Partes :: Jack el Destripador
  #8 (permalink)  
Antiguo 28/05/2003, 10:27
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 7 meses
Puntos: 5
Perdona, me confundí al construir lo de antes (no se puede correr tanto).

Pruébalo así:

Código PHP:
temporal.FindFirst "[npanelista] = " &  ola5.fields("npanelista"
  #9 (permalink)  
Antiguo 28/05/2003, 10:32
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 21 años, 6 meses
Puntos: 8
Nada, sigue diciendo lo mismo, que no se traga el findfirst :(
__________________
Vayamos por Partes :: Jack el Destripador
  #10 (permalink)  
Antiguo 28/05/2003, 10:53
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 7 meses
Puntos: 5
La verdad es que en todos los sitios que me encuentro que usan FindFirst no es exactamente una página ASP sino código Visual Basic.

Quizás no es aplicable a un recordset en ASP. No se.. lo siento.

Encontré sentencias como las siguientes que parecen que pueden hacer lo mismo que quieres. Pruebalas a ver si hay suerte... es mejor que no hacer nada mas y conformarse con un bucle anidado:

Código PHP:
temporal.Find "npanelista=" ola5.fields("npanelista"), , adSearchForward 
Código PHP:
temporal.Find "npanelista='" ola5.fields("npanelista") & "'", , adSearchForward 
Código PHP:
temporal.Find "npanelista=#" ola5.fields("npanelista") & "#", , adSearchForward 
Y aparte encontré la siguiente información que no me atreví a crearte un ejemplo con tus parámetros por no meter la pata:


Cita:
Recordset.Find Criteria, SkipRecords, SearchDirection, Start


ADO's Find method supports four arguments, but it requires only the first: Criteria. The remaining arguments default to preset values unless you explicitly supply a value for an argument. The Criteria method specifies the criteria to use for locating a record in a Recordset object. The first optional parameter is SkipRecords; it specifies a Long that indicates the number of records to skip when locating a record in a Recordset object. The default value initially starts at "0"; this instructs the recordset not to skip the current record. Subsequent calls to the Find method set the default value to "1," which tells the recordset to skip one record forward until it finds the next record that matches the search criteria.

The third parameter, SearchDirection, specifies whether the search direction should go forward or backward. It provides the same functionality as DAO's FindFirst and FindPrevious methods. It also illustrates how ADO flattens DAO's object model; a single parameter lets ADO replace two DAO methods. The SearchDirection parameter can take either of two enumeration values (see Table 2). The Start parameter, a Variant type, serves as the Find method's final parameter. It specifies the starting location for a search, and it can be a valid bookmark or a bookmark enumeration value that specifies whether a search begins with the current, first, or last record in a Recordset object (see Table 3).
Suerte
  #11 (permalink)  
Antiguo 29/05/2003, 02:03
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 21 años, 6 meses
Puntos: 8
De acuerdo, pues ahora lo probaré a ver si funciona,spero que si Como funcione te planto un monumento

De acuerdo, algo ha echo, ahora mismo lo tengo de la siguiente manera:

'Ola 5
anyo5=request.querystring("anyo5")
nola5=request.querystring("nola5")
set ola5=createobject("ADODB.Recordset")
ola5.CursorType = adOpenKeyset
ola5.LockType = adLockOptimistic
sql_ola5="SELECT * from consEmpRecibidasEvolucion1 where año=" & anyo5 & " AND Nola='" & nola5 &"'"
ola5.Open sql_ola5, conn
i=1
Response.Write("<td valign='top'>Ola5<br>")
If not temporal.eof then temporal.movefirst
While Not ola5.eof
If isnull(ola5.fields("tmpnpanelista")) then
temporal.addnew
temporal.fields("npanelista") = ola5("npanelista")
temporal.fields("FaxConllamadas5") = ola5("FaxConLlamadas")
temporal.fields("FaxEspontaneo5") = ola5("FaxEspontaneo")
temporal.fields("Telefono5") = ola5("Telefono")
temporal.update
else
temporal.Find ("npanelista='" & ola5.fields("npanelista") & "'"), adSearchForward
Response.Write("Entro en el else")
temporal.fields("npanelista") = ola5("npanelista") 'Aqui es donde me da ahora el error que comento abajo, que el recordser está vacio. Alguna idea de por que??????
temporal.fields("FaxConllamadas5") = ola5("FaxConLlamadas")
temporal.fields("FaxEspontaneo5") = ola5("FaxEspontaneo")
temporal.fields("Telefono5") = ola5("Telefono")
temporal.update
end if
Response.Write (i & ". " & ola5("npanelista")&"<br>")
ola5.movenext
i = i + 1
wend
Response.Write("</td>")


Pero ahora me dice que El valor de BOF o EOF es True, o el actual registro se eliminó; la operación solicitada requiere un registro actual en la linea 175 (arriba está marcada la linea que es) Por que me dice ahora que el recordset está vacio o que ha llegado al final?????
__________________
Vayamos por Partes :: Jack el Destripador

Última edición por angel_dope; 29/05/2003 a las 02:16
  #12 (permalink)  
Antiguo 29/05/2003, 02:36
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 7 meses
Puntos: 5
Para mi es un avance importante.

¿Te sale el mensaje de que Entra en el else?

Te lo pregunto para saber si el error te lo da al hacer el .Find .

Si es así pon justo nada más entrar en el else un temporal.MoveFirst . Aunque me temo que al hacer el temporal.update lleva implicito un temporal.Close y por eso te da el error.

Aunque creo recordar que cuando un recordset se cierra y lo intentas usar el error suele ser que está cerrado y no que ha llegado al final o esta vacío. Prueba de todas formas.

Código PHP:
else
temporal.MoveFirst
temporal
.Find ("npanelista='" ola5.fields("npanelista") & "'"), adSearchForward 
Aunque he vuelto a mirar tu código y veo que en realidad ya lo haces. Por tanto, comprueba mejor que entra en el IF NOT temporal.BOF:

Código PHP:
If not temporal.eof then temporal.movefirst 
Por cierto, ese IF donde lo cierras? quizás sea ese el error, que se te olvidó cerrarlo correctamente.



Un beso
  #13 (permalink)  
Antiguo 29/05/2003, 02:44
Avatar de angel_dope  
Fecha de Ingreso: noviembre-2002
Ubicación: Valencia
Mensajes: 737
Antigüedad: 21 años, 6 meses
Puntos: 8
SIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII POR FIIIIIIIIIIIIIIN era metiendole el Temporal.movefirst dentro del else y antes del Find!!!!! Ya había comprobado que entraba dentro el else y no tenia ni idea de por que me daba un recordset vacio. MUCHISIMAS GRACIAS PEAZO BESO QUE TE PLANTABA SI TE TUVIESE DELANTE!!!!!!!!!! Creo que con esto ya soluciono yo el resto, espero, jejeje, y sino, pues nada, a dar la lata por aqui de nuevo
__________________
Vayamos por Partes :: Jack el Destripador
  #14 (permalink)  
Antiguo 29/05/2003, 02:53
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 7 meses
Puntos: 5


¿Pero no te dije que debías pasar por caja si lo resolvía? BROMAAAAAAAAAAAA

Me alegro mucho.

De todas formas mira lo que te comenté de que no cierras correctamente el if en el que haces el temporal.MoveFirst . Creo que lo debes cerrar justo en la misma linea donde lo pones y te sobraria el que has puesto dentro del else. O al contrario, quita el if not temporal.EOF ya que con el MoveFirst que has puesto en el else es suficiente.

Un beso
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 23:34.