Access - Seleccionar registro TOP 1 mediante código

   
Vista:

Seleccionar registro TOP 1 mediante código

Publicado por Jorge javys_veri@hotmail.com (28 intervenciones) el 18/03/2015 20:03:16
Hola:
Necesito hacer el código para seleccionar un registro de una tabla.
Para una aplicación anterior utilicé el código que propuso Neckkito en su artículo "Actualización global de datos en tablas", poniendo un if then end if para localizar el registro que me interesaba actualizar.

El problema que tengo ahora es que, después de que el usuario seleccionó en el formulario la ciudad de su interés (Cd1), deseo hacer por código un

SELECT TOP 1 RUTAS.Precio1,RUTAS.Precio2,RUTAS.Precio3 FROM RUTAS,
WHERE RUTAS.Ciudad = Cd1,
ORDER BY RUTAS.FechaDeActualizacion DESC

para guardar los valores de Precio1, Precio2 y Precio3 en campos que ya definí en el formulario.

Agradezco de antemano su ayuda

Jorge.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Neckkito

Seleccionar registro TOP 1 mediante código

Publicado por Neckkito (1104 intervenciones) el 19/03/2015 09:51:55
Prueba con esto en el evento "Después de actualizar" del control donde se selecciona la ciudad (supongo que será un combo):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
...
Private sub...
Dim miSql as string
Dim laCiudad as long 'Supongo que es un valor numérico
Dim rst as dao.recordset
 
laCiudad=nz(me.Cd1.value, -1)
If laCiudad=-1 then exit sub
 
miSql="SELECT TOP 1 RUTAS.Precio1,RUTAS.Precio2,RUTAS.Precio3 FROM RUTAS" _
& " WHERE RUTAS.Ciudad =" & laCiudad _
& " ORDER BY RUTAS.FechaDeActualizacion DESC"
 
Set rst=currentdb.openrecordset(miSql)
If rst.recordcount=0 then
msgbox "No existe información para la ciudad indicada",vbCritical,"SIN DATOS"
goto Salida
End if
 
With me
.Precio1.value=rst.Fields(0).value
.Precio2.value=rst.Fields(1).value
.Precio3.value=rst.Fields(2).value
End with
 
Salida:
rst.close
Set rst=nothing
 
End sub
...

Te lo he escrito de memoria. Supongo que no te dará ningún error de sintaxis.

A ver si así te funciona.

Saludos,
firmaMail
http://neckkito.siliconproject.com.ar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Seleccionar registro TOP 1 mediante código

Publicado por Jorge javys_veri@hotmail.com (28 intervenciones) el 19/03/2015 19:00:17
Muchas gracias por tu respuesta Neckkito. Seguramente funcionará bien, solo que, por el momento, me mando error en:

Set rst = CurrentDb.OpenRecordset(miSql)

con el mensaje de que esperaba dos parámetros.

¿Me podrías señalar qué es lo que le falta, por favor?

He estado visitando tu página y realmente te felicito por la cantidad y calidad de trabajo que has dejado ahí.

Gracias anticipadas por tu próxima respuesta,

Jorge.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

Seleccionar registro TOP 1 mediante código

Publicado por Neckkito (1104 intervenciones) el 19/03/2015 20:02:10
Hola!

Inicialmente no veo nada raro en lo que es el código. Pero para probarlo he hecho una recreación rápida de los elementos que intervienen en una BD y, tras testearlo, todo funciona correctamente: http://www.mediafire.com/download/93hmgxg5jeptczu/Jorge.Top1.zip

El error, por lo que comentas, aunque te marque la línea del recordset realmente te lo da en la SQL. Debe haber algún elemento en tu BD (que yo no puedo ver) que no "encaja" en Sql.

Revisa los nombres de tus campos en la tabla, pero sobre todo revisa los nombres de tus controles en el formulario. Los nombres que debes revisar son los que te aparecen en las propiedades del control -> Pestaña Otras -> Nombre.

Y muchas gracias por tus amables palabras. Me alegra que la web te haya gustado.

Ya me dirás.

Saludos,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Seleccionar registro TOP 1 mediante código

Publicado por Jorge javys_veri@hotmail.com (28 intervenciones) el 23/03/2015 21:15:39
Hola Neckkito:

Efectivamente estaban mal dos nombres y ya funcionó. Pero...

Para que funcionara como necesito (obtener los últimos precios en relación a una fecha, necesito comparar con una fecha que se captura al inicio del formulario (en todas partes mis fechas están con formato Fecha mediana).

Modifique el WHERE añadiendo un AND y aquí comenzaron nuevamente mis problemas.

la subrutina está de la siguiente forma:

Private Sub DestinoRuta_Change()
Dim miSql As String
Dim laCiudad As Long 'Supongo que es un valor numérico
Dim rst As dao.Recordset

HSFechaviaje = Nz(Me.FechaViaje.Value, -1) ' HSFechaviaje está declarada en el módulo inicial "Public HSFechaviaje as Date"
If HSFechaviaje = -1 Then Exit Sub

laCiudad = Nz(Me.DestinoRuta.Value, -1)
If laCiudad = -1 Then Exit Sub

miSql = "SELECT TOP 1 RutasVariable.PrecioSencillo,RutasVariable.PrecioFull,RutasVariable.ComisiónSencillo FROM RutasVariable" _
& " WHERE (RutasVariable.IdRutas=" & laCiudad & ") AND (RutasVariable.FechaEnVigor<=" & HSFechaviaje & ")" _
& " ORDER BY RutasVariable.FechaEnVigor DESC;"

Set rst = CurrentDb.OpenRecordset(miSql)
If rst.RecordCount = 0 Then
MsgBox "No existe información para la ciudad indicada", vbCritical, "SIN DATOS"
GoTo Salida
End If

With Me
.Texto92.Value = rst.Fields(0).Value
.Texto93.Value = rst.Fields(1).Value
.Texto94.Value = rst.Fields(2).Value
End With

Salida:
rst.Close
Set rst = Nothing

End Sub

En cada ocasión que pruebo, con diversas FechaViaje, me manda mensaje de que "No existe información para la ciudad indicada", y yo tengo entre uno y tres registros de cada ciudad con diversas fechas de actualización.

Curiosamente si cambio el menor o igual del AND a mayor que, funciona bien y me da el último valor posible, pero yo necesito el último precio en relación a una fecha que varía en cada caso.

He probado poniendo y quitando paréntesis en el WHERE - AND; he revisado los nombres; he intercambiado los argumentos del WHERE - AND.

¿Qué estoy haciendo mal?

Muchas gracias por tu ayuda,

Jorge.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

Seleccionar registro TOP 1 mediante código

Publicado por Neckkito (1104 intervenciones) el 23/03/2015 21:45:55
miSql = "SELECT TOP 1 RutasVariable.PrecioSencillo,RutasVariable.PrecioFull,RutasVariable.ComisiónSencillo FROM RutasVariable" _
& " WHERE (RutasVariable.IdRutas=" & laCiudad & ") AND (RutasVariable.FechaEnVigor<=" & format(HSFechaviaje, "mm/dd/yy") & ")" _
& " ORDER BY RutasVariable.FechaEnVigor DESC;"

A ver si así te funciona.

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Seleccionar registro TOP 1 mediante código

Publicado por Jorge javys_veri@hotmail.com (28 intervenciones) el 24/03/2015 02:25:31
Gracias por tu pronta respuesta Neckkito:

Desafortunadamente no me funcionó. Siguió mandando el mensaje "No existe información para la ciudad indicada".

Me percaté de que fecha mediana tiene el formato dd-mmm-yy y se lo cambié, y me mandó el error "3061 en tiempo de ejecución, pocos parámetros. Se esperaba 1".

Al formato le cambié las dobles comillas con una comilla simple y me mandó error de compilación.

He checado con cuidado los nombres y no encuentro nada.

Mi máscara de entrada para Me.FechaViaje es 00/00/0000;0;_

¿Andará por allí el problema?

Un saludo,

Jorge.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

Seleccionar registro TOP 1 mediante código

Publicado por Neckkito (1104 intervenciones) el 24/03/2015 07:49:32
Hola!

Prueba con esto de nuevo:

miSql = "SELECT TOP 1 RutasVariable.PrecioSencillo,RutasVariable.PrecioFull,RutasVariable.ComisiónSencillo FROM RutasVariable" _
& " WHERE (RutasVariable.IdRutas=" & laCiudad & ") AND (RutasVariable.FechaEnVigor<=#" & format(HSFechaviaje, "mm/dd/yy") & "#)" _
& " ORDER BY RutasVariable.FechaEnVigor DESC;"

Saludos,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Seleccionar registro TOP 1 mediante código

Publicado por Jorge javys_veri@hotmail.com (28 intervenciones) el 24/03/2015 18:27:19
Muchas gracias Neckkito!

Funcionó de inmediato y de forma apropiada. He aprendido más cosas de las que te imaginas con tu ayuda.

Estuvo genial!

No entendí bien como funciona la expresión:

(RutasVariable.FechaEnVigor<=# Format(HSFechaviaje, "mm/dd/yy") #)

consulté el capítulo 8 de tu curso de VB y no encontré algo que me orientara al respecto.

¿Me la podrías explicar, por favor?

Nuevamente, ¡Muchas gracias!

[Un favor adicional: estoy tratando de calcular distancias aéreas entre dos puntos geográficos, por medio de sus coordenadas Longitud y Latitud. Son operaciones con senos y cosenos que tengo definidas en Access, pero necesito el Arcoseno (calcula el ángulo cuyo coseno es x) y no encuentro esa función. ¿Tendrás alguna idea de en donde la puedo encontrar?] {En Excel es la función ACOS}

Un cordial saludo,

Jorge.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

Seleccionar registro TOP 1 mediante código

Publicado por Neckkito (1104 intervenciones) el 24/03/2015 20:52:05
Hola!

Cuando trabajas en lenguaje SQL en VBA, para indicar que el valor que estás utilizando es una fecha (es decir, un valor tipo fecha), debes encerrarla entre almohadilas.

Si te fijas, en mi penúltima respuesta me olvidé de encerrarla entre almohadillas y por eso te falló. Al darme cuenta te di mi última respuesta que sí funcionó.

Esta parte creo que está clara.

Por otra parte, si tu configuración regional (la de tu PC) es española Access se da cuenta de la misma y por eso, si abres una tabla por ejemplo, tú puedes ver las fechas en el formato "dd/mm/yy". Sin embargo, al trabajar con SQL en VBA, se da la circunstancia que SQL interpreta siempre las fechas en formato inglés, es decir "mm/dd/yy".

Si tú pones, por ejemplo, en el WHERE de la SQL una fecha de búsqueda igual a 02/03/15 (dos de marzo) y en la tabla tienes una fecha 02/03/15 (dos de marzo) por intuición parece que la SQL debería funcionar porque las fechas son iguales. Sin embargo no funcionará porque la SQL interpreta la fecha como 3 de febrero, y por eso no encuentra la coincidencia.

Para evitar lo anterior lo que hacemos es hacer concordar formatos para la SQL, de manera que si yo hago

format(02/03/15,"mm/dd/yy")

lo que estoy haciendo, por decirlo de alguna manera, es que iguale una fecha de la tabla que, por defecto, lee en formato inglés, con una fecha española a la que estoy forzando que sea interpretada en formato inglés. Y, lógicamente, inglés con inglés pues sí encuentra equivalencia entre fechas y por eso la SQL te funciona debidamente.

La verdad es que trabajar con fechas es un poco más "complicado" que con otros tipos, pero bueno.

Espero que la explicación te haya quedado medianamente clara.

Y por el tema de las funciones trigonométricas pues la verdad no puedo ayudarte, porque efectivamente Access no la incorpora. Si sacas el generador de expresiones -> Funciones -> Funciones incorporadas -> Matemáticas, encontrarás un listado de todas las funciones matemáticas que incorpora Access, entre las cuales no está la de arcocoseno.

Tendrás que buscar por internet a ver si alguien ha creado alguna función para poderla calcular.

Saludos,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Seleccionar registro TOP 1 mediante código

Publicado por Jorge javys_veri@hotmail.com (28 intervenciones) el 25/03/2015 03:10:30
Qué tal Neckkito:

Con el primer párrafo entendí cómo interpretar la expresión. La interpretación que quería darle estaba totalmente errada.

Con los párrafos restantes entendí el truco que hiciste para que la interpretación de la fecha fuera correcta, tomando en cuenta el lenguaje "nativo" del Access que es el inglés.

Nuevamente te agradezco tu ayuda.

Me pondré a investigar sobre mi función y ya te comentaré.

Un cordial saludo,

Jorge.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar