Access - Error 3035 se excedieron los recursos del sistema

 
Vista:

Error 3035 se excedieron los recursos del sistema

Publicado por Enrique Ramírez (5 intervenciones) el 30/11/2006 03:06:51
Creo una consulta de selección con la Tabla1 y se generan 6009 registros, el resultado de la consulta lo leo secuencialmente con un DAO.RecordSet.
Tengo otra Tabla2 que es copia fiel de Tabla1 y en ambas tengo un campo de No. de empleado, un campo para mes y 31 campos para cada día del mes, cada empleado puede tener uno o varios registros pero eso si los meses no se repiten.
El objetivo es que por cada registro que lea en Tabla1, en la Tabla2 se inserten los registros que hagan falta para completar 12 registros por empleado (uno por mes), utilizo un FOR de 1 to 12 para determinar si ya existe el mes y si NO existe lo inserto en Tabla2, el proceso trabaja correctamente pero cuando llega a procesar entre 140 y 150 registros (nunca es el mismo registro) me marca el siguiente mensaje: Se ha producido el error 3035 en tiempo de ejecución, se excedieron los recursos del sistema y ya no me deja continuar procesando, si le doy ayuda esta aparece en blanco. El error me lo manda al momento de hacer el Insert en Tabla2.
Alguien me pudiera ayudar para determinar porque manda el error porque haciendo el calculo (150*12) se procesan como 1800 registros antes de que marque el error siendo que tenemos tablas de mas de 50,000 registros y no marcan este error al ser procesadas, mi codigo es el siguiente:

Set d = CurrentDb()
Set r = d.OpenRecordset(vSQL, dbOpenDynaset)
wEOF = True
If r.RecordCount > 0 Then
r.MoveFirst
Do While wEOF = True
If r.EOF Then
wEOF = False
Else
For jval = 1 To 12
If Len(jval) = 1 Then
jmes = "0" & jval
Else
jmes = Trim(str(jval))
End If
vSQL = ""
vSQL = "SELECT Count([MES]) AS Expr1 FROM cur_KF_011
WHERE (((cur_KF_011.MES)='" & jmes & "'))
And cur_KF_011.NEMPLEADO =" & r!NEMPLEADO
l_res.RowSource = vSQL
l_res.Requery
If l_res.Column(0, 0) = 0 Then
vSQL = ""
vSQL = "INSERT INTO cur_KF_011 (NEMPLEADO,MES)
VALUES (" & r!NEMPLEADO & ",'" & jmes & "')"
DoCmd.RunSql = vSQL
End If
Next jval
End If
If Not r.EOF Then
r.MoveNext
End If
Loop
End If
r.Close
Set d = Nothing
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

Error 3035 al insertar registros en Tabla2 desde consulta en Tabla1

Publicado por Alejandro (4142 intervenciones) el 28/07/2023 20:11:11
El error 3035 "Se excedieron los recursos del sistema" puede ocurrir cuando hay una gran cantidad de registros y operaciones en una base de datos de Access. Para evitar este problema y mejorar la eficiencia del proceso, te recomiendo realizar algunos ajustes en tu código:

1. Usa un conjunto de registros (DAO.Recordset) para los registros a insertar en Tabla2, en lugar de ejecutar una consulta directa. Esto puede mejorar la eficiencia y el rendimiento del proceso.

2. En lugar de realizar un INSERT en Tabla2 por cada registro de Tabla1, considera acumular los registros a insertar en un conjunto de registros temporal y luego hacer una sola operación de inserción masiva.

3. Utiliza un bloque de transacción para las operaciones de inserción. Esto te permitirá hacer una "transacción" de varias operaciones en una única unidad lógica y revertir las operaciones en caso de error.

4. Asegúrate de cerrar y liberar todos los conjuntos de registros y objetos después de finalizar el proceso para liberar recursos.

Aquí hay una versión ajustada de tu 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Dim d As DAO.Database
Dim r As DAO.Recordset
Dim l_res As DAO.Recordset
Dim vSQL As String
Dim wEOF As Boolean
Dim jval As Integer
Dim jmes As String
 
Set d = CurrentDb()
Set r = d.OpenRecordset(vSQL, dbOpenDynaset)
wEOF = True
 
If r.RecordCount > 0 Then
    r.MoveFirst
    Do While wEOF = True
        If r.EOF Then
            wEOF = False
        Else
            Set l_res = d.OpenRecordset("SELECT Count([MES]) AS Expr1 FROM cur_KF_011 WHERE [MES] Is Not Null AND NEMPLEADO = " & r!NEMPLEADO, dbOpenDynaset)
 
            For jval = 1 To 12
                If Len(jval) = 1 Then
                    jmes = "0" & jval
                Else
                    jmes = Trim(Str(jval))
                End If
 
                l_res.MoveFirst
                If l_res.Fields("Expr1") = 0 Then
                    vSQL = "INSERT INTO cur_KF_011 (NEMPLEADO, MES) VALUES (" & r!NEMPLEADO & ", '" & jmes & "')"
                    d.Execute vSQL
                End If
            Next jval
 
            l_res.Close
        End If
 
        If Not r.EOF Then
            r.MoveNext
        End If
    Loop
End If
 
r.Close
Set d = Nothing

Con estos ajustes, tu código debería ser más eficiente y evitar el error 3035 al insertar los registros en Tabla2 desde la consulta en Tabla1. Recuerda que siempre es importante realizar pruebas exhaustivas para asegurarte de que el proceso funcione correctamente con diferentes volúmenes de datos.
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