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

Do-Loop sencillo pero que no sale

Estas en el tema de Do-Loop sencillo pero que no sale en el foro de ASP Clásico en Foros del Web. Saludos: Intento hacer lo siguiente: Recibir un valor por url en la variable usuarioaborrar y compararlo con rs("empresaoferta"). Si la comparación es ok (si son ...
  #1 (permalink)  
Antiguo 07/03/2005, 09:15
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años, 10 meses
Puntos: 0
Do-Loop sencillo pero que no sale

Saludos:
Intento hacer lo siguiente:

Recibir un valor por url en la variable usuarioaborrar y compararlo con rs("empresaoferta").

Si la comparación es ok (si son iguales): entonces que me borre todos los registros que cumplen esa condición
y si no que salga del do-loop

El caso es que siempre encuentra los registros en los que la comparación no es ok (son distintos).
Lo que hago es lo siguiente:

Código:
usuarioaborrar=ucase(request.form("usuarioaborrar"))

set Conn= Server.CreateObject("ADODB.Connection")
 Conn.ConnectionString = "DSN=clubviajesoferta.com.turofertas"
 Conn.open
 Set RS=Server.CreateObject("ADODB.Recordset")
 rs.activeconnection=Conn 
 rs.source="ofertasmayoristas"
 rs.Locktype = adLockOptimistic
 rs.CursorType = adOpenDinamic
 rs.open
 
 rs.movefirst
 do while rs("empresaoferta") = usuarioaborrar
  rs.delete
  rs.movenext
 loop

Por favor pueden explicarme donde está el error, porque o estoy obcecado o no lo veo.
Gracias
  #2 (permalink)  
Antiguo 07/03/2005, 10:10
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Bueno, yo no uso los métodos del recordset append , update o delete, pero por lógica puedo comentarte lo siguiente:

do while rs("empresaoferta") = usuarioaborrar
rs.delete
rs.movenext
loop

1) Si borras un registro, automáticamente te pasas al siguiente registro ¿o no?, si entonces haces un move next, te estas saltando la mitad de los registros.
2) No preguntas por el EOF
3) Puedes comparar evitando los espacios: Trim(rs("empresaoferta")) = Trim(usuarioaborrar)
4) ¿Por que no haces un simple "Delete from tabla where empresaoferta <> 'ok'"?

Saludos
  #3 (permalink)  
Antiguo 07/03/2005, 10:44
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años, 10 meses
Puntos: 0
La tabla está en Access y he comprobado que hay que hacer el rs.movenext porque sino no avanza al siguiente registro.
He probado ha hacer lo siguiente como tu me indicas y si no he entendido mal he hecho esto.
Código:
  
 if rs.bof and rs.eof then
  rs.movefirst
  do while Trim(rs("empresaoferta")) = Trim(usuarioaborrar)
   rs.delete
   rs.movenext
  loop
 end if
Entiendo que le estoy diciendo que:
mientras rs("empresaoferta") y usuarioborrar sean iguales borre el registro.
Lo que pasa es que o yo estoy muy obcecado o el alzheimer llama a mi puerta.
Gracias
  #4 (permalink)  
Antiguo 07/03/2005, 11:23
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
¿Por que no haces un simple "Delete from tabla where empresaoferta <> 'ok'"? y te olvidas de problemas.

No es que por medio de un ciclo no se pueda, pero ¿si lo puedes hacer en una linea (y que lo haga el motor de BS's), por qué no hacerlo?
  #5 (permalink)  
Antiguo 07/03/2005, 12:43
Avatar de kova  
Fecha de Ingreso: marzo-2003
Mensajes: 79
Antigüedad: 22 años, 1 mes
Puntos: 0
Ciberpata, hola, si aún quieres mantener tu código, te hago algunas recomendaciones.
Me parece que el código correcto para que elimine a las filas que cumplan con la condición de que el campo "empresaoferta" del recordset sea igual a la variable usuarioborrar, sería el siguiente:

rs.movefirst
do while not rs.eof
if trim(rs("empresaoferta")) = trim(usuarioborrar) then
rs.delete
end if
rs.movenext
loop

Eso debería andar.

Otro consejo, cuando el rs está vacío suele tirar un error si intentas hacer
rs.movefirst
directamente, por eso te recomiendo que coloques todo el bloque en un if que pregunte, ni bien lo abre, si no esta en el fondo (osea que no esta vacío), quedaría algo así:

if not rs.eof then
rs.movefirst
do while not rs.eof
if trim(rs("empresaoferta")) = trim(usuarioborrar) then
rs.delete
end if
rs.movenext
loop
end if

Mucha Suerte!!!
  #6 (permalink)  
Antiguo 07/03/2005, 14:42
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago de Compostela
Mensajes: 603
Antigüedad: 21 años, 10 meses
Puntos: 0
Lo probare Kova. Vaya creo que el Alzheimer llama a mi puerta. De todas maneras el recordset en este caso, nunca estará vacio.

Muchiiiiiiisimas gracias por todo.

Un saludo
  #7 (permalink)  
Antiguo 07/03/2005, 18:43
Avatar de trasgukabi  
Fecha de Ingreso: septiembre-2004
Mensajes: 2.749
Antigüedad: 20 años, 8 meses
Puntos: 18
A ver, aveeerrrr

ÉSTO:
Código PHP:
usuarioaborrar=ucase(request.form("usuarioaborrar"))

set ConnServer.CreateObject("ADODB.Connection")
 
Conn.ConnectionString "DSN=clubviajesoferta.com.turofertas"
 
Conn.open
 Set RS
=Server.CreateObject("ADODB.Recordset")
 
rs.activeconnection=Conn 
 rs
.source="ofertasmayoristas"
 
rs.Locktype adLockOptimistic
 rs
.CursorType adOpenDinamic
 rs
.open
 
 rs
.movefirst
 
do while rs("empresaoferta") = usuarioaborrar
  rs
.delete
  rs
.movenext
 loop 
COMPARADO CON ESTO:
Código PHP:
usuarioaborrar=ucase(request.form("usuarioaborrar"))

set ConnServer.CreateObject("ADODB.Connection")
 
Conn.ConnectionString "DSN=clubviajesoferta.com.turofertas"
 
Conn.execute("delete from ofertasmayoristas where empresaoferta='"&usuarioaborrar&"'")
Conn.close 
como decía Myakire. No hay color, compadre. Optimización, esa es la clave.
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 18:00.