Guardar fechas nulas mediante SQL

Un lugar dónde compartir funciones, procedimientos y aplicaciones
Avatar de Usuario
leadrudi
Nivel 6
Mensajes: 260
Registrado: Sab Oct 14, 2017 7:55 am

Guardar fechas nulas mediante SQL

Mensajepor leadrudi » Vie Mar 18, 2022 12:52 am

Durante muchísimo tiempo busqué la forma de guardar una fecha de un campo que no tuviera valor.
Siempre recibía un error como resultado y la fecha seguía allí, toda horonda riéndose de mí.
Pero, aunque posiblemente haya otras formas, encontré una que me ha resultado.

Código: Seleccionar todo

.RunSQL "UPDATE [tabArtistas] SET [NAC_FECHA] = " & IIf(IsNull(Me.txtFecha_Nac.Value), "Null", "#" & Format(Me.txtFecha_Nac.Value, "mm/dd/yyyy") & "#") & " WHERE [ARTISTA] = '" & Me.txtArtista.Value & "'"

Muchos dirán:
¿No es más fácil "[FECHA] = Null"?

Pues es lo que encuentro en todos los foros, pero hacerlo así me devuelve "No coinciden los tipos".
:?: :!: :idea: :arrow: :oops: :( :o :) :D :geek: :ugeek:

Avatar de Usuario
Neckkito
Moderador
Mensajes: 1229
Registrado: Dom Oct 25, 2015 3:42 pm

Re: Guardar fechas nulas mediante SQL

Mensajepor Neckkito » Vie Mar 18, 2022 1:00 pm

Hola!

Simplemente como nota aclaratoria y para que nadie se confunda, deberías definir un poco mejor el entorno y los elementos que envuelven el caso para poder realizar la afirmación que realizas y no tratarlo como una generalidad.

La aplicación, en SQL, de FECHA=NULL, sí que funciona en un uso, por llamarlo de alguna manera, "normal". Para otras situaciones que, quizá en tu caso, afecten al proceso (habría que analizarlo en profundidad debido quizás a la múltiple casuística que podría darse), sí sea necesario utilizar la mecánica que propones; pero, insisto, no puedes generalizar.

Para muestra, un botón: https://www.mediafire.com/file/k7zbmf0x4ix0cta/Leandrudy.FechasNulas.zip/file

Saludos
Access MVP 2017-2022
http://bit.ly/NckAccess

Avatar de Usuario
leadrudi
Nivel 6
Mensajes: 260
Registrado: Sab Oct 14, 2017 7:55 am

Re: Guardar fechas nulas mediante SQL

Mensajepor leadrudi » Vie Mar 18, 2022 7:58 pm

Lo mío es muy básico: Las tablas no definen el formato de los datos. Es decir, la tabla tiene campo tipo FECHA/HORA pero no establece el formato. Al formato DD/MM/YYYY HH:MM:SS o simplemente HH:MM, etc. lo establece el formulario para que el usuario ingrese de tal o cual manera, con máscara de entrada.
El formulario no está relacionado con la tabla, sino que para "guardar" los valores cargados en los campos del formulario uso INSERT, UPDATE, etc.
Entonces, el objeto tendrá la máscara de entrada dd/mm/yyyy y al "guardar" le doy el formato mm/dd/yyyy.
Ahora, si algo de esto tiene que ver con el resultado del error, pues no lo sé.
Lo que noto diferente es que usas CurrentDb.Execute y no docmd.RunSQL. Ahí tampoco sé la diferencia y beneficios de usar uno y otro. Pero, probé usar CurrentDb.Execute para guardar la fecha y el resultado ha sido el mismo: "No coinciden los tipos".
Voy a ver de pasar una copia de lo que estoy haciendo sacando el código que no es relevante para el funcionamiento a ver si me dan una luz ante esto.
:?: :!: :idea: :arrow: :oops: :( :o :) :D :geek: :ugeek:

Avatar de Usuario
leadrudi
Nivel 6
Mensajes: 260
Registrado: Sab Oct 14, 2017 7:55 am

Re: Guardar fechas nulas mediante SQL

Mensajepor leadrudi » Vie Mar 18, 2022 8:34 pm

Envío una copia simplificada. A ver si me pueden dar un poco de luz en este caso.
Aclaración: En esta copia, las tablas forman parte del archivo. En la que uso normalmente, la base de datos está dividida.
https://1drv.ms/u/s!AgxcE5vJFAoai8dc377OoCwjO45tXA?e=LSLuwB
Caduca: 01/04/2022
:?: :!: :idea: :arrow: :oops: :( :o :) :D :geek: :ugeek:

Avatar de Usuario
Neckkito
Moderador
Mensajes: 1229
Registrado: Dom Oct 25, 2015 3:42 pm

Re: Guardar fechas nulas mediante SQL

Mensajepor Neckkito » Vie Mar 18, 2022 11:47 pm

Hola!

No sé si estoy entendiendo el problema que tienes pero ahí tienes mis comentarios:

- Si estás empleando un Iif() la sistemática que estás utilizando es la correcta y requiere la sintaxis como la estás usando para poder actualizar la fecha a un valor null.
- Si quieres comprobar que el otro sistema funciona tienes que "convertir" ese Iif() en un bloque condicional que realice o bien una actuación en función del cumplimiento de la condición, u otra si no se cumple. En este caso, lógicamente estás cambiando la sintaxis y, por tanto, la mecánica de inserción de null en un campo fecha (o en el que sea). Yo no cambiaría el Iif() porque, si te funciona, pues bien está lo que bien acaba, pero si quieres probar lo que te comentaba lo que tienes que hacer es esto:

Código: Seleccionar todo

        'Datos nacimiento
        If IsNull(Me.txtFecha_Nac) Then
            CurrentDb.Execute ("UPDATE [tabArtistas] SET [NAC_FECHA] = Null WHERE [ARTISTA] = '" & Me.txtArtista.Value & "'")
        Else
            CurrentDb.Execute ("UPDATE [tabArtistas] SET [NAC_FECHA] = #" & Format(Me.txtFecha_Nac.Value, "mm/dd/yyyy") & "# WHERE [ARTISTA] = '" & Me.txtArtista.Value & "'")
        End If
'16      .RunSQL "UPDATE [tabArtistas] SET [NAC_FECHA] = " & IIf(IsNull(Me.txtFecha_Nac.Value), "Null", "#" & Format(Me.txtFecha_Nac.Value, "mm/dd/yyyy") & "#") & " WHERE [ARTISTA] = '" & Me.txtArtista.Value & "'"


Por otra parte, el método docmd.runsql es un método que permite la ejecución de una instrucción sql y, como elemento adicional, permite la inclusión de la misma en una transacción o no. No tiene otros modificadores (https://docs.microsoft.com/es-es/office/vba/api/access.docmd.runsql)

El método currentdb.execute permite la ejecución de una instrucción sql, pero tiene bastantes constantes, todas opcionales, que permiten dominar el comportamiento de lo que pasa en la propia ejecución de la sql. El típico ejemplo para explicar esto es utilizarlo con la constante dbFailOnError. Es decir, que si yo escribo, por ejemplo:

Código: Seleccionar todo

Currentdb.execute ("UPDATE TablaX SET unCampo='Aceptado'"), dbFailOnError


lo que hará el código es actualizar unCampo al valor "Aceptado", pero si durante el proceso se produjera algún error Access desharía toda la operación y volvería al status de inicio sin aplicar ningún cambio en los datos (y, por suerte, no acabarías con media tabla actualizada y la otra media no, je, je...).

Aquí tienes una descripción de las constantes aplicables al método: https://docs.microsoft.com/es-es/office/client-developer/access/desktop-database-reference/database-execute-method-dao

Saludos.
Access MVP 2017-2022
http://bit.ly/NckAccess

Avatar de Usuario
leadrudi
Nivel 6
Mensajes: 260
Registrado: Sab Oct 14, 2017 7:55 am

Re: Guardar fechas nulas mediante SQL

Mensajepor leadrudi » Sab Mar 19, 2022 9:04 pm

¡WOW! Voy a investigar más sobre Currentdb.execute porque eso ya es mucho más avanzado de lo que manejo hasta ahora (que es bastante considerando que lo hago sin ayuda más que de foros y tutoriales).
Volviendo al uso de IF vs. IIF...
Como lo propones lo hice, y es así que recibí el error "No coinciden los tipos". Pruebo ahora.
:?: :!: :idea: :arrow: :oops: :( :o :) :D :geek: :ugeek:

Avatar de Usuario
Neckkito
Moderador
Mensajes: 1229
Registrado: Dom Oct 25, 2015 3:42 pm

Re: Guardar fechas nulas mediante SQL

Mensajepor Neckkito » Dom Mar 20, 2022 11:36 am

Pues algo debes tener en tu base porque, para hacerte esa propuesta, yo hice la prueba en el archivo que colgaste y a mí me funcionó sin problemas y sin errores. De hecho el código fue un copy-paste tras esa prueba y comprobar que funcionaba.

Saludos.
Access MVP 2017-2022
http://bit.ly/NckAccess

Avatar de Usuario
leadrudi
Nivel 6
Mensajes: 260
Registrado: Sab Oct 14, 2017 7:55 am

Re: Guardar fechas nulas mediante SQL

Mensajepor leadrudi » Lun Mar 21, 2022 6:42 pm

Me desconcierta. El código funciona.
Ahora, quizá, sea la forma en que yo lo hago: en vez de poner Nulo si está vacío y en cualquier otro caso llenar con la fecha yo lo propongo al revés: si hay datos guarde la fecha y en cualquier otro caso, nulo. ¿Tendrá que ver?
:?: :!: :idea: :arrow: :oops: :( :o :) :D :geek: :ugeek:

Avatar de Usuario
Neckkito
Moderador
Mensajes: 1229
Registrado: Dom Oct 25, 2015 3:42 pm

Re: Guardar fechas nulas mediante SQL

Mensajepor Neckkito » Lun Mar 21, 2022 7:15 pm

En teoría no debería tener nada que ver.

Poco más puedo añadirte a lo que he dicho ya. Lamento no poder ayudarte más. Es difícil poder dar una solución a algo que a mí sí me funciona, por lo cual no puedo recrear el error.

Saludos.
Access MVP 2017-2022
http://bit.ly/NckAccess


Volver a “Almacén Accesiano”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado