Inconvenientes con funciones SQL en código vba

Haz tu pregunta - Todoexpertos.com

Aquí deseo realizar un update con un botón que tiene el siguiente código:

Dim StrSQL22 As String 

StrSQL2 = "UPDATE [Clientes] SET Direccion= '" & Me.TextoDIRECCION & "',Poblacion= '" & Me.TextoPoblacion & "' ,Codpostal= '" & Me.TextoCodpostal & "' ,NIFCLIE =" & Me.TextoNIFCLIE & "'" & _         "TL ='" & Me.Textotl & "', MOVIL='" & Me.TextoMOVIL & "', CORREO='" & Me.TextoCORREO & "' "   & _        

"PRESIDENTE='" & Me.Textopresidente & "' , ADMINISTRADOR ='" & Me.Textoadministrador & "' Calle= '" & Me.TextoCalle & "' WHERE Id_clie = '" & Me.Textoiclie & "'"

CurrentDb.Execute StrSQL2, dbFailOnError 

Al hacer una actualización en alguno de los textos y oprimir el boton que tiuene el anterior codigo, me sale un error que dice:                Se ha producido el error ‘3075’ en tienmpo de ejecucion: Error de sintaxis(falta operador) en la expresion de consulta ’NR’TL=”, MOVIL=”, CORREO=” PRESIDENTE=”, ADMINISTRADOR=” CALLE=” WHERE Id_clie=’146”.  En verdad no comprendo en donde esten los errores en las dos anteriores instrucciones SQL. 

2 Respuestas

Respuesta
2

El primer error es que antes del nombre del campo TL te falta una coma, y lo mismo con PRESIDENTE y CALLE.

El segundo error, por el mensaje de error que pones, es que tienes cuadros de texto sin valor al ejecutar esa consulta, y si no tienen valor, no tiene forma de actualizarlos. Deberías comprobarlo antes, o asignar un valor por defecto a los nulos con la función Nz()

El tercer posible error es que haya campos numéricos y tu los estás tratando a todos como si fueran de texto, con las comillas simples.

Un saludo.


Muchas gracias Sveinbjorn El Rojo, ya arregle el inconveniente que tenia con lo de las comas en la aplicación, ahora mi pregunta es en cuanto a Nz(),según la sugerencia que usted me hace   esa validación me tocaría realizarla con if anidados antes de ejecutar el Update?

Nz() convierte valores nulos en otro valor que quieras, por ejemplo, si pones: Nz(Me. Precio, 0), donde no haya Precio te pondrá un 0, pero si pones Nz(Me. Precio, 200), donde no haya Precio te pondrá 200.

SI usas Nz(), no te hace falta validar por medio de Ifs, tan solo poner un valor "por defecto", si hay nulos en los campos, aunque por supuesto, puedes hacerlo.

Hola,,,, Un saludo muy cordial desarrolle lo quien usted me comenta acerca de utilizar la función Nz en el Update como usted me indica:

StrSQL = "UPDATE [Proveedores] SET NIFPROV= Nz(isnull(me.TextoNIFPROV), '0', '" & Me.TextoNIFPROV & "'), " & _
"TELEFONO=Nz(isnull(Me. TextoTELEFONO), '0', '" & Me.TextoTELEFONO & "') , " & _
"MOVIL =Nz(isnull(Me. TextoMOVIL), '0', '" & Me.TextoMOVIL & "'), " & _
"CORREO =Nz(isnull(Me.TextoCORREO), '0', '" & Me.TextoCORREO & "'), " & _
"PAGINAWEB =Nz(isnull(Me.TextoPAGINAWEB), '0','" & Me.TextoPAGINAWEB & "') , " & _
"CODIGOPOSTAL= Nz(isnull(Me.TextoCODIGOPOSTAL), '0','" & Me.TextoCODIGOPOSTAL & "'), " & _
"DIRECCION= Nz(isnull(Me.TextoDIRECCION), '0','" & Me.TextoDIRECCION & "'), " & _
"ACTIVIDAD =Nz(isnull(Me.TextoACTIVIDAD), '0'," & Me.TextoACTIVIDAD & "), " & _
"WHERE Id_proveedor = '" & Me.TextoIDPROVEED & "'";

Pero desafortunadamente me arroja un error, me dice que hay error de sintexis en verdad no veo donde esta dicho error.

Muchas gracias por la ayuda

Att. Hernan Martínez

Es mas aquí explico el error para que se entienda mejor : https://www.youtube.com/watch?v=wqecmbXt0fA 

Lógico que te de error, porque lo que has hecho no tiene ningún sentido...

En primer lugar te sobran todos los Isnull, y en segundo, te convendría releer como se usa Nz() pues no lo haces bien.

El uso correcto sería:

StrSQL2 = "UPDATE [Clientes] SET Direccion= '" & Nz(Me.TextoDIRECCION,'') & "',Poblacion= '" & ....

Obviamente, con Nz tendrás que usar los valores adecuados a tus campos en caso de nulos

Igualmente al realizar esto:

dim strsql as string

strsql = "update [proveedores] set nifprov= '" & nz(me.textonifprov, "0") & "', " & _
"telefono='" & nz(me.textotelefono, "0") & "', " & _
"movil = '" & nz(me.textomovil, "0") & "' , " & _
"correo ='" & nz(me.textocorreo, "0") & "' , " & _
"paginaweb ='" & nz(me.textopaginaweb, "0") & "' , " & _
"codigopostal= '" & nz(me.textocodigopostal, "0") & "' , " & _
"direccion= '" & nz(me.textodireccion, "0") & "' , " & _
"actividad =" & nz(me.textoactividad, "0") & " , " & _
"recibido = " & nz(me.recibido, "0") & " , " & _
"where id_proveedor = '" & me.textoidproveed & "'"

currentdb.execute strsql, dbfailonerror

Al ejecutar este update me dic e que hay error de sintaxis.

En vez de "currentdb.execute strsql, dbfailonerror" pon "debug.print strsql" (sin las comillas, y ponme aquí el resultado que sale en la ventana inmediato

Además, sigues usando mal Nz(), pues dudo que 0 sea un valor adecuado para todos los campos...

En el Update en la ventana Inmediato me muestra, lo siguiente: 

UPDATE [Clientes] SET [Direccion]= 'Rio de Janeiro 99', [Poblacion]='080 Barcelona', [Codpostal]= '', [NIFCLIE]='E58751579', [TL]='', [MOVIL]= '', [CORREO]='', [PRESIDENTE]= '', [Administrador]= '', [Calle]= 'Mallorca 201-203 Bjos. Int', [Activo]=0, WHERE [Id_clie] = '147'

El único error de sintaxis que veo, es que te sobra una coma (,) antes del WHERE.

Hola ya le quite la coma, pero viendo la ventana Inmediato si toma la actualización como se puede ver aquí, en el campo [Población]='080 barcelona, le incluí las cuatro A mayúscula

UPDATE [Clientes] SET [Direccion]= 'Rio de Janeiro 99',  [Poblacion]='080  BarcelonaAAAAAA',  [Codpostal]= '',  [NIFCLIE]='E58751579',  [TL]='',  [MOVIL]= '',  [CORREO]='',  [PRESIDENTE]= '',  [Administrador]= '',  [Calle]= 'Mallorca 201-203 Bjos. Int',  [Activo]=0 WHERE [Id_clie] = '147'    

Pero la momento de cerrar el formulario y abrir la tabla clientes no me aparece el registro Modificado.. de verdad no se que haga falta dentro del código, pues incluí CurrentDb.Execute StrSQL2, dbFailOnError, para ver si es necesario y ahí si el interpretador de Access me muestra el error "No coinciden los tipos de datos en la expresión de criterios".

Tienes que tener en cuenta el tipo de datos de cada campo para pasarles un valor: si el tipo de datos es texto, has de pasar un texto, si es numérico, un número, y si es fecha/hora, una fecha, una hora o ambas.

Con esto te quiero decir, por ejemplo, que si Id_clie es un campo numérico, tan como tienes la SQL le estás diciendo que lo compare con un valor de texto (...WHERE [Id_clie] = '147') en vez de con un número (...WHERE [Id_clie] =147)

¡Gracias! Muy amable por todo Sveibjorn por todo ese era el inconveniente, los tipos de datos y el código para actualizar la base de datos. Gracias.

Respuesta
1

Si es de tipo texto en tu base de datos se ponen así '" & me.campo & "'

Si es de tipo de numero en tu base de datos se ponen así " & me.campo & "

Checa eso tal vez te sirva

También los espacios chekalos bien, procura que los & y las comillas tengas espacio al igual que el & tenga espacio con me. Campo

CurrentDb. Execute "INSERT INTO Robos(fecha, folio, sucursal, nombrefiscal, no_carpeta, descripcion, efectivo, fondocaja, corte)VALUES(#" _
& Format(Me.Fecha, "MM/dd/yyyy") & " " & Format(Me.Hora, "hh:mm:ss ") & "# , " _
& Me.folio & " , " & Me.SucursalHidden & " , " _
& IIf(IsNull(Me.Fiscal) Or Me.Fiscal = "", "NULL", " '" & Me.Fiscal & "' ") & " , " _
& IIf(IsNull(Me.Carpeta) Or Me.Carpeta = "", "NULL", " '" & Me.Carpeta & "' ") & " , '" _
& Me.descripcion & "' , " & Me.efectivo & " , " & Me.Fondo & " , " & Me.corte & " )", dbFailOnError

Si te das cuenta en el campo me. Descripcion le pongo comillas sencilla y doble por que en mi base de datos es tipo texto. y en me. Efectivo le pongo solo comillas dobles por que en mi base de datos es de tipo numero

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas