Se ha producido el error 3061 pocos parámetros se esperaba 1
Agradezco quien me puede ayudar con esta consulta de intro, llevo medio día y no doy con el problema.
Tengo un problema con el siguiente código, al momento de ejecutarlo me arroja el error "3061 en tiempo de ejecución. Pocos Parámetros. Se esperaba 1.
Option Compare Database
Option Explicit
Dim dbs As Database
Dim rst As Recordset
Dim str As String
Private Sub Form_DblClick(Cancel As Integer)
Set dbs = CurrentDb
str = "INSERT INTO ITSalida_Registros_Pagos_Detallado(IdAptosInst, Vr_Unitario_Detallado, IdCtrl_Precio_Insta, IdSalida_Pagos_Detall, Cantidad_Cancelar )"
str = str & " SELECT [ITConsulta_Control_pagos_Registros_DetalladoA].IdAptosInst, Vr_Detallado, IdCtrl_Precio_Inst," & Forms!ItSalida_Pagos_detallado![Id_Salida_Pagos_Detall] & ", Nz([Q Mueble],0)-TotalCanceladoDetall([IdAptosInst])"
str = str & " FROM [ITConsulta_Control_pagos_Registros_DetalladoA]"
str = str & " WHERE [ITConsulta_Control_pagos_Registros_DetalladoA].IdAptosInst =" & Me![IdAptosInst]
dbs.Execute (str)
Forms!ItSalida_Pagos_detallado!ITSalida_Registro_Pagos_Detallado.Form.Requery
Forms!ItSalida_Pagos_detallado!ITConsulta_Salida_Registro_Pagos_Detall_Inst.Form.Requery
End Sub
Tengo otra consulta similar a esta en otro formulario y me funciona correctamente, no se por que esta no.
1 Respuesta
Para localizar el error una posibilidad sencilla es poner un punto de interrupción en el código y comprobar el valor de str. Si el objeto desde el que se ejecuta el código no tiene acceso a Forms!ItSalida_Pagos_detallado![Id_Salida_Pagos_Detall] o a Me![IdAptosInst] se producirá el error que comentas. Imagino que TotalCanceladoDetall([IdAptosInst]) es un campo calculado o función a la que le pasas el valor de IdAptosInst, por lo que también puede ser que no se tenga acceso a ese valor requerido. Otra posibilidad es que la acción desde donde se ejecuta el doble click provoque que no se tenga el enfoque en un registro en concreto de Forms! ItSalida_Pagos_detallado (suponiendo que éste sea un formulario o subformulario continuo), lo uqe provoca el mismo error.
Puedes usar para verlo inspecciones. Créate variables para estas referencias a objetos y agrega inspecciones sobre ellas y sobre el valor de str. Alguna de ellas tiene que tener valor nulo. Una vez la localices no debe de ser complicado evitar ese error.
Cordiales saludos.
Solo un comentario más. SI no te manejas bien en el código con las interrupciones, variables... puedes realizarlo de un modo más manual. Sustituye en la sentencia SQL una referencia (por ejemplo Forms!ItSalida_Pagos_detallado![Id_Salida_Pagos_Detall]) por un valor válido (escribes el valor tal cual en la SQL en lugar de la referencia al objeto). Vas probando con las referencias que tengas una a una hasta que veas que desaparece el error. Una vez tengas localizada la que lo ocasiona ya puedes intentar corregir el error que se presente.
Cordiales slaudos.
Angel, el error me lo arroja al momento de pasar por :
dbs.Execute (str)
En el transcurso de cada código no hay error
Que puedo hacer.
El error te lo va a presentar siempre en ese punto (en caso de existir) ya que es cuando se ejecuta el SQL definido en la variable str. Esta variable nunca va a dar error ya que simplemente se necesita que sea un string válido.
Antes te comentaba lo siguiente: "Créate variables para estas referencias a objetos y agrega inspecciones sobre ellas y sobre el valor de str. Alguna de ellas tiene que tener valor nulo.".
Manten el punto de interrupción que tengas. Define variables para las referencias que tiene la SQL ay escribelas antes de ejecutar dbs. Execute (str). Por ejemplo:
Dim miValor_Id_Salida_Pagos_Detall as String
miValor_Id_Salida_Pagos_Detall = Forms!ItSalida_Pagos_detallado![Id_Salida_Pagos_Detall]
Haz lo mismo con el resto de referencias. Cuando ejecutes el código comprueba cual tiene un valor nulo y con ello ya sabes cual te está dando el error en la ejecución.
La otra opción que te comentaba es ir sustituyendo en la cadena estas referencias por valores. SI te da error la cadena original y al sustituir en la SQL por ejemplo la referencia Forms!ItSalida_Pagos_detallado![Id_Salida_Pagos_Detall] por 200 (estoy suponiendo que 200 es un valor válido para ese campo) te desaparece el error, también de este modo localizas que el error está en el valor de esa referencia. Una vez localizado tienes que mirar como solucionarlo. En esto no hay directrices predefinidas, ya que depende del diseño de los objetos... pero en general no es complicado dar con la solución sabiendo donde tienes el problema.
Si con esto no localizas el error tendrías que definirme más los objetos que usas, o mandarme un breve ejemplo que contuviese solo los objetos necesarios para reproducir el error (simpre con datos de prueba si son necesarios), es decir, no requiero todo el mdb o accdb, bastando con los objetos que intervengan y sean necesarios para reproducir el error (el formulario desde el que se produce, la consulta en que esté basado, la tabla o tablas usadas en la consulta con datos de prueba...).
Si te es necesario puedes enviarmelo a [email protected].
Cordiales saludos.
¡Gracias! Volví a crear la consulta de donde cogía los datos y volver a escribir todo el código y me dio.
Tengo una pregunta adicional:
Si en el siguiente código:
Set dbs = CurrentDb
str = "INSERT INTO ITSalida_Registros_Pagos_Detallado(IdAptosInst, Vr_Unitario_Detallado, IdCtrl_Precio_Insta, IdSalida_Pagos_Detall, Cantidad_Cancelar )"
str = str & " SELECT [ITConsulta_Control_pagos_Registros_DetalladoA].IdAptosInst, Vr_Detallado, IdCtrl_Precio_Inst," & Forms!ItSalida_Pagos_detallado![Id_Salida_Pagos_Detall] & ", Nz([Q Mueble],0)-TotalCanceladoDetall([IdAptosInst])"
str = str & " FROM [ITConsulta_Control_pagos_Registros_DetalladoA]"
str = str & " WHERE [ITConsulta_Control_pagos_Registros_DetalladoA].IdAptosInst =" & Me![IdAptosInst]
dbs.Execute (str)
Yo quiero agregar dos campos más pero necesito que los coja del formulario (la parte en negrilla del código de arriba), como debo escribirlo en el código;
Set dbs = CurrentDb
str = "INSERT INTO ITSalida_Registros_Pagos_Detallado(IdAptosInst, Vr_Unitario_Detallado, IdCtrl_Precio_Insta, IdSalida_Pagos_Detall, Campo Nuevo1, Campo Nuevo2, Cantidad_Cancelar )"
str = str & " SELECT [ITConsulta_Control_pagos_Registros_DetalladoA].IdAptosInst, Vr_Detallado, IdCtrl_Precio_Inst," & Forms!ItSalida_Pagos_detallado![Id_Salida_Pagos_Detall] EN ESTA PARTE DEBEN IR LOS CAMPOS O EN QUE PARTE? & ", Nz([Q Mueble],0)-TotalCanceladoDetall([IdAptosInst])"
str = str & " FROM [ITConsulta_Control_pagos_Registros_DetalladoA]"
str = str & " WHERE [ITConsulta_Control_pagos_Registros_DetalladoA].IdAptosInst =" & Me![IdAptosInst]
dbs.Execute (str)
Para añadir nuevos campos hay que tener en cuenta básicamente dos cosas. La primera es que las expresiones que uses para obtener los valores como puede ser en tu ejemplo Forms!ItSalida_Pagos_detallado![Id_Salida_Pagos_Detall] devuelvan un valor, o bien la valides antes de usarla en str para comprobar (usando por ejemplo la función IsNull) si hay algún valor, y en caso de ser nulo y requerir la tabla de destino la inserción de algún valor, sustituir ese nulo por algún valor adecuado en ese caso.
Lo otro a tener en cuenta es que los campos en los que insertar y los valores a insertar deben de estar en el mismo orden y separados por comas. ¿En tu ejemplo para insertar en 'Campo Nuevo1' y en 'Campo Nuevo2' debes de escribir en el lugar en que pones EN ESTA PARTE DEBEN IR LOS CAMPOS O EN QUE PARTE? & Las expresiones que obtienen el valor de los campos en el formulario (separadas entre si y de las precedentes y posteriores por comas). Te pongo un ejemplo de la segunda parte de tu str (la parte en que haces SELECT...) inventando el nombre de dos campos del formulario.
Dim str As Screen str = str & " SELECT [ITConsulta_Control_pagos_Registros_DetalladoA].IdAptosInst, Vr_Detallado, IdCtrl_Precio_Inst," & Forms!ItSalida_Pagos_detallado![Id_Salida_Pagos_Detall] & ", " & Forms!MiFormulario!MiCampo1 & ", " & Forms!MiFormulario!MiCampo2 & ", Nz([Q Mueble],0)-TotalCanceladoDetall([IdAptosInst])"
Cordiales saludos.
Ángel, buenos días, coloque el código como me lo indicaste con las comas y todo pero al dar doble clic no me hace nada, ni siquiera genera error.
te envío el código como quedo:
Set dbs = CurrentDb
'str = "INSERT INTO ITSalida_Registros_Pagos_Instalacion (IdAptosInst,Vr_Unitario, IdCtrl_Precio_Insta, IdEmpleado, IdMano_de_Obra, IdSalida_Pagos_Inst, Cantidad_Cancelar) "
str = str & " SELECT [ITConsulta_Salida_Registro_Pagos_Instalacion].IdAptosInst,Vr_Inst, IdCtrl_Precio_Inst," & Forms!ITSalida_Pagos_Instalacion![Id_Salida_Pagos_Inst] & ", " & Forms!ITSalida_Pagos_Instalacion![IdEmpleado] & ", " & Forms!ITSalida_Pagos_Instalacion![IdTipo_Mano_de_Obra] & ", Nz([Q Mueble],0)-TotalCancelado([IdAptosInst])"
str = str & " FROM [ITConsulta_Salida_Registro_Pagos_Instalacion]"
str = str & " WHERE [ITConsulta_Salida_Registro_Pagos_Instalacion].IdAptosInst=" & Me![IdAptosInst]
dbs.Execute (str)
Los dos campos que agregue son campos que existen en el formulario y son campos independientes, los selecciono de una lista ya que son cuadros combinados.
Quedo Atento a tu valiosa ayuda.
Puedes hacer varias pruebas para ver que está fallando. Eso sí, lo primero es comprobar que no tienes en modo comentario la primera asignación de la variable str, ya que por lo menos en el texto que copias hay antes del primer str un apóstrofe, con lo que str empieza realmente en la parte de:
str = str & " SELECT ...
Si realmente está comentado lo anterior, al hacer una select, de cara al usuario no se está haciendo nada, ya que no hay un INSERT INTO que le diga donde insertar los registros seleccionados.
Suponiendo que sea un error al escribirlo y realmente tengas un error en la cadena str puedes hacer varias pruebas dependiendo de como te manejes con el código.
La primera podría ser definir antes de la construcción de str unas variables para comprobar el valor de todos los elementos que tienes en la parte SELECT de str.
Por ejemplo escribe algo así como:
DIm a, b, c, d (y así con el resto)
a = [ITConsulta_Salida_Registro_Pagos_Instalacion].IdAptosInst
b = Vr_Inst
c = IdCtrl_Precio_Inst
d = Forms!ITSalida_Pagos_Instalacion![Id_Salida_Pagos_Inst]
...
Pones un punto de interrupción en el código antes de estas lineas y ejecutas paso a paso hasta sobrepasar la asignación de la última variable que has definido. En ese punto simplemente para el cursor por encima de las variables y comprueba que todas tienen algún valor.
También puedes agregar inspecciones para ver los valores, o incluso añadir tras definir str lo siguiente:
Debug. Print str
Esto te envia la cadena str completa a la ventana Inmediato a la que accedes desde el código VBA. Luego tomas la cadena y la usas para crear una consulta en modo SQL. Haciendo algunas pruebas puedes ver donde está el error. Dado que estás haciendo referencias a campos del formulario ITSalida_Pagos_Instalacion, debes de tenerlo abierto para btener resultados.
Si sigues sin localizarlo puedes comenzar a reescribir la consulta desde su inicio: Mantienes el formulario abierto, Creas una nueva consulta en modo diseño, añades la tabla y arrastras los campos que vas a usar al grid. La idea básica es ir definiendo la consulta poco a poco hasta ver el error. Prienro solo intentas simular la parte select de la consulta. A medida que vayas haciendo cambios la vas ejecutando para ver resultados. Para las referencias a los campos del formulario en la parte select, así como para la referencia que usas en la clausula WHERE usa el generador para eviatr errores de escritura. Cuando tengas operativa la parte SELECT convierte la consulta en una de datos anexados e indica que la tabla destino es ITSalida_Registros_Pagos_Instalacion.
Seleciona los campos de destino y ejecuta. Cuando se añadan los registros a la tabla comprueba en modo SQL esta consulta con la que se obtiene desde el código y mira que diferencia existe.
Suerte.
Si finalmente no das con el error y quieres enviarme una pequeña muestra de la aplicación con los objetos necesarios para poder ejecutar el formulario (y como siempre solo con datos de prueba) puedes hacerlo a [email protected]
Cordiales saludos.
Angel, muchas gracias, me fue de excelente ayuda todos tus comentarios, en este ultimo lo que hice fue insertar un campo en la tabla que contiene el formulario para que tomara los datos (como te comentaba los datos los tomaba de unos campos independientes, y esto es lo que hacia que no los tomara).
si es posible te estare molestando para que me indiques como puedo hacen en el access que cuando yo llame un nuevo registro me de la oportunidad de registrar los datos desde 0 o tomarlos de registros anteriores.
Nuevamente Gracias.
- Compartir respuesta