Access - ERROR DE SINTAXIS EN UPDATE

   
Vista:
Imágen de perfil de VICENTE

ERROR DE SINTAXIS EN UPDATE

Publicado por VICENTE VSLCINES@GMAIL.COM (32 intervenciones) el 03/02/2015 14:12:47
Hola Compañeros, me estoy volviendo loco con un error de sintaxis en un UPDATE:

DoCmd.RunSQL "UPDATE ComprasPedidos set ComprasPedidos.PedQNF = " & Me.txtPedQNF.Value & _
", ComprasPedidos.PedQFisica = " & Me.txtPedQFisica.Value & _
", ComprasPedidos.PedLote = " & Me.txtPedLote.Value & _
", ComprasPedidos.PedPNF = " & Me.txtPedPNF.Value & _
", ComprasPedidos.PedFechaCaduca = " & Me.txtPedFechaCaducidad & _
" WHERE ComprasPedidos.Id = val (" & Me.txtPedId.Value & ") "

No encuentro cual puede ser la causa del error, y sospecho que se encuentra en los tipos de datos, aunque he comprobado todos y tampoco hay discrepancias aparentes:
PedQNF, PedQFisica están configurados en la tabla como "Entero Largo" y los campos del formulario como Numero General.
PedLote es un Texto en la tabla y no le he especificado formato en el campo del formulario.
PedPNF esta como Moneda en la Tabla y el campo del formulario también como Moneda.
PedFechaCaduca está como Fecha/Hora en la tabla y como Fecha Corta en el formulario.

Alguien me puede echar una mano, por favor????

Agradecido de antemano

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Neckkito

ERROR DE SINTAXIS EN UPDATE

Publicado por Neckkito (1104 intervenciones) el 03/02/2015 14:58:10
Hola!

Prueba con esto:

DoCmd.RunSQL "UPDATE ComprasPedidos set ComprasPedidos.PedQNF = " & Me.txtPedQNF.Value & _
", ComprasPedidos.PedQFisica = " & Me.txtPedQFisica.Value & _
", ComprasPedidos.PedLote = '" & Me.txtPedLote.Value & "'" & _
", ComprasPedidos.PedPNF = " & Me.txtPedPNF.Value & _
", ComprasPedidos.PedFechaCaduca = #" & format(Me.txtPedFechaCaducidad, "mm/dd/yy") & "#" & _
" WHERE ComprasPedidos.Id = " & val(Me.txtPedId.Value)

A ver si así te funciona.

Saludos,
firmaMail
http://neckkito.siliconproject.com.ar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de VICENTE

ERROR DE SINTAXIS EN UPDATE

Publicado por VICENTE (32 intervenciones) el 03/02/2015 19:12:41
Gracias Neck, era eso y el campo Me.txtPedPNF, que tiene 3 decimales y la coma me la estaba jugando.

Lo he arreglado con un:

Replace(Me.txtPedPNF, ",", ".")

Para sustituir la coma por el punto.....

El problema es que cuando defino un campo del Form como Número General, o como Standar y llamo ese valor en el código, me devuelve un campo texto, y lo mismo me pasa con las fechas.

Tu sabes porque me está sucediendo esto??

Gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

ERROR DE SINTAXIS EN UPDATE

Publicado por Neckkito (1104 intervenciones) el 03/02/2015 22:58:22
Hola Vicente:

Cuando le das un formato a un textbox el valor introducido en ese textbox coge el formato dado. Eso puede ser un poco "trampa", sobretodo en los formatos numéricos (como el número general o el standard que comentas). Y digo "trampa" porque cuando tú crees que estás definiendo un long, o un integer, o un byte, pensando que se adapta al valor escrito, en realidad estás definiendo un double.

Ahora bien, que se conviertan en texto... eso, en teoría, no debería ser así.

Echa un vistazo a este ejemplo que te he preparado. En el código del botón podrás apreciar la manera de poder ver el tipo de valores que te devuelve un cuadro de texto al cual se le ha dado formato (http://www.mediafire.com/view/ezzh6uzl5o5r2zd/Vicente.TiposDeDatos.zip)

Ni que decir tiene que hay más tipos de datos, pero yo sólo te lo he preparado para que veas los valores que comentas en tu consulta.

A ver si con esto puedes clarificar alguna cosa.

Saludos,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de VICENTE

ERROR DE SINTAXIS EN UPDATE

Publicado por VICENTE (32 intervenciones) el 04/02/2015 12:11:35
Gracias Neckkito,

Muy bueno tu ejemplo.

Es que con esto de los tipos de datos me estoy volviendo loco, sobre todo con las fechas.

Por lo menos con esta función de VarType, voy a poder asegurarme del tipo de dato que estoy manejando.

Para cerrar la fase 1 del proyecto que estoy haciendo, tengo un problema con el tratamiento NULL de las fechas, por ejemplo, en este código:

1
2
3
4
5
6
7
8
..........
    Do While Not rs6.EOF
        DoCmd.RunSQL "INSERT INTO StockMovimientos(MovId, MovFecha, MovTipoMovimiento, MovCodArt, MovCantidad, MovLote, MovCaducidad, " & _
                    " MovEstado) values ( " & rs6!Id & ", Date() , 'E', " & tf2(rs6!PedCodArt) & ", " & rs6!PedQFisica & ", " & _
                    tf2(Nz(rs6!PedLote, "0")) & ", " & Nz(rs6!PedFechaCaduca, 0) & ", 'A')"
    rs6.MoveNext
    Loop
..........

Cuando rs6!PedFechaCaduca es nulo, me esta colocando el valor 0:00:00 en el campo de la Tabla, que aunque no es la solución perfecta (porque yo quisiera que me escribiese NULL), me arregla el problema.
Pero cuando el campo tiene un valor "fecha", por ejemplo 30/08/2015, me esta colocando como valor del campo otro valor que no tiene nada que ver, por ejemplo 0:02:23.
Me podrías dar alguna idea sobre qué estoy omitiendo???

Gracias por tu colaboración. Gente como tu en estos foros consigue que a gente como yo le entre el gusanillo del access y del vba, y continuemos intentando a pesar de nuestras carencias de conocimiento.

Un gran saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

ERROR DE SINTAXIS EN UPDATE

Publicado por Neckkito (1104 intervenciones) el 04/02/2015 13:04:04
Hola, Vicente:

A ver si me explico, porque es un poco "raro" si no estás acostumbrado. Las fechas son unos "malos bichos" (es una opinión personal, por supuesto) y algo enrevesadas de manejar.

Imaginemos que creas una tabla con sus campos e introduces unos campos, entre ellos un campo fecha. Imaginemos que das de alta, a mano, valores para un registro. Lógicamente, si sabes el valor de la fecha la introduces y, si no la sabes, dejas el campo en blanco. ¿Ok?

1.- Si has podido introducir la fecha es porque el valor que has introducido es un tipo fecha. Sin problemas.
2.- Si lo has dejado en blanco NO has introducido ningún valor, por lo que el campo fecha te muestra un valor en blanco, esto es, un valor NULL.

Pasemos a SQL. Cuando tu haces un update o un insert to es "diferente" a una introducción manual. La SQL te introduce los valores en los campos, pero...

1.- Si te ha introducido la fecha es porque el valor que inserta la SQL es un valor tipo fecha. Sin problemas.
2.- Si no te ha introducido la fecha no es porque te hayas saltado ese campo, sino porque ha intentado introducir un NULL. Si el campo de fecha está definido como fecha no te puede aceptar un NULL, porque un NULL no es un Date.

Es decir, que una cosa es dejarlo en blanco y otra cosa es intentar meter un dato nulo en un campo que espera un date.

Dicho esto pasemos a tu siguiente problema:

En tu ordenador tú ves las fechas "normales" porque así lo tienes configurado en tu sistema, es decir, en tu configuración regional. Y ahí le debes tener puesto que te muestre la fecha en formato "dd/mm/aa". Hasta aquí bien.

Cuando trabajas con SQL la SQL no se guía por la configuración regional, sino por el formato inglés de fecha. Entonces (y esto puede parecer raro), para que la fecha salga correctamente debes decirle expresamente en la SQL que el formato a utilizar es el inglés. Así la fecha se coge correctamente por la SQL. Todo esto a nivel "interno". Cuando tú miras la fecha en la tabla, por ejemplo, es cuando el sistema se va a mirar qué configuración regional tienes y es cuando te muestra la fecha "en español".

De ahí que cuando trabajes con fechas en SQL es muy conveniente siempre darles formato inglés, es decir, format(laFecha, "mm/dd/yy").

Último problema:

Relacionado con el primer punto, dado que no puedes forzar la inserción o actualización de un tipo date como null, en tu código debes hacer una aproximación condicional. Y lo mejor para eso es utilizar una variable intermedia y una conversión. Dicho en otras palabras,
...
Si laFecha es nulo entonces
'Ejecútame esta SQL
Si no
'Ejecútame esta otra SQL
End if
...

Traducido a tu código vendría a ser una cosa así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
Dim laFecha as Variant 'Variant porque no sabemos si el campo tendrá valor o no.
Do While Not rs6.EOF
laFecha=rs6!PedFechaCaduca
If isnull(laFecha) then 'Si el valor de la fecha es nulo...
DoCmd.RunSQL "INSERT INTO StockMovimientos(MovId, MovFecha, MovTipoMovimiento, MovCodArt, MovCantidad, MovLote, " & _
" MovEstado) values ( " & rs6!Id & ", Date() , 'E', " & tf2(rs6!PedCodArt) & ", " & rs6!PedQFisica & ", " & _
tf2(Nz(rs6!PedLote, "0")) & ", 'A')" 'Insertamos los datos, pero saltamos la fecha
Else
laFecha=CDate(laFecha) 'La convertimos en un valor tipo fecha
DoCmd.RunSQL "INSERT INTO StockMovimientos(MovId, MovFecha, MovTipoMovimiento, MovCodArt, MovCantidad, MovLote, MovCaducidad, " & _
" MovEstado) values ( " & rs6!Id & ", Date() , 'E', " & tf2(rs6!PedCodArt) & ", " & rs6!PedQFisica & ", " & _
tf2(Nz(rs6!PedLote, "0")) & ", " & format(laFecha,"mm/dd/yy") & ", 'A')" 'La pasamos, pero con formato inglés
End if
rs6.MoveNext
Loop
...

Con lo anterior, lógicamente, si no hay fecha no es que insertes un valor NULL (que hemos concluido que no era posible), sino que lo que haces es no indicar valor para el campo de la fecha, y lo que te queda es un NULL.

A ver si me he conseguido explicar medianamente bien.

Un saludo,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de VICENTE

ERROR DE SINTAXIS EN UPDATE

Publicado por VICENTE (32 intervenciones) el 04/02/2015 13:16:11
Neckkito, no te has conseguido explicar bien, te has conseguido explicar excepcionalmente bien, y no es por darte grasilla.

Muchas gracias, no se me había ocurrido algo tan simple y práctico.

Voy a intertarlo y seguro que me funciona.

Gracias de nuevo.

Un gran saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de VICENTE

ERROR DE SINTAXIS EN UPDATE

Publicado por VICENTE (32 intervenciones) el 04/02/2015 14:35:15
Hola Neckkito, y disculpa que te moleste de nuevo.

Me funciono en parte, es decir, cuando el campo es nulo, no lo actualizo.... FACIL.

Pero cuando el campo toma un valor, por ejemplo, 01/12/2015, me devuelve siempre, en cualquiera de los casos el valor 30/12/1899, tome el valor que tome el campo.

Te paso el código:
Do While Not rs6.EOF
FCAD = rs6!PedFechaCaduca
If IsNull(FCAD) Then
DoCmd.RunSQL "INSERT INTO StockMovimientos(MovId, MovFecha, MovTipoMovimiento, MovCodArt, MovCantidad, MovLote, " & _
" MovEstado) values ( " & rs6!Id & ", Date() , 'E', " & tf2(rs6!PedCodArt) & ", " & rs6!PedQFisica & ", " & _
tf2(Nz(rs6!PedLote, "0")) & ", 'A')"
Else
FCAD = CDate(FCAD)
DoCmd.RunSQL "INSERT INTO StockMovimientos(MovId, MovFecha, MovTipoMovimiento, MovCodArt, MovCantidad, MovLote, MovCaducidad, " & _
" MovEstado) values ( " & rs6!Id & ", Date() , 'E', " & tf2(rs6!PedCodArt) & ", " & rs6!PedQFisica & ", " & _
tf2(Nz(rs6!PedLote, "0")) & ", " & Format(FCAD, "mm/dd/yyyy") & ", 'A')"
Debug.Print FCAD
End If
rs6.MoveNext
Loop

Y el caso es que en el DEBUG, me da el valor correcto
En la tabla tengo este campo como fecha corta, en formato.

Me ayudas de nuevo, por favor??

Gracias, un gran saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

ERROR DE SINTAXIS EN UPDATE

Publicado por Neckkito (1104 intervenciones) el 04/02/2015 14:43:29
Pásame una BD con la tabla origen del recordset (rs6) y la tabla StockMovimientos. No hace falta que me las pases con todos los registros, pero déjame algunos para ver los datos que contienen.

neckkito(ARROBA)gmail(PUNTO)com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de VICENTE

ERROR DE SINTAXIS EN UPDATE

Publicado por VICENTE (32 intervenciones) el 04/02/2015 15:14:23
Está en camino....

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

ERROR DE SINTAXIS EN UPDATE

Publicado por Neckkito (1104 intervenciones) el 04/02/2015 18:09:24
Hola Vicente:

Como dice el dicho, "los árboles no me dejan ver el bosque".

El error se te produce por un desliz mío a la hora de indicarte la sintaxis de la SQL. Me explico: cuando trabajas con fechas (ya te decía yo que el tema era enrevesado) debes, además de todo lo que te he comentado mensajes más arriba, acotarlas con almohadillas. Si no lo haces así, aunque esté devolviendo un valor de fecha, la SQL no lo interpreta como fecha.

En definitiva, que en la parte del ELSE la sintaxis correcta de la SQL sería:

DoCmd.RunSQL "INSERT INTO StockMovimientos(MovId, MovFecha, MovTipoMovimiento, MovCodArt, MovCantidad, MovLote, MovCaducidad, " & _
" MovEstado) values ( " & rs6!Id & ", Date() , 'E', " & tf2(rs6!PedCodArt) & ", " & rs6!PedQFisica & ", " & _
tf2(Nz(rs6!PedLote, "0")) & ", #" & Format(FCAD, "mm/dd/yy") & "#, 'A')"

Eso independientemente de que con la función accessdata() la cosa, según me has comentado, se te haya solucionado.

Un saludo,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de VICENTE

ERROR DE SINTAXIS EN UPDATE

Publicado por VICENTE (32 intervenciones) el 05/02/2015 11:47:49
Gracias Neckkito,

Ja ja ja ja, esos arboles no dejan el ver el bosque, ni a ti, ni a mi........

Como te decía, con la función accessdata lo he solucionado, que en definitiva no es mas que una función que coloca las almoadillas y el formato.

Gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar