Error 3061 |
Responder |
Autor | |
Kublai
Habitual Unido: 11/Julio/2020 Localización: Murcia Estado: Sin conexión Puntos: 162 |
Tema: Error 3061 Enviado: 07/Agosto/2022 a las 11:15 |
Hola. Necesitaría un poco de ayuda, porque este código me da un error que no entiendo.
El error que da es: "Se ha producido el error 3061 en tiempo de ejecución: Pocos parámetros. Se esperaba 1" y me lo da en esta instrucción: Set rs_origen = dbf.OpenRecordset("tickets_del_expe", dbOpenDynaset) El código completo es el siguiente: Primero creo una consulta: Private Sub crear_consulta() DoCmd.DeleteObject acQuery, "tickets_del_expe" Dim vexpe As String Dim vtipo As Variant vexpe = Me.t_expediente vtipo = 2 Dim dbs As Database, qdf As QueryDef, strSQL As String Set dbs = CurrentDb strSQL = "SELECT * FROM Tickets WHERE (t_expediente = Forms!Tickets!t_expediente) and (t_tipogasto = 2) ORDER BY t_fecha ASC" Set qdf = dbs.CreateQueryDef("tickets_del_expe", strSQL) DoCmd.OpenQuery "tickets_del_expe" End Sub Y DE AHÍ PASO A ESTE OTRO CÓDIGO. LA LÍNEA EN ROJO ES EL ERROR: Private Sub totalizar_dias() Dim dbf As DAO.Database Dim rs_origen As DAO.Recordset Dim rs_destino As DAO.Recordset 'Asigna los recordsets origen y destino Set dbf = CurrentDb Set rs_origen = dbf.OpenRecordset("tickets_del_expe", dbOpenDynaset) Set rs_destino = dbf.OpenRecordset("Tickets_por_dia") Dim dia As Date Dim suma_importe As Currency Dim pernocta As Boolean suma_importe = 0 'Entra en origen y va al primero rs_origen.MoveFirst 'Recorre origen con la condición hasta el final Do Until rs_origen.EOF dia = rs_origen!t_fecha pernocta = rs_origen!t_pernocta 'Si se cumple la condición If rs_origen!t_fecha = dia Then suma_importe = suma_importe + rs_origen!t_importe rs_origen.MoveNext Else rs_destino.AddNew rs_destino!td_fecha = dia rs_destino!td_importe = suma_importe rs_destino!td_pernocta = pernocta rs_destino!td_expediente = rs_origen!t_expediente rs_destino.Update suma_importe = 0 rs_origen.MoveNext End If Loop End Sub |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14734 |
Enviado: 07/Agosto/2022 a las 16:21 |
Pon un punto de interrupción después de la asignación de la variable strSQL y preguntas que contiene en la ventana de inmediato.
Descubrirás que, probablemente, alguna asignación no sea correcta o bien porque no tiene valor o bien porque no se ha hecho con el tipo correcto. Pista: sospecho que t_expediente es un texto por lo estás delimitando mal (mejor dicho: no lo estás delimitando) Un saludo
|
|
Kublai
Habitual Unido: 11/Julio/2020 Localización: Murcia Estado: Sin conexión Puntos: 162 |
Enviado: 07/Agosto/2022 a las 16:52 |
hola
pues no se, el caso es que la consulta de esa variable sql se crea bien. Cuando le digo que la abra, la consulta se crea tal y como pretendo que se cree y se abre sin problemas. El fallo la da en el segundo sub, cuando intento asignar dicha consulta al recordset rs_origen. Ahí es donde da el error. Es verdad que t_expediente es un campo de texto, pero no te entiendo con lo de delimitarlo
|
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14734 |
Enviado: 08/Agosto/2022 a las 08:58 |
Yo hace bastante tiempo que decidí no abrir recordsets sobre consultas almacenadas o tablas ya que me encontré con algunos problemas (que ya no recuerdo). Desde entonces abro siempre recordsets sobre sentencias SQL.
Cosas: En tu sub crear_consulta 1. Borras un objeto sin verificar si previamente existe. 2. Declaras 2 variables que luego no utilizas 3. Utilizas la sintaxis Forms!... con la posibilidad que después tu Access no sea capaz de hacer la conversión Forms <--> Formularios 4. Una vez creada, la abres (mi duda existencial: ¿para qué?) 5. No hace falta crear ni tantas variables ni hacer asignaciones raras Dim qdf As QueryDef Set qdf = CurrentDb.CreateQueryDef("tickets_del_expe", "SELECT * FROM Tickets WHERE t_expediente = '" & Me!t_expediente & "' AND t_tipogasto = 2 ORDER BY t_fecha ASC") Nota: observa como se delimita el campo t_expediente cuando lo utilizo en una sentencia SQL 6. Todo esto no es necesario "externalizarlo" (con lo que estoy viendo) porque lo puedes hacer directamente igual en el procedimiento de totalizar. Un saludo |
|
Kublai
Habitual Unido: 11/Julio/2020 Localización: Murcia Estado: Sin conexión Puntos: 162 |
Enviado: 08/Agosto/2022 a las 19:06 |
Gracias Xavi.
He seguido tus instrucciones y ya no me da el error que me daba, pero me he hecho un lío con el resto del proceso que quiero hacer: pretendo que el programa recorra el recordset origen y sume todos los campos t_importe correspondientes a registros de la misma fecha (t_fecha). Una vez tenga la suma total de cada t_fecha, que cree un registro en el recordset destino con la fecha y la suma de los importes. Básicamente lo que quiero es totalizar, como haría una hoja excel o un report, todos los importes de una misma fecha y crear un recordset destino con un registro por fecha. El código que he hecho es el siguiente, pero no me funciona bien. No se dónde estará el error: Private Sub totalizar_dias() If CurrentDb.QueryDefs!tickets_del_expe.Exists Then DoCmd.DeleteObject acQuery, "tickets_del_expe" End If Dim qdf As QueryDef Set qdf = CurrentDb.CreateQueryDef("tickets_del_expe", "SELECT * FROM Tickets WHERE t_expediente = '" & Me!t_expediente & "' AND t_tipogasto = 2 ORDER BY t_fecha ASC") Dim dbf As DAO.Database Dim rs_origen As DAO.Recordset Dim rs_destino As DAO.Recordset Set dbf = CurrentDb Set rs_origen = dbf.OpenRecordset("tickets_del_expe", dbOpenDynaset) Set rs_destino = dbf.OpenRecordset("Tickets_por_dia") Dim dia As Date Dim suma_importe As Currency Dim pernocta As Boolean suma_importe = 0 rs_origen.MoveFirst dia = rs_origen!t_fecha Do Until rs_origen.EOF pernocta = rs_origen!t_pernocta Do While rs_origen!t_fecha = dia If rs_origen.EOF Then Exit Do End If suma_importe = suma_importe + rs_origen!t_importe rs_origen.MoveNext Loop rs_destino.AddNew rs_destino!td_fecha = rs_origen!t_fecha rs_destino!td_importe = suma_importe rs_destino!td_pernocta = pernocta rs_destino!td_expediente = rs_origen!t_expediente rs_destino.Update dia = rs_origen!t_fecha suma_importe = rs_origen!t_importe rs_origen.MoveNext ' Debug.Print suma_importe ' Debug.Print dia Loop End Sub |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14734 |
Enviado: 08/Agosto/2022 a las 19:19 |
¿Y porque no creas directamente una consulta de agrupados sumando los campos que quieres?
Porque me parece a mi que agrupando por fecha, pernocta y expediente, sumando importe y filtrando por expediente y tipogasto, ya lo tendrías. Un saludo
|
|
Kublai
Habitual Unido: 11/Julio/2020 Localización: Murcia Estado: Sin conexión Puntos: 162 |
Enviado: 09/Agosto/2022 a las 10:05 |
Llevas toda la razón. Hay que ver cómo me estaba complicando la vida, cuando la solución era así de sencilla.
Con la consulta de agrupados funciona estupendamente. Una vez más, muchas gracias. Un saludo. Tema solucionado. Se puede cerrar el hilo.
|
|
Responder | |
Tweet
|
Ir al foro | Permisos de foro Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |