Access - Actualizar tabla de access sin consulta

 
Vista:
sin imagen de perfil

Actualizar tabla de access sin consulta

Publicado por Edmund (10 intervenciones) el 17/06/2015 01:37:12
Hola amigos:
Quisiera por favor su valiosa ayuda en esto. Necesito que una de las tablas de mi proyecto se actualice de forma automática sin necesidad de utilizar un evento de consulta, ni oprimir botones, ni nada, (tomando en cuenta que la máquina o PC nunca se apaga, es decir que permanece las 24 horas encendida).

Bien la situación está así:
Cuando un cliente necesita que se le imprima una "Solvencia", éste documento tiene validez 24 horas; por lo tanto dicho cliente durante ese período de tiempo estará "inhabilitado", y transcurrido ese tiempo se debe habilitar, para ese propósito he creado en la tabla "Clientes" un campo llamado "Activado" el cual es de tipo Boolean.

Como comprenderán si es una empresa que maneja más de mil clientes, y que esa tarea sea unas 10 veces al mes, y sin que la máquina se apague, sería un lío; y un evento de botón o consulta no sería efectivo. Por tal razón quiero atajar directamente a la tabla.

Recapitulando:
1. El cliente solicita una Solvencia y este es evaluado si se encuentra activado o no para imprirsela, si esta activado, entonces se imprime.
2. Automáticamente la casilla "Activado" de la tabla "Clientes" se le quita el check.
3. La máquina internamente espera pasar 24 horas exactas para que automáticamente vuelve a colocar el "Check" en el campo "Activado".

Espero me podáis ayudar, de antemano muy agradecido.
Saludos cordiales..!!!
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
sin imagen de perfil

Actualizar tabla de access sin consulta

Publicado por Enrique Heliodoro (1664 intervenciones) el 20/06/2015 03:17:51
el cambio se ha de efectuar a las 24 horas de su gestión, o el proceso se ha de hacer una vez al dia (cada 24 horas)

El segundo método es el mas sencillo, una base muy simple que ejecute una consulta de actualización y tras ello se cierre, a la que iniciaría el programador de tareas del sistema operativo.

Se puede acercar (utilizando el mismo método) a lo solicitado, si se ejecutase esa tarea cada hora (y la consulta actualizase aquellos registros que cumplan las características)

La SQLde esa propuesta seria algo similar a :
CurrentD.Execute "Update [aquí la tabla] Set [aquí el campo booleano a actualizar] = -1 Where DateDiff("h", [campo con la fecha/hora], Now()) >= 24"
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
sin imagen de perfil

Actualizar tabla de access sin consulta

Publicado por Edmund (10 intervenciones) el 20/06/2015 15:49:54
Mil gracias Enrique Heliodoro!!!

Probaré tu propuesta en un modelo aparte, para que se actualice en menos tiempo, por ejemplo 2 horas, para ver si verdaderamente lo hace automático. Porque yo también tenía una SQL parecida pero tenía que estar ligada a un botón para general el evento; y eso no me es funcional.

Comentaré los resultados.
Saludos!!!
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
sin imagen de perfil

Actualizar tabla de access sin consulta

Publicado por Enrique Heliodoro (1664 intervenciones) el 20/06/2015 15:56:42
Si el código actualizador ya es funcional (al antiguo me refiero), no veo que problema puede existir en reutilizarlo, las SQLs no precisan de un medio especifico para ser ejecutadas, la misma macro AUTOEXEC puede ejecutarla y al finalizar cerrar la base (ni formularios, ni tablas ni adornos, a lo sumo una función para hacer 'algo mas' como por ejemplo indicar en un histórico cuando se efectúan los cambios).

Eso si, la 'automatización' dependerá del programador de tareas de la maquina que siempre esta activa.
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
sin imagen de perfil

Actualizar tabla de access sin consulta

Publicado por Edmund (10 intervenciones) el 20/06/2015 16:46:35
Para una macro AUTOEXEC obligadamente necesito cerrar o salir del programa y luego volver a entrar.

Por favor mil disculpas por no haberme expresado correctamente, al decir que "la máquina no se apaga" me refería que el programa no se cierra, debido a los requerimientos de trabajo ininterrumpidos.

Si hubiese alguna interrupción sería de manera programada para mantenimiento u otros menesteres que no se hacen a diario.

La SQL que menciono (antigua) no me funciona. La acción de quitar el check si lo hace, pero no la vuelve a colocar al pasar el tiempo requerido, (24hrs). Para probar y no esperar a que pase todo el día; lo hago con menos tiempo.
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
sin imagen de perfil

Actualizar tabla de access sin consulta

Publicado por Edmund (10 intervenciones) el 20/06/2015 17:15:53
A continuación una copia del código completo de dos eventos. En el segundo es "supuestamente" donde escribo una SQL para actualizar pero no corre. Tal vez me puedas ayudar, teniendo un mejor panorama de como va.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Private Sub CmdPruSolvencia_Click()
Dim vActivo As Boolean
 
vActivo = Nz(DLookup("Activado", "06CLIENTES", "[Carnet]='" & Me.TxtCarnet & "'"), "")
 
If vActivo = False Then
MsgBox "Lo siento, no es posible generar más Solvencias para este Cliente, espere pasar 24 horas", vbCritical, "Adios!!!"
DoCmd.Close acForm, Me.Name
Exit Sub
End If
 
    Me.LstLibrosCargados.Visible = True
    LstLibrosCargados.RowSource = "SELECT [11VALES_PRÉSTAMO].ValeNo, [11VALES_PRÉSTAMO].CodLib, [02LIBROS].Libro FROM (06CLIENTES INNER JOIN (02LIBROS RIGHT JOIN 11VALES_PRÉSTAMO ON [02LIBROS].CodLib = [11VALES_PRÉSTAMO].CodLib) ON [06CLIENTES].Carnet = [11VALES_PRÉSTAMO].Carnet) LEFT JOIN 12DEVOLUCIONES ON [11VALES_PRÉSTAMO].ValeNo = [12DEVOLUCIONES].ValeNo GROUP BY [11VALES_PRÉSTAMO].ValeNo, [11VALES_PRÉSTAMO].CodLib, [02LIBROS].Libro, [06CLIENTES].Carnet, [06CLIENTES]![Nombres] & "" "" & [06CLIENTES]![Apellidos], [12DEVOLUCIONES].DescargoNo HAVING ((([11VALES_PRÉSTAMO].ValeNo)=IIf(IsNull([12DEVOLUCIONES]![DescargoNo]),[11VALES_PRÉSTAMO]![ValeNo],(0))) AND (([06CLIENTES].Carnet)=[Formularios]![SOLVENCIAS]![TxtCarnet]));"
    LstLibrosCargados.Requery
 
        If Me.LstLibrosCargados.ListCount = 0 Then
            Me.LstLibrosCargados.Visible = False
            MsgBox "¡Felicitaciones!, puede proceder a imprimir su constancia SOLVENCIA DE BIBLIOTECA."
            Me.CmdSiSolvente.Visible = True
        Else: MsgBox "Lo siento mucho, según el detalle de su cuenta de cargo, usted:" _
                    & "             NO ESTÁ SOLVENTE.", vbExclamation, "INSOLVENTE"
        End If
 
End Sub
 
Private Sub CmdSiSolvente_Click()
Dim miSQL As String
 
On Error GoTo tratar_error
If Me.LstLibrosCargados.ListCount = 0 Then
Me.TxtCodSolv.Value = Nz(DMax("CodSolv", "14BitacoraSolvencias"), 0) + 1
End If
 
DoCmd.RunSQL "UPDATE 06CLIENTES SET Activado = False WHERE Carnet = '" & Me.TxtCarnet & "'"
        Application.Echo False
        ' abrimos el informe
        DoCmd.OpenReport "SOLVENCIA DE BIBLIOTECA", acViewPreview
        ' imprimimos 1 copias,
        ' en calidad baja
        DoCmd.PrintOut acPages, , , acLow, 1
        ' cerramos el informe
        DoCmd.Close acReport, "SOLVENCIA DE BIBLIOTECA"
 
          miSQL = "INSERT INTO 14BitacoraSolvencias (CodSolv, Carnet, Fecha) values ('" & Me.TxtCodSolv & "','" & Me.TxtCarnet & "',#" & Format(Me.TxtFecSolvencia, "mmm/dd/yyyy hh:nn:ss") & "#)"
DoCmd.RunSQL miSQL
        'Cierro el formulario porque ya no lo necesito.
        DoCmd.Close acForm, Me.Name
        ' activamos la actualización de pantalla
        Application.Echo True
Exit Sub
 
tratar_error:
    DoCmd.Close acForm, Me.Name
    Exit Sub
 
End Sub
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
sin imagen de perfil

Actualizar tabla de access sin consulta

Publicado por Enrique Heliodoro (1664 intervenciones) el 20/06/2015 18:10:21
Observo que se han escapado algunos detalles de mi respuesta, en ella la idea base esta en crear una aplicación especifica que solo efectúe esa actualización y se cierre tras completarla.

Es pues una aplicación que será INDEPENDIENTE y por ello se utilizaría en conjunto con el programador de tareas del sistema operativo.

Por otra parte si 'algo' (en este caso una aplicación creada en Access) tiene que estar disponible las 24 horas del día, indispensablemente tendrá que funcionar sobre una maquina que también estará encendida todo el día y es (en esta maquina) donde se ha de crear la tarea programada.

No conozco ni la aplicación ni el entorno así como los medios de gestión, pero de lo expuesto (aplicación todo el día en marcha, que no es lo mismo que todo el día 'accesible'), tendrá un usuario de consola para modificar los datos que la consulta volverá a 'trastear' ¿crees que le molestaría una pantalla emergente que le de unos minutos de descanso 'mientras se actualizan los datos' ?.

Seria con un formulario abierto e invisible que en su evento 'timer' ejecute la actualización (la pantalla emergente no es indispensable), pero de alguna forma habría que indicarle al usuario de consola que se esta 'haciendo algo' y que no se rebelo la maquina intentando 'tomar el poder'.
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
sin imagen de perfil

Actualizar tabla de access sin consulta

Publicado por Enrique Heliodoro (1664 intervenciones) el 20/06/2015 18:29:28
Ese código expuesto requiere un delicado trabajo a efectuar con una pulidora de grano grueso.

Sobre 'vActivo' :
Es mas simple con DCount que devolverá un cero (equivale a false) o un numero (cualquiera que no sea el cero es un TRUE)

lo de la lista 'LstLibrosCargados' no lo veo claro, que sea visible o invisible le da lo mismo para (y al final) utilizarla como un simple contador, creo que se puede pulir (y bastante), una consulta guardada y un DCount sobre ella, a efectos prácticos hace lo mismo.

En esta SQL:
UPDATE 06CLIENTES SET Activado = False WHERE Carnet = '" & Me.TxtCarnet & "'"

El error esta destacado en negrita, aclarare que False, True, Verdadero, Falso, Si, NO .... no son mas que seudónimos de un CERO (0) para indicar FALSE (o cualquiera de sus sinónimos) y CUALQUIER otro valor numérico (en el rango de un LONG) para indicar TRUE y asimilados, el clásico valor de '-1', es el valor que toma por defecto (como si se les da por ponerle cualquier otra cosa, pero no deja de ser interesante apreciar que '-1' es un excelente nemotécnico)

En definitiva: FALSE ===> 0 y solucionado (en ese detalle)

En la ultima SQL ... dependerá del entorno, pero yo a las fechas las respeto mucho y para evitar errores de conversión, formato y demás, las utilizo como números y así es mas sencillo manejarlas
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
sin imagen de perfil

Actualizar tabla de access sin consulta

Publicado por Edmund (10 intervenciones) el 22/06/2015 21:59:14
Hola Enrique Heliodoro:
Ruego me disculpe por el retraso el contestar.
En el penúltimo comentario, entiendo que me sugiere crear una aplicación adicional que manejaría esta situación? Le confieso que no soy muy experto en esto; eso sí, trato de aprender como rayo, jeje..

En el último comentario, el código vertido era para que apreciara el panorama, sin embargo no me fue posible enviarle el código que parecido al suyo pretendía ejecutar la tarea que me atañe. Permítame, ahora sí, le adjunto el código:

1
DoCmd.RunSQL "UPDATE 06CLIENTES INNER JOIN BitacoraSolvencia ON 06CLIENTES.Carnet = 14BitacoraSolvencias.Carnet SET 06CLIENTES.Activado = True WHERE DateDiff("h", [FECHA], Now()) >= 24"

Bien, tal como me sugería a un principio, este código está en el formulario "Introductorio" el cual es el que se abre por defecto al arrancar la aplicación, luego automáticamente éste se cierra para acto seguido abrir el formulario de Menú Principal.

Si tienes alguna idea, de cómo me pueda funcionar, (me decía que se le escapaba algunos detalles, cuales son?).

Gracias por su fina atención y tiempo empleado. Saludos!!!
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