Discussion:
Error al ejecutar una consulta con vba
(demasiado antiguo para responder)
ash2
2010-01-19 09:50:23 UTC
Permalink
Hola a todos,

Hace mucho que no toco Access pero antes lo manejaba bastante. He
tenido que tocar un formulario de una aplicación que hice hace 5 años.
Tengo que insertar en un text_box, al crear un nuevo registro, el
numero de registro siguiente al número insertado, pero me da un
error. Se ha poducido un error "3061" en tiempo de ejecución: Too few
parameters. Expected 1.

Mi código es el siguiente; y el error me lo da en el set:

Private Sub AÑADIR_Click()
On Error GoTo Err_AÑADIR_Click
Dim ultimo As Integer
Dim rs As Recordset

DoCmd.GoToRecord , , acNewRec

Set rs = CurrentDb.OpenRecordset("SELECT Max(SALIDAS_2000.[NUMERO
SALIDA]) AS UltimaSalida FROM SALIDAS_2000 WHERE (((SALIDAS_2000.[AÑO
DE TRABAJO])=[Formularios]![REGISTRO GENERAL]![AñoTrab]))")
If Not IsNull(rs("UltimaSalida")) Then
ultimo = rs("UltimaSalida") + 1
Else
ultimo = 1
End If

Me.NUMERO_SALIDA = ultimo
Exit_AÑADIR_Click:
Exit Sub

Err_AÑADIR_Click:
MsgBox Err.Description
Resume Exit_AÑADIR_Click

End Sub


¿Por que falla?


Un saludo a todos
xavi
2010-01-19 10:10:31 UTC
Permalink
Hola,

Creo que, dado que solo debes recuperar un valor, seria más adecuado el uso
de un DMax evaluando el nulo

ultimo = Nz(DMax("[NUMERO SALIDA]", "[SALIDAS_2000]", "[AÑO DE TRABAJO]=" &
Me!AñoTrab), 1)

De todas formas, y en respuesta a la pregunta ¿Por que falla?, decirte que
podría ser por 2 motivos:
1. Algun nombre de campo mal escrito
2. No devuelve ningun registro. Deberias evaluar si el recordset está vacío
con un if rst.EOF
--
Un saludo

Xavi
http://www.llodax.com
http://www.mvp-access.com/foro
Post by ash2
Hola a todos,
Hace mucho que no toco Access pero antes lo manejaba bastante. He
tenido que tocar un formulario de una aplicación que hice hace 5 años.
Tengo que insertar en un text_box, al crear un nuevo registro, el
numero de registro siguiente al número insertado, pero me da un
error. Se ha poducido un error "3061" en tiempo de ejecución: Too few
parameters. Expected 1.
Private Sub AÑADIR_Click()
On Error GoTo Err_AÑADIR_Click
Dim ultimo As Integer
Dim rs As Recordset
DoCmd.GoToRecord , , acNewRec
Set rs = CurrentDb.OpenRecordset("SELECT Max(SALIDAS_2000.[NUMERO
SALIDA]) AS UltimaSalida FROM SALIDAS_2000 WHERE (((SALIDAS_2000.[AÑO
DE TRABAJO])=[Formularios]![REGISTRO GENERAL]![AñoTrab]))")
If Not IsNull(rs("UltimaSalida")) Then
ultimo = rs("UltimaSalida") + 1
Else
ultimo = 1
End If
Me.NUMERO_SALIDA = ultimo
Exit Sub
MsgBox Err.Description
Resume Exit_AÑADIR_Click
End Sub
¿Por que falla?
Un saludo a todos
Patxi Sanz
2010-01-19 10:32:52 UTC
Permalink
Como te dice Xavi, para recuperar un único registro te sirve con DMax.

Y el fallo en la SQL se encuentra en el criterio:

WHERE (((SALIDAS_2000.[AÑO DE TRABAJO])=[Formularios]![REGISTRO
GENERAL]![AñoTrab]))

El motor Jet no entiende de formularios o informes, y por eso te está
pidiendo el valor del "parámetro" [Formularios]![REGISTRO
GENERAL]![AñoTrab], ya que no sabe qué es.

Cuando se ejecutan estas consultas a través de Access, es el propio programa
el que da los valores de esos parámetros. Pero al ejecutarlas mediante
objetos DAO, tenemos que dárselos nosotros.
--
Un saludo,


Patxi Sanz
Tudela (NA)
http://www.pasa.es.tt/
Loading...