Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-10-2003
viajero2015 viajero2015 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cuba
Posts: 47
Poder: 0
viajero2015 Va por buen camino
Question porque en el momento de validar llave no entra al evento en DataModule Posterror

Hola amigos y sigos con las validaciones, ya me exp;icaron que usando
try
post
except

puede ser y de hecho me trabajo peor he visto que las tablas tienen dos eventos onedithError y OnPostError en el datamodule mio dond etengo las Tabla programe el evento OnPostError para cuando vaya a agregar verifique que no haya problemas y el prcedimiento es el siguiente.

const
eKeyViol=9729;
eRequiredFieldMissing=9732;

procedure TCustomerData.TTempresaPostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
var IDberror: Integer;
begin
if (E is EDBEngineError) then
begin
IDberror:=(E as EDBEngineError).Errors[0].ErrorCode;
case IDberror of
ekeyViol:
begin
MessageDlg('Ese código esta siendo usado por otra empresa, asigne otro código a dicha empresa',mtError,[mbOk],0);
Abort;
end;
eRequiredFieldMissing:
begin
MessageDlg('El Código tiene un valor no válido, por favor intentelo de nuevo',mtError,[mbOk],0);
Abort;
end;
end;
end;
end;

pero nunca cuando agrego un nuevo articulo va a este procedimiento en datamodule por lo que no me valida me sale un cartel peor d ela aplicacion no esta, yo uso tablas en mdb, alguienme podra decir porque sucede esto que no va al evento a validar. y sin embargo si pongo el codigo try tabla.post except ent si me valida eso peor necesito validar otras cosas mas que estoy haciendo mal?
necesito esa ayuda urgente pues sino me veo algo loco.
saludos y gracias TOMAS
Responder Con Cita
  #2  
Antiguo 18-10-2003
viajero2015 viajero2015 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cuba
Posts: 47
Poder: 0
viajero2015 Va por buen camino
Lightbulb

Hola amigos con tanto insistir vi que con el ADOTable no me valida si se programa en el evento PstError pues cogi un objeto TTable y le hize lo mismo y si me valido como queria, que le puedo hacer al objeto Adotable para que e haga lo mismo que hace TTable a la hora de validar llaves duplicadas etc etc etc.

gracias peor alguien que me de una mano con esto.
saludos TOMAS
Responder Con Cita
  #3  
Antiguo 18-10-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Estás seguro de que no valida?

Lo que yo creo es que el evento OnPostError sí se genera pero no hace nada porque todo el código está rodeado por un condicional que no se cumple:

Código:
if (E is EDBEngineError) then
begin
  { código que no se ejecuta }
end;
El problema es que una excepción EDBEngineError sólo se ejecuta cuando accedes a la base através del BDE pero en tu caso lo haces por medio de ADO. Por tanto la excepción E nunca va a ser del tipo EDBEngineError.

Yo no conozco ADO pero haciendo algunas pruebas observo lo siguiente:

La componente TAdoConnection tiene una propiedad Errors que aparentemente almacena los errores que se generan. Desconozco en qué casos se almacena más de un error pero puedes intentar con el primero: TAdoConnection1.Errors[0].

Cada elemento de este arreglo tiene dos propiedades que pueden servirte:

NativeError y Description

NativeError te puede servir para determinar en el evento OnPostError a qué se debió el error mientras que Description contiene el texto del mensaje de error.

El siguiente código es la prueba que hice:

Código:
const
  E_DB_KEYVIOLATION = -1605;
  E_DB_REQUIREDFIELD = -3701;

procedure TForm1.ADOTable1PostError(
  DataSet: TDataSet; E: EDatabaseError;
  var Action: TDataAction);
begin
  case AdoConnection1.Errors.Item[0].NativeError of
    E_DB_KEYVIOLATION:
      raise Exception.Create('La llave se repite amigo');

    E_DB_REQUIREDFIELD:
      raise Exception.Create('Sin valor no hago nada');
  end;
end;
Como dije, no sé gran cosa de ADO pero me parece que esto te puede servir como punto de partida.

// Saludos
Responder Con Cita
  #4  
Antiguo 18-10-2003
viajero2015 viajero2015 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cuba
Posts: 47
Poder: 0
viajero2015 Va por buen camino
Angry

Hola roman oye gracias pro tu ayuda eh, peor sabes no me dio resultado el vento no me sigue cogiendo la excepcion esa yo con TTable si me da el error peor con AdoTable no nada, ni contu ejemplo a ti te se ejecuto bien el evento posterror del esa tabla ADO?
sin embargo probe con
try
post;
Except
mensaje()
y ok peor en el mismo formulario peor quiero hacerlo como dios manda

esto me tiene loco, saludos TOMAS
Responder Con Cita
  #5  
Antiguo 18-10-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Una solución puede ser la siguiente:

Coloca un control no DataAware, para el campo clave, por ejemplo un Tedit.

Coloca dos AdoTable, sobre la misma Tabla. Trabaja siempre con el primero y el segundo solamente le utilizas para buscar si lo tecleado existe o no.

En el evento OnExit de dicho control no conectado a la tabla, lanzas una búsqueda con el segundo Adotable que como queda dicho está conectado a la misma tabla, si encuentras lo tecleado estaríamos ante un caso de "Clave duplicada", entonces lanzas el mensaje que tu quieras y devuelves el foco al mismo control.

De esta manera también evitas que el usuario despues de rellenar 40 campos se encuentre que todo su trabajo ha sido inutil por tratarse de una clave existente.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #6  
Antiguo 19-10-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Posteado originalmente por viajero2015
Hola roman oye gracias pro tu ayuda eh, peor sabes no me dio resultado el vento no me sigue cogiendo la excepcion esa yo con TTable si me da el error peor con AdoTable no nada, ni contu ejemplo a ti te se ejecuto bien el evento posterror del esa tabla ADO?
sin embargo probe con
try
post;
Except
mensaje()
y ok peor en el mismo formulario peor quiero hacerlo como dios manda

esto me tiene loco, saludos TOMAS
Vamos a tratar de desmenuzar esto porque debe haber una explicación. Estuve un rato mirando el grupo de noticias borland.public.delphi.database.ado y hay varias menciones acerca de problemas con OnPostError como, por ejemplo, que no se dispara si el LockType de la tabla está en BatchOptimistic, o mejor dicho, se dispara sólo hasta que se llama a ApplyUpdates. No obstante no parece ser tu problema.

De cualquier forma lo primero será determinar perfectamente si el evento se dispara o no:

Coloca un breakpoint justo al comienzo del evento:

Código:
procedure TForm1.ADOTablePostError(...);
begin // <-- breakpoint aquí (F5)
...
end;
Ejecuta la aplicación y fuerza un error. Si se detiene en el punto marcado (y yo sospecho que así será) querrá decir que el problema es que por alguna razón no se cumplen las condiciones del case.

Originalmente hice la prueba usando como proveedor de la conexión el que pone por defecto:

Microsoft OLE DB Providerfor ODBC Drivers

y todo funcionó correctamente con las constantes E_DB_KEYVIOLATION y E_DB_REQUIREDFIELD que puse anteriormente.

Pero después cambié de proveedor a

Microsoft Jet 4.0 OLE DB Provider

y ¡sorpresa! no se dispararon mis mensajes sino que de vuelta obtuve los que da por defecto.

Sin embargo que entraba al evento, sólo que las condiciones no se cumplían: ¡las constantes eran otras!

Buscando en el grupo de noticias ví que los códigos de error dependen tanto de la base de datos misma como del proveedor.

Si estás en este caso, es decir si sí entra al evento pero no cumple las condiciones entonces lo único que debes hacer es investigar cuáles son las constantes correctas. Yo lo hice con mi método favorito

Caption := IntToStr(AdoConnection.Errors[0].NativeError);

y generando cada uno de los errores que me interesan (seguro que en algún lugar debe venir la documentación pero desconozco dónde). Por ejemplo, para Microsoft Jet 4.0 obtuve estos otros valores:

Código:
E_DB_KEYVIOLATION = -105121349;
E_DB_REQUIREDFIELD = -541331061;
Por otro lado, si en el peor de los casos resulta que realmente no entra al evento (y te reitero que primero que nada verifiques muy bien esto) lo que yo haría es olvidarme del proyecto por un momento y comenzar con una aplicación limpia, colocando un AdoConnection, un AdoTable, un DataSource, un DBGrid y nada más. Salvo la cadena de conexión del AdoConnection no cambiar ninguna propiedad y ver qué pasa. Si sí funciona ir cambiando las propiedades que hayas cambiado en el proyecto original (si es que hiciste algún cambio).

Bueno, como verás no es una ayuda muy concreta pero es como yo procedería si tuviera que usar ADO, Access y desconociera ambos-- y tal es el caso

// Saludos

Última edición por roman fecha: 19-10-2003 a las 08:32:21.
Responder Con Cita
Respuesta



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 19:22:42.


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