EDatabaseError

Hola Miguecrack, mira intente capturar la excepción del campo vacío requerido más no funciono, lo solucione de esta forma,
procedure TDataCatalogos.CatalogoPostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
begin
if (E is EDBEngineError) then
begin
if (E as EDBEngineError).Errors[0].Errorcode=9729 then
begin
// llave duplicada
MessageDlg('Clave repetida. Modifiquela. No se registrará.',
mtWarning,[mbOK], 0);
Abort;
end;
if ((E as EDBEngineError).Errors[0].Errorcode=9736) or ((E as EDBEngineError).Errors[0].Errorcode=9733) then
begin
// Valor fera de rango o registro maestro inexistente
MessageDlg('ERROR GRUPO NO EXISTENTE .',
mtWarning,[mbOK], 0);
Abort;
end;
end
Else
Begin
MessageDlg('error en registro '+E.Message, MtWarning,[mbOk], 0);
MessageDlg('El campo debe tener un valor. ',MtWarning,[mbok],0);
end;
end;
El numero del error si es el 9732 pero no lo captura, el error parte de un EDabaseError, pero no lo identifica como EDBEngineError que es un desenciente de EDatabaseError. El evento obvio va sobre una tabla de paradox (como atinadamente lo intuiste) en un DataModule.
De antemano agradezco tu tiempo.
Saludos
Lina

1 Respuesta

Respuesta
1
No, no te recomiendo que no uses BDGrid, el uso de un componente u otro es decisión tuya, pero creo que debes informarte de qué ventajas o inconveniente tiene un componente. Bueno, respecto al tema de comunicar un módulo con otro lo puedes hacer mediante llamadas a procedimientos o funciones desde un módulo a otro, me explico, si estás implementando la parte de la interfaz de usuario y necesitas, por ejemplo, controlar las excepciones, la opción que te proponía era la de tener un módulo separado para manejar las excepciones (en la red hay mucho material escrito para crear un módulo de este tipo, incluso te generan un fichero donde se van incluyendo los errores, es más existen componentes Handler Exception). Podría ser algo tal que así.
Unit interfaz
...
...
Si excepción entonces procesarExcepcion(excepción)
...
...
Fin
Unit handlerExceciones
...
procedure procesarExcepcion(E:excepcion)
begin
//Segun la excepcion realizar acciones
Fin
...
Fin
Bueno, a esto es lo que yo me refería. También se puede tener un módulo de datos para tu bd.
Bueno, siento no poder ayudarte más, me pillas un poco liadillo estos días. Ya te digo que en la red hay cantidad de cosas escritas de estos temas.
Efectivamente, cuando una operación sobre una base de datos falla se genera un error de tipo EDatabaseError. Cada tipo de base de datos (Paradox, Interbase, Oracle...) tiene sus propios códigos (llamados sqlcode) para estos casos. Si el error lo provoca el BDE entonces tendremos un error de tipo EDBEngineError que es diferente (aunque derive del primero) y posee valores distintos. Bueno, como te comenté tu estás trabajando directamente sobre la tabla al usar DBGrid por lo que algunos fallos vendrán de la unidad DB del VCL que encapsula las llamadas al motor de datos. Como ya te comenté lo mejor es que te crees un manejador de excepciones y desde este módulo realices las acciones pertinentes según la excepción pasada. Fíjate que estás programando para la implementación y no para la interfaz por lo que tendrás un código prácticamente nulo de reutilizar y totalmente específico para tu programa. ¿Y si quieres volver a utilizar el manejador de excepciones en otra aplicación?. Podrías hacer cosas como estas:
(Módulo de entrada de datos) <se_comunica_con> (manejador de excepciones)
(Módulo de entrada de datos)<se_comunica_con> (módulo de actualización de tabla)
Es decir, que al sacar el código de cada módulo por separado conseguirás una aplicación más reutilizable (y más fácil de entender) y menos específica con los mismos resultados.
Esta página está muy bien (además es del creador de la cara oculta de delphi) y tiene algunos "idioms" (trucos) de Delphi muy buenos, entre ellos está el de sacar el sqlcode.
http://www.marteens.com/index.htm
Gracias Miguecrack por tu pronta respuesta, aunque como te habrás dado cuenta no estoy muy familiarizada con el manejo de excepciones, que es lo que me recomiendas, ¿no usar un DBGrid?, ¿Seria mucho pedirte si me pudieras enviar un pequeño ejemplo sobre como hacer las comunicaciones de el modulo deentrada al modulo de excepciones y del modulo de entrada al modulo de acutalización que mencionas? ¿Te doy mi correo? Disculpa tanta molestia
[email protected]
Mil gracias de antemano
Lina
Hola Miguecrack, gracias portu respuesta, me ha sido de gran utilidad, y disculpa quehasta ahora finalice la pregunta pero no me fue posible antes.
Gracias nuevamente
Lina

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas