Ver Mensaje Individual
  #9  
Antiguo 16-05-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 31
Lepe Va por buen camino
Tus intuiciones son ciertas JMGR

Cuando se produce el OnPostError, debes tener en cuenta que tienes un registro en Edición (dsEdit o dsInsert) que está modificado pero aún no se ha guardado ese cambio, es más, no se puede guardar porque ha producido un error.

Pero que no se te escape otro detalle, la Tabla se encuentra apuntando a ese mismo registro que da error.

Tienes las alternativas del parámetro Action (no recuerdo cuales son ), pero tal y como veo tu código, no veo alternativas para tu usuario, es decir, tu usuario no podrá continuar hasta que cambie el código de ese cliente y al guardar no dé errores:

Código Delphi [-]
procedure TDataModule3.TablaClientesPostError(DataSet: TDataSet;
  E: EDatabaseError; var Action: TDataAction);
begin
//if (E is EDatabaseError) then  // siempre lo será, porque es de ese tipo el parámetro.
 MessageDlg('Parece que ese Codigo ya existe.'  +#13+#10+'Introduzca otro por favor', mtWarning, [mbYes], 0) ;
     Action:=daAbort;
end;

Con eso, informas al usuario y dejas el registro en edición, esperando a que cambie el código.

A otra cosa modosa: ¿estás seguro que el OnPostError se produce por el fallo del código de forma exclusiva? Obviamente no, ocurrirá cuando:

- Si un campo es Requerido (not null) pero tiene el valor null
- Un índice único sobre algún campo está a punto de violarse (
- Por pérdida repentina de conexión a la base de datos (... no sé si está en red o no).
- etc.

Para saber el error que ha ocurrido, tendrás que indagar en las "ADOExceptions" para obtener el código de error... y aquí será mejor que un entendido en ADO hable mejor que yo. Básicamente sería algo así como:
Código Delphi [-]
dentro del OnPostError
 if E is EADODBexception  then // me lo he inventado
  if E.ErrorCode = const_KeyViolation then
    ShowMessage('Codigo Repetido de cliente')
  else if E.ErrorCode = const_Indice_Unico_A_punto_de_Violar then
     ShowMessage('Por favor cambia el campo NombreCliente');
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 16-05-2008 a las 22:36:59.
Responder Con Cita