Access - Automatizar histórico de actualizaciones - Problema con campos vacíos

 
Vista:
sin imagen de perfil
Val: 756
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Automatizar histórico de actualizaciones - Problema con campos vacíos

Publicado por Jesús Manuel (134 intervenciones) el 25/02/2013 09:04:03
Muy buenas:

Tengo una BD con dos tablas (clientes e historico) y un formulario (CLIENTES).

En la tabla historico se insertan los registros de la tabla clientes cuando se ha modificado algún dato desde el formulario CLIENTES.

El problema es que si algún campo de un registro esta en blanco, no se copia el registro en la tabla historico y no puedo forzar que todos los campos sean obligatorios porque siempre me puede faltar alguno de los datos.


El código que tengo asociado al formulario es el siguiente:


Private Sub Form_BeforeUpdate(Cancel As Integer)
' Hace una copia en la tabla HISTORIAL del registro que se actualiza
If NewRecord = False Then
HacerHistorial Me.ID_Cliente, "Actualizar"
Else
If Nz(Me.ID_Cliente, 0) = 0 Then
MsgBox "ID de registro no válida"
End If
End If
End Sub

' Creamos unha función que creara una cadena de código SQL para copiar los registros de la tabla CLIENTES en la tabla HISTORIAL antes de actualizarlos

Private Sub HacerHistorial(ID As Long, OP As String)
Dim CadenaSQL As String

CadenaSQL = "INSERT INTO HISTORICO (ID_Cliente, Nombre, Apellidos, NIF, Telefono, Email, Tipo, Fecha_Actualizacion) VALUES (" & ID & ", '" & _
DLookup("Nombre", "CLIENTES", "ID_Cliente =" & ID) & "', '" & _
DLookup("Apellidos", "CLIENTES", "ID_Cliente =" & ID) & "', '" & _
DLookup("NIF", "CLIENTES", "ID_Cliente =" & ID) & "', '" & _
DLookup("Telefono", "CLIENTES", "ID_Cliente =" & ID) & "', '" & _
DLookup("Email", "CLIENTES", "ID_Cliente =" & ID) & "', '" & _
OP & "', #" & _
Now & "#)"


CurrentDb.Execute CadenaSQL
End Sub

' Hace una copia en la tabla HISTORIAL del registro que se elimina
Private Sub Form_Delete(Cancel As Integer)
HacerHistorial Me.ID_Cliente, "Eliminar"
End Sub


He comprobado que al crear la cadena SQL, cuando un campo esta vacío, en la cadena aparece el siguiente texto: ... VALUES (1,'Ramón', 'López', '33222444Z', ", '[email protected]', 'Actualizar', #25/02/2013 8:30:30#)


También he probado a usar la función Nz pero el resultado no varia del texto anterior cuando se crea la cadena SQL, si no incluyo el valueifnull.


Tenéis alguna idea de como puedo "forzar" una cadena de texto de tamaño 0 ????
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
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Automatizar histórico de actualizaciones - Problema con campos vacíos

Publicado por Neckkito (1157 intervenciones) el 27/02/2013 11:58:06
Hola!

No sé si te servirá esta solución, pero si los datos son datos de tipo texto (con datos numéricos no funcionará) podrías intentar esto (te lo pongo en formato de función NZ con una expresión inventada. No creo que tengas problema para adaptarlo e intentar hacer una prueba)

Nz(me.nombreCliente.value, vbNullString)

Ya me dirás... (cruzaremos los dedos)

Saludos,


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
0
Comentar
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Automatizar histórico de actualizaciones - Problema con campos vacíos

Publicado por Neckkito (1157 intervenciones) el 27/02/2013 14:12:20
Hola!

Tenía unos "momentos de ocio" y he preparado una BD simplificada que simula lo que tú has hecho, sin utilizar el DLookup, sino cogiendo los datos directamente del formulario.

Y parece ser que el vbNullString funciona.

Si quieres bajártela para echar un vistazo está aquí: http://www.filebig.net/files/SGcpXyMJvC

Verás que he utilizado un código ligeramente diferente al tuyo en la construcción de la SQL. Además, he pasado todos los "VALUES" a través de variables.

Espero que te sea de utilidad.

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
0
Comentar
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Automatizar histórico de actualizaciones - Problema con campos vacíos

Publicado por Norberto (753 intervenciones) el 27/02/2013 12:02:09
Hola.

Te lanzo una idea:

1. Crea una consulta a la que llamaremos Cliente Modificado con la siguiente sintaxis SQL:

SELECT Clientes.*, Now() AS FechaModificación, Forms!Clientes!Acción AS TipoModificación
FROM Clientes WHERE (((Clientes.IdCliente)=[Forms]![Clientes]![IdCliente]));

De esta forma tendrás un recordset con un registro que contiene los datos del formulario más la fecha actual y el tipo de modificación que se está realizando.

2. Crea otra consulta, esta vez de Datos Anexados, llamada Anexar Histórico:

INSERT INTO [HistoMod Clientes]
SELECT [Cliente Modificado].*
FROM [Cliente Modificado];

En el formulario añade:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub Form_AfterDelConfirm(Status As Integer)
    If Status = acDeleteOK Then
        Me.Acción = "Eliminación"
        DoCmd.SetWarnings False
        DoCmd.OpenQuery "Anexar Histórico"
        DoCmd.SetWarnings True
    End If
End Sub
 
Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Not Me.NewRecord Then
        Me.Acción = "Modificación"
        DoCmd.SetWarnings False
        DoCmd.OpenQuery "Anexar Histórico"
        DoCmd.SetWarnings True
    End If
 
End Sub
 
Private Sub Form_Current()
    Me.Acción = ""
 
End Sub



Los nombres en negrita los cambias a tu gusto pero es importante que la estructura de la tabla histórico sea igual que la de la consulta Cliente Modificado

PROBLEMA Y GORDO
No funciona para eliminaciones ya que Access en cuanto le damos eliminar un registro lo quita de la tabla antes, incluso de preguntar y de que se produzca el evento BeforeDelConfirm, por lo que perdemos el Id del registro a eliminar. Después, si le decimos que no queremos eliminarlo, lo vuelve a poner en la tabla.

Se me ocurre que la eliminación la hagas por medio de un botón que en caso de confirmarla, realice el paso al histórico y luego con las alertas desactivadas proceda a eliminar el registro.

Un 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