VBA Access: Error de sintaxis en la instrucción INSERT INTO

He generado una especie de seguimiento de acciones de usuarios específicos y, tras recabar la información en variables, al insertar en la tabla dichos valores me da error:

CurrentDb.Execute "INSERT INTO US_AD_TICKET (TICKET, USUARIO, TITULAR, NIVEL, NDETALLE, FECHA, FORMULARIO, ACCION, DETALLE, OBS,) VALUES ('" & vTktTKT & "', '" & vUsuarioTKT & "', '" & vTitularTKT & "', '" & vNivelTKT & "', '" & vNivDetTKT & "', '" & vFechaTKT & "', '" & vFormTKT & "', '" & vAccionTKT & "', '" & vDetalleTKT & "', '" & vObsTKT & "')"

Son todos valores String a excepción de NIVEL es Byte (sólo hay valores del 1 al 5) y fecha que es DATE.
El campo USUARIO está restringido a 15 caracteres, TITULAR está restringido a 20 caracteres. El campo OBS es del tipo MEMO (Texto largo).
¿Dónde está el error?

2 Respuestas

Respuesta
1

El error está en la sintaxis: los campos numéricos se pasan sin comillas simples y los de fecha entre almohadillas, como siempre.

Me odio por ello porque lo sé y lo olvido siempre. ¡Soy un desastre!
Apliqué los cambios y ahora me da error:
Falta un operador en la expresión de consulta y cita el contenido de un campo que tiene saltos de línea (vbcrlf) (Es el campo Texto Largo, o Memo)
¿A qué se debe? El campo, de ser posible, debe tener esos saltos. Son datos que deben ir en esa línea.

Que el campo memo tenga saltos de linea no debería ser problema (acabo de probar en un BD y funciona sin problema)

Se me ocurre que el problema pueda estar en que el contenido de tu campo lleve alguna comilla simple, y entonces Access y el SQL lo interpreta como fin del contenido del campo, y se encuentra que hay más valores que campos.

Usa la función Replace para sustituir la comilla simple por dos comillas simples, a ver si funciona.

En realidad hay texto con comillas dobles para insertar texto a modo de 'Título' de lo que se registra:
Ej.: "Usuario: " & vUserTKT
Y hay otros que tienen paréntesis:
Ej.: "Nivel: (" & vNivelTKT & ") " & vNivDet
Hay un InPutBox con un texto predeterminado (en caso de que no ingrese valor): "[ El Usuario no deja registro ]" pero le quité los corchetes y aún así dio error.
El código completo:

Sub TKT_ADMIN()
'Public VTKT As DAO.Recordset, vTktTKT As String, vUsuarioTKT As String, vTitularTKT As String, vNivelTKT As Byte, vNivDetTKT As String, vFechaTKT As Date, _
vFormTKT As String, vAccionTKT As String, vDetalleTKT As String, vObsTKT As String, vTextoTKT as String, vNumTKT as long
Set VTKT = CurrentDb.OpenRecordset("US_ACTIVO")
If DCount("TICKET", "US_AD_TICKET") = 0 Then
    vNumTKT = 1
Else
    vNumTKT = Nz(DMax("ID", "LIBRO"), 0) + 1
End If
vUsuarioTKT = VTKT.Fields(0)
vTitularTKT = VTKT.Fields(1)
vNivelTKT = VTKT.Fields(2)
vNivDetTKT = VTKT.Fields(3)
vFechaTKT = Now
vFormTKT = "Nuevo Usuario"
vAccionTKT = "NEW" & String(6 - Len(vAccionTKT), "0") & vNumTKT
vDetalleTKT = DLookup("[DETALLE]", "[US_AD_ACCION]", "[ACCION] ='" & vAccionTKT & "'")
vTextoTKT = InputBox("Inserte algún comentario para el ticket:", "Nuevo Ticket", "Sin comentario del usuario '" & vUsuarioTKT & "'")
vObsTKT = "Acción: Creación de Usuario." & vbCrLf & "Usuario: " & txtUsuario & vbCrLf & "Titular: " & txtApeNom & vbCrLf & "Alta: " & TXTfaLTA & vbCrLf & _
"Nivel: (" & lstNivel & ") " & vNivDetTKT & vbCrLf & "Observaciones: " & vTextoTKT
vTktTKT = vAccionTKT
MsgBox "Ticket: " & vTktTKT & vbCrLf & "Usuario: " & vUsuarioTKT & vbLf & "Titular: " & vTitularTKT & vbLf & "Nivel: " & vNivelTKT & ": " & vNivDetTKT & vbLf & _
"Fecha: " & vFechaTKT & vbLf & "Formulario: " & vFormTKT & vbLf & "Acción: " & vAccionTKT & ": " & vDetalleTKT & vbLf & "Observaciones:" & vbLf & vObsTKT
CurrentDb.Execute "INSERT INTO [US_AD_TICKET] (TICKET, USUARIO, TITULAR, NIVEL, NDETALLE, FECHA, FORMULARIO, ACCION, DETALLE, OBS) Values  ('" & vTktTKT & "', '" & vUsuarioTKT & "', '" & vTitularTKT & "', " & vNivelTKT & ", '" & vNivDetTKT & "', #" & vFechaTKT & "#, '" & vFormTKT & "', '" & vAccionTKT & "', '" & vDetalleTKT & "', '" & vObsTKT & "'"
End Sub

Tengo: vDetalleTKT = DLookup("[DETALLE]", "[US_AD_ACCION]", "[ACCION] ='" & vAccionTKT & "'")
¿Hay alguna forma de 'limpiar' esas comillas?
Por ejemplo:

vDetalleTKT = DLookup("[DETALLE]", "[US_AD_ACCION]", "[ACCION] ='" & vAccionTKT & "'")
vDetalleTKT = vDetalleTKT

Si dentro del texto tienes comillas dobles, usa el truco del replace() para duplicarlas. Ten también en cuenta la respuesta de fichu, pues te sobra una coma después del nombre del campo OBS

¡Gracias!
Lo rearmé íntegro. Al rehacerlo encontré el error y todo lo que me dijeron es verdad: funciona perfectamente. EL código quedó así, para quienes les sirva:

Sub TKT_ADMIN()
'Public vTKT As DAO.Recordset, vNumTktTKT As Long, vTktTKT As String, vUsuarioTKT As String, vTitularTKT As String, vNNivTKT As Byte, vDNivTKT As String, _
vFechaTKT As Date, vFormTKT As String, vAccTKT As String, vAccAccionTKT As String, vAccionTKT As String, vDetalleTKT As String, vObsTKT As String, vTextoTKT as string
Set vTKT = CurrentDb.OpenRecordset("US_ACTIVO")
' Estableciendo valores iniciales:
' Tipo de ticket
If DCount("TICKET", "US_AD_TICKET") = 0 Then
    vNumTktTKT = 1
Else
    vNumTktTKT = Nz(DMax("ID", "LIBRO"), 0) + 1
End If
' Usuario
vUsuarioTKT = vTKT.Fields(0)
' Titular
vTitularTKT = vTKT.Fields(1)
' Nivel
vNNivTKT = vTKT.Fields(2)
vDNivTKT = vTKT.Fields(2) & " " & vTKT.Fields(3)
' Fecha
vFechaTKT = Now
' Formulario
vFormTKT = "Nuevo usuario"
' Acción
vAccTKT = "NEW"
vAccAccionTKT = vAccTKT & DLookup("[ACCION]", "[US_AD_ACCION]", "[ACCION] = '" & vAccTKT & "'")
' Detalle del usuario
vDetalleTKT = InputBox("Ingrese algún comentario:", "Nuevo ticket", "[Sin comentario del usuario " & vUsuarioTKT & "]")
' Observaciones
vTextoTKT = DLookup("[NIVEL]", "[US_NIVEL]", "[IDN] = " & txtNivel & "")
vObsTKT = "Usuario: " & txtUsuario & vbCrLf & "Titular: " & txtApeNom & vbCrLf & "Fecha alta: " & TXTfaLTA & vbCrLf & "Nivel: " & txtNivel & " " & vTextoTKT
'Arma Número de Ticket
vTktTKT = vAccTKT & String(12 - Len(vNumTktTKT), "0")
CurrentDb.Execute "INSERT INTO [US_AD_TICKET] (TICKET, USUARIO, TITULAR, NIVEL, FECHA, FORMULARIO, ACCION, DETALLE, OBS) Values ('" & vTktTKT & "', '" & vUsuarioTKT & "', '" & vTitularTKT & "', '" & vDNivTKT & "', #" & vFechaTKT & "#, '" & vFormTKT & "', '" & vAccAccionTKT & "', '" & vDetalleTKT & "', '" & vObsTKT & "')"
End Sub

¡Gracias!
Para variar, TE funcionando mal. Te haré caso y entraré al foro que me pasaste.
Ahora, paso el código final pues lo rehíce íntegramente y me di cuenta que cerré el paréntesis fuera de las comillas  "'") en vez de "')"

Sub TKT_ADMIN()
'Public vTKT As DAO.Recordset, vNumTktTKT As Long, vTktTKT As String, vUsuarioTKT As String, vTitularTKT As String, vNNivTKT As Byte, vDNivTKT As String, _
vFechaTKT As Date, vFormTKT As String, vAccTKT As String, vAccAccionTKT As String, vAccionTKT As String, vDetalleTKT As String, vObsTKT As String, vTextoTKT as string
Set vTKT = CurrentDb.OpenRecordset("US_ACTIVO")
' Estableciendo valores iniciales:
' Tipo de ticket
If DCount("TICKET", "US_AD_TICKET") = 0 Then
    vNumTktTKT = 1
Else
    vNumTktTKT = Nz(DMax("TICKET", "US_AD_TICKET"), 0) + 1
End If
' Usuario
vUsuarioTKT = vTKT.Fields(0)
' Titular
vTitularTKT = vTKT.Fields(1)
' Nivel
vNNivTKT = vTKT.Fields(2)
vDNivTKT = vTKT.Fields(2) & " " & vTKT.Fields(3)
' Fecha
vFechaTKT = Now
' Formulario
vFormTKT = "Nuevo usuario"
' Acción
vAccTKT = "NEW"
vAccAccionTKT = vAccTKT & DLookup("[ACCION]", "[US_AD_ACCION]", "[ACCION] = '" & vAccTKT & "'")
' Detalle del usuario
vDetalleTKT = InputBox("Ingrese algún comentario:", "Nuevo ticket", "[Sin comentario del usuario " & vUsuarioTKT & "]")
' Observaciones
vTextoTKT = DLookup("[NIVEL]", "[US_NIVEL]", "[IDN] = " & txtNivel & "")
vObsTKT = "Usuario: " & txtUsuario & vbCrLf & "Titular: " & txtApeNom & vbCrLf & "Fecha alta: " & TXTfaLTA & vbCrLf & "Nivel: " & txtNivel & " " & vTextoTKT
'Arma Número de Ticket
vTktTKT = vAccTKT & String(6 - Len(vNumTktTKT), "0")
CurrentDb.Execute "INSERT INTO [US_AD_TICKET] (TICKET, USUARIO, TITULAR, NIVEL, FECHA, FORMULARIO, ACCION, DETALLE, OBS) Values ('" & vTktTKT & "', '" & vUsuarioTKT & "', '" & vTitularTKT & "', '" & vDNivTKT & "', #" & vFechaTKT & "#, '" & vFormTKT & "', '" & vAccAccionTKT & "', '" & vDetalleTKT & "', '" & vObsTKT & "')"
End Sub
Respuesta
1

El error de sintaxis está en la lista de columnas, hay una coma de más al final, después de la columna OBS

¡Gracias! Me confundió eso de la coma (,) y buscaba y buscaba.
Lo rehíce y quedó perfecto pues no cerré el paréntesis después del apóstrofo (')
Cerraba "'") y no "')".
Muchas gracias para ti por tu ayuda.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas