![]() |
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 |
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 |
¿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 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 // Saludos |
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 |
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. |
Cita:
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(...); 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 sí 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; 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 :D // Saludos |
La franja horaria es GMT +2. Ahora son las 08:45:22. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi