PDA

Ver la Versión Completa : OnPostError no salta en ClientDataSet


M. FM.
16-10-2008, 17:22:58
Buenas tardes:

Estoy intentando evitar un error de key violation en un ClientDataSet antes de llegar al ApplyUpdates. Mi código es el siguiente:
try
cdsLineas.Post;
cdsLineas.ApplyUpdates(-1);
except
TrataError(self, Exception(ExceptObject));
end;

Además, tengo definido un procedimiento para el evento OnPostError y otro para OnReconcileError, ambos del ClientDataSet cdsLineas. El problema es que no me está saltando el error en el Post, sino en el ApplyUpdates. No pasa por el procedimiento TrataError ni por el definido para el OnPostError.

Antes de esto, intenté arreglarlo directamente en el evento OnReconcileError, que sí salta, pero el problema es que si le asigno la acción raCancel me borra todos los datos que había escrito, y si le asigno raSkip luego se comporta de forma extraña con el registro corregido y creado (me da error si luego intento borrarlo).

¿Alguna idea de por qué el Post no da error?

Muchas gracias por la ayuda,
M.

mightydragonlor
20-10-2008, 18:16:00
cdsLineas.ApplyUpdates(0);


Trata con esto a ver si te saca error.

M. FM.
21-10-2008, 12:26:59
Muchas gracias, mightydragonlor, pero me temo que todo sigue igual. Acabo de probarlo y aún no pasa por el PostError.

Por otra parte, debería pasar por él justo después del post, sin llegar al ApplyUpdates, ¿no? :-(

Voy a volver a buscar información sobre el tema, a ver si encuentro algo que me ilumine.

Gracias

mightydragonlor
21-10-2008, 18:14:32
Otra causa a este problema es el tipo de dataset al que estas intentando acceder, si nos muestras el error completo podremos ayudarte.

M. FM.
22-10-2008, 09:00:48
El DataSet es un TClientDataSet y el error que quiero capturar es de clave duplicada. Mi problema es que el error aparece en el ApplyUpdates, pero no en el Post.

Quiero capturarlo antes para que no se me borren todos los datos que estoy introduciendo del nuevo registro. Es decir, que deje al usuario cambiar el número de registro (que es el índice que se está duplicando) y volver a intentar el alta. Ahora mismo, tras saltar el key violation en el ApplyUpdates, se está borrando todo.

Muchas gracias por tu ayuda

mightydragonlor
22-10-2008, 17:44:55
tal vez no me expliqué bien, el TClientDataSet se conecta mediante un TDataSetProvider a otro DataSet, ya sea TIBQuery, TIBSQL, TADOTable o cualquier otro, un error común que sucede es ligar un TClientDataSet a un TIBTable, ya que siempre muestra un error en el ApplyUpdates, por lo menos a mi me ha ocurrido, pero lo soluciono ligandolo con un TIBQuery, espero te sirva de algo la información, si puedes copiar exactamente el error que te sale tal vez podremos solucionarlo.

M. FM.
22-10-2008, 17:53:00
Perdona, no te había entendido. Se conecta a un TSQLTable de dbExpress. ¿Puede ser ese componente el que tiene el problema?

Yo pensaba que tendría que ver directamente con el TClientDataSet, pero si me dices que puede partir del otro, intentaré mirar si es un bug conocido o si es mi programa el que está mal.

Muchas gracias de nuevo

mightydragonlor
22-10-2008, 18:11:16
exactamente ese es el problema, cambialo por el TSQLQuery y se debe arreglar el problema.

Ana María
24-10-2008, 02:22:44
hola, en realidad no tiene que ver con que sea un TSLTable o TSLQuery, ese no es el problema, tampoco lo es el ClientDataset.
La cuestión es que el conjunto de datos del ClientDataset solo se carga en memoria y no tiene forma alguna de saber si hay o nó una clave duplicada hasta que la actualización o inserción hayan ido hasta la propia base de datos, es por eso que la excepción no se dispara en Post sinó en ApplyUpdates.

Lo que debes hacer es manejar la excepción en OnReconcileError y la acción a realizar es raAbort que no te va a borrar absolutamente nada.

Espero te sirva de algo.

M. FM.
28-10-2008, 12:54:41
Muchas gracias a los dos.

Es verdad que no depende del TSQLTable, probé con un TSQLQuery y me daba el mismo error. Al final he tenido que quitar la función para OnPostError porque no servía de nada, pero tras el OnReconcileError, con la acción raAbort, se me están conservando los datos, que es lo que quería.

Gracias de nuevo.