Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-09-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.439
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Lo normal sería crear índices, checks y FK's; Cuando realizas una operación (incorrecta) con cualquiera de ellos "saltará" una excepción; En ese punto la capturas y mustras tu mensaje de error (normalmente más claro de cara al usuario).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #2  
Antiguo 14-09-2005
micayael micayael is offline
Miembro
 
Registrado: sep 2005
Posts: 68
Poder: 21
micayael Va por buen camino
aahh. Eso esta interesante. pero como capturo ese momento? Ahi deberia llamar a mi exepcion.
Responder Con Cita
  #3  
Antiguo 15-09-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.439
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Bueno, sería algo así:

Código Delphi [-]
 
   ...
   // Comienza el bloque de proteccion
   try
     Tabla1.Post;  // Supongamos que ésto genera excepcion
   except
     on E:EDBEngineError do begin
       // Error de Base de Datos....
       // Para afinar más puedses intentar saber de qué tipo es el erorr...
       if ((E as EDBEngineError).Errors[0].Errorcode = eKeyViol) then begin
          Application.MessageBox('Imposible dar alta ese registro 
                                          ya  existe','Atención',mb_Ok +
                                           mb_IconQuestion);
       end
       else if....
          // puedes capturar el resto de la misma forma...
       end;
     end
     else begin
       raise;   // dejamos que siga....
     end;
   end;

Las constantes para los errores más comunes:
  • eKeyViol = 9729;
  • eRequiredFieldMissing = 9732;
  • eForeignKey = 9733;
  • eDetailsExist = 9734;
  • eSqlGralerror = 13059;
No lo he compilado, espero no haber cometido muchos errores; Pruébalo y si tienes problemas ya dirás...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 15-09-2005
micayael micayael is offline
Miembro
 
Registrado: sep 2005
Posts: 68
Poder: 21
micayael Va por buen camino
Guuuaaaauuuuu.,

La verdad que es bien complejo todavia para mi. Para empezar no se ni siquiera si es un trigger o alguna otra cosa.

Me podrias especificar eso (si es un trigger)

Sabes de donde puedo encontrar informacion sobre los tipos de exepciones y sobre las variables que usas ahi para crear tu mensaje? Es propio de firebird?

Es parecido al uso en visual basic. Yo estoy usando php

Última edición por micayael fecha: 15-09-2005 a las 15:20:50.
Responder Con Cita
  #5  
Antiguo 15-09-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 23
rastafarey Va por buen camino
Resp

Si uqieres personalizar aun mas tu errores lo puedes hacer el evento on exception ya que este captura todos lo errores.

Lee un poco sobre esto.

Espero te sirva
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #6  
Antiguo 19-09-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.740
Poder: 26
ContraVeneno Va por buen camino
O en todo caso coloca el cursor sobre la palabra que no entiendes y presionas F1 para que te muestre la ayuda sobre ese tema (esto sobre delphi claro esta).
__________________

Responder Con Cita
  #7  
Antiguo 20-09-2005
HombreSigma HombreSigma is offline
Miembro
 
Registrado: jun 2003
Ubicación: World
Posts: 114
Poder: 24
HombreSigma Va por buen camino
Una sugerencia más

Saludos foro:

Sugiero aprovechar la tecnología de objetos de Delphi.

Como estas rutinas de captura de excepciones para validar la integridad de llave primaria y llave foránea son comunes a todas las tablas hace tiempo se me ocurrió crear un componente nuevo que llamé TTabla que hereda las características (métodos y propiedades) de TTable.

A este nuevo componente le modifique algunos de los métodos de los eventos tipicos de TTabla haciendo las validaciones estandar dentro de ellos.

Usando este componente, hasta ahora, me he olvidado por completo de tener que realizar validaciones de integridad tipicas como validacion de registros duplicados, mensajes de error en español, pues todo lo hace este componente, aprovechando los principios de la orientación a objetos de Delphi. De lo contrario estarían condenados para siempre a hacer copy paste del código de las validaciones mencionadas para cada TTable que ustedes crearan.

Envio un bosquejo del componente el cual se puede ampliar a conveniencia, luego pongase en una paleta de componentes personales y utilicese este componente en vez de TTable.

Código:
unit Tabla;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, DBCtrls, DBTables, ReglasValidacion, bdBaseDatos, ArchivoTexto,
  ComCtrls,Gauges, TiposComunes;

type
  TTabla = class(TTable)
  private
    { Private declarations }
    procedure MiDataSetPostError(DataSet: TDataSet;
                                   E: EDatabaseError;
                                   var Action: TDataAction);
    procedure MiUpdateError( DataSet: TDataSet;
                             E: EDatabaseError;
                             UpdateKind: TUpdateKind;
                             var UpdateAction: TUpdateAction);
    procedure MiDataSetDeleteError(DataSet: TDataSet;
                                   E: EDatabaseError;
                                   var Action: TDataAction);
    procedure MiBeforePost(DataSet:TDataSet);
    procedure MiBeforeDelete(DataSet:TDataSet);
    procedure MiBeforeInsert(DataSet:TDataSet);
    procedure MiBeforeEdit(DataSet:TDataSet);
    
   protected
    { Protected declarations }
   public
    { Public declarations }
   constructor Create (AOwner:Tcomponent);override;
    destructor Destroy;override;

  published
    { Published declarations }
  end;

implementation

constructor TTabla.Create (AOwner:TComponent);
var DataSetNo:Integer;
begin 
   inherited Create(AOwner);
  Self.OnDeleteError   :=MiDataSetDeleteError;
  Self.OnPostError     :=MiDataSetPostError;
  Self.BeforePost      :=MiBeforePost;
  Self.BeforeDelete    :=MiBeforeDelete;
  Self.BeforeInsert    :=MiBeforeInsert;
  Self.BeforeEdit      :=MiBeforeEdit;
  Self.OnUpdateError   :=MiUpdateError;
end;

destructor TTabla.Destroy;
begin
  //Destroy previos al de TTabla
  inherited Destroy;
end;

procedure TTabla.MiDataSetDeleteError
 (DataSet: TDataSet;E: EDatabaseError; var Action: TDataAction);
begin
  //Hacer aqui las validaciones estandar en caso de error al borrar un registro
end;


procedure TTabla.MiDataSetPostError
  (DataSet: TDataSet; E:EDatabaseError; var Action:TDataAction);
var MensajeValidacionIntegridadDatos:AnsiString;
begin
  inherited;
  //Validaciones estandar en caso de error al hacer POST
end;

procedure TTabla.MiUpdateError( DataSet: TDataSet;
                             E: EDatabaseError;
                             UpdateKind: TUpdateKind;
                             var UpdateAction: TUpdateAction);
begin
  inherited;
  //Validaciones estandar en caso de error al actualizar
end;

procedure TTabla.MiBeforePost(DataSet: TDataSet);
begin
  //Hacer validaciones estándar before post 
end;

procedure TTabla.MiBeforeDelete(DataSet: TDataSet);
begin
  if DataSet.IsEmpty
    then raise Exception.Create('No hay registros para borrar');
  //Otras validaciones estandar
end;

procedure TTabla.MiBeforeInsert(DataSet: TDataSet);
begin
  //Validaciones estandar BeforeInsert  
end;

procedure TTabla.MiBeforeEdit(DataSet: TDataSet);
begin
  //Validaciones estandar Before Edit
end;


end.
__________________
SigmaMan

Última edición por HombreSigma fecha: 20-09-2005 a las 17:06:24. Razón: Mejorar la redacción
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 20:26:05.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi