Comparación de menor mayor en recordset no funciona

Hago un recorset y busco que un numero dado (puesto en la variable numero) se encuentre o no en un rango de números del recordset... El tema es que cuando ejecuto el código, me dice que el numero esta incluido en rangos donde no debería estarlo. Algo esta mal. El código es este:

Private Sub Comando23_Click()
numero = Me.ingresanumero.Value
Dim db As Database
Dim rs As Recordset
' activamos la BD
Set db = CurrentDb
' Creamos el Recordset:
Set rs = db.OpenRecordset("Select * from nombres")
' Recorremos el recordset:
Do While Not rs.EOF
 If numero > rs.Fields(2) And (numero < rs.Fields(3)) Then
 nombretipo = rs.Fields(1)
 inicio = rs.Fields(2)
 fin = rs.Fields(3)
 MsgBox "El inspector del precinto es " & nombretipo & ". El rango va desde " & inicio & " hasta " _
 & fin & " el numero ingresado es " & numero, , "Encontrado"
 ElseIf numero < rs.Fields(2) Or (numero > rs.Fields(3)) Then
 MsgBox "El numero no se encuentra"
 End If
' Pasamos al siguiente registro:
rs.MoveNext
' Cerramos el bucle
Loop
Set numero = Nothing
Set nombretipo = Nothing
Set inicio = Nothing
Set fin = Nothing
rs.Close
Set rs = Nothing
End Sub 

office 2010...Access....

2 respuestas

Respuesta
1

Prueba así:

Private Sub Comando23_Click()
Numero = Me.ingresanumero.Value
Dim db As Database
Dim rs As Recordset
' activamos la BD
Set db = CurrentDb
' Creamos el Recordset:
Set rs = db.OpenRecordset("Select * from nombres")
' Recorremos el recordset:
Do While Not rs.EOF
If (Numero <= rs.Fields(2).Value And Numero >= rs.Fields(3).Value) Then
nombretipo = rs.Fields(1).Value
inicio = rs.Fields(2).Value
fin = rs.Fields(3).Value
MsgBox "El inspector del precinto es " & nombretipo & ". El rango va desde " & inicio & " hasta " _
& fin & " el numero ingresado es " & Numero, , "Encontrado"
ElseIf (Numero < rs.Fields(2).Value Or Numero > rs.Fields(3).Value) Then
MsgBox "El numero no se encuentra"
End If
' Pasamos al siguiente registro:
rs.MoveNext
' Cerramos el bucle
Loop
Set Numero = Nothing
Set nombretipo = Nothing
Set inicio = Nothing
Set fin = Nothing
rs.Close
Set rs = Nothing
End Sub

Hola... Gracias por contestar.

Es raro lo que pasa...con tu reforma de código se comporta de otra manera, pero no bien. fijate:

Si la condición no se cumple, me tira el msgbox esperado. Pero si la condición se cumple, no hace nada... pero aparte, si la cifra que pongo a buscar es en algo parecida, tampoco hace nada...ejemplo:

un rango que va desde 1234 a 1300, y busco:

1 no hace nada

12 tampoco

123 tampoco hace nada

1234 menos

1235 tampoco.

ahora pongo como numero a buscar

234 tira el msgbox del ELSE, o sea, "no se encuentra el numero"

pero lo tira una vez nada mas,,, porque el registro que sigue tiene un rango que empieza por

23456, entonces se "cumple" extrañamente la condición y no hace nada....

me tiene confundido.... será que no se puede usar un IF con esa construcción comparativa en un recordset? ni idea. GRacias por molestarte!!!! espero tu respuesta.

Haz esto cambia la linea del ElseIf por Else.

Si aun así no te funciona correctamente, prueba a cambiar el bloque If por un Select Case:

numero = Me.ingresanumero.Value
Dim db As Database
Dim rs As Recordset
' activamos la BD
Set db = CurrentDb
' Creamos el Recordset:
Set rs = db.OpenRecordset("Select * from nombres")
' Recorremos el recordset:
Do While Not rs.EOF

Select Case numero

Case rs.Fields(2).value to rs.Fields(3).value
nombretipo = rs.Fields(1)
inicio = rs.Fields(2)
fin = rs.Fields(3)
MsgBox "El inspector del precinto es " & nombretipo & ". El rango va desde " & inicio & " hasta " _
& fin & " el numero ingresado es " & numero, , "Encontrado"
Case Else
MsgBox "El numero no se encuentra"
End Select
' Pasamos al siguiente registro:
rs.MoveNext
' Cerramos el bucle
Loop
Set numero = Nothing
Set nombretipo = Nothing
Set inicio = Nothing
Set fin = Nothing
rs.Close

db.close
Set rs = Nothing

Set db=Nothing
End Sub

No funciona de ninguna manera. Gracias por contestar.

ya me tiene mosca el tema...

Prueba así, a ver:

Private Sub Comando23_Click()

numero = Me.ingresanumero.Value
Dim db As Database
Dim rs As Recordset

Dim nombretipo as string

Dim inicio as integer, fin as integer
' activamos la BD
Set db = CurrentDb
' Creamos el Recordset:
Set rs = db.OpenRecordset("Select * from nombres")
' Recorremos el recordset:

rs.MoveFirst
Do While Not rs.EOF

nombretipo = rs.Fields(1).Value
inicio = rs.Fields(2).Value
fin = rs.Fields(3).Value
Select Case numero
Case inicio to fin<br class="scayt-misspell" data-scayt_word="nombretipo" data-scaytid="17" />MsgBox "El inspector del precinto es " & nombretipo & ". El rango va desde " & inicio & " hasta " _
& fin & " el numero ingresado es " & numero, , "Encontrado"
Case Else
MsgBox "El numero no se encuentra"
End Select
' Pasamos al siguiente registro:
rs.MoveNext
' Cerramos el bucle
Loop
Set numero = Nothing
Set nombretipo = Nothing
Set inicio = Nothing
Set fin = Nothing
rs.Close
db.close
Set rs = Nothing
Set db=Nothing
End Sub

tira error de sintaxis. No te molestes mas. Sigo averiguando. Gracias igualmente.

¿Qué error te da, y que linea te marca en amarillo?

Declara tambien la variable numero, con un Dim numero as ...

Si vas a desistir de la pregunta, descártala o finalízala.

Dice error de sintaxis... y señala todo esto

Case inicio to fin<br class="scayt-misspell" data-scayt_word="nombretipo" data-scaytid="17" />MsgBox "El inspector del precinto es " & nombretipo & ". El rango va desde " & inicio & " hasta " _
& fin & " el numero ingresado es " & numero, , "Encontrado"

Tienes que poner solo esto:
case inicio to fin
msgbox....
Es decir, borra todo lo que esta entre los <>, que no se de donde salio...

Me daba el error "se requiere un objeto" (copie y pegue el código que me sugeriste).., después establecí todas las variables en tipo VARIANT, y dejo de hacerlo. pero el resultado, el mismo de siempre. me muestra como si el numero estuviera dentro de un rango que no puede ser posible. La tabla que uso es sencilla... tiene 5 registros de prueba y los campos son 5 también.... en este orden. Id;nombre;inicio;fin;cantidad.

La base Access contiene solamente esta tabla con un form hecha en base a la misma y un botón que ejecuta este código.

El tema es que si ejecuto la condición IF para un solo registro, sin hacer un recordset, me devuelve el resultado esperado. Cuando quiero recorrer los registros en busca de esta condición, el IF empieza a fallar y "cumple" cualquier cosa.

todo lo que hay en esta base esta en tu conocimiento. La verdad, no se porque se da esto.

El problema está en estas lineas:

Set numero = Nothing
Set nombretipo = Nothing
Set inicio = Nothing
Set fin = Nothing

Tienes que borrarlas, y funciona con el último que te mandé, comprobado:

Private Sub Comando23_Click()
Dim Numero As Long
Dim db As Database
Dim rs As Recordset
Dim nombretipo As String
Dim inicio As Integer, fin As Integer
Numero = Me.ingresanumero.Value
' activamos la BD
Set db = CurrentDb
' Creamos el Recordset:
Set rs = db.OpenRecordset("Select * from nombres")
' Recorremos el recordset:
rs.MoveFirst
Do While Not rs.EOF
nombretipo = rs.Fields(1).Value
inicio = rs.Fields(2).Value
fin = rs.Fields(3).Value
Select Case Numero
Case inicio To fin
MsgBox "El inspector del precinto es " & nombretipo & ". El rango va desde " & inicio & " hasta " _
& fin & " el numero ingresado es " & Numero, , "Encontrado"
Case Else
MsgBox "El numero no se encuentra"
End Select
' Pasamos al siguiente registro:
rs.MoveNext
' Cerramos el bucle
Loop
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
End Sub

Y este otro también funciona:

Private Sub Comando23_Click()
Dim Numero As Long
Numero = Me.ingresanumero.Value
Dim db As Database
Dim rs As Recordset
' activamos la BD
Set db = CurrentDb
' Creamos el Recordset:
Set rs = db.OpenRecordset("Select * from nombres")
' Recorremos el recordset:
Do While Not rs.EOF
If (Numero >= rs.Fields(2).Value And Numero <= rs.Fields(3).Value) Then
nombretipo = rs.Fields(1).Value
inicio = rs.Fields(2).Value
fin = rs.Fields(3).Value
MsgBox "El inspector del precinto es " & nombretipo & ". El rango va desde " & inicio & " hasta " _
& fin & " el numero ingresado es " & Numero, , "Encontrado"
Else
MsgBox "El numero no se encuentra"
End If
' Pasamos al siguiente registro:
rs.MoveNext
' Cerramos el bucle
Loop
rs.Close
Set rs = Nothing
End Sub

Aquí había un error, estaban mal puestos los signos de menor y menor, por eso no funcionaba correctamente.

Porque sera que el nothing hace problemas si esta fuera del bucle y después de las acciones a tomar según el resultado? en fin... gracias por solucionarme el problema!!!!!

Respuesta
1

Debo suponer que un numero dado sólo puede encontrarse dentro de un solo rango, ¿verdad?

En ese caso me parece que este código bastaría

Dim rst As DAO.Recordset

' Suponiendo que los campos 2 y 3 de la tabla nombres se llamen inicio y fin

Set rst = CurrentDb.OpenRecordset("SELECT * FROM nombres WHERE " & Me!IngresaNumero & " > inicio And " & Me!ngresaNumero & " < fin")

If rst.EOF Then

' ningún registro coincide

MsgBox "El numero no se encuentra"

Else

' Encontrado un registro

MsgBox "El inspector del precinto es " & rst.Fields(1) & ". El rango va desde " & rst.Fields(2) & " hasta " & rst.Fields(3) & " el numero ingresado es " & Me!IngresaNumero

End If

rst.Close

Set rst = Nothing

Un saludo

Xavi

http://www.aesoft-databases.com/aesdb
http://www.mvp-access.com

hay un runtime error 3061.

"pocos parámetros. Se esperaba 2"

y señala la linea del set rst.

saludos. gracias por contestar.

Coloca la sentencia SQL en una variable en lugar de dentro del OpenRecordset y evalúa que es correcta. Para ello pones un punto de interrupción, preguntas en la ventana de inmediato el valor de la variable que contiene la SQL y la evalúas en una nueva consulta para ver dónde me equivoco yo (o tu, si es que no hubieras introducido datos)

tal como estaba.., el error era de nombres de campos... ya lo corregí.. pero corregido ese error dice:

"no coincide los tipos de datos en la expresión de criterio"

todos son números. Algo estará mal?

Si, algo esta mal. ¿Has hecho lo que te he dicho?

Pega la SQL resultante aquí y la miramos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas