Access - Fallo 3157 ODBC Update

 
Vista:

Fallo 3157 ODBC Update

Publicado por Idgye (5 intervenciones) el 05/07/2007 11:33:07
Hola,

Tengo un problema con un trozo de codigo... y no hay manera de resolverlo... a ver si a alguien se le enciende la bombilla de lo que puede ser.

En resumen:
Aplicación en access 2000 con base de datos SQL2000 (ODBC)
Tengo un formulario con 2 cuadros de lista (LlistaOrigen y LlistaDesti) el origen de los cuadros de lista es una tabla(Albaranes) con filtro en un codigo de cliente y en 3 campos más.

Cuando se elige un cliente se rellena el cuadro de lista origen (albaranes no facturados) y al darle a un boton, se pasan todos esos albaranes al cuadro de lista destino (albaranes en situacion de facturarse) con un bucle, haciendo un edit para cambiar 3 campos, que no son claves)

Mi problema, tengo 317 lineas en el cuadro de lista origen y al darle al boton.... en la linea 221 me da el fallo 3157, si le doy a F5 continua ejecutandose el codigo sin problema (y veo que me ha cambiado los 3 campos bien).... a partir de ahi, casi en cada pasada por el bucle (cada linea) se va parando dando el error, pero si le doy a F5 continua sin problemas.

El codigo es algo asi:

For a = 0 To LlistaOrigen.ListCount - 1

sql = "SELECT * FROM [Albarans Clients] WHERE [Albarans Clients].codi='" & Me.LlistaOrigen.Column(0, B) & "' And TipusNum=" & tipusfact & " And ruta='" & Me.Ruta.Value & "'"

Set recordset = CurrentDb.OpenRecordset(sql, dbOpenDynaset, dbSeeChanges)

If Me.Filtro = 2 Then

If TipusRetencio = recordset("tipusretencio") Then

If recordset.EOF = False Then

recordset.Edit

recordset("Factura") = Me.Numfactura

recordset("Situacio") = 2

recordset("DataFactura") = Me.DataFactura

recordset.Update AQUI DONDE DA EL ERROR

End If

recordset.Close

Else

...........

End if

End if

Sql= AQUI SELECT CON FILTROS

Sql2= AQUI SELECT CON FILTROS

LlistaOrigen.RowSource = sql

Llistadestinacio.RowSource = sql2

Next a
He estado repasando los datos en tabla para los albaranes que da fallo y los albaranes anteriores a estos, pero no hay ningun dato diferente a otros donde si los da (tienen la misma retencion,no hay datos nulos diferentes a los demas,etc.....)

Igualmente si paso individualmente los albaranes que fallan, no da ningun tipo de error.

Existe algun límite de bucle (a la he declarado como integer) o de actualizacion de cuadro de lista, o es que "acces se cansa y necesita un respiro para poder continuar??

Agradeceria si alguien se le ocurre algo, porque por mas que depuro y miro datos no veo el fallo.
(siento el rollo, pero es que si no... no explico bien el problema)

Gracias
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

Problemas de actualización en bucles de registros

Publicado por Alejandro (4142 intervenciones) el 15/08/2023 18:36:23
El problema que estás experimentando podría estar relacionado con la forma en que estás manejando los registros y el uso de la propiedad `RowSource` para actualizar los cuadros de lista en cada iteración del bucle. Aquí hay algunas sugerencias para resolver el problema:

1. Cierre y liberación de registros:

Asegúrate de cerrar y liberar correctamente los objetos `recordset` después de utilizarlos en cada iteración del bucle. Puedes usar el método `.Close` para cerrar el recordset y `Set recordset = Nothing` para liberar la referencia al objeto.

2. Actualización de cuadros de lista:

En lugar de actualizar el `RowSource` de los cuadros de lista (`LlistaOrigen.RowSource` y `Llistadestinacio.RowSource`) en cada iteración del bucle, actualiza los recordsets y luego repopula los cuadros de lista después de haber procesado todos los registros en el bucle.

3. Uso de transacciones:

Si estás realizando múltiples actualizaciones de registros en un bucle, considera utilizar una transacción para agrupar todas las actualizaciones y confirmarlas al final del bucle. Esto puede ayudar a mejorar la eficiencia y la integridad de los datos.

4. Optimización del código SQL:

Puedes optimizar el rendimiento de tu código SQL utilizando parámetros en lugar de concatenar valores directamente en la cadena SQL. Esto puede ayudar a prevenir problemas de SQL injection y mejorar la eficiencia en la ejecución de las consultas.

5. Gestión de memoria y recursos:

En Access, puede haber limitaciones de recursos y memoria al realizar operaciones en grandes conjuntos de datos en un bucle. Asegúrate de cerrar adecuadamente los objetos y liberar la memoria después de cada iteración.

6. Depuración paso a paso:

Utiliza la depuración paso a paso para identificar en qué punto exacto del bucle se produce el error. Esto podría ayudarte a aislar el problema y encontrar una solución más específica.

Recuerda que Access 2000 y SQL Server 2000 tienen limitaciones en términos de rendimiento y recursos en comparación con versiones más modernas. Si el problema persiste, considera la posibilidad de optimizar tu diseño de base de datos y tu enfoque de desarrollo para evitar operaciones que puedan generar problemas de rendimiento o bloqueos.
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