Ir al contenido


Foto

identificar fallo de transaccion


  • Por favor identifícate para responder
3 respuestas en este tema

#1 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 01 diciembre 2015 - 10:53

Tengo un codigo tipico de delphi donde uso una transaccion. Supongamos el caso de agregar un cliente. primero se agregan los datos en la tabla persona. si no se concreta el insert en la tabla cliente, se hara rollback sobre la de persona.

 

O si no se puede asociar un banco a un cheque supongamos, fallara la insercion del cheque y se hara rollback.

 

Pero como podria identificar en estas 2 y en toda situacion que desee cual fue el fallo transaccional y mostrar un mensaje en lenguaje humano.

 

Por ej:

 

Fallo en la transaccion: no hay banco asociado al cheque.

 

osea existe algun manejador para esto?

 

Gracias


  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 01 diciembre 2015 - 11:33

Mira este hilo del 2009, aunque con la actualización del foro veo que se han estropeado algunas cosas, la idea general se entiende y, puedes adaptarlo a tu necesidad.

http://delphiaccess....ror-al-usuario/

 

Saludos.


  • 0

#3 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 mensajes
  • LocationMar del Plata / Bs As / Argentina

Escrito 02 diciembre 2015 - 06:08

Tengo un codigo tipico de delphi donde uso una transaccion. Supongamos el caso de agregar un cliente. primero se agregan los datos en la tabla persona. si no se concreta el insert en la tabla cliente, se hara rollback sobre la de persona.

 

O si no se puede asociar un banco a un cheque supongamos, fallara la insercion del cheque y se hara rollback.

 

Pero como podria identificar en estas 2 y en toda situacion que desee cual fue el fallo transaccional y mostrar un mensaje en lenguaje humano.

 

Por ej:

 

Fallo en la transaccion: no hay banco asociado al cheque.

 

osea existe algun manejador para esto?

 

Gracias

 

Lo que hago es verificar todos los datos antes de hacer la sentencia SQL.

 

si es un cliente, verifico que no existe y tenga sus datos correctos y completos, similar para el cheque o cualquier dato a insertar.

¿me explico?


  • 1

#4 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 02 diciembre 2015 - 11:53

Lo que hago es verificar todos los datos antes de hacer la sentencia SQL.

 

si es un cliente, verifico que no existe y tenga sus datos correctos y completos, similar para el cheque o cualquier dato a insertar.

¿me explico?

Obvio que te entiendo, pero me parece que a veces es conveniente verificar algunas cosas del lado del server. Aunque se lo puede hacer en tiempo real del lado del cliente. Osea esto se usaria en ambientes mas complejos. Una posible solucion:


delphi
  1. procedure TForm1.Button3Click(Sender: TObject);
  2. var
  3. iCodigoProducto,iCodigoFactura,iCantidad : integer;
  4. fPrecio : Double;
  5. begin
  6. iCodigoProducto:=StrToInt(edProducto.Text);
  7. iCodigoFactura:=StrToInt(edFactura.Text);
  8. iCantidad:=StrToInt(edCantidad.Text);
  9. fPrecio:=StrToFloat(edPrecio.Text);
  10.  
  11.  
  12. ZConnection1.StartTransaction;
  13.  
  14. try
  15. zDetalle.Insert;
  16.  
  17. zDetalleProdCodigo.Value:=iCodigoProducto;
  18. zDetalleFactCodigo.Value:=iCodigoFactura;
  19. zDetalleCantidad.Value:=iCantidad;
  20. zDetallePrecio.Value:=fPrecio;
  21.  
  22. zDetalle.Post;
  23. ZConnection1.Commit;
  24. except
  25. //on E: EZSQLException do //<--- Ya no uso esta excepcion
  26. on E:EZDatabaseError do //<--- Esta esta mejor
  27. begin
  28. case E.ErrorCode of
  29. 1062: // Este era el codigo que buscaba
  30. begin
  31. ShowMessage('Duplicado'); // El mensaje que yo quiera
  32. end
  33. else
  34. ShowMessage('Error codigo: '+IntToStr(E.ErrorCode)+' - '+E.Message);
  35. end;
  36. ZConnection1.Rollback;
  37. zDetalle.Cancel;
  38.  
  39. end;
  40.  
  41. end;
  42.  
  43. end;


  • 0




IP.Board spam blocked by CleanTalk.