** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Error 3061
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoError 3061

 Responder Responder
Autor
Mensaje
Kublai Ver desplegable
Habitual
Habitual


Unido: 11/Julio/2020
Localización: Murcia
Estado: Sin conexión
Puntos: 162
Enlace directo a este mensaje 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

Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje 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
Xavi, un minyó de Terrassa

Mi web
Arriba
Kublai Ver desplegable
Habitual
Habitual


Unido: 11/Julio/2020
Localización: Murcia
Estado: Sin conexión
Puntos: 162
Enlace directo a este mensaje 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
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje 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



Xavi, un minyó de Terrassa

Mi web
Arriba
Kublai Ver desplegable
Habitual
Habitual


Unido: 11/Julio/2020
Localización: Murcia
Estado: Sin conexión
Puntos: 162
Enlace directo a este mensaje 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

Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje 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
Xavi, un minyó de Terrassa

Mi web
Arriba
Kublai Ver desplegable
Habitual
Habitual


Unido: 11/Julio/2020
Localización: Murcia
Estado: Sin conexión
Puntos: 162
Enlace directo a este mensaje 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.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable