EMDOError está declarado en mdo.pas
Lo demás fijo que no son erroes, es que no sabe lo que era EMDOError.
Veo que el hilo ha avanzado mucho, pero hace falta tener las cosas algo más claras.
Si el campo placas está declarado como NOT NULL, y en tu programa creas un registro y le das a guardar (sin modificar nada), ya Firebird protestará con un mensaje de error "violation of constraint ENTRADA_1 for table ENTRADA" o algo similar, por tanto, no es necesario ni crear trigger ni excepciones. Pruebalo para que veas como funciona la cosa.
Ahora aplicas una mezcla entre lo dicho por roman y lo mío, esto es, en el dataset entrada de tu form de delphi, localiza el evento onPostError, y añade ShowMessage mostrando los parámetros que trae el evento para ver que te muestra. Ahora en ese evento es donde tendrás que adaptar las rutinas "parseError" y también "IsBDConstraint" para tu caso particular.
Lo mismo para las placas duplicadas, si pones un indice único sobre el campo, Firebird ya protesta, por ende, no hace falta crear la excepción, es más en este caso está mal planteado, ya que si introduce un número de placa correcto (no duplicado), en el trigger solo se compara si es distinto de null y salta la excepción, asi que, no dejará introducir ningún número de placa, ¡ninguno!
OFFTOPIC: Que no te vea yo declarar una excepción así:
Código SQL
[-]
CREATE EXCEPTION PLACAS_2 'LAS PLACAS ESTAS DUPLICADAS';
que te pego un tirón de orejas, crealá así:
Código SQL
[-]
CREATE EXCEPTION PLACAS_DUPLICADAS 'LAS PLACAS ESTAS DUPLICADAS';
Si quieres dejar pasar las excepciones al ApplicationsEvent, no uses el OnPostError para nada.
Efectivamente me parece más adecuado usar el evento OnPostError del dataset porque está precisamente para eso, para detectar errores al guardar.
Saludos