Se ha producido el error 3061 pocos parámetros se esperaba 1

Tengo la siguiente función definida en un Módulo en una Base de datos MS Access 2016, para actualizar el valor de un campo de tipo booleano de una tala:

Function Actualiza_subcontrata(Exp As String, Valor As Boolean)
   Set DB = CurrentDb
   'Actualiza el valor del campo Tiene subcontratas en la tabla 1-Expedientes_SARA
   SQL = "UPDATE [1-Expedientes_SARA] SET [1-Expedientes_SARA].[Tiene Subcontratacion] = " & Valor
   SQL = SQL & " WHERE [1-Expedientes_SARA].Expediente = '" & Exp & "'"
   DB.Execute (SQL)
   MsgBox "Actualizado Tiene subcontratas"
End Function

Al aplicar la inspección sobre las variables de la función, los valores aparentemente son correctos:

Exp = "2.20/28520.0185"

Valor = Verdadero

SQL = "UPDATE [1-Expedientes_SARA] SET [1-Expedientes_SARA].[Tiene Subcontratacion] = Verdadero WHERE 1-Expedientes_SARA].Expediente = '2.20/28520.0185'"

Al llegar a DB. Execute (SQL), aparece el mensaje de error indicado. El problema viene dado por la variable booleana que le paso en la llamada que hago desde un subformulario, que Valor toma Verdadero y no True. Es decir, que si sustituyo la variable Valor por el literal True, no aparece el error y la función actualiza correctamente el campo booleano en la tabla. ¿Hay alguna solución a este problema?

Respuesta
1

Pruebe pasando el parámetro Valor por valor y no por referencia, algo como:

Function Actualiza_subcontrata(Exp As String, Byval Valor As Boolean)

Además, el error puede estar es en la llamada de la función, por ejemplo,

Actualiza_subcontrata(Expediente ,Forms! NombreSubformulario! Valor) si no está en el formulario principal.

Actualiza_subcontrata(Expediente ,Me.NombreSubformulario! Valor) si llama la función desde el formulario principal.

Pero no puede colocar -1 como le indican porque es un parámetro, que puede ser -1 o 0 y no un valor estático

No hay necesidad de dividir la consulta debería funcionar con una sola instrucción SQL.

2 respuestas más de otros expertos

Respuesta
1

En lugar de usar

"... [1-Expedientes_SARA].[Tiene Subcontratacion] = " & Valor

podría usted usar

"... [1-Expedientes_SARA].[Tiene Subcontratacion] = " & SiInm(Valor, -1, 0)

Gracias por la solución, finalmente he optado por modificar la función y ahora funciona correctamente:

Function Actualiza_subcontrata(Exp As String, Valor As Boolean)
   Set DB = CurrentDb
   'Actualiza el valor del campo Tiene subcontratas en la tabla 1-Expedientes_SARA
   If Valor Then
      SQL = "UPDATE [1-Expedientes_SARA] SET [1-Expedientes_SARA].[Tiene Subcontratacion] = True"
 Else
     SQL = "UPDATE [1-Expedientes_SARA] SET [1-Expedientes_SARA].[Tiene Subcontratacion] = False"
   End If
   SQL = SQL & " WHERE [1-Expedientes_SARA].Expediente = '" & Exp & "'"
   DB.Execute (SQL)
End Function

Respuesta
1

Da la impresión que Tiene Subcontratación es una casilla de verificación. Personalmente pondría la instrucción como

Docmd.runsql"update 1-Expedientes_Sara set [tiene subcontratación]=-1 where Expediente='" & me.exp & "'"

O si lo prefieres

Docmd.runsql"update 1-Expedientes_Sara set [tiene subcontratación]=-1 where expediente=""2.20/28520.0185"""

Cuando los nombre están separados, caso de Tiene Subcontratación si son necesarios los corchetes, pero si es todo seguido, caso de 1_Expedientes_Sara no los necesitas.

El -1 equivale a true, el 0 a false

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas