Access - ayuda con update lento

 
Vista:

ayuda con update lento

Publicado por manuel (51 intervenciones) el 17/08/2007 19:10:17
hola necesito de su ayuda tengo una funcion de actualizacion de una tabla a otra mediante DAO de unos 630 registros y la ejecucion demora de 20 a 30 segundos ademas de que mi aplicacion lo tengo como cliente servidor

Function actsalv()
Dim rs As DAO.Recordset
Dim xy, xz As String
xz = "update vacacionesp set dias=0"
CurrentDb.Execute xz
xy = "SELECT p.año,p.id,sum(e.dias) as tdias from vacacionesp as p inner join vacacionese as e on p.id=e.id and p.año=e.año group by p.año,p.id,p.dias"
Set rs = CurrentDb.OpenRecordset(xy)
rs.MoveFirst
While Not rs.EOF
xz = "update vacacionesp set dias=" & rs!TDIAS & " where año=" & rs!AÑO & " and ID =" & rs!ID
CurrentDb.Execute (xz)
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
End Function

quisiera que vieran el codigo y me digan en que esta mal o que puedo mejorar

Atte,

manuel
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 Alejandro

Mejora de la función de actualización con DAO

Publicado por Alejandro (4142 intervenciones) el 17/08/2023 20:35:56
Tu función de actualización parece estar funcionando correctamente, pero hay algunas áreas que podrían optimizarse y simplificarse. Aquí tienes una versión mejorada del código:

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
Function actsalv()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
 
    ' Reiniciar todos los días en vacacionesp a 0
    strSQL = "UPDATE vacacionesp SET dias = 0"
    CurrentDb.Execute strSQL
 
    ' Actualizar días en vacacionesp con la suma de vacacionese
    strSQL = "UPDATE vacacionesp AS p " & _
             "INNER JOIN (SELECT año, id, SUM(dias) AS tdias FROM vacacionese GROUP BY año, id) AS e " & _
             "ON p.año = e.año AND p.id = e.id " & _
             "SET p.dias = e.tdias"
    CurrentDb.Execute strSQL
 
    Set db = CurrentDb
    Set rs = db.OpenRecordset("SELECT DISTINCTROW año FROM vacacionesp")
 
    While Not rs.EOF
        ' Realizar cálculos adicionales o procesamientos para cada año si es necesario
        ' ...
 
        rs.MoveNext
    Wend
 
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Function

Cambios realizados:

1. En lugar de dos consultas independientes para actualizar y luego sumar los días, combinamos ambas operaciones en una sola consulta de actualización. Esto reduce la necesidad de iterar a través de los registros en la base de datos y disminuye el tiempo de ejecución.

2. Usamos una consulta `UPDATE` con un `INNER JOIN` para realizar la actualización de los días en la tabla `vacacionesp` basada en la suma de la tabla `vacacionese`.

3. Agregamos un bucle `While` para recorrer los años en la tabla `vacacionesp`. Esto podría ser útil si necesitas realizar cálculos adicionales o procesamientos específicos para cada año.

4. Utilizamos variables más descriptivas para las consultas SQL (`strSQL`) y aprovechamos la funcionalidad de concatenación de líneas para mejorar la legibilidad.

5. Añadimos comentarios para ayudar a entender la lógica del código.

Asegúrate de adaptar y ajustar el código según las necesidades específicas de tu aplicación. Recuerda que el rendimiento puede verse afectado por la cantidad de datos en las tablas y otros factores del entorno.
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